core-3nweb-client-lib 0.25.6 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/build/api-defs/asmail.d.ts +1 -1
- package/build/api-defs/files.d.ts +282 -70
- package/build/core/app-files.js +7 -7
- package/build/core/asmail/config/common.js +4 -4
- package/build/core/asmail/config/index.js +2 -2
- package/build/core/asmail/config/published-intro-key.js +1 -1
- package/build/core/asmail/delivery/common.js +7 -7
- package/build/core/asmail/delivery/index.js +7 -6
- package/build/core/asmail/delivery/msg.js +8 -7
- package/build/core/asmail/delivery/per-recipient-wip.js +3 -3
- package/build/core/asmail/inbox/attachments/fs.js +11 -1
- package/build/core/asmail/inbox/cached-msgs.js +3 -3
- package/build/core/asmail/inbox/inbox-events.js +5 -4
- package/build/core/asmail/inbox/index.js +12 -12
- package/build/core/asmail/inbox/msg-downloader.js +3 -3
- package/build/core/asmail/inbox/msg-indexing.js +4 -4
- package/build/core/asmail/inbox/msg-on-disk.js +7 -7
- package/build/core/asmail/index.d.ts +3 -3
- package/build/core/asmail/index.js +13 -8
- package/build/core/asmail/key-verification.js +5 -5
- package/build/core/asmail/keyring/common.js +7 -6
- package/build/core/asmail/keyring/correspondent-keys.js +8 -7
- package/build/core/asmail/keyring/id-to-email-map.js +2 -1
- package/build/core/asmail/keyring/index.d.ts +7 -8
- package/build/core/asmail/keyring/index.js +15 -14
- package/build/core/asmail/keyring/keyring-storage.js +4 -3
- package/build/core/asmail/msg/opener.js +3 -3
- package/build/core/asmail/msg/packer.js +13 -13
- package/build/core/asmail/sending-params/own-params.js +4 -4
- package/build/core/asmail/sending-params/params-from-others.js +3 -3
- package/build/core/id-manager.js +8 -5
- package/build/core/index.d.ts +2 -1
- package/build/core/index.js +14 -14
- package/build/core/sign-in.d.ts +5 -4
- package/build/core/sign-in.js +12 -14
- package/build/core/sign-up.d.ts +1 -0
- package/build/core/sign-up.js +15 -11
- package/build/core/storage/common/json-saving.d.ts +21 -0
- package/build/core/storage/common/json-saving.js +82 -0
- package/build/core/storage/common/obj-info-file.d.ts +51 -0
- package/build/core/storage/common/obj-info-file.js +153 -5
- package/build/core/storage/common/utils.d.ts +2 -0
- package/build/core/storage/common/utils.js +32 -0
- package/build/core/storage/index.d.ts +3 -17
- package/build/core/storage/index.js +57 -77
- package/build/core/storage/local/obj-files-gc.d.ts +2 -0
- package/build/core/storage/local/obj-files-gc.js +53 -39
- package/build/core/storage/local/obj-files.d.ts +6 -9
- package/build/core/storage/local/obj-files.js +16 -19
- package/build/core/storage/local/obj-status.d.ts +20 -30
- package/build/core/storage/local/obj-status.js +46 -113
- package/build/core/storage/local/storage.d.ts +15 -5
- package/build/core/storage/local/storage.js +37 -18
- package/build/core/storage/synced/downloader.js +7 -6
- package/build/core/storage/synced/obj-files-gc.d.ts +6 -1
- package/build/core/storage/synced/obj-files-gc.js +106 -13
- package/build/core/storage/synced/obj-files.d.ts +46 -47
- package/build/core/storage/synced/obj-files.js +207 -154
- package/build/core/storage/synced/obj-status.d.ts +103 -42
- package/build/core/storage/synced/obj-status.js +525 -137
- package/build/core/storage/synced/remote-events.d.ts +11 -12
- package/build/core/storage/synced/remote-events.js +80 -57
- package/build/core/storage/synced/storage.d.ts +24 -5
- package/build/core/storage/synced/storage.js +123 -38
- package/build/core/storage/synced/upload-header-file.d.ts +4 -0
- package/build/core/storage/synced/upload-header-file.js +64 -0
- package/build/core/storage/synced/upsyncer.d.ts +15 -9
- package/build/core/storage/synced/upsyncer.js +219 -246
- package/build/core/storage/system-folders/apps-data.d.ts +16 -0
- package/build/core/storage/system-folders/apps-data.js +110 -0
- package/build/core/storage/system-folders/index.d.ts +18 -0
- package/build/core/storage/system-folders/index.js +77 -0
- package/build/core-ipc/common-caps.js +3 -3
- package/build/core-ipc/generic.js +8 -8
- package/build/core-ipc/startup-caps.js +2 -2
- package/build/cryptors.js +6 -2
- package/build/ipc-via-protobuf/asmail-cap.js +67 -83
- package/build/ipc-via-protobuf/bytes.js +16 -17
- package/build/ipc-via-protobuf/connector-clients-side.d.ts +3 -0
- package/build/ipc-via-protobuf/connector-clients-side.js +62 -25
- package/build/ipc-via-protobuf/connector-services-side.js +10 -10
- package/build/ipc-via-protobuf/connector.js +4 -4
- package/build/ipc-via-protobuf/file.d.ts +48 -12
- package/build/ipc-via-protobuf/file.js +476 -120
- package/build/ipc-via-protobuf/fs.d.ts +8 -0
- package/build/ipc-via-protobuf/fs.js +592 -159
- package/build/ipc-via-protobuf/log-cap.js +2 -2
- package/build/ipc-via-protobuf/mailerid.js +3 -3
- package/build/ipc-via-protobuf/protobuf-msg.d.ts +1 -0
- package/build/ipc-via-protobuf/protobuf-msg.js +11 -7
- package/build/ipc-via-protobuf/startup-cap.js +23 -23
- package/build/ipc-via-protobuf/storage-cap.js +12 -12
- package/build/ipc.js +7 -2
- package/build/lib-client/3nstorage/exceptions.d.ts +12 -8
- package/build/lib-client/3nstorage/exceptions.js +31 -10
- package/build/lib-client/3nstorage/service.d.ts +16 -2
- package/build/lib-client/3nstorage/service.js +109 -39
- package/build/lib-client/3nstorage/util/file-based-json.d.ts +2 -1
- package/build/lib-client/3nstorage/util/file-based-json.js +1 -1
- package/build/lib-client/3nstorage/xsp-fs/attrs.js +17 -17
- package/build/lib-client/3nstorage/xsp-fs/common.d.ts +52 -14
- package/build/lib-client/3nstorage/xsp-fs/common.js +31 -16
- package/build/lib-client/3nstorage/xsp-fs/file-node.d.ts +1 -0
- package/build/lib-client/3nstorage/xsp-fs/file-node.js +18 -14
- package/build/lib-client/3nstorage/xsp-fs/file.d.ts +31 -6
- package/build/lib-client/3nstorage/xsp-fs/file.js +74 -23
- package/build/lib-client/3nstorage/xsp-fs/folder-node-serialization.js +4 -4
- package/build/lib-client/3nstorage/xsp-fs/folder-node.d.ts +24 -11
- package/build/lib-client/3nstorage/xsp-fs/folder-node.js +599 -189
- package/build/lib-client/3nstorage/xsp-fs/fs.d.ts +45 -9
- package/build/lib-client/3nstorage/xsp-fs/fs.js +326 -74
- package/build/lib-client/3nstorage/xsp-fs/link-node.d.ts +1 -0
- package/build/lib-client/3nstorage/xsp-fs/link-node.js +7 -2
- package/build/lib-client/3nstorage/xsp-fs/node-in-fs.d.ts +30 -20
- package/build/lib-client/3nstorage/xsp-fs/node-in-fs.js +239 -106
- package/build/lib-client/3nstorage/xsp-fs/node-persistence.d.ts +1 -1
- package/build/lib-client/3nstorage/xsp-fs/node-persistence.js +18 -19
- package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v1.js +5 -5
- package/build/lib-client/3nstorage/xsp-fs/xsp-payload-v2.js +56 -56
- package/build/lib-client/3nweb-signup.js +4 -4
- package/build/lib-client/asmail/recipient.js +15 -15
- package/build/lib-client/asmail/sender.js +22 -22
- package/build/lib-client/asmail/service-config.js +3 -3
- package/build/lib-client/cryptor/cryptor-in-worker.js +19 -17
- package/build/lib-client/cryptor/cryptor-wasm.js +1 -1
- package/build/lib-client/cryptor/cryptor.js +4 -2
- package/build/lib-client/cryptor/cryptor.wasm +0 -0
- package/build/lib-client/cryptor/in-proc-js.js +1 -1
- package/build/lib-client/cryptor/in-proc-wasm.js +7 -7
- package/build/lib-client/cryptor/worker-js.js +2 -2
- package/build/lib-client/cryptor/worker-wasm.js +2 -2
- package/build/lib-client/files-select.js +1 -1
- package/build/lib-client/files.d.ts +1 -1
- package/build/lib-client/files.js +71 -4
- package/build/lib-client/fs-collection.js +3 -2
- package/build/lib-client/fs-sync-utils.d.ts +5 -0
- package/build/lib-client/fs-sync-utils.js +61 -0
- package/build/lib-client/fs-view.d.ts +14 -0
- package/build/lib-client/fs-view.js +33 -0
- package/build/lib-client/key-derivation.js +1 -1
- package/build/lib-client/local-files/dev-file-sink.js +9 -9
- package/build/lib-client/local-files/dev-file-src.js +2 -2
- package/build/lib-client/local-files/device-fs.d.ts +1 -1
- package/build/lib-client/local-files/device-fs.js +56 -54
- package/build/lib-client/logging/log-to-file.d.ts +1 -1
- package/build/lib-client/logging/log-to-file.js +11 -11
- package/build/lib-client/mailer-id/login.js +7 -7
- package/build/lib-client/mailer-id/provisioner.js +12 -12
- package/build/lib-client/objs-on-disk/file-writing-proc.js +5 -5
- package/build/lib-client/objs-on-disk/obj-folders.js +33 -33
- package/build/lib-client/objs-on-disk/obj-on-disk.d.ts +13 -2
- package/build/lib-client/objs-on-disk/obj-on-disk.js +24 -9
- package/build/lib-client/request-utils.d.ts +1 -0
- package/build/lib-client/request-utils.js +14 -14
- package/build/lib-client/server-events.d.ts +3 -3
- package/build/lib-client/server-events.js +12 -10
- package/build/lib-client/service-locator.js +10 -10
- package/build/lib-client/user-with-mid-session.js +7 -7
- package/build/lib-client/user-with-pkl-session.js +25 -25
- package/build/lib-client/ws-utils.js +3 -3
- package/build/lib-common/async-cryptor-wrap.js +4 -4
- package/build/lib-common/async-fs-node.d.ts +5 -3
- package/build/lib-common/async-fs-node.js +19 -18
- package/build/lib-common/byte-streaming/pipe.js +1 -1
- package/build/lib-common/byte-streaming/wrapping.js +17 -17
- package/build/lib-common/canonical-address.js +1 -1
- package/build/lib-common/exceptions/error.d.ts +1 -0
- package/build/lib-common/exceptions/error.js +7 -6
- package/build/lib-common/exceptions/file.js +10 -1
- package/build/lib-common/ipc/generic-ipc.js +2 -2
- package/build/lib-common/ipc/ws-ipc.js +2 -2
- package/build/lib-common/json-utils.js +2 -1
- package/build/lib-common/mid-sigs-NaCl-Ed.js +14 -14
- package/build/lib-common/objs-on-disk/file-layout.d.ts +19 -0
- package/build/lib-common/objs-on-disk/file-layout.js +130 -12
- package/build/lib-common/objs-on-disk/obj-file.d.ts +13 -2
- package/build/lib-common/objs-on-disk/obj-file.js +99 -37
- package/build/lib-common/objs-on-disk/utils.d.ts +1 -0
- package/build/lib-common/objs-on-disk/utils.js +4 -4
- package/build/lib-common/objs-on-disk/v1-obj-file-format.js +14 -14
- package/build/lib-common/processes/deferred.d.ts +6 -0
- package/build/lib-common/processes/deferred.js +30 -0
- package/build/lib-common/processes/labelled-exec-pools.d.ts +33 -0
- package/build/lib-common/processes/labelled-exec-pools.js +141 -0
- package/build/lib-common/processes/pressure.d.ts +7 -0
- package/build/lib-common/processes/pressure.js +56 -0
- package/build/lib-common/processes/sleep.d.ts +1 -0
- package/build/lib-common/processes/sleep.js +26 -0
- package/build/lib-common/{processes.d.ts → processes/synced.d.ts} +0 -40
- package/build/lib-common/{processes.js → processes/synced.js} +187 -204
- package/build/lib-common/processes/timeout.d.ts +1 -0
- package/build/lib-common/processes/timeout.js +51 -0
- package/build/lib-common/random-node.js +7 -7
- package/build/lib-common/service-api/3nstorage/owner.d.ts +100 -39
- package/build/lib-common/service-api/3nstorage/owner.js +85 -42
- package/build/lib-common/service-api/asmail/delivery.js +2 -2
- package/build/lib-common/service-api/asmail/retrieval.js +1 -1
- package/build/lib-common/timed-cache.d.ts +1 -0
- package/build/lib-common/timed-non-weak-cache.d.ts +1 -0
- package/build/lib-common/timed-non-weak-cache.js +11 -0
- package/build/lib-common/utils-for-observables.d.ts +15 -1
- package/build/lib-common/utils-for-observables.js +70 -19
- package/build/lib-common/weak-cache.d.ts +1 -0
- package/build/lib-common/weak-cache.js +12 -1
- package/build/lib-index.d.ts +2 -1
- package/build/lib-index.js +10 -7
- package/build/protos/asmail.proto.js +12912 -7127
- package/build/protos/file.proto.js +4848 -2399
- package/build/protos/fs.proto.js +9230 -3445
- package/package.json +8 -7
- package/protos/file.proto +91 -11
- package/protos/fs.proto +107 -8
- package/build/core/storage/synced/upsync-status.d.ts +0 -41
- package/build/core/storage/synced/upsync-status.js +0 -158
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/*
|
|
3
|
-
Copyright (C) 2015 - 2017, 2019 -
|
|
3
|
+
Copyright (C) 2015 - 2017, 2019 - 2022 3NSoft Inc.
|
|
4
4
|
|
|
5
5
|
This program is free software: you can redistribute it and/or modify it under
|
|
6
6
|
the terms of the GNU General Public License as published by the Free Software
|
|
@@ -16,17 +16,18 @@
|
|
|
16
16
|
this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.PerAppStorage = exports.reverseDomain = exports.
|
|
19
|
+
exports.PerAppStorage = exports.reverseDomain = exports.Storages = void 0;
|
|
20
20
|
const fs_1 = require("../../lib-client/3nstorage/xsp-fs/fs");
|
|
21
21
|
const storage_1 = require("./synced/storage");
|
|
22
22
|
const storage_2 = require("./local/storage");
|
|
23
23
|
const file_1 = require("../../lib-common/exceptions/file");
|
|
24
24
|
const fs_collection_1 = require("../../lib-client/fs-collection");
|
|
25
25
|
const async_iter_1 = require("../../lib-common/async-iter");
|
|
26
|
-
const device_fs_1 = require("../../lib-client/local-files/device-fs");
|
|
27
26
|
const path_1 = require("path");
|
|
28
27
|
const fs = require("../../lib-common/async-fs-node");
|
|
29
28
|
const error_1 = require("../../lib-common/exceptions/error");
|
|
29
|
+
const system_folders_1 = require("./system-folders");
|
|
30
|
+
const apps_data_1 = require("./system-folders/apps-data");
|
|
30
31
|
function makeBadAppNameExc(appName) {
|
|
31
32
|
return {
|
|
32
33
|
runtimeException: true,
|
|
@@ -74,58 +75,45 @@ const SYNCED_STORAGE_DIR = 'synced';
|
|
|
74
75
|
*/
|
|
75
76
|
async function readRootKeyDerivParamsFromCache(folder) {
|
|
76
77
|
try {
|
|
77
|
-
const str = await fs.readFile(path_1.join(folder, KD_PARAMS_FILE_NAME), { encoding: 'utf8' });
|
|
78
|
+
const str = await fs.readFile((0, path_1.join)(folder, KD_PARAMS_FILE_NAME), { encoding: 'utf8' });
|
|
78
79
|
return JSON.parse(str);
|
|
79
80
|
}
|
|
80
81
|
catch (err) {
|
|
81
82
|
if (err.notFound) {
|
|
82
83
|
return undefined;
|
|
83
84
|
}
|
|
84
|
-
throw error_1.errWithCause(err, `Can't read and parse content of obj status file ${KD_PARAMS_FILE_NAME} in folder ${folder}`);
|
|
85
|
+
throw (0, error_1.errWithCause)(err, `Can't read and parse content of obj status file ${KD_PARAMS_FILE_NAME} in folder ${folder}`);
|
|
85
86
|
}
|
|
86
87
|
}
|
|
87
88
|
/**
|
|
88
89
|
* This function tries to get key derivation parameters from cache on a disk.
|
|
89
90
|
* If not found, it will ask storage server for it with a provided function.
|
|
90
|
-
* @param
|
|
91
|
+
* @param folder
|
|
91
92
|
* @param getFromServer
|
|
92
93
|
*/
|
|
93
94
|
async function getRootKeyDerivParams(folder, getFromServer) {
|
|
94
95
|
let params = await readRootKeyDerivParamsFromCache(folder);
|
|
95
96
|
if (!params) {
|
|
96
97
|
params = await getFromServer();
|
|
97
|
-
await fs.writeFile(path_1.join(folder, KD_PARAMS_FILE_NAME), JSON.stringify(params), { encoding: 'utf8' });
|
|
98
|
+
await fs.writeFile((0, path_1.join)(folder, KD_PARAMS_FILE_NAME), JSON.stringify(params), { encoding: 'utf8' });
|
|
98
99
|
}
|
|
99
100
|
return params;
|
|
100
101
|
}
|
|
101
|
-
exports.sysFolders = {
|
|
102
|
-
appData: 'Apps Data',
|
|
103
|
-
apps: 'Apps Code',
|
|
104
|
-
packages: 'App&Lib Packs',
|
|
105
|
-
sharedLibs: 'Shared Libs',
|
|
106
|
-
userFiles: 'User Files'
|
|
107
|
-
};
|
|
108
|
-
Object.freeze(exports.sysFolders);
|
|
109
|
-
/**
|
|
110
|
-
* This function creates initial folder structure in a given root.
|
|
111
|
-
* @param root
|
|
112
|
-
*/
|
|
113
|
-
async function initSysFolders(root) {
|
|
114
|
-
for (const sysFolder of Object.values(exports.sysFolders)) {
|
|
115
|
-
await root.makeFolder(sysFolder);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
exports.initSysFolders = initSysFolders;
|
|
119
102
|
class StorageAndFS {
|
|
120
103
|
constructor(storage) {
|
|
121
104
|
this.storage = storage;
|
|
122
105
|
this.rootFS = undefined;
|
|
106
|
+
this.syncedAppDataRoots = undefined;
|
|
123
107
|
Object.seal(this);
|
|
124
108
|
}
|
|
125
109
|
static async existing(storage, key) {
|
|
110
|
+
var _a;
|
|
126
111
|
const s = new StorageAndFS(storage);
|
|
127
112
|
try {
|
|
128
113
|
s.rootFS = await fs_1.XspFS.fromExistingRoot(s.storage, key);
|
|
114
|
+
if ((_a = s.rootFS.v) === null || _a === void 0 ? void 0 : _a.sync) {
|
|
115
|
+
s.syncedAppDataRoots = await apps_data_1.AppDataFolders.make(s.rootFS);
|
|
116
|
+
}
|
|
129
117
|
return s;
|
|
130
118
|
}
|
|
131
119
|
catch (err) {
|
|
@@ -138,15 +126,22 @@ class StorageAndFS {
|
|
|
138
126
|
}
|
|
139
127
|
}
|
|
140
128
|
static async newOrExisting(storage, key) {
|
|
129
|
+
var _a, _b;
|
|
141
130
|
const s = new StorageAndFS(storage);
|
|
142
131
|
try {
|
|
143
132
|
s.rootFS = await fs_1.XspFS.fromExistingRoot(s.storage, key);
|
|
133
|
+
if ((_a = s.rootFS.v) === null || _a === void 0 ? void 0 : _a.sync) {
|
|
134
|
+
s.syncedAppDataRoots = await apps_data_1.AppDataFolders.make(s.rootFS);
|
|
135
|
+
}
|
|
144
136
|
return s;
|
|
145
137
|
}
|
|
146
138
|
catch (err) {
|
|
147
139
|
if (err.objNotFound) {
|
|
148
140
|
s.rootFS = await fs_1.XspFS.makeNewRoot(s.storage, key);
|
|
149
|
-
await initSysFolders(s.rootFS);
|
|
141
|
+
await (0, system_folders_1.initSysFolders)(s.rootFS);
|
|
142
|
+
if ((_b = s.rootFS.v) === null || _b === void 0 ? void 0 : _b.sync) {
|
|
143
|
+
s.syncedAppDataRoots = await apps_data_1.AppDataFolders.make(s.rootFS);
|
|
144
|
+
}
|
|
150
145
|
return s;
|
|
151
146
|
}
|
|
152
147
|
else if (err.failedCipherVerification) {
|
|
@@ -157,27 +152,35 @@ class StorageAndFS {
|
|
|
157
152
|
}
|
|
158
153
|
}
|
|
159
154
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
155
|
+
/**
|
|
156
|
+
* This creates app data folder.
|
|
157
|
+
* Folder objects are uploaded, if this is a synced storage.
|
|
158
|
+
* @param appFolder
|
|
159
|
+
*/
|
|
160
|
+
async makeAppFS(appFolder) {
|
|
161
|
+
if (('string' !== typeof appFolder) || (appFolder.length === 0)
|
|
162
|
+
|| (appFolder.indexOf('/') >= 0)
|
|
163
|
+
|| (appFolder === '.') || (appFolder === '..')) {
|
|
164
164
|
throw makeBadAppNameExc(appFolder);
|
|
165
165
|
}
|
|
166
166
|
if (!this.rootFS) {
|
|
167
167
|
throw new Error('Storage is not initialized.');
|
|
168
168
|
}
|
|
169
|
-
|
|
169
|
+
const appDataFS = await (this.syncedAppDataRoots ?
|
|
170
|
+
this.syncedAppDataRoots.getOrMake(appFolder) :
|
|
171
|
+
this.rootFS.writableSubRoot(`${system_folders_1.sysFolders.appData}/${appFolder}`));
|
|
172
|
+
return appDataFS;
|
|
170
173
|
}
|
|
171
174
|
userFS() {
|
|
172
|
-
return this.rootFS.writableSubRoot(
|
|
175
|
+
return this.rootFS.writableSubRoot(system_folders_1.sysFolders.userFiles);
|
|
173
176
|
}
|
|
174
177
|
async sysFSs() {
|
|
175
178
|
const folders = [
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
+
system_folders_1.sysFolders.appData, system_folders_1.sysFolders.apps,
|
|
180
|
+
system_folders_1.sysFolders.packages,
|
|
181
|
+
system_folders_1.sysFolders.sharedLibs
|
|
179
182
|
];
|
|
180
|
-
const c = fs_collection_1.makeFSCollection();
|
|
183
|
+
const c = (0, fs_collection_1.makeFSCollection)();
|
|
181
184
|
for (let fsName of folders) {
|
|
182
185
|
await c.set(fsName, {
|
|
183
186
|
isFolder: true,
|
|
@@ -187,15 +190,20 @@ class StorageAndFS {
|
|
|
187
190
|
return c;
|
|
188
191
|
}
|
|
189
192
|
async close() {
|
|
193
|
+
var _a;
|
|
190
194
|
if (!this.rootFS) {
|
|
191
195
|
return;
|
|
192
196
|
}
|
|
197
|
+
(_a = this.syncedAppDataRoots) === null || _a === void 0 ? void 0 : _a.stopSync();
|
|
193
198
|
await this.rootFS.close();
|
|
194
199
|
await this.storage.close();
|
|
200
|
+
this.syncedAppDataRoots = undefined;
|
|
195
201
|
this.rootFS = undefined;
|
|
196
202
|
this.storage = undefined;
|
|
197
203
|
}
|
|
198
204
|
}
|
|
205
|
+
Object.freeze(StorageAndFS.prototype);
|
|
206
|
+
Object.freeze(StorageAndFS);
|
|
199
207
|
class Storages {
|
|
200
208
|
constructor(cryptor, storageDirForUser) {
|
|
201
209
|
this.cryptor = cryptor;
|
|
@@ -266,7 +274,7 @@ class Storages {
|
|
|
266
274
|
return;
|
|
267
275
|
}
|
|
268
276
|
const key = await keyGen(params);
|
|
269
|
-
this.local = await StorageAndFS.existing(await storage_2.LocalStorage.makeAndStart(path_1.join(storageDir, LOCAL_STORAGE_DIR), this.storageGetterForLocalStorage, this.cryptor, logError), key);
|
|
277
|
+
this.local = await StorageAndFS.existing(await storage_2.LocalStorage.makeAndStart((0, path_1.join)(storageDir, LOCAL_STORAGE_DIR), this.storageGetterForLocalStorage, this.cryptor, logError), key);
|
|
270
278
|
if (!this.local) {
|
|
271
279
|
return;
|
|
272
280
|
}
|
|
@@ -274,25 +282,25 @@ class Storages {
|
|
|
274
282
|
if (this.synced) {
|
|
275
283
|
return true;
|
|
276
284
|
}
|
|
277
|
-
const { startObjProcs, syncedStore } = await storage_1.SyncedStore.makeAndStart(path_1.join(storageDir, SYNCED_STORAGE_DIR), user, getSigner, this.storageGetterForSyncedStorage, this.cryptor, () => resolver(user), makeNet, logError);
|
|
285
|
+
const { startObjProcs, syncedStore } = await storage_1.SyncedStore.makeAndStart((0, path_1.join)(storageDir, SYNCED_STORAGE_DIR), user, getSigner, this.storageGetterForSyncedStorage, this.cryptor, () => resolver(user), makeNet(), logError);
|
|
278
286
|
this.synced = await StorageAndFS.existing(syncedStore, key);
|
|
279
287
|
key.fill(0);
|
|
280
288
|
if (!this.synced) {
|
|
281
289
|
return false;
|
|
282
290
|
}
|
|
283
|
-
|
|
291
|
+
startObjProcs();
|
|
284
292
|
return true;
|
|
285
293
|
};
|
|
286
294
|
}
|
|
287
295
|
async initFromRemote(user, getSigner, keyOrGen, makeNet, resolver, logError) {
|
|
288
296
|
const storageDir = this.storageDirForUser(user);
|
|
289
|
-
const { startObjProcs, syncedStore } = await storage_1.SyncedStore.makeAndStart(path_1.join(storageDir, SYNCED_STORAGE_DIR), user, getSigner, this.storageGetterForSyncedStorage, this.cryptor, () => resolver(user), makeNet, logError);
|
|
297
|
+
const { startObjProcs, syncedStore } = await storage_1.SyncedStore.makeAndStart((0, path_1.join)(storageDir, SYNCED_STORAGE_DIR), user, getSigner, this.storageGetterForSyncedStorage, this.cryptor, () => resolver(user), makeNet(), logError);
|
|
290
298
|
// getting parameters records them locally on a disk
|
|
291
299
|
const params = await getRootKeyDerivParams(storageDir, syncedStore.getRootKeyDerivParamsFromServer);
|
|
292
300
|
const key = ((typeof keyOrGen === 'function') ?
|
|
293
301
|
await keyOrGen(params) : keyOrGen);
|
|
294
302
|
this.synced = await StorageAndFS.newOrExisting(syncedStore, key);
|
|
295
|
-
this.local = await StorageAndFS.newOrExisting(await storage_2.LocalStorage.makeAndStart(path_1.join(storageDir, LOCAL_STORAGE_DIR), this.storageGetterForLocalStorage, this.cryptor, logError), key);
|
|
303
|
+
this.local = await StorageAndFS.newOrExisting(await storage_2.LocalStorage.makeAndStart((0, path_1.join)(storageDir, LOCAL_STORAGE_DIR), this.storageGetterForLocalStorage, this.cryptor, logError), key);
|
|
296
304
|
key.fill(0);
|
|
297
305
|
startObjProcs();
|
|
298
306
|
return (!!this.synced && !!this.local);
|
|
@@ -316,7 +324,7 @@ class Storages {
|
|
|
316
324
|
fs = await this.local.userFS();
|
|
317
325
|
}
|
|
318
326
|
else if (type === 'device') {
|
|
319
|
-
fs = await userFilesOnDevice();
|
|
327
|
+
fs = await (0, system_folders_1.userFilesOnDevice)();
|
|
320
328
|
}
|
|
321
329
|
else {
|
|
322
330
|
throw new Error(`Unknown storage type ${type}`);
|
|
@@ -342,7 +350,7 @@ class Storages {
|
|
|
342
350
|
};
|
|
343
351
|
}
|
|
344
352
|
else if (type === 'device') {
|
|
345
|
-
return sysFilesOnDevice();
|
|
353
|
+
return (0, system_folders_1.sysFilesOnDevice)();
|
|
346
354
|
}
|
|
347
355
|
else {
|
|
348
356
|
throw new Error(`Unknown storage type ${type}`);
|
|
@@ -372,33 +380,6 @@ class Storages {
|
|
|
372
380
|
exports.Storages = Storages;
|
|
373
381
|
Object.freeze(Storages.prototype);
|
|
374
382
|
Object.freeze(Storages);
|
|
375
|
-
async function userFilesOnDevice() {
|
|
376
|
-
if (process.platform === 'win32') {
|
|
377
|
-
return device_fs_1.DeviceFS.makeWritable(process.env.USERPROFILE);
|
|
378
|
-
}
|
|
379
|
-
else {
|
|
380
|
-
return device_fs_1.DeviceFS.makeWritable(process.env.HOME);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
exports.userFilesOnDevice = userFilesOnDevice;
|
|
384
|
-
async function sysFilesOnDevice() {
|
|
385
|
-
const c = fs_collection_1.makeFSCollection();
|
|
386
|
-
if (process.platform === 'win32') {
|
|
387
|
-
const sysDrive = process.env.SystemDrive;
|
|
388
|
-
await c.set(sysDrive, {
|
|
389
|
-
isFolder: true,
|
|
390
|
-
item: await device_fs_1.DeviceFS.makeWritable(sysDrive)
|
|
391
|
-
});
|
|
392
|
-
}
|
|
393
|
-
else {
|
|
394
|
-
await c.set('', {
|
|
395
|
-
isFolder: true,
|
|
396
|
-
item: await device_fs_1.DeviceFS.makeWritable('/')
|
|
397
|
-
});
|
|
398
|
-
}
|
|
399
|
-
return { isCollection: true, item: c };
|
|
400
|
-
}
|
|
401
|
-
exports.sysFilesOnDevice = sysFilesOnDevice;
|
|
402
383
|
function reverseDomain(domain) {
|
|
403
384
|
return domain.split('.').reverse().join('.');
|
|
404
385
|
}
|
|
@@ -456,8 +437,7 @@ class PerAppStorage {
|
|
|
456
437
|
if (typeof appFolder !== 'string') {
|
|
457
438
|
throw makeBadAppNameExc(appFolder);
|
|
458
439
|
}
|
|
459
|
-
if (CORE_APPS_PREFIX
|
|
460
|
-
appFolder.substring(0, CORE_APPS_PREFIX.length)) {
|
|
440
|
+
if (appFolder.startsWith(CORE_APPS_PREFIX)) {
|
|
461
441
|
throw makeNotAllowedToOpenAppFSExc(appFolder);
|
|
462
442
|
}
|
|
463
443
|
if (!this.policy.canOpenAppFS(appFolder, type)) {
|
|
@@ -523,10 +503,10 @@ async function applyPolicyToFS(fs, policy, path) {
|
|
|
523
503
|
async function applyPolicyToFSCollection(c, policy, path) {
|
|
524
504
|
if (path === undefined) {
|
|
525
505
|
if (policy === 'w') {
|
|
526
|
-
return fs_collection_1.readonlyWrapFSCollection(c);
|
|
506
|
+
return (0, fs_collection_1.readonlyWrapFSCollection)(c);
|
|
527
507
|
}
|
|
528
508
|
else {
|
|
529
|
-
const roFSs = fs_collection_1.makeFSCollection();
|
|
509
|
+
const roFSs = (0, fs_collection_1.makeFSCollection)();
|
|
530
510
|
for (const v of (await c.getAll())) {
|
|
531
511
|
const fs = v[1].item;
|
|
532
512
|
if (!v[1].isFolder || !fs || !fs.listFolder) {
|
|
@@ -535,15 +515,15 @@ async function applyPolicyToFSCollection(c, policy, path) {
|
|
|
535
515
|
v[1].item = await v[1].item.readonlySubRoot('/');
|
|
536
516
|
await roFSs.set(v[0], v[1]);
|
|
537
517
|
}
|
|
538
|
-
return fs_collection_1.readonlyWrapFSCollection(roFSs);
|
|
518
|
+
return (0, fs_collection_1.readonlyWrapFSCollection)(roFSs);
|
|
539
519
|
}
|
|
540
520
|
}
|
|
541
521
|
if (path.startsWith('/')) {
|
|
542
522
|
path = path.substring(1);
|
|
543
523
|
}
|
|
544
|
-
const nameAndItem = await async_iter_1.asyncFind(await c.entries(), async (v) => path.startsWith(v[0]));
|
|
524
|
+
const nameAndItem = await (0, async_iter_1.asyncFind)(await c.entries(), async (v) => path.startsWith(v[0]));
|
|
545
525
|
if (!nameAndItem) {
|
|
546
|
-
throw file_1.makeFileException(file_1.Code.notFound, path);
|
|
526
|
+
throw (0, file_1.makeFileException)(file_1.Code.notFound, path);
|
|
547
527
|
}
|
|
548
528
|
const [name, item] = nameAndItem;
|
|
549
529
|
path = path.substring(name.length);
|
|
@@ -19,4 +19,6 @@ export declare class GC {
|
|
|
19
19
|
constructor(rmObjFromCache: (obj: LocalObj) => void, rmObjFolder: (objId: string) => Promise<void>);
|
|
20
20
|
scheduleCollection: (obj: LocalObj) => void;
|
|
21
21
|
private objCollecting;
|
|
22
|
+
private collectIn;
|
|
23
|
+
private checkAndRemoveWholeObjFolder;
|
|
22
24
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/*
|
|
3
|
-
Copyright (C) 2016 - 2020 3NSoft Inc.
|
|
3
|
+
Copyright (C) 2016 - 2020, 2022 3NSoft Inc.
|
|
4
4
|
|
|
5
5
|
This program is free software: you can redistribute it and/or modify it under
|
|
6
6
|
the terms of the GNU General Public License as published by the Free Software
|
|
@@ -13,12 +13,14 @@
|
|
|
13
13
|
See the GNU General Public License for more details.
|
|
14
14
|
|
|
15
15
|
You should have received a copy of the GNU General Public License along with
|
|
16
|
-
this program. If not, see <http://www.gnu.org/licenses/>.
|
|
16
|
+
this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
|
+
*/
|
|
17
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
19
|
exports.GC = void 0;
|
|
19
20
|
const fs = require("../../../lib-common/async-fs-node");
|
|
20
|
-
const
|
|
21
|
+
const synced_1 = require("../../../lib-common/processes/synced");
|
|
21
22
|
const path_1 = require("path");
|
|
23
|
+
const utils_1 = require("../common/utils");
|
|
22
24
|
class GC {
|
|
23
25
|
constructor(rmObjFromCache, rmObjFolder) {
|
|
24
26
|
this.rmObjFromCache = rmObjFromCache;
|
|
@@ -26,7 +28,7 @@ class GC {
|
|
|
26
28
|
/**
|
|
27
29
|
* All gc steps are done in this process.
|
|
28
30
|
*/
|
|
29
|
-
this.gcProc = new
|
|
31
|
+
this.gcProc = new synced_1.SingleProc();
|
|
30
32
|
/**
|
|
31
33
|
* wip are objects that are currently processed. When wip set is empty,
|
|
32
34
|
* it gets swapped with non-empty scheduled set.
|
|
@@ -48,53 +50,65 @@ class GC {
|
|
|
48
50
|
if (this.wip.size === 0) {
|
|
49
51
|
[this.wip, this.scheduled] = [this.scheduled, this.wip];
|
|
50
52
|
}
|
|
51
|
-
const obj = getAndRemoveOneFrom(this.wip);
|
|
53
|
+
const obj = (0, utils_1.getAndRemoveOneFrom)(this.wip);
|
|
52
54
|
if (!obj) {
|
|
53
55
|
return;
|
|
54
56
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
// if object is set archived, and there is nothing in it worth keeping,
|
|
58
|
-
// whole folder can be removed
|
|
59
|
-
if (obj.isArchived()) {
|
|
60
|
-
if (nonGarbage.size === 0) {
|
|
61
|
-
this.rmObjFromCache(obj);
|
|
62
|
-
if (obj.objId) {
|
|
63
|
-
await this.rmObjFolder(obj.objId);
|
|
64
|
-
}
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
// for all other cases, we remove version files that are not worth
|
|
69
|
-
// keeping.
|
|
70
|
-
const lst = await fs.readdir(obj.objFolder);
|
|
71
|
-
const rmProcs = [];
|
|
72
|
-
for (const f of lst) {
|
|
73
|
-
const ver = parseInt(f);
|
|
74
|
-
if (isNaN(ver) || nonGarbage.has(ver)
|
|
75
|
-
|| (gcMaxVer && (ver >= gcMaxVer))) {
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
rmProcs.push(fs.unlink(path_1.join(obj.objFolder, f)).catch(() => { }));
|
|
79
|
-
}
|
|
80
|
-
while (rmProcs.length > 0) {
|
|
81
|
-
await rmProcs.pop();
|
|
57
|
+
try {
|
|
58
|
+
await this.collectIn(obj);
|
|
82
59
|
}
|
|
60
|
+
catch (err) { }
|
|
83
61
|
return this.objCollecting();
|
|
84
62
|
};
|
|
85
63
|
Object.seal(this);
|
|
86
64
|
}
|
|
65
|
+
async collectIn(obj) {
|
|
66
|
+
const nonGarbage = obj.statusObj().getNonGarbageVersions();
|
|
67
|
+
if (!(await this.checkAndRemoveWholeObjFolder(obj, nonGarbage))) {
|
|
68
|
+
await removeGarbageFiles(obj, nonGarbage);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async checkAndRemoveWholeObjFolder(obj, { nonGarbage }) {
|
|
72
|
+
// if object is set archived, and there is nothing in it worth keeping,
|
|
73
|
+
// whole folder can be removed
|
|
74
|
+
if (obj.objId
|
|
75
|
+
&& obj.statusObj().isArchived()
|
|
76
|
+
&& (nonGarbage.size === 0)) {
|
|
77
|
+
this.rmObjFromCache(obj);
|
|
78
|
+
await this.rmObjFolder(obj.objId);
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
87
85
|
}
|
|
88
86
|
exports.GC = GC;
|
|
89
87
|
Object.freeze(GC.prototype);
|
|
90
88
|
Object.freeze(GC);
|
|
91
|
-
function
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
89
|
+
async function removeGarbageFiles(obj, nonGarbage) {
|
|
90
|
+
const lst = await fs.readdir(obj.objFolder);
|
|
91
|
+
const rmProcs = [];
|
|
92
|
+
for (const f of lst) {
|
|
93
|
+
if (canGC(f, nonGarbage)) {
|
|
94
|
+
rmProcs.push(fs.unlink((0, path_1.join)(obj.objFolder, f)).catch(utils_1.noop));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (rmProcs.length > 0) {
|
|
98
|
+
await Promise.all(rmProcs);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function canGC(f, { gcMaxVer, nonGarbage }) {
|
|
102
|
+
const ver = parseInt(f);
|
|
103
|
+
if (isNaN(ver)) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
else if (!nonGarbage.has(ver)
|
|
107
|
+
&& (!gcMaxVer || (ver < gcMaxVer))) {
|
|
108
|
+
return true;
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
return false;
|
|
96
112
|
}
|
|
97
|
-
set.delete(value);
|
|
98
|
-
return value;
|
|
99
113
|
}
|
|
100
114
|
Object.freeze(exports);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { ObjId } from '../../../lib-client/3nstorage/xsp-fs/common';
|
|
1
|
+
import { LocalObjStatus, ObjId } from '../../../lib-client/3nstorage/xsp-fs/common';
|
|
2
2
|
import { ObjSource, Subscribe } from 'xsp-files';
|
|
3
3
|
import { GC } from './obj-files-gc';
|
|
4
|
+
import { ObjStatus } from './obj-status';
|
|
4
5
|
import { LogError } from '../../../lib-client/logging/log-to-file';
|
|
5
6
|
export declare class ObjFiles {
|
|
6
7
|
private readonly folders;
|
|
@@ -23,18 +24,14 @@ export declare class LocalObj {
|
|
|
23
24
|
private readonly scheduleGC;
|
|
24
25
|
private readonly verObjs;
|
|
25
26
|
private constructor();
|
|
26
|
-
static forExistingObj(objId: ObjId, objFolder: string, scheduleGC: GC['scheduleCollection']): Promise<LocalObj>;
|
|
27
|
-
static forNewObj(objId: ObjId, objFolder: string, scheduleGC: GC['scheduleCollection']): Promise<LocalObj>;
|
|
27
|
+
static forExistingObj(objId: ObjId, objFolder: string, scheduleGC: GC['scheduleCollection'], logError: LogError | undefined): Promise<LocalObj>;
|
|
28
|
+
static forNewObj(objId: ObjId, objFolder: string, scheduleGC: GC['scheduleCollection'], logError: LogError | undefined): Promise<LocalObj>;
|
|
28
29
|
private path;
|
|
29
30
|
getObjSrc(version: number): Promise<ObjSource>;
|
|
30
31
|
private objSegsGetterFromDisk;
|
|
31
32
|
saveNewVersion(version: number, encSub: Subscribe): Promise<void>;
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
getNonGarbageVersions(): {
|
|
35
|
-
gcMaxVer: number | undefined;
|
|
36
|
-
nonGarbage: Set<number>;
|
|
37
|
-
};
|
|
33
|
+
localStatus(): LocalObjStatus;
|
|
34
|
+
statusObj(): ObjStatus;
|
|
38
35
|
removeCurrentVersion(): Promise<void>;
|
|
39
36
|
removeArchivedVersion(version: number): Promise<void>;
|
|
40
37
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/*
|
|
3
|
-
Copyright (C) 2016 - 2020 3NSoft Inc.
|
|
3
|
+
Copyright (C) 2016 - 2020, 2022 3NSoft Inc.
|
|
4
4
|
|
|
5
5
|
This program is free software: you can redistribute it and/or modify it under
|
|
6
6
|
the terms of the GNU General Public License as published by the Free Software
|
|
@@ -19,7 +19,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
19
19
|
exports.LocalObj = exports.ObjFiles = void 0;
|
|
20
20
|
const obj_folders_1 = require("../../../lib-client/objs-on-disk/obj-folders");
|
|
21
21
|
const obj_on_disk_1 = require("../../../lib-client/objs-on-disk/obj-on-disk");
|
|
22
|
-
const
|
|
22
|
+
const synced_1 = require("../../../lib-common/processes/synced");
|
|
23
23
|
const path_1 = require("path");
|
|
24
24
|
const obj_files_gc_1 = require("./obj-files-gc");
|
|
25
25
|
const obj_status_1 = require("./obj-status");
|
|
@@ -28,8 +28,8 @@ class ObjFiles {
|
|
|
28
28
|
constructor(folders, logError) {
|
|
29
29
|
this.folders = folders;
|
|
30
30
|
this.logError = logError;
|
|
31
|
-
this.objs = timed_cache_1.makeTimedCache(60 * 1000);
|
|
32
|
-
this.folderAccessSyncProc = new
|
|
31
|
+
this.objs = (0, timed_cache_1.makeTimedCache)(60 * 1000);
|
|
32
|
+
this.folderAccessSyncProc = new synced_1.NamedProcs();
|
|
33
33
|
this.gc = new obj_files_gc_1.GC(obj => {
|
|
34
34
|
if (this.objs.get(obj.objId) === obj) {
|
|
35
35
|
this.objs.delete(obj.objId);
|
|
@@ -55,7 +55,7 @@ class ObjFiles {
|
|
|
55
55
|
if (!folder) {
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
|
-
obj = await LocalObj.forExistingObj(objId, folder, this.gc.scheduleCollection);
|
|
58
|
+
obj = await LocalObj.forExistingObj(objId, folder, this.gc.scheduleCollection, this.logError);
|
|
59
59
|
this.objs.set(objId, obj);
|
|
60
60
|
return obj;
|
|
61
61
|
});
|
|
@@ -63,7 +63,7 @@ class ObjFiles {
|
|
|
63
63
|
async makeNewObj(objId) {
|
|
64
64
|
return this.sync(objId, async () => {
|
|
65
65
|
const folder = await this.folders.getFolderAccessFor(objId, true);
|
|
66
|
-
const obj = await LocalObj.forNewObj(objId, folder, this.gc.scheduleCollection);
|
|
66
|
+
const obj = await LocalObj.forNewObj(objId, folder, this.gc.scheduleCollection, this.logError);
|
|
67
67
|
this.objs.set(objId, obj);
|
|
68
68
|
return obj;
|
|
69
69
|
});
|
|
@@ -99,7 +99,7 @@ class LocalObj {
|
|
|
99
99
|
this.objFolder = objFolder;
|
|
100
100
|
this.status = status;
|
|
101
101
|
this.scheduleGC = scheduleGC;
|
|
102
|
-
this.verObjs = timed_cache_1.makeTimedCache(60 * 1000);
|
|
102
|
+
this.verObjs = (0, timed_cache_1.makeTimedCache)(60 * 1000);
|
|
103
103
|
this.objSegsGetterFromDisk = async (ver, ofs, len) => {
|
|
104
104
|
let obj = this.verObjs.get(ver);
|
|
105
105
|
if (!obj) {
|
|
@@ -111,16 +111,16 @@ class LocalObj {
|
|
|
111
111
|
};
|
|
112
112
|
Object.freeze(this);
|
|
113
113
|
}
|
|
114
|
-
static async forExistingObj(objId, objFolder, scheduleGC) {
|
|
115
|
-
const status = await obj_status_1.ObjStatus.readFrom(objFolder, objId);
|
|
114
|
+
static async forExistingObj(objId, objFolder, scheduleGC, logError) {
|
|
115
|
+
const status = await obj_status_1.ObjStatus.readFrom(objFolder, objId, logError);
|
|
116
116
|
return new LocalObj(objId, objFolder, status, scheduleGC);
|
|
117
117
|
}
|
|
118
|
-
static async forNewObj(objId, objFolder, scheduleGC) {
|
|
119
|
-
const status = await obj_status_1.ObjStatus.makeNew(objFolder, objId);
|
|
118
|
+
static async forNewObj(objId, objFolder, scheduleGC, logError) {
|
|
119
|
+
const status = await obj_status_1.ObjStatus.makeNew(objFolder, objId, logError);
|
|
120
120
|
return new LocalObj(objId, objFolder, status, scheduleGC);
|
|
121
121
|
}
|
|
122
122
|
path(version) {
|
|
123
|
-
return path_1.join(this.objFolder, `${version}.v`);
|
|
123
|
+
return (0, path_1.join)(this.objFolder, `${version}.v`);
|
|
124
124
|
}
|
|
125
125
|
async getObjSrc(version) {
|
|
126
126
|
let obj = this.verObjs.get(version);
|
|
@@ -152,14 +152,11 @@ class LocalObj {
|
|
|
152
152
|
await this.status.setNewCurrentVersion(version, obj.getBaseVersion());
|
|
153
153
|
this.scheduleGC(this);
|
|
154
154
|
}
|
|
155
|
-
|
|
156
|
-
return this.status
|
|
155
|
+
localStatus() {
|
|
156
|
+
return this.status;
|
|
157
157
|
}
|
|
158
|
-
|
|
159
|
-
return this.status
|
|
160
|
-
}
|
|
161
|
-
getNonGarbageVersions() {
|
|
162
|
-
return this.status.getNonGarbageVersions();
|
|
158
|
+
statusObj() {
|
|
159
|
+
return this.status;
|
|
163
160
|
}
|
|
164
161
|
async removeCurrentVersion() {
|
|
165
162
|
await this.status.removeCurrentVersion(this.verObjs);
|
|
@@ -1,45 +1,35 @@
|
|
|
1
|
-
import { ObjId } from '../../../lib-client/3nstorage/xsp-fs/common';
|
|
1
|
+
import { LocalObjStatus, ObjId } from '../../../lib-client/3nstorage/xsp-fs/common';
|
|
2
|
+
import { VersionsInfo } from '../common/obj-info-file';
|
|
3
|
+
import { LogError } from '../../../lib-client/logging/log-to-file';
|
|
2
4
|
export interface ObjStatusInfo {
|
|
3
5
|
objId: ObjId;
|
|
4
6
|
isArchived?: boolean;
|
|
5
|
-
|
|
6
|
-
* This field indicates current object version in cache.
|
|
7
|
-
*/
|
|
8
|
-
currentVersion?: number;
|
|
9
|
-
/**
|
|
10
|
-
* This is a list of archived versions in the cache.
|
|
11
|
-
*/
|
|
12
|
-
archivedVersions: number[];
|
|
13
|
-
/**
|
|
14
|
-
* This is a map from base version to diff-ed version(s), that use(s) base.
|
|
15
|
-
*/
|
|
16
|
-
baseToDiff: {
|
|
17
|
-
[baseVersion: number]: number[];
|
|
18
|
-
};
|
|
19
|
-
/**
|
|
20
|
-
* This is a map from diff version to base version.
|
|
21
|
-
*/
|
|
22
|
-
diffToBase: {
|
|
23
|
-
[diffVersion: number]: number;
|
|
24
|
-
};
|
|
7
|
+
versions: VersionsInfo;
|
|
25
8
|
}
|
|
26
|
-
export declare class ObjStatus {
|
|
9
|
+
export declare class ObjStatus implements LocalObjStatus {
|
|
27
10
|
private readonly objFolder;
|
|
28
11
|
private readonly status;
|
|
12
|
+
private readonly logError;
|
|
29
13
|
private readonly saveProc;
|
|
30
|
-
constructor(objFolder: string, status: ObjStatusInfo);
|
|
31
|
-
static readFrom(objFolder: string, objId: ObjId): Promise<ObjStatus>;
|
|
32
|
-
static makeNew(objFolder: string, objId: ObjId): Promise<ObjStatus>;
|
|
33
|
-
private
|
|
14
|
+
constructor(objFolder: string, status: ObjStatusInfo, logError: LogError | undefined);
|
|
15
|
+
static readFrom(objFolder: string, objId: ObjId, logError: LogError | undefined): Promise<ObjStatus>;
|
|
16
|
+
static makeNew(objFolder: string, objId: ObjId, logError: LogError | undefined): Promise<ObjStatus>;
|
|
17
|
+
private triggerSaveProc;
|
|
34
18
|
isArchived(): boolean;
|
|
35
19
|
getCurrentVersionOrThrow(): number;
|
|
36
|
-
getNonGarbageVersions():
|
|
37
|
-
gcMaxVer: number | undefined;
|
|
38
|
-
nonGarbage: Set<number>;
|
|
39
|
-
};
|
|
20
|
+
getNonGarbageVersions(): NonGarbage;
|
|
40
21
|
setNewCurrentVersion(newVersion: number, baseVer: number | undefined): Promise<void>;
|
|
41
22
|
removeCurrentVersion(verObjs: ContainerWithDelete<number>): Promise<void>;
|
|
42
23
|
removeArchivedVersion(version: number, verObjs: ContainerWithDelete<number>): Promise<void>;
|
|
24
|
+
archiveCurrentVersion(): Promise<void>;
|
|
25
|
+
listVersions(): {
|
|
26
|
+
current?: number;
|
|
27
|
+
archived?: number[];
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export interface NonGarbage {
|
|
31
|
+
gcMaxVer?: number;
|
|
32
|
+
nonGarbage: Set<number>;
|
|
43
33
|
}
|
|
44
34
|
interface ContainerWithDelete<T> {
|
|
45
35
|
delete(key: T): void;
|