spec-3nweb-server 1.3.6 → 1.4.1
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/build/3nstorage/3nstorage-app.js +4 -4
- package/build/3nstorage/owner.js +21 -21
- package/build/3nstorage/resources/store.js +25 -24
- package/build/3nstorage/resources/users.js +2 -2
- package/build/3nstorage/routes/owner/archive-obj-version.d.ts +2 -2
- package/build/3nstorage/routes/owner/archive-obj-version.js +3 -2
- package/build/3nstorage/routes/owner/cancel-trans.js +1 -1
- package/build/3nstorage/routes/owner/delete-obj.js +1 -1
- package/build/3nstorage/routes/owner/get-archived-obj-ver.js +2 -2
- package/build/3nstorage/routes/owner/get-current-obj.js +2 -2
- package/build/3nstorage/routes/owner/list-obj-archive.js +3 -2
- package/build/3nstorage/routes/owner/param-getter.js +3 -2
- package/build/3nstorage/routes/owner/param-setter.js +3 -2
- package/build/3nstorage/routes/owner/put-current-obj.js +12 -10
- package/build/3nstorage/routes/owner/session-params.js +4 -3
- package/build/admin/admin-app.js +7 -5
- package/build/admin/resources/users.d.ts +10 -4
- package/build/admin/resources/users.js +90 -37
- package/build/admin/routes/add.js +3 -3
- package/build/admin/routes/get-available-domains.d.ts +3 -0
- package/build/admin/routes/get-available-domains.js +38 -0
- package/build/admin/signup-tokens.js +11 -11
- package/build/asmail/asmail-app.js +7 -7
- package/build/asmail/config.js +9 -8
- package/build/asmail/delivery.js +10 -9
- package/build/asmail/resources/delivery-sessions.js +4 -3
- package/build/asmail/resources/inbox.d.ts +1 -1
- package/build/asmail/resources/inbox.js +22 -22
- package/build/asmail/resources/recipients.d.ts +2 -1
- package/build/asmail/resources/recipients.js +4 -4
- package/build/asmail/resources/sessions.js +2 -1
- package/build/asmail/retrieval.js +13 -8
- package/build/asmail/routes/config/param-getter.js +3 -2
- package/build/asmail/routes/config/param-setter.js +3 -2
- package/build/asmail/routes/delivery/finalize-delivery.js +3 -2
- package/build/asmail/routes/delivery/pre-flight.js +5 -4
- package/build/asmail/routes/delivery/provide-recipient-pubkey.js +3 -2
- package/build/asmail/routes/delivery/put-metadata.js +3 -2
- package/build/asmail/routes/delivery/put-obj.js +4 -4
- package/build/asmail/routes/delivery/restart-session.js +4 -3
- package/build/asmail/routes/delivery/sender-authorization.d.ts +1 -3
- package/build/asmail/routes/delivery/sender-authorization.js +3 -2
- package/build/asmail/routes/delivery/start-session.js +5 -4
- package/build/asmail/routes/retrieval/get-message-meta.js +3 -2
- package/build/asmail/routes/retrieval/get-message-obj.js +4 -3
- package/build/asmail/routes/retrieval/list-messages.js +3 -2
- package/build/asmail/routes/retrieval/remove-message.js +3 -2
- package/build/lib-common/admin-api/signup.d.ts +9 -0
- package/build/lib-common/admin-api/signup.js +11 -2
- package/build/lib-common/async-fs-node.js +13 -13
- package/build/lib-common/byte-streaming/common.js +9 -9
- package/build/lib-common/canonical-address.js +1 -1
- package/build/lib-common/ipc/generic-ipc.js +12 -12
- package/build/lib-common/ipc/ws-ipc.js +2 -2
- package/build/lib-common/mid-sigs-NaCl-Ed.js +14 -14
- package/build/lib-common/objs-on-disk/file-layout.js +10 -10
- package/build/lib-common/objs-on-disk/obj-file.js +11 -11
- package/build/lib-common/objs-on-disk/utils.js +3 -3
- package/build/lib-common/processes.js +1 -1
- package/build/lib-common/random-node.js +7 -7
- package/build/lib-common/service-api/3nstorage/owner.d.ts +5 -4
- package/build/lib-common/service-api/3nstorage/owner.js +11 -10
- 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-server/conf-util.js +2 -1
- package/build/lib-server/middleware/body-parsers.js +16 -16
- package/build/lib-server/middleware/error-handler.js +1 -1
- package/build/lib-server/resources/mailerid-authorizer.js +3 -3
- package/build/lib-server/resources/mem-backed-sessions-factory.js +3 -3
- package/build/lib-server/resources/server-data-folders.js +23 -23
- package/build/lib-server/resources/sessions.js +5 -5
- package/build/lib-server/resources/user-files.js +8 -8
- package/build/lib-server/routes/pub-key-login/complete-exchange.js +4 -3
- package/build/lib-server/routes/pub-key-login/start-exchange.js +7 -6
- package/build/lib-server/routes/sessions/mid-auth.js +6 -5
- package/build/lib-server/routes/sessions/start.js +4 -3
- package/build/lib-server/web-sockets/app.js +6 -5
- package/build/lib-server/web-sockets/server-events.js +5 -4
- package/build/mailerId/mailerId-app.js +7 -7
- package/build/mailerId/resources/certifier.d.ts +4 -6
- package/build/mailerId/resources/certifier.js +8 -7
- package/build/mailerId/resources/compute-login-dhshared-key.js +2 -1
- package/build/mailerId/resources/sessions.js +2 -1
- package/build/mailerId/resources/users.js +4 -4
- package/build/mailerId/routes/certify.js +1 -1
- package/build/main.js +10 -10
- package/build/mock/dns.js +1 -1
- package/build/mock/mock-as-child-proc.js +10 -10
- package/build/mock/node-child-ipc.js +2 -2
- package/build/mock/run-in-proc.js +7 -7
- package/build/run-config.js +10 -10
- package/build/run.js +4 -4
- package/build/services.js +5 -5
- package/package.json +9 -6
|
@@ -44,13 +44,13 @@ function setupStaticEntryRoute(app) {
|
|
|
44
44
|
}
|
|
45
45
|
function makeApp(dataFolder, domain, midAuthorizer) {
|
|
46
46
|
const app = new app_1.AppWithWSs();
|
|
47
|
-
const ownersSessions = sessions_1.makeSessionFactory(20 * 60);
|
|
48
|
-
const sharingSessions = sessions_1.makeSessionFactory(20 * 60);
|
|
49
|
-
const users = users_1.makeFactory(dataFolder);
|
|
47
|
+
const ownersSessions = (0, sessions_1.makeSessionFactory)(20 * 60);
|
|
48
|
+
const sharingSessions = (0, sessions_1.makeSessionFactory)(20 * 60);
|
|
49
|
+
const users = (0, users_1.makeFactory)(dataFolder);
|
|
50
50
|
setupStaticEntryRoute(app.http);
|
|
51
51
|
app.use(PATHS.owner, owners.makeApp(domain, ownersSessions, users, midAuthorizer));
|
|
52
52
|
app.http.use(PATHS.shared, sharing.makeApp(sharingSessions, users));
|
|
53
|
-
app.http.use(error_handler_1.makeErrHandler((err, req) => {
|
|
53
|
+
app.http.use((0, error_handler_1.makeErrHandler)((err, req) => {
|
|
54
54
|
if (typeof err.status !== 'number') {
|
|
55
55
|
console.error(`\n --- Error occured in storage, when handling ${req.method} request to ${req.originalUrl}`);
|
|
56
56
|
console.error(err);
|
package/build/3nstorage/owner.js
CHANGED
|
@@ -59,44 +59,44 @@ const MAX_CHUNK_SIZE = '0.5mb';
|
|
|
59
59
|
function setHttpPart(app, domain, sessions, users, midAuthorizer) {
|
|
60
60
|
app.http.disable('etag');
|
|
61
61
|
// Login
|
|
62
|
-
app.http.post('/' + api.midLogin.START_URL_END, sessions.checkSession(), body_parsers_1.json('1kb'), start_1.startSession(users.exists, sessions.generate));
|
|
63
|
-
app.http.post('/' + api.midLogin.AUTH_URL_END, sessions.ensureOpenedSession(), body_parsers_1.json('4kb'), mid_auth_1.midLogin(domain, midAuthorizer));
|
|
62
|
+
app.http.post('/' + api.midLogin.START_URL_END, sessions.checkSession(), (0, body_parsers_1.json)('1kb'), (0, start_1.startSession)(users.exists, sessions.generate));
|
|
63
|
+
app.http.post('/' + api.midLogin.AUTH_URL_END, sessions.ensureOpenedSession(), (0, body_parsers_1.json)('4kb'), (0, mid_auth_1.midLogin)(domain, midAuthorizer));
|
|
64
64
|
// *** Require authorized session for everything below ***
|
|
65
65
|
app.http.use(sessions.ensureAuthorizedSession());
|
|
66
|
-
app.http.post('/' + api.closeSession.URL_END, body_parsers_1.emptyBody(), close_1.closeSession());
|
|
66
|
+
app.http.post('/' + api.closeSession.URL_END, (0, body_parsers_1.emptyBody)(), (0, close_1.closeSession)());
|
|
67
67
|
// Session params
|
|
68
|
-
app.http.get('/' + api.sessionParams.URL_END, session_params_1.sessionParams(MAX_CHUNK_SIZE));
|
|
68
|
+
app.http.get('/' + api.sessionParams.URL_END, (0, session_params_1.sessionParams)(MAX_CHUNK_SIZE));
|
|
69
69
|
// Key derivation params
|
|
70
70
|
app.http.route('/' + api.keyDerivParams.URL_END)
|
|
71
|
-
.get(param_getter_1.getParam(users.getKeyDerivParams))
|
|
72
|
-
.put(body_parsers_1.json('1kb'), param_setter_1.setParam(users.setKeyDerivParams));
|
|
71
|
+
.get((0, param_getter_1.getParam)(users.getKeyDerivParams))
|
|
72
|
+
.put((0, body_parsers_1.json)('1kb'), (0, param_setter_1.setParam)(users.setKeyDerivParams));
|
|
73
73
|
// Transaction canceling
|
|
74
|
-
app.http.post('/' + api.cancelTransaction.EXPRESS_URL_END, body_parsers_1.emptyBody(), cancel_trans_1.cancelTransaction(false, users.cancelTransaction));
|
|
75
|
-
app.http.post('/' + api.cancelRootTransaction.EXPRESS_URL_END, body_parsers_1.emptyBody(), cancel_trans_1.cancelTransaction(true, users.cancelTransaction));
|
|
74
|
+
app.http.post('/' + api.cancelTransaction.EXPRESS_URL_END, (0, body_parsers_1.emptyBody)(), (0, cancel_trans_1.cancelTransaction)(false, users.cancelTransaction));
|
|
75
|
+
app.http.post('/' + api.cancelRootTransaction.EXPRESS_URL_END, (0, body_parsers_1.emptyBody)(), (0, cancel_trans_1.cancelTransaction)(true, users.cancelTransaction));
|
|
76
76
|
// Getting current root object
|
|
77
77
|
app.http.route('/' + api.currentRootObj.EXPRESS_URL_END)
|
|
78
|
-
.get(get_current_obj_1.getCurrentObj(true, users.getCurrentRootObj))
|
|
79
|
-
.put(put_current_obj_1.saveCurrentObj(true, users.saveNewRootVersion, MAX_CHUNK_SIZE));
|
|
78
|
+
.get((0, get_current_obj_1.getCurrentObj)(true, users.getCurrentRootObj))
|
|
79
|
+
.put((0, put_current_obj_1.saveCurrentObj)(true, users.saveNewRootVersion, MAX_CHUNK_SIZE));
|
|
80
80
|
// Getting current non-root objects
|
|
81
81
|
app.http.route('/' + api.currentObj.EXPRESS_URL_END)
|
|
82
|
-
.get(get_current_obj_1.getCurrentObj(false, users.getCurrentObj))
|
|
83
|
-
.delete(delete_obj_1.deleteObj(false, true, users.deleteObj))
|
|
84
|
-
.put(put_current_obj_1.saveCurrentObj(false, users.saveNewObjVersion, MAX_CHUNK_SIZE));
|
|
82
|
+
.get((0, get_current_obj_1.getCurrentObj)(false, users.getCurrentObj))
|
|
83
|
+
.delete((0, delete_obj_1.deleteObj)(false, true, users.deleteObj))
|
|
84
|
+
.put((0, put_current_obj_1.saveCurrentObj)(false, users.saveNewObjVersion, MAX_CHUNK_SIZE));
|
|
85
85
|
// Archive root's current version
|
|
86
86
|
app.http.route('/' + api.archiveRoot.URL_END)
|
|
87
|
-
.get(list_obj_archive_1.listObjArchive(true, users.listObjArchive))
|
|
88
|
-
.put(body_parsers_1.emptyBody(), archive_obj_version_1.archiveCurrentObjVersion(true, users.archiveObjVersion));
|
|
87
|
+
.get((0, list_obj_archive_1.listObjArchive)(true, users.listObjArchive))
|
|
88
|
+
.put((0, body_parsers_1.emptyBody)(), (0, archive_obj_version_1.archiveCurrentObjVersion)(true, users.archiveObjVersion));
|
|
89
89
|
// Archive non-root object's current version
|
|
90
90
|
app.http.route('/' + api.archiveObj.EXPRESS_URL_END)
|
|
91
|
-
.get(list_obj_archive_1.listObjArchive(false, users.listObjArchive))
|
|
92
|
-
.put(body_parsers_1.emptyBody(), archive_obj_version_1.archiveCurrentObjVersion(false, users.archiveObjVersion));
|
|
91
|
+
.get((0, list_obj_archive_1.listObjArchive)(false, users.listObjArchive))
|
|
92
|
+
.put((0, body_parsers_1.emptyBody)(), (0, archive_obj_version_1.archiveCurrentObjVersion)(false, users.archiveObjVersion));
|
|
93
93
|
// Archived root versions
|
|
94
94
|
app.http.route('/' + api.archivedRootVersion.EXPRESS_URL_END)
|
|
95
|
-
.get(get_archived_obj_ver_1.getArchivedObjVersion(true, users.getArchivedRootVersion))
|
|
96
|
-
.delete(delete_obj_1.deleteObj(true, false, users.deleteObj));
|
|
95
|
+
.get((0, get_archived_obj_ver_1.getArchivedObjVersion)(true, users.getArchivedRootVersion))
|
|
96
|
+
.delete((0, delete_obj_1.deleteObj)(true, false, users.deleteObj));
|
|
97
97
|
// Removing archived and current versions of non-root object
|
|
98
98
|
app.http.route('/' + api.archivedObjVersion.EXPRESS_URL_END)
|
|
99
|
-
.get(get_archived_obj_ver_1.getArchivedObjVersion(true, users.getArchivedObjVersion))
|
|
100
|
-
.delete(delete_obj_1.deleteObj(false, false, users.deleteObj));
|
|
99
|
+
.get((0, get_archived_obj_ver_1.getArchivedObjVersion)(true, users.getArchivedObjVersion))
|
|
100
|
+
.delete((0, delete_obj_1.deleteObj)(false, false, users.deleteObj));
|
|
101
101
|
}
|
|
102
102
|
Object.freeze(exports);
|
|
@@ -131,7 +131,7 @@ class Store extends user_files_1.UserFiles {
|
|
|
131
131
|
Object.freeze(this);
|
|
132
132
|
}
|
|
133
133
|
static async make(userFolder, userId, storageEventsSink, writeBufferSize, readBufferSize) {
|
|
134
|
-
const path = path_1.join(userFolder, 'store');
|
|
134
|
+
const path = (0, path_1.join)(userFolder, 'store');
|
|
135
135
|
const store = new Store(userId, path, storageEventsSink, writeBufferSize, readBufferSize);
|
|
136
136
|
await store.ensureUserExistsOnDisk();
|
|
137
137
|
return store;
|
|
@@ -153,7 +153,7 @@ class Store extends user_files_1.UserFiles {
|
|
|
153
153
|
await spaceTracker.change(this, byteLen);
|
|
154
154
|
}
|
|
155
155
|
const params = {
|
|
156
|
-
isNewObj:
|
|
156
|
+
isNewObj: opts.create,
|
|
157
157
|
version: opts.ver,
|
|
158
158
|
baseVersion: (diff ? diff.baseVersion : undefined)
|
|
159
159
|
};
|
|
@@ -163,10 +163,10 @@ class Store extends user_files_1.UserFiles {
|
|
|
163
163
|
const filePath = this.transactions.objFileWritingPath(objId);
|
|
164
164
|
file = await this.objVerFiles.forNewFile(objId, trans.version, filePath);
|
|
165
165
|
if (diff) {
|
|
166
|
-
await file.setSegsLayout(utils_1.diffToLayout(diff), false);
|
|
166
|
+
await file.setSegsLayout((0, utils_1.diffToLayout)(diff), false);
|
|
167
167
|
}
|
|
168
|
-
const chunks = utils_1.chunksInOrderedStream(byteLen, opts.header, 0);
|
|
169
|
-
await utils_1.streamToObjFile(file, chunks, bytes, this.fileWritingBufferSize);
|
|
168
|
+
const chunks = (0, utils_1.chunksInOrderedStream)(byteLen, opts.header, 0);
|
|
169
|
+
await (0, utils_1.streamToObjFile)(file, chunks, bytes, this.fileWritingBufferSize);
|
|
170
170
|
if (opts.last) {
|
|
171
171
|
if (!file.isFileComplete()) {
|
|
172
172
|
throw exports.SC.OBJ_FILE_INCOMPLETE;
|
|
@@ -183,7 +183,7 @@ class Store extends user_files_1.UserFiles {
|
|
|
183
183
|
}
|
|
184
184
|
catch (err) {
|
|
185
185
|
await spaceTracker.change(this, -byteLen);
|
|
186
|
-
await this.transactions.cancel(objId, trans.transactionId).catch(
|
|
186
|
+
await this.transactions.cancel(objId, trans.transactionId).catch(noop);
|
|
187
187
|
throw err;
|
|
188
188
|
}
|
|
189
189
|
}
|
|
@@ -206,8 +206,8 @@ class Store extends user_files_1.UserFiles {
|
|
|
206
206
|
const file = await this.objVerFiles.forExistingFile(objId, trans.version, filePath);
|
|
207
207
|
if (byteLen > 0) {
|
|
208
208
|
await spaceTracker.change(this, byteLen);
|
|
209
|
-
const chunks = utils_1.chunksInOrderedStream(byteLen, undefined, opts.ofs);
|
|
210
|
-
await utils_1.streamToObjFile(file, chunks, bytes, this.fileWritingBufferSize);
|
|
209
|
+
const chunks = (0, utils_1.chunksInOrderedStream)(byteLen, undefined, opts.ofs);
|
|
210
|
+
await (0, utils_1.streamToObjFile)(file, chunks, bytes, this.fileWritingBufferSize);
|
|
211
211
|
}
|
|
212
212
|
if (opts.last) {
|
|
213
213
|
if (!file.isFileComplete()) {
|
|
@@ -302,14 +302,14 @@ class Store extends user_files_1.UserFiles {
|
|
|
302
302
|
len: (segBytesToRead + headerLen),
|
|
303
303
|
segsLen,
|
|
304
304
|
headerLen,
|
|
305
|
-
pipe: utils_1.makeObjPipe(file, true, segsOfs, segBytesToRead, objId, this.getObjFile)
|
|
305
|
+
pipe: (0, utils_1.makeObjPipe)(file, true, segsOfs, segBytesToRead, objId, this.getObjFile)
|
|
306
306
|
};
|
|
307
307
|
}
|
|
308
308
|
else {
|
|
309
309
|
reader = {
|
|
310
310
|
len: segBytesToRead,
|
|
311
311
|
segsLen,
|
|
312
|
-
pipe: utils_1.makeObjPipe(file, false, segsOfs, segBytesToRead, objId, this.getObjFile)
|
|
312
|
+
pipe: (0, utils_1.makeObjPipe)(file, false, segsOfs, segBytesToRead, objId, this.getObjFile)
|
|
313
313
|
};
|
|
314
314
|
}
|
|
315
315
|
Object.freeze(reader);
|
|
@@ -394,7 +394,7 @@ class Store extends user_files_1.UserFiles {
|
|
|
394
394
|
throw exports.SC.OBJ_UNKNOWN;
|
|
395
395
|
}
|
|
396
396
|
for (const fName of objFiles) {
|
|
397
|
-
await fs.unlink(path_1.join(objFolder, fName)).catch(() => { });
|
|
397
|
+
await fs.unlink((0, path_1.join)(objFolder, fName)).catch(() => { });
|
|
398
398
|
}
|
|
399
399
|
}
|
|
400
400
|
// XXX need both, archiving and removal transactions for atomic locking
|
|
@@ -501,8 +501,8 @@ class ObjStatuses {
|
|
|
501
501
|
}
|
|
502
502
|
objFolder(objId) {
|
|
503
503
|
return (objId ?
|
|
504
|
-
path_1.join(this.path, 'objects', objId) :
|
|
505
|
-
path_1.join(this.path, 'root'));
|
|
504
|
+
(0, path_1.join)(this.path, 'objects', objId) :
|
|
505
|
+
(0, path_1.join)(this.path, 'root'));
|
|
506
506
|
}
|
|
507
507
|
async get(objId) {
|
|
508
508
|
let status = this.cache.get(objId);
|
|
@@ -513,7 +513,7 @@ class ObjStatuses {
|
|
|
513
513
|
return status;
|
|
514
514
|
}
|
|
515
515
|
async fromFile(objId) {
|
|
516
|
-
const filePath = path_1.join(this.objFolder(objId), STATUS_FILE);
|
|
516
|
+
const filePath = (0, path_1.join)(this.objFolder(objId), STATUS_FILE);
|
|
517
517
|
const str = await fs.readFile(filePath, { encoding: 'utf8', flag: 'r' }).catch((exc) => {
|
|
518
518
|
if (exc.notFound) {
|
|
519
519
|
throw exports.SC.OBJ_UNKNOWN;
|
|
@@ -524,7 +524,7 @@ class ObjStatuses {
|
|
|
524
524
|
return JSON.parse(str);
|
|
525
525
|
}
|
|
526
526
|
catch (err) {
|
|
527
|
-
throw error_1.errWithCause(err, `Can't parse content of obj status file`);
|
|
527
|
+
throw (0, error_1.errWithCause)(err, `Can't parse content of obj status file`);
|
|
528
528
|
}
|
|
529
529
|
}
|
|
530
530
|
async set(objId, status) {
|
|
@@ -532,7 +532,7 @@ class ObjStatuses {
|
|
|
532
532
|
await this.saveToFile(objId, status);
|
|
533
533
|
}
|
|
534
534
|
async saveToFile(objId, status) {
|
|
535
|
-
const filePath = path_1.join(this.objFolder(objId), STATUS_FILE);
|
|
535
|
+
const filePath = (0, path_1.join)(this.objFolder(objId), STATUS_FILE);
|
|
536
536
|
const str = JSON.stringify(status);
|
|
537
537
|
const procId = (objId ? objId : 'null');
|
|
538
538
|
await this.saveProcs.startOrChain(procId, () => fs.writeFile(filePath, str, { encoding: 'utf8', flag: 'w' }));
|
|
@@ -540,7 +540,7 @@ class ObjStatuses {
|
|
|
540
540
|
async deleteWithObj(objId) {
|
|
541
541
|
this.cache.delete(objId);
|
|
542
542
|
if (objId === null) {
|
|
543
|
-
await fs.unlink(path_1.join(this.objFolder(null), STATUS_FILE))
|
|
543
|
+
await fs.unlink((0, path_1.join)(this.objFolder(null), STATUS_FILE))
|
|
544
544
|
.catch(() => { });
|
|
545
545
|
}
|
|
546
546
|
else {
|
|
@@ -571,7 +571,7 @@ class ObjStatuses {
|
|
|
571
571
|
});
|
|
572
572
|
}
|
|
573
573
|
objFileReadingPath(objId, version) {
|
|
574
|
-
return path_1.join(this.objFolder(objId), toFName(version));
|
|
574
|
+
return (0, path_1.join)(this.objFolder(objId), toFName(version));
|
|
575
575
|
}
|
|
576
576
|
}
|
|
577
577
|
Object.freeze(ObjStatuses.prototype);
|
|
@@ -587,8 +587,8 @@ class ObjTransactions {
|
|
|
587
587
|
}
|
|
588
588
|
transactionFolder(objId) {
|
|
589
589
|
return (objId ?
|
|
590
|
-
path_1.join(this.path, 'transactions', objId) :
|
|
591
|
-
path_1.join(this.path, 'root', 'transaction'));
|
|
590
|
+
(0, path_1.join)(this.path, 'transactions', objId) :
|
|
591
|
+
(0, path_1.join)(this.path, 'root', 'transaction'));
|
|
592
592
|
}
|
|
593
593
|
async get(objId, transactionId) {
|
|
594
594
|
let isInCache = true;
|
|
@@ -606,7 +606,7 @@ class ObjTransactions {
|
|
|
606
606
|
return trans;
|
|
607
607
|
}
|
|
608
608
|
transactionFilePath(objId) {
|
|
609
|
-
return path_1.join(this.transactionFolder(objId), 'transaction');
|
|
609
|
+
return (0, path_1.join)(this.transactionFolder(objId), 'transaction');
|
|
610
610
|
}
|
|
611
611
|
async fromFile(objId) {
|
|
612
612
|
const filePath = this.transactionFilePath(objId);
|
|
@@ -625,7 +625,7 @@ class ObjTransactions {
|
|
|
625
625
|
return JSON.parse(str);
|
|
626
626
|
}
|
|
627
627
|
catch (err) {
|
|
628
|
-
throw error_1.errWithCause(err, `Can't parse content of obj transaction file`);
|
|
628
|
+
throw (0, error_1.errWithCause)(err, `Can't parse content of obj transaction file`);
|
|
629
629
|
}
|
|
630
630
|
}
|
|
631
631
|
async set(objId, status) {
|
|
@@ -639,11 +639,11 @@ class ObjTransactions {
|
|
|
639
639
|
await this.saveProcs.startOrChain(procId, () => fs.writeFile(filePath, str, { encoding: 'utf8', flag: 'w' }));
|
|
640
640
|
}
|
|
641
641
|
objFileWritingPath(objId) {
|
|
642
|
-
return path_1.join(this.transactionFolder(objId), 'new');
|
|
642
|
+
return (0, path_1.join)(this.transactionFolder(objId), 'new');
|
|
643
643
|
}
|
|
644
644
|
async startNew(objId, reqTrans) {
|
|
645
645
|
const trans = reqTrans;
|
|
646
|
-
trans.transactionId = await random_node_1.stringOfB64UrlSafeChars(10);
|
|
646
|
+
trans.transactionId = await (0, random_node_1.stringOfB64UrlSafeChars)(10);
|
|
647
647
|
trans.transactionType = 'write';
|
|
648
648
|
await this.makeTransactionFolder(objId);
|
|
649
649
|
await this.set(objId, trans);
|
|
@@ -735,4 +735,5 @@ Object.freeze(ObjStatuses);
|
|
|
735
735
|
function toFName(version) {
|
|
736
736
|
return `${version}.`;
|
|
737
737
|
}
|
|
738
|
+
function noop() { }
|
|
738
739
|
Object.freeze(exports);
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
this program. If not, see <http://www.gnu.org/licenses/>.
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
-
exports.makeFactory = void 0;
|
|
19
|
+
exports.makeFactory = exports.SC = void 0;
|
|
20
20
|
const store_1 = require("./store");
|
|
21
21
|
const server_data_folders_1 = require("../../lib-server/resources/server-data-folders");
|
|
22
22
|
var store_2 = require("./store");
|
|
@@ -40,7 +40,7 @@ function makeFactory(rootFolder, writeBufferSize, readBufferSize) {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
else {
|
|
43
|
-
const userFolder = server_data_folders_1.userDataInRootFolder(rootFolder, userId);
|
|
43
|
+
const userFolder = (0, server_data_folders_1.userDataInRootFolder)(rootFolder, userId);
|
|
44
44
|
const store = await store_1.Store.make(userFolder, userId, storageEventsSink, writeBufferSize, readBufferSize);
|
|
45
45
|
stores.set(userId, store);
|
|
46
46
|
return store;
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { RequestHandler } from 'express';
|
|
2
2
|
import { ArchiveObjCurrentVersion } from '../../resources/users';
|
|
3
|
-
export declare function archiveCurrentObjVersion(root: boolean, archiveObjVerFunc: ArchiveObjCurrentVersion):
|
|
3
|
+
export declare function archiveCurrentObjVersion(root: boolean, archiveObjVerFunc: ArchiveObjCurrentVersion): RequestHandler;
|
|
@@ -13,7 +13,8 @@
|
|
|
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.archiveCurrentObjVersion = void 0;
|
|
19
20
|
const owner_1 = require("../../../lib-common/service-api/3nstorage/owner");
|
|
@@ -22,7 +23,7 @@ function archiveCurrentObjVersion(root, archiveObjVerFunc) {
|
|
|
22
23
|
if ('function' !== typeof archiveObjVerFunc) {
|
|
23
24
|
throw new TypeError("Given argument 'archiveObjVerFunc' must be function, but is not.");
|
|
24
25
|
}
|
|
25
|
-
return async
|
|
26
|
+
return async (req, res, next) => {
|
|
26
27
|
next(new Error('Not implemented, yet.'));
|
|
27
28
|
// const userId = req.session.params.userId;
|
|
28
29
|
// const objId: string = (root ? null : req.params.objId);
|
|
@@ -23,7 +23,7 @@ function cancelTransaction(root, cancelTransFunc) {
|
|
|
23
23
|
if ('function' !== typeof cancelTransFunc) {
|
|
24
24
|
throw new TypeError("Given argument 'cancelTransFunc' must be function, but is not.");
|
|
25
25
|
}
|
|
26
|
-
return async
|
|
26
|
+
return async (req, res, next) => {
|
|
27
27
|
const userId = req.session.params.userId;
|
|
28
28
|
const objId = (root ? null : req.params.objId);
|
|
29
29
|
const transactionId = req.params.transactionId;
|
|
@@ -23,7 +23,7 @@ function deleteObj(root, delCurrent, deleteObjFunc) {
|
|
|
23
23
|
if ('function' !== typeof deleteObjFunc) {
|
|
24
24
|
throw new TypeError("Given argument 'deleteObjFunc' must be function, but is not.");
|
|
25
25
|
}
|
|
26
|
-
return async
|
|
26
|
+
return async (req, res, next) => {
|
|
27
27
|
const userId = req.session.params.userId;
|
|
28
28
|
const objId = (root ? null : req.params.objId);
|
|
29
29
|
const version = (delCurrent ? null : req.params.version);
|
|
@@ -49,7 +49,7 @@ function getArchivedObjVersion(root, getArchivedObjFunc) {
|
|
|
49
49
|
if ('function' !== typeof getArchivedObjFunc) {
|
|
50
50
|
throw new TypeError("Given argument 'getArchivedObjFunc' must be function, but is not.");
|
|
51
51
|
}
|
|
52
|
-
return async
|
|
52
|
+
return async (req, res, next) => {
|
|
53
53
|
const userId = req.session.params.userId;
|
|
54
54
|
const objId = (root ? null : req.params.objId);
|
|
55
55
|
const opts = extractQueryOptions(req);
|
|
@@ -71,7 +71,7 @@ function getArchivedObjVersion(root, getArchivedObjFunc) {
|
|
|
71
71
|
await reader.pipe(res);
|
|
72
72
|
}
|
|
73
73
|
catch (err) {
|
|
74
|
-
console.error(error_1.errWithCause(err, `Wasn't able to complete sending segments due to error in piping`));
|
|
74
|
+
console.error((0, error_1.errWithCause)(err, `Wasn't able to complete sending segments due to error in piping`));
|
|
75
75
|
}
|
|
76
76
|
finally {
|
|
77
77
|
res.end();
|
|
@@ -54,7 +54,7 @@ function getCurrentObj(root, getCurrentObjFunc) {
|
|
|
54
54
|
if ('function' !== typeof getCurrentObjFunc) {
|
|
55
55
|
throw new TypeError("Given argument 'getCurrentObjFunc' must be function, but is not.");
|
|
56
56
|
}
|
|
57
|
-
return async
|
|
57
|
+
return async (req, res, next) => {
|
|
58
58
|
const userId = req.session.params.userId;
|
|
59
59
|
const objId = (root ? null : req.params.objId);
|
|
60
60
|
const opts = extractQueryOptions(req);
|
|
@@ -86,7 +86,7 @@ function getCurrentObj(root, getCurrentObjFunc) {
|
|
|
86
86
|
await reader.pipe(res);
|
|
87
87
|
}
|
|
88
88
|
catch (err) {
|
|
89
|
-
console.error(error_1.stringifyErr(error_1.errWithCause(err, `Wasn't able to complete sending segments due to error in piping`)));
|
|
89
|
+
console.error((0, error_1.stringifyErr)((0, error_1.errWithCause)(err, `Wasn't able to complete sending segments due to error in piping`)));
|
|
90
90
|
}
|
|
91
91
|
finally {
|
|
92
92
|
res.end();
|
|
@@ -13,14 +13,15 @@
|
|
|
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.listObjArchive = void 0;
|
|
19
20
|
function listObjArchive(root, listObjArchiveFunc) {
|
|
20
21
|
if ('function' !== typeof listObjArchiveFunc) {
|
|
21
22
|
throw new TypeError("Given argument 'listObjArchiveFunc' must be function, but is not.");
|
|
22
23
|
}
|
|
23
|
-
return async
|
|
24
|
+
return async (req, res, next) => {
|
|
24
25
|
next(new Error('Not implemented, yet.'));
|
|
25
26
|
// const userId = req.session.params.userId;
|
|
26
27
|
// const objId: string = (root ? null : req.params.objId);
|
|
@@ -13,7 +13,8 @@
|
|
|
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.getParam = void 0;
|
|
19
20
|
const users_1 = require("../../resources/users");
|
|
@@ -22,7 +23,7 @@ function getParam(paramGetter) {
|
|
|
22
23
|
if ('function' !== typeof paramGetter) {
|
|
23
24
|
throw new TypeError("Given argument 'paramGetter' must be function, but is not.");
|
|
24
25
|
}
|
|
25
|
-
return async
|
|
26
|
+
return async (req, res, next) => {
|
|
26
27
|
const session = req.session;
|
|
27
28
|
const userId = session.params.userId;
|
|
28
29
|
try {
|
|
@@ -13,7 +13,8 @@
|
|
|
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.setParam = void 0;
|
|
19
20
|
const users_1 = require("../../resources/users");
|
|
@@ -22,7 +23,7 @@ function setParam(paramSetter) {
|
|
|
22
23
|
if ('function' !== typeof paramSetter) {
|
|
23
24
|
throw new TypeError("Given argument 'paramSetter' must be function, but is not.");
|
|
24
25
|
}
|
|
25
|
-
return async
|
|
26
|
+
return async (req, res, next) => {
|
|
26
27
|
const session = req.session;
|
|
27
28
|
const userId = session.params.userId;
|
|
28
29
|
const pValue = req.body;
|
|
@@ -28,10 +28,10 @@ function saveCurrentObj(root, saveObjFunc, chunkLimit) {
|
|
|
28
28
|
if ('function' !== typeof saveObjFunc) {
|
|
29
29
|
throw new TypeError("Given argument 'saveObjFunc' must be function, but is not.");
|
|
30
30
|
}
|
|
31
|
-
const maxChunkSize = conf_util_1.stringToNumOfBytes(chunkLimit);
|
|
32
|
-
return async
|
|
31
|
+
const maxChunkSize = (0, conf_util_1.stringToNumOfBytes)(chunkLimit);
|
|
32
|
+
return async (req, res, next) => {
|
|
33
33
|
if (!req.is(owner_1.BIN_TYPE)) {
|
|
34
|
-
body_parsers_1.attachByteDrainToRequest(req);
|
|
34
|
+
(0, body_parsers_1.attachByteDrainToRequest)(req);
|
|
35
35
|
res.status(owner_1.ERR_SC.wrongContentType).json({
|
|
36
36
|
error: `Content-Type must be ${owner_1.BIN_TYPE} for this call.`
|
|
37
37
|
});
|
|
@@ -42,7 +42,7 @@ function saveCurrentObj(root, saveObjFunc, chunkLimit) {
|
|
|
42
42
|
// get and check Content-Length, implicitly sending replies for bad length
|
|
43
43
|
let len = getContentLenOrSendError(req, res, maxChunkSize);
|
|
44
44
|
if (len === undefined) {
|
|
45
|
-
body_parsers_1.attachByteDrainToRequest(req);
|
|
45
|
+
(0, body_parsers_1.attachByteDrainToRequest)(req);
|
|
46
46
|
return;
|
|
47
47
|
}
|
|
48
48
|
// extract and check query parameters
|
|
@@ -53,7 +53,7 @@ function saveCurrentObj(root, saveObjFunc, chunkLimit) {
|
|
|
53
53
|
const { fstReq, sndReq } = opts;
|
|
54
54
|
let diff;
|
|
55
55
|
if (fstReq) {
|
|
56
|
-
if (
|
|
56
|
+
if (fstReq.create && objId) {
|
|
57
57
|
if (!buffer_utils_1.base64urlSafe.allCharsFromAlphabet(objId)) {
|
|
58
58
|
return replyToMalformed(req, "Bad object id", res);
|
|
59
59
|
}
|
|
@@ -66,7 +66,7 @@ function saveCurrentObj(root, saveObjFunc, chunkLimit) {
|
|
|
66
66
|
}
|
|
67
67
|
// read diff, if it is expected
|
|
68
68
|
if (fstReq.diff) {
|
|
69
|
-
let diffBytes = await readChunkFrom(req, fstReq.diff).catch(
|
|
69
|
+
let diffBytes = await readChunkFrom(req, fstReq.diff).catch(noop);
|
|
70
70
|
if (diffBytes) {
|
|
71
71
|
len -= fstReq.diff;
|
|
72
72
|
}
|
|
@@ -75,7 +75,7 @@ function saveCurrentObj(root, saveObjFunc, chunkLimit) {
|
|
|
75
75
|
}
|
|
76
76
|
try {
|
|
77
77
|
const diffFromReq = JSON.parse(buffer_utils_1.utf8.open(diffBytes));
|
|
78
|
-
diff = owner_1.sanitizedDiff(diffFromReq, fstReq.ver);
|
|
78
|
+
diff = (0, owner_1.sanitizedDiff)(diffFromReq, fstReq.ver);
|
|
79
79
|
if (!diff) {
|
|
80
80
|
return replyToMalformed(req, "Malformed diff info", res);
|
|
81
81
|
}
|
|
@@ -171,6 +171,7 @@ function extractQueryOptions(req) {
|
|
|
171
171
|
// this is the first request
|
|
172
172
|
// query fields are string or undefined, yet, type info helps the show
|
|
173
173
|
const query = req.query;
|
|
174
|
+
const create = (query.create === 'true');
|
|
174
175
|
const ver = parseInt(query.ver);
|
|
175
176
|
if (isNaN(ver) || (ver < 1)) {
|
|
176
177
|
return;
|
|
@@ -186,7 +187,7 @@ function extractQueryOptions(req) {
|
|
|
186
187
|
return;
|
|
187
188
|
}
|
|
188
189
|
const last = (query.last === 'true');
|
|
189
|
-
return { fstReq: { diff, header, last, ver } };
|
|
190
|
+
return { fstReq: { diff, header, last, ver, create } };
|
|
190
191
|
}
|
|
191
192
|
}
|
|
192
193
|
function getContentLenOrSendError(req, res, maxChunkSize) {
|
|
@@ -219,7 +220,7 @@ function readChunkFrom(stream, bytesToRead) {
|
|
|
219
220
|
throw new Error(`Illegal number of bytes to read from stream: ${bytesToRead}`);
|
|
220
221
|
}
|
|
221
222
|
const buffer = new common_1.BytesFIFOBuffer();
|
|
222
|
-
let deferred = processes_1.defer();
|
|
223
|
+
let deferred = (0, processes_1.defer)();
|
|
223
224
|
const complete = (bytes, err) => {
|
|
224
225
|
if (!deferred) {
|
|
225
226
|
return;
|
|
@@ -270,7 +271,8 @@ function readChunkFrom(stream, bytesToRead) {
|
|
|
270
271
|
return deferred.promise;
|
|
271
272
|
}
|
|
272
273
|
function replyToMalformed(req, msg, res) {
|
|
273
|
-
body_parsers_1.attachByteDrainToRequest(req);
|
|
274
|
+
(0, body_parsers_1.attachByteDrainToRequest)(req);
|
|
274
275
|
res.status(owner_1.ERR_SC.malformed).json({ error: msg });
|
|
275
276
|
}
|
|
277
|
+
function noop() { }
|
|
276
278
|
Object.freeze(exports);
|
|
@@ -13,15 +13,16 @@
|
|
|
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.sessionParams = void 0;
|
|
19
20
|
const users_1 = require("../../resources/users");
|
|
20
21
|
const owner_1 = require("../../../lib-common/service-api/3nstorage/owner");
|
|
21
22
|
const conf_util_1 = require("../../../lib-server/conf-util");
|
|
22
23
|
function sessionParams(maxChunk) {
|
|
23
|
-
const maxChunkSize = conf_util_1.stringToNumOfBytes(maxChunk);
|
|
24
|
-
return async
|
|
24
|
+
const maxChunkSize = (0, conf_util_1.stringToNumOfBytes)(maxChunk);
|
|
25
|
+
return async (req, res, next) => {
|
|
25
26
|
const userId = req.session.params.userId;
|
|
26
27
|
try {
|
|
27
28
|
const reply = { maxChunkSize };
|
package/build/admin/admin-app.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/*
|
|
3
|
-
Copyright (C) 2015 - 2016, 2020 3NSoft Inc.
|
|
3
|
+
Copyright (C) 2015 - 2016, 2020 - 2021 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
|
|
@@ -23,22 +23,24 @@ const error_handler_1 = require("../lib-server/middleware/error-handler");
|
|
|
23
23
|
const users_1 = require("./resources/users");
|
|
24
24
|
const add_1 = require("./routes/add");
|
|
25
25
|
const get_available_addresses_1 = require("./routes/get-available-addresses");
|
|
26
|
+
const get_available_domains_1 = require("./routes/get-available-domains");
|
|
26
27
|
const signupApi = require("../lib-common/admin-api/signup");
|
|
27
28
|
function apiPart(users) {
|
|
28
29
|
const app = express();
|
|
29
30
|
app.disable('etag');
|
|
30
|
-
app.post('/' + signupApi.
|
|
31
|
-
app.post('/' + signupApi.
|
|
31
|
+
app.post('/' + signupApi.availableDomains.URL_END, (0, body_parsers_1.json)('1kb'), (0, get_available_domains_1.availableDomains)(users.getAvailableDomains));
|
|
32
|
+
app.post('/' + signupApi.availableAddressesForName.URL_END, (0, body_parsers_1.json)('1kb'), (0, get_available_addresses_1.availableAddresses)(users.getAvailableAddresses));
|
|
33
|
+
app.post('/' + signupApi.addUser.URL_END, (0, body_parsers_1.json)('4kb'), (0, add_1.addUser)(users.add));
|
|
32
34
|
return app;
|
|
33
35
|
}
|
|
34
36
|
function makeApp(conf) {
|
|
35
37
|
const app = express();
|
|
36
38
|
const noTokenFile = (conf.signup ? conf.signup.noTokenFile : undefined);
|
|
37
|
-
const users = users_1.makeFactory(conf.rootFolder, noTokenFile);
|
|
39
|
+
const users = (0, users_1.makeFactory)(conf.rootFolder, noTokenFile);
|
|
38
40
|
if (conf.signup) {
|
|
39
41
|
app.use('/signup', apiPart(users));
|
|
40
42
|
}
|
|
41
|
-
app.use(error_handler_1.makeErrHandler());
|
|
43
|
+
app.use((0, error_handler_1.makeErrHandler)());
|
|
42
44
|
return app;
|
|
43
45
|
}
|
|
44
46
|
exports.makeApp = makeApp;
|
|
@@ -6,16 +6,20 @@ export declare const SC: {
|
|
|
6
6
|
export declare function validateUserMidParams(params: UserMidParams): boolean;
|
|
7
7
|
export declare function validateUserStorageParams(params: UserStorageParams): boolean;
|
|
8
8
|
/**
|
|
9
|
-
* This returns a promise, resolvable to
|
|
10
|
-
*
|
|
11
|
-
*
|
|
9
|
+
* This returns a promise, resolvable to an array of domains, that are
|
|
10
|
+
* available for a given token. Array may be empty, when there are no
|
|
11
|
+
* such domains.
|
|
12
|
+
* @param signupToken
|
|
13
|
+
* @return a promise, resolvable to available addresses for a given name.
|
|
14
|
+
* If array is empty, there are no available addresses for a given name.
|
|
12
15
|
*/
|
|
13
|
-
export declare type
|
|
16
|
+
export declare type IAvailableDomains = (signupToken: string | undefined) => Promise<string[]>;
|
|
14
17
|
/**
|
|
15
18
|
* This returns a promise, resolvable to an array of addresses, that are
|
|
16
19
|
* available for a given string. Array may be empty, when there are no
|
|
17
20
|
* such addresses.
|
|
18
21
|
* @param name is a name part of address, or not a domain part.
|
|
22
|
+
* @param signupToken
|
|
19
23
|
* @return a promise, resolvable to available addresses for a given name.
|
|
20
24
|
* If array is empty, there are no available addresses for a given name.
|
|
21
25
|
*/
|
|
@@ -27,11 +31,13 @@ export declare type IAvailableAddressesForName = (name: string, signupToken: str
|
|
|
27
31
|
* but user-likable variant.
|
|
28
32
|
* @param midParams MailerId parameters to save
|
|
29
33
|
* @param storeParams storage parameters to save
|
|
34
|
+
* @param signupToken
|
|
30
35
|
* @return a promise, resolvable, when user is added, and all parameters are
|
|
31
36
|
* saved.
|
|
32
37
|
*/
|
|
33
38
|
export declare type IAdd = (userId: string, midParams: UserMidParams, storeParams: any, signupToken: string | undefined) => Promise<void>;
|
|
34
39
|
export interface Factory {
|
|
40
|
+
getAvailableDomains: IAvailableDomains;
|
|
35
41
|
getAvailableAddresses: IAvailableAddressesForName;
|
|
36
42
|
add: IAdd;
|
|
37
43
|
}
|