103 lines
2.3 KiB
JavaScript
103 lines
2.3 KiB
JavaScript
|
/* global LIMITS */
|
||
|
import assets from '../common/assets';
|
||
|
import { getFileList, setFileList } from './api';
|
||
|
import { encryptStream, decryptStream } from './ece';
|
||
|
import { b64ToArray, streamToArrayBuffer } from './utils';
|
||
|
import { blobStream } from './streams';
|
||
|
|
||
|
const textEncoder = new TextEncoder();
|
||
|
const textDecoder = new TextDecoder();
|
||
|
|
||
|
export default class User {
|
||
|
constructor(info, storage) {
|
||
|
if (info && storage) {
|
||
|
storage.user = info;
|
||
|
}
|
||
|
this.storage = storage;
|
||
|
this.data = info || storage.user || {};
|
||
|
}
|
||
|
|
||
|
get avatar() {
|
||
|
const defaultAvatar = assets.get('user.svg');
|
||
|
if (this.data.avatarDefault) {
|
||
|
return defaultAvatar;
|
||
|
}
|
||
|
return this.data.avatar || defaultAvatar;
|
||
|
}
|
||
|
|
||
|
get name() {
|
||
|
return this.data.displayName;
|
||
|
}
|
||
|
|
||
|
get email() {
|
||
|
return this.data.email;
|
||
|
}
|
||
|
|
||
|
get loggedIn() {
|
||
|
return !!this.data.access_token;
|
||
|
}
|
||
|
|
||
|
get bearerToken() {
|
||
|
return this.data.access_token;
|
||
|
}
|
||
|
|
||
|
get maxSize() {
|
||
|
return this.loggedIn ? LIMITS.MAX_FILE_SIZE : LIMITS.ANON.MAX_FILE_SIZE;
|
||
|
}
|
||
|
|
||
|
get maxExpireSeconds() {
|
||
|
return this.loggedIn
|
||
|
? LIMITS.MAX_EXPIRE_SECONDS
|
||
|
: LIMITS.ANON.MAX_EXPIRE_SECONDS;
|
||
|
}
|
||
|
|
||
|
get maxDownloads() {
|
||
|
return this.loggedIn ? LIMITS.MAX_DOWNLOADS : LIMITS.ANON.MAX_DOWNLOADS;
|
||
|
}
|
||
|
|
||
|
login() {}
|
||
|
|
||
|
logout() {
|
||
|
this.storage.user = null;
|
||
|
this.storage.clearLocalFiles();
|
||
|
this.data = {};
|
||
|
}
|
||
|
|
||
|
async syncFileList() {
|
||
|
let changes = { incoming: false, outgoing: false, downloadCount: false };
|
||
|
if (!this.loggedIn) {
|
||
|
return this.storage.merge();
|
||
|
}
|
||
|
let list = [];
|
||
|
try {
|
||
|
const encrypted = await getFileList(this.bearerToken);
|
||
|
const decrypted = await streamToArrayBuffer(
|
||
|
decryptStream(encrypted, b64ToArray(this.data.fileListKey))
|
||
|
);
|
||
|
list = JSON.parse(textDecoder.decode(decrypted));
|
||
|
} catch (e) {
|
||
|
//
|
||
|
}
|
||
|
changes = await this.storage.merge(list);
|
||
|
if (!changes.outgoing) {
|
||
|
return changes;
|
||
|
}
|
||
|
try {
|
||
|
const blob = new Blob([
|
||
|
textEncoder.encode(JSON.stringify(this.storage.files))
|
||
|
]);
|
||
|
const encrypted = await streamToArrayBuffer(
|
||
|
encryptStream(blobStream(blob), b64ToArray(this.data.fileListKey))
|
||
|
);
|
||
|
await setFileList(this.bearerToken, encrypted);
|
||
|
} catch (e) {
|
||
|
//
|
||
|
}
|
||
|
return changes;
|
||
|
}
|
||
|
|
||
|
toJSON() {
|
||
|
return this.data;
|
||
|
}
|
||
|
}
|