@comapeo/core 4.0.0 → 4.1.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/dist/constants.d.ts +1 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/discovery/local-discovery.d.ts.map +1 -1
- package/dist/errors.d.ts +0 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/invite/invite-api.d.ts.map +1 -1
- package/dist/mapeo-manager.d.ts.map +1 -1
- package/dist/mapeo-project.d.ts +5 -1
- package/dist/mapeo-project.d.ts.map +1 -1
- package/dist/member-api.d.ts +7 -2
- package/dist/member-api.d.ts.map +1 -1
- package/dist/roles.d.ts +3 -4
- package/dist/roles.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/constants.js +3 -0
- package/src/discovery/local-discovery.js +32 -11
- package/src/errors.js +0 -8
- package/src/invite/invite-api.js +31 -23
- package/src/mapeo-manager.js +58 -27
- package/src/mapeo-project.js +22 -13
- package/src/member-api.js +26 -22
- package/src/roles.js +0 -37
package/dist/constants.d.ts
CHANGED
|
@@ -11,5 +11,6 @@ export namespace NAMESPACE_SCHEMAS {
|
|
|
11
11
|
}
|
|
12
12
|
export const SUPPORTED_CONFIG_VERSION: 1;
|
|
13
13
|
export const DRIZZLE_MIGRATIONS_TABLE: "__drizzle_migrations";
|
|
14
|
+
export const UNIX_EPOCH_DATE: string;
|
|
14
15
|
import type { Namespace } from './types.js';
|
|
15
16
|
//# sourceMappingURL=constants.d.ts.map
|
package/dist/constants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.js"],"names":[],"mappings":"AAAA,8CAA8C;AAI9C,kFAME;AAEF,uCAAuC;AACvC,iCADW,aAAa,CAAC,SAAS,CAAC,CAC8B;AAEjE,uCAAuC;AACvC,8BADW,aAAa,CAAC,SAAS,CAAC,CAGlC;;;;;;AAeD,yCAAyC;AAGzC,8DAA8D;+
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.js"],"names":[],"mappings":"AAAA,8CAA8C;AAI9C,kFAME;AAEF,uCAAuC;AACvC,iCADW,aAAa,CAAC,SAAS,CAAC,CAC8B;AAEjE,uCAAuC;AACvC,8BADW,aAAa,CAAC,SAAS,CAAC,CAGlC;;;;;;AAeD,yCAAyC;AAGzC,8DAA8D;AAG9D,qCAAwD;+BAvCzB,YAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-discovery.d.ts","sourceRoot":"","sources":["../../src/discovery/local-discovery.js"],"names":[],"mappings":"AAqBA,mDAAmD;AAEnD;;;GAGG;AAEH;;GAEG;AACH;
|
|
1
|
+
{"version":3,"file":"local-discovery.d.ts","sourceRoot":"","sources":["../../src/discovery/local-discovery.js"],"names":[],"mappings":"AAqBA,mDAAmD;AAEnD;;;GAGG;AAEH;;GAEG;AACH;IAaE;;;;OAIG;IACH,yCAHG;QAAsB,eAAe,EAA7B,OAAO;QACO,MAAM;KAAC,EAqB/B;IAED,yDAAyD;IACzD,SADc,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAIpD;IAqBD;;;;;;OAMG;IACH,qCALG;QAAqB,OAAO,EAApB,MAAM;QACO,IAAI,EAAjB,MAAM;QACO,IAAI,EAAjB,MAAM;KACd,GAAU,IAAI,CAkBhB;IAqJD;;;;;;;;;OASG;IACH;;;oBAFa,OAAO,CAAC,IAAI,CAAC,CAIzB;;CA+BF;sBAxSa;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;mCACxC,kBAAkB,GAAG,CAAC,MAAM,CAAC;;gBAU7B,CAAC,UAAU,EAAE,oBAAoB,KAAK,IAAI;;6BAzB3B,oBAAoB;uBAU1B,cAAc;gBATrB,UAAU;uCAWa,uCAAuC"}
|
package/dist/errors.d.ts
CHANGED
|
@@ -22,10 +22,6 @@ export class ProjectDetailsSendFailError extends Error {
|
|
|
22
22
|
/** @param {string} [message] */
|
|
23
23
|
constructor(message?: string | undefined);
|
|
24
24
|
}
|
|
25
|
-
export class InviteInitialSyncFailError extends Error {
|
|
26
|
-
/** @param {string} [message] */
|
|
27
|
-
constructor(message?: string | undefined);
|
|
28
|
-
}
|
|
29
25
|
export class RPCDisconnectBeforeSendingError extends Error {
|
|
30
26
|
/** @param {string} [message] */
|
|
31
27
|
constructor(message?: string | undefined);
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.js"],"names":[],"mappings":"AA+DA;;;GAGG;AACH,oCAHW,OAAO,GACL,IAAI,CAKhB;AAtED;IACE,8BAGC;CACF;AAED;IACE,gCAAgC;IAChC,0CAGC;CACF;AAED;IACE,gCAAgC;IAChC,0CAGC;CACF;AAED;IACE,gCAAgC;IAChC,0CAGC;CACF;AAED;IACE,gCAAgC;IAChC,0CAGC;CACF;AAED;IACE,gCAAgC;IAChC,0CAGC;CACF;AAED;IACE,gCAAgC;IAChC,0CAGC;CACF;AAED;IACE,gCAAgC;IAChC,0CAGC;CACF"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":";;;AAgBO,0CAJI,YAAY,gKAEV,UAAU,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.js"],"names":[],"mappings":";;;AAgBO,0CAJI,YAAY,gKAEV,UAAU,yCAU4kmB,QAAQ,kBAAyB,SAAS,qDAV3kmB,CAG7B;;;;;;kCARH,oBAAoB;gCAL/C,YAAY;oCAAZ,YAAY;+BAAZ,YAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invite-api.d.ts","sourceRoot":"","sources":["../../src/invite/invite-api.js"],"names":[],"mappings":"AAcA,iEAAiE;AACjE,gDAAgD;AAChD;;;;;;GAMG;AAQH;;;GAGG;AACH,4GAA4G;AAC5G,+LAA+L;AAE/L;;GAEG;AAEH;;;;GAIG;AAEH;;GAEG;AAEH;;GAEG;AACH;IAOE;;;;;;;OAOG;IACH,sCANG;QAAwD,GAAG,EAAnD,OAAO,mBAAmB,EAAE,UAAU;QACtB,OAAO,EAC/B;YAAwG,oBAAoB,EAApH,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,SAAS,GAAG;gBAAE,eAAe,EAAE,MAAM,CAAA;aAAE;YAC7C,UAAU,EAA3C,eAAe;SACvB;QAAyB,MAAM;KAAC,EAkClC;IA3BC,4CAAc;IAqKhB;;;;OAIG;IACH,WAFa,KAAK,CAAC,MAAM,CAAC,CAUzB;IAED;;;;;OAKG;IACH,wBAHW,MAAM,GACJ,MAAM,CASlB;IAED;;;;;;;;;;;;OAYG;IACH,qCAHW,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,GACtB,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"invite-api.d.ts","sourceRoot":"","sources":["../../src/invite/invite-api.js"],"names":[],"mappings":"AAcA,iEAAiE;AACjE,gDAAgD;AAChD;;;;;;GAMG;AAQH;;;GAGG;AACH,4GAA4G;AAC5G,+LAA+L;AAE/L;;GAEG;AAEH;;;;GAIG;AAEH;;GAEG;AAEH;;GAEG;AACH;IAOE;;;;;;;OAOG;IACH,sCANG;QAAwD,GAAG,EAAnD,OAAO,mBAAmB,EAAE,UAAU;QACtB,OAAO,EAC/B;YAAwG,oBAAoB,EAApH,CAAC,eAAe,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,SAAS,GAAG;gBAAE,eAAe,EAAE,MAAM,CAAA;aAAE;YAC7C,UAAU,EAA3C,eAAe;SACvB;QAAyB,MAAM;KAAC,EAkClC;IA3BC,4CAAc;IAqKhB;;;;OAIG;IACH,WAFa,KAAK,CAAC,MAAM,CAAC,CAUzB;IAED;;;;;OAKG;IACH,wBAHW,MAAM,GACJ,MAAM,CASlB;IAED;;;;;;;;;;;;OAYG;IACH,qCAHW,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,GACtB,OAAO,CAAC,MAAM,CAAC,CAwC3B;IAED;;;OAGG;IACH,qCAHW,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,GACtB,IAAI,CAWhB;;CACF;+BAmD0C,CAAC,SAA/B,OAAQ,QAAQ,EAAE,UAAW,IAC7B,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,CAAC,SAAS,OAAO,QAAQ,EAAE,aAAa,GAAG,MAAM,CAAC,GAAG,KAAK;6BApWjF,gBAAgB,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE;0BAExC,kBAAkB,CAAC,OAAO,QAAQ,EAAE,cAAc,CAAC,OAAO,kBAAkB,CAAC,CAAC;qBAC9E,OAAO,WAAW,EAAE,QAAQ,CAAC,WAAW,cAAc,CAAC,GAAG;IAAE,eAAe,EAAE,MAAM,CAAA;CAAE,GAAG,CAAC;IAAE,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC,CAAC;;iBAGvK,OAAO,QAAQ,EAAE,YAAY,CAAC,OAAO,kBAAkB,CAAC;;;uBAKvD,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;sBACxB,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI;;8BAIzB,CAAC,cAAc,EAAE,mBAAmB,KAAK,OAAO,CAAC,MAAM,CAAC;6BAhDxC,oBAAoB;uBAK1B,cAAc;gDAgB3B,qBAAqB;mCAdI,2BAA2B;gCAQ9B,aAAa;yCADJ,qBAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapeo-manager.d.ts","sourceRoot":"","sources":["../src/mapeo-manager.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapeo-manager.d.ts","sourceRoot":"","sources":["../src/mapeo-manager.js"],"names":[],"mappings":"AAqFA,oDAEC;AAED,mFAC6C;AAE7C;;GAEG;AAEH;;;GAGG;AAEH;;GAEG;AACH;IAsBE;;;;;;;;;;;;;OAaG;IACH,oMAZG;QAAqB,OAAO,EAApB,MAAM;QACO,QAAQ,EAArB,MAAM;QACO,uBAAuB,EAApC,MAAM;QACO,sBAAsB,EAAnC,MAAM;QACqB,WAAW,EAAtC,MAAM,GAAG,WAAW;QACoB,OAAO,EAA/C,OAAO,SAAS,EAAE,eAAe;QACnB,iBAAiB;QACjB,aAAa;QACb,eAAe;QACf,qBAAqB;QACD,aAAa,UAAzC,MAAM,KAAK,SAAS;KAAsB,EA+F1D;IAED,uBAEC;IAsID;;;;;OAKG;IACH;eAHoB,MAAM;qBAAe,MAAM;uBAAiB,MAAM;6BAAuB,MAAM;oBACtF,OAAO,CAAC,MAAM,CAAC,CAoF3B;IAED;;;OAGG;IACH,4BAHW,MAAM,GACJ,OAAO,CAAC,YAAY,CAAC,CAuCjC;IAwBD;;OAEG;IACH,gBAFa,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAyDzC;IAED;;;;;;;;OAQG;IACH,6FAJW,mBAAmB;sBACH,OAAO;sBACrB,OAAO,CAAC,MAAM,CAAC,CA2G3B;IAqED;;OAEG;IAEH;;;;OAIG;IACH,cAHoF,CAAC,SADxE,OAAQ,WAAW,EAAE,KAAK,CACtC,OAAS,oBAAoB,EAAE,eAAe,GAAG;QAAC,UAAU,CAAC,oGAAe;KAAC,EAAE,CAAC,CAAE,cACxE,CAAC,iBA6CX;IAED;;;;;;;OAOG;IACH,iBAPa,CACZ;QACM,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,eAAe,CAAC,YAAY,CAAC,CAAC;KAC3C,GAAG,OAAO,CAAC,eAAe,CAAC,CAC7B,CAaH;IAED;;;;;;OAMG;IACH,oCAHW,OAAO,GACL,IAAI,CAkBhB;IAED;;;;;OAKG;IACH,sBAFa,OAAO,CAanB;IAED;;OAEG;IACH,wBAEC;IAED,yDAAyD;IACzD,iCADc,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAGpD;;;;;;;;;;IAYD;;OAEG;IACH,kBAFa,OAAO,CAAC,cAAc,EAAE,CAAC,CAIrC;IAED;;;;;;;OAOG;IACH,kBAFa,IAAI,CAKhB;IAED;;;;;;;OAOG;IACH,kBAFa,IAAI,CAKhB;IAED;;OAEG;IACH,8BAFW,MAAM,iBAgDhB;IAED,sCAGC;;CACF;mCAn6Ba,eAAe,WAAW,EAAE,gBAAgB,CAAC;kCAC7C,IAAI,CAAC,kBAAkB,EAAE,YAAY,GAAG,gBAAgB,CAAC,GAAG;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAE;4BACvI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAAE;6BAwBjI,IAAI,CAAC,OAAO,kBAAkB,EAAE,QAAQ,EAAE,UAAU,CAAC;;;;;mBAKpD,CAAC,KAAK,EAAE,cAAc,EAAE,KAAK,IAAI;;6BA1FlB,oBAAoB;6BAY1C,oBAAoB;qCA6CuB,oBAAoB;0BAhB5C,wBAAwB;iCAeN,YAAY;0BAL9B,IAAI;4BAjCF,qBAAqB;oCAoCb,WAAW;wCACN,oBAAoB"}
|
package/dist/mapeo-project.d.ts
CHANGED
|
@@ -1274,7 +1274,11 @@ export class MapeoProject extends TypedEmitter<{
|
|
|
1274
1274
|
* @returns {Promise<EditableProjectSettings>}
|
|
1275
1275
|
*/
|
|
1276
1276
|
$getProjectSettings(): Promise<EditableProjectSettings>;
|
|
1277
|
-
|
|
1277
|
+
/**
|
|
1278
|
+
* @returns {Promise<boolean>}
|
|
1279
|
+
*/
|
|
1280
|
+
$hasSyncedProjectSettings(): Promise<boolean>;
|
|
1281
|
+
$getOwnRole(): Promise<import("./roles.js").Role<"a12a6702b93bd7ff" | "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b" | "08e4251e36f6e7ed">>;
|
|
1278
1282
|
/**
|
|
1279
1283
|
* @param {string} originalVersionId The `originalVersionId` from a document.
|
|
1280
1284
|
* @returns {Promise<string>} The device ID for this creator.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mapeo-project.d.ts","sourceRoot":"","sources":["../src/mapeo-project.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"mapeo-project.d.ts","sourceRoot":"","sources":["../src/mapeo-project.js"],"names":[],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA6XZ;IAED,8BAEC;IAmMD;;;;;;;;;;;OAWG;IACH,yCAPW,CACV,OAAW,GACX,OAAW,QAAQ,EAAE,MAAM,GAC3B,OAAW,SAAS,EAAE,MAAM,CACzB,GACS,iBAAiB,CAqB7B;IAED;;;OAGG;IACH,2BAHW,IAAI,CAAC,OAAO,iBAAiB,EAAE,eAAe,EAAE,MAAM,GAAG,YAAY,GAAG,yBAAyB,CAAC,GAChG,OAAO,CAAC,OAAO,iBAAiB,EAAE,UAAU,CAAC,CAwBzD;IAED,uCAAuC;IACvC,uCADY,OAAO,iBAGlB;IAED,yBAAyB;IACzB,kCAEC;IAgOD;;;;OAIG;IACH,iCAJW,OAAO,UACP,OAAO,GACL,OAAO,CAAC,MAAM,CAAC,CAY3B;IAmPD,iCAMC;IAED;;;OAGG;IACH,sBAFa,OAAO,CAAC,IAAI,CAAC,CAoCzB;;CAuKF;sCAv3Ca,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC;6BACxC,oBAAoB,CAAC,gBAAgB,CAAC;8BACtC,GAAG,CAAC,MAAM,EAAC,UAAU,CAAC;;cAE1B,MAAM,GAAC,SAAS;YAChB,MAAM;;6BArEa,oBAAoB;wBAYzB,eAAe;0BAHb,sBAAsB;yBACL,qBAAqB;0BAuCtC,iBAAiB;wBAKpC,oBAAoB;2BAIA,sBAAsB;wBAFzB,eAAe;4BAhDX,yBAAyB;8BAuB9C,qBAAqB;0BApBF,uBAAuB;uCAoD8H,YAAY;4BAlD/J,yBAAyB;iCAkD0H,YAAY;0BAHjK,IAAI;uBALP,aAAa;0CAO0B,iBAAiB;gCACgG,YAAY;4BAAZ,YAAY"}
|
package/dist/member-api.d.ts
CHANGED
|
@@ -41,8 +41,9 @@ export class MemberApi extends TypedEmitter<import("tiny-typed-emitter").Default
|
|
|
41
41
|
* @param {Object} opts.dataTypes
|
|
42
42
|
* @param {Pick<DeviceInfoDataType, 'getByDocId' | 'getMany'>} opts.dataTypes.deviceInfo
|
|
43
43
|
* @param {Pick<ProjectDataType, 'getByDocId'>} opts.dataTypes.project
|
|
44
|
+
* @param {Logger} [opts.logger]
|
|
44
45
|
*/
|
|
45
|
-
constructor({ deviceId, roles, coreOwnership, encryptionKeys, getProjectName, projectKey, rpc, makeWebsocket, getReplicationStream, waitForInitialSyncWithPeer, dataTypes, }: {
|
|
46
|
+
constructor({ deviceId, roles, coreOwnership, encryptionKeys, getProjectName, projectKey, rpc, makeWebsocket, getReplicationStream, waitForInitialSyncWithPeer, dataTypes, logger, }: {
|
|
46
47
|
deviceId: string;
|
|
47
48
|
roles: import("./roles.js").Roles;
|
|
48
49
|
coreOwnership: import("./core-ownership.js").CoreOwnership;
|
|
@@ -57,6 +58,7 @@ export class MemberApi extends TypedEmitter<import("tiny-typed-emitter").Default
|
|
|
57
58
|
deviceInfo: Pick<DeviceInfoDataType, "getByDocId" | "getMany">;
|
|
58
59
|
project: Pick<ProjectDataType, "getByDocId">;
|
|
59
60
|
};
|
|
61
|
+
logger?: Logger | undefined;
|
|
60
62
|
});
|
|
61
63
|
/**
|
|
62
64
|
* Send an invite. Resolves when receiving a response. Rejects if the invite
|
|
@@ -68,17 +70,19 @@ export class MemberApi extends TypedEmitter<import("tiny-typed-emitter").Default
|
|
|
68
70
|
* @param {string} [opts.roleName]
|
|
69
71
|
* @param {string} [opts.roleDescription]
|
|
70
72
|
* @param {Buffer} [opts.__testOnlyInviteId] Hard-code the invite ID. Only for tests.
|
|
73
|
+
* @param {number} [opts.initialSyncTimeoutMs=5000]
|
|
71
74
|
* @returns {Promise<(
|
|
72
75
|
* typeof InviteResponse_Decision.ACCEPT |
|
|
73
76
|
* typeof InviteResponse_Decision.REJECT |
|
|
74
77
|
* typeof InviteResponse_Decision.ALREADY
|
|
75
78
|
* )>}
|
|
76
79
|
*/
|
|
77
|
-
invite(deviceId: string, { roleId, roleName, roleDescription, __testOnlyInviteId, }: {
|
|
80
|
+
invite(deviceId: string, { roleId, roleName, roleDescription, __testOnlyInviteId, initialSyncTimeoutMs, }: {
|
|
78
81
|
roleId: import("./roles.js").RoleIdForNewInvite;
|
|
79
82
|
roleName?: string | undefined;
|
|
80
83
|
roleDescription?: string | undefined;
|
|
81
84
|
__testOnlyInviteId?: Buffer | undefined;
|
|
85
|
+
initialSyncTimeoutMs?: number | undefined;
|
|
82
86
|
}): Promise<(typeof InviteResponse_Decision.ACCEPT | typeof InviteResponse_Decision.REJECT | typeof InviteResponse_Decision.ALREADY)>;
|
|
83
87
|
/**
|
|
84
88
|
* Attempt to cancel an outbound invite, if it exists.
|
|
@@ -162,6 +166,7 @@ import { InviteResponse_Decision } from './generated/rpc.js';
|
|
|
162
166
|
import type { Promisable } from 'type-fest';
|
|
163
167
|
import WebSocket from 'ws';
|
|
164
168
|
import type { ReplicationStream } from './types.js';
|
|
169
|
+
import { Logger } from './logger.js';
|
|
165
170
|
import type { DataStore } from './datastore/index.js';
|
|
166
171
|
import type { deviceInfoTable } from './schema/project.js';
|
|
167
172
|
import type { DeviceInfo } from '@comapeo/schema';
|
package/dist/member-api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"member-api.d.ts","sourceRoot":"","sources":["../src/member-api.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"member-api.d.ts","sourceRoot":"","sources":["../src/member-api.js"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,8CAA8C;AAC9C,mEAAmE;AACnE,sDAAsD;AACtD,wDAAwD;AACxD,6DAA6D;AAC7D,iEAAiE;AACjE,sDAAsD;AAEtD,qIAAqI;AACrI,sJAAsJ;AACtJ;;;;;;;;;GASG;AAEH;IAiBE;;;;;;;;;;;;;;;;OAgBG;IACH,sLAfG;QAAqB,QAAQ,EAArB,MAAM;QAC2B,KAAK,EAAtC,OAAO,YAAY,EAAE,KAAK;QACwB,aAAa,EAA/D,OAAO,qBAAqB,EAAE,aAAa;QACQ,cAAc,EAAjE,OAAO,qBAAqB,EAAE,cAAc;QACD,cAAc,EAAzD,MAAM,WAAW,SAAS,GAAG,MAAM,CAAC;QACvB,UAAU,EAAvB,MAAM;QACsC,GAAG,EAA/C,OAAO,kBAAkB,EAAE,UAAU;QACH,aAAa,UAAzC,MAAM,KAAK,SAAS;QACI,oBAAoB,EAAlD,MAAM,iBAAiB;QAC6C,0BAA0B,EAA9F,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC;QAChD,SAAS,EAC9B;YAA2E,UAAU,EAA7E,IAAI,CAAC,kBAAkB,EAAE,YAAY,GAAG,SAAS,CAAC;YACE,OAAO,EAA3D,IAAI,CAAC,eAAe,EAAE,YAAY,CAAC;SAC3C;QAAsB,MAAM;KAAC,EA6B/B;IAED;;;;;;;;;;;;;;;;OAgBG;IACH,iBAbW,MAAM,oFAEd;QAAsD,MAAM,EAApD,OAAO,YAAY,EAAE,kBAAkB;QACzB,QAAQ;QACR,eAAe;QACf,kBAAkB;QAClB,oBAAoB;KAC1C,GAAU,OAAO,CAAC,CACpB,OAAW,uBAAuB,CAAC,MAAM,GACzC,OAAW,uBAAuB,CAAC,MAAM,GACzC,OAAW,uBAAuB,CAAC,OAAO,CACvC,CAAC,CA6GJ;IAqDD;;;;;;;OAOG;IACH,8BAHW,MAAM,GACJ,IAAI,CAIhB;IAED;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,uBALW,MAAM;;oBAGJ,OAAO,CAAC,IAAI,CAAC,CAqBzB;IAED;;;;;;;OAOG;IACH,iCALW,MAAM;;oBAGJ,OAAO,CAAC,IAAI,CAAC,CAgCzB;IAkHD;;;OAGG;IACH,kBAHW,MAAM,GACJ,OAAO,CAAC,UAAU,CAAC,CA6B/B;IAED;;OAEG;IACH,WAFa,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAqCtC;IAED;;;;OAIG;IACH,qBAJW,MAAM,UACN,OAAO,YAAY,EAAE,wBAAwB,GAC3C,OAAO,CAAC,IAAI,CAAC,CAIzB;;CACF;iCAhiBa,SAAS,UAAU,QAAQ,CAAC,EAAE,sBAAsB,EAAE,YAAY,EAAE,UAAU,EAAE,eAAe,CAAC;8BAChG,SAAS,UAAU,QAAQ,CAAC,EAAE,2BAA2B,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,CAAC;;cAGxH,MAAM;UACN,OAAO,YAAY,EAAE,IAAI;;;;;iBAKzB,MAAM;;;6BAnDa,oBAAoB;wCAET,oBAAoB;gCA+B5B,WAAW;sBAlCrB,IAAI;uCAwCa,YAAY;uBA5B5B,aAAa;+BAyBL,sBAAsB;qCAChB,qBAAqB;gCANhD,iBAAiB;qCAAjB,iBAAiB;8BAIG,qBAAqB;0CAGT,oBAAoB;qCAPpD,iBAAiB;0CAAjB,iBAAiB"}
|
package/dist/roles.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export const COORDINATOR_ROLE_ID: "f7c150f5a3a9a855";
|
|
|
4
4
|
export const MEMBER_ROLE_ID: "012fd2d431c0bf60";
|
|
5
5
|
export const BLOCKED_ROLE_ID: "9e6d29263cba36c9";
|
|
6
6
|
export const LEFT_ROLE_ID: "8ced989b1904606b";
|
|
7
|
-
export const FAILED_ROLE_ID: "a24eaca65ab5d5d0";
|
|
8
7
|
export const NO_ROLE_ID: "08e4251e36f6e7ed";
|
|
9
8
|
export const isRoleIdForNewInvite: (value: unknown) => value is "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9";
|
|
10
9
|
export const isRoleIdAssignableToOthers: (value: unknown) => value is "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9";
|
|
@@ -127,7 +126,7 @@ export type DocCapability = {
|
|
|
127
126
|
*/
|
|
128
127
|
writeOthers: boolean;
|
|
129
128
|
};
|
|
130
|
-
export type Role<T extends RoleId = "a12a6702b93bd7ff" | "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b" | "
|
|
129
|
+
export type Role<T extends RoleId = "a12a6702b93bd7ff" | "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b" | "08e4251e36f6e7ed"> = {
|
|
131
130
|
roleId: T;
|
|
132
131
|
name: string;
|
|
133
132
|
docs: Record<import("@comapeo/schema").MapeoDoc["schemaName"], DocCapability>;
|
|
@@ -146,13 +145,13 @@ import { TypedEmitter } from 'tiny-typed-emitter';
|
|
|
146
145
|
* @template T
|
|
147
146
|
*/
|
|
148
147
|
/** @typedef {ElementOf<typeof ROLE_IDS>} RoleId */
|
|
149
|
-
declare const ROLE_IDS: Set<"a12a6702b93bd7ff" | "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b" | "
|
|
148
|
+
declare const ROLE_IDS: Set<"a12a6702b93bd7ff" | "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b" | "08e4251e36f6e7ed">;
|
|
150
149
|
/** @typedef {ElementOf<typeof ROLE_IDS_FOR_NEW_INVITE>} RoleIdForNewInvite */
|
|
151
150
|
declare const ROLE_IDS_FOR_NEW_INVITE: Set<"f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9">;
|
|
152
151
|
/** @typedef {ElementOf<typeof ROLE_IDS_ASSIGNABLE_TO_OTHERS>} RoleIdAssignableToOthers */
|
|
153
152
|
declare const ROLE_IDS_ASSIGNABLE_TO_OTHERS: Set<"f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9">;
|
|
154
153
|
/** @typedef {ElementOf<typeof ROLE_IDS_ASSIGNABLE_TO_ANYONE>} RoleIdAssignableToAnyone */
|
|
155
|
-
declare const ROLE_IDS_ASSIGNABLE_TO_ANYONE: Set<"f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b"
|
|
154
|
+
declare const ROLE_IDS_ASSIGNABLE_TO_ANYONE: Set<"f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b">;
|
|
156
155
|
import type { Namespace } from './types.js';
|
|
157
156
|
export {};
|
|
158
157
|
//# sourceMappingURL=roles.d.ts.map
|
package/dist/roles.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../src/roles.js"],"names":[],"mappings":"AAMA,8CAA8C;AAG9C,iDAAiD;AACjD,qDAAqD;AACrD,gDAAgD;AAChD,iDAAiD;AACjD,8CAA8C;AAC9C,
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../src/roles.js"],"names":[],"mappings":"AAMA,8CAA8C;AAG9C,iDAAiD;AACjD,qDAAqD;AACrD,gDAAgD;AAChD,iDAAiD;AACjD,8CAA8C;AAC9C,4CAA4C;AAwB5C,6HAAmE;AAMnE,mIAA+E;AAa/E;;;;;;GAMG;AAEH;;;;;;;;GAQG;AAEH;;;;;;GAMG;AACH,2BAFU,IAAI,CAAC,OAAO,eAAe,CAAC,CAmBrC;AA6BD;;;;;;;;;GASG;AACH,sBAFU,IAAI,CAAC,OAAO,UAAU,CAAC,CAmBhC;AAED,yCAAyC;AACzC,oBADW,GAAG,CAAW,IAAN,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAE,CAgEpC;AAED;;;GAGG;AAEH;;GAEG;AACH;IAOE,yCAAwB;IAExB;;;;;;;;;;;;;;OAcG;IACH,6EAZG;QAMQ,QAAQ,EANR,OAAO,qBAAqB,EAAE,QAAQ,CAChD,OAAW,sBAAsB,EAAE,SAAS,CAAC,MAAM,CAAC,EACpD,cAAkB,qBAAqB,EAAE,SAAS,EAClD,MAAU,EACV,OAAW,iBAAiB,EAAE,IAAI,EAClC,OAAW,iBAAiB,EAAE,SAAS,CACpC;QACyD,aAAa,EAA/D,OAAO,qBAAqB,EAAE,aAAa;QACS,WAAW,EAA/D,OAAO,yBAAyB,EAAE,WAAW;QAChC,UAAU,EAAvB,MAAM;QACO,SAAS,EAAtB,MAAM;KAChB,EASA;IAED;;;;;OAKG;IACH,kBAHW,MAAM,GACJ,OAAO,CAAC,IAAI,CAAC,CAuBzB;IAED;;;;;;;OAOG;IACH,UAFa,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAsCtC;IAED;;;;;;;;OAQG;IACH,qBAHW,MAAM,UACN,wBAAwB,iBA8DlC;;CAQF;sBA/YY,CAAC,IADD,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK;qBAItC,SAAS,CAAC,OAAO,QAAQ,CAAC;iCAa1B,SAAS,CAAC,OAAO,uBAAuB,CAAC;uCAMzC,SAAS,CAAC,OAAO,6BAA6B,CAAC;uCAM/C,SAAS,CAAC,OAAO,6BAA6B,CAAC;;;;;aAa/C,OAAO;;;;cACP,OAAO;;;;gBACP,OAAO;;;;iBACP,OAAO;;iBAIE,CAAC,SAAV,MAAO;YAEP,CAAC;UACD,MAAM;UACN,MAAM,CAAC,OAAO,iBAAiB,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC;oBACvE,wBAAwB,EAAE;UAC1B,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,CAAC;;;;;;YAyJxC,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI;;6BA5Nd,oBAAoB;AAWjD;;;GAGG;AAEH,mDAAmD;AACnD,yJASC;AAGD,8EAA8E;AAC9E,yGAEC;AAGD,0FAA0F;AAC1F,+GAEC;AAGD,0FAA0F;AAC1F,oIAOC;+BAhD8B,YAAY"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comapeo/core",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.1.1",
|
|
4
4
|
"description": "Offline p2p mapping library",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
"homepage": "https://github.com/digidem/comapeo-core#readme",
|
|
109
109
|
"devDependencies": {
|
|
110
110
|
"@bufbuild/buf": "^1.26.1",
|
|
111
|
-
"@comapeo/cloud": "^0.1
|
|
111
|
+
"@comapeo/cloud": "^0.2.1",
|
|
112
112
|
"@comapeo/core2.0.1": "npm:@comapeo/core@2.0.1",
|
|
113
113
|
"@comapeo/ipc": "^2.1.0",
|
|
114
114
|
"@mapeo/default-config": "5.0.0",
|
package/src/constants.js
CHANGED
|
@@ -35,3 +35,6 @@ export const SUPPORTED_CONFIG_VERSION = 1
|
|
|
35
35
|
|
|
36
36
|
// WARNING: This value is persisted. Be careful when changing it.
|
|
37
37
|
export const DRIZZLE_MIGRATIONS_TABLE = '__drizzle_migrations'
|
|
38
|
+
|
|
39
|
+
// Oldest possible time, ensure it gets overwritten with any updates
|
|
40
|
+
export const UNIX_EPOCH_DATE = new Date(0).toISOString()
|
|
@@ -40,6 +40,7 @@ export class LocalDiscovery extends TypedEmitter {
|
|
|
40
40
|
/** @type {(e: Error) => void} */
|
|
41
41
|
#handleSocketError
|
|
42
42
|
#l
|
|
43
|
+
#port = 0
|
|
43
44
|
|
|
44
45
|
/**
|
|
45
46
|
* @param {Object} opts
|
|
@@ -76,9 +77,19 @@ export class LocalDiscovery extends TypedEmitter {
|
|
|
76
77
|
/** @returns {Promise<void>} */
|
|
77
78
|
async #start() {
|
|
78
79
|
// Let OS choose port, listen on ip4, all interfaces
|
|
79
|
-
this.#server
|
|
80
|
-
|
|
80
|
+
const onListening = once(this.#server, 'listening')
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
this.#server.listen(this.#port, '0.0.0.0')
|
|
84
|
+
await onListening
|
|
85
|
+
} catch (e) {
|
|
86
|
+
if (this.#port === 0) throw e
|
|
87
|
+
// Account for errors from re-binding the port failing
|
|
88
|
+
this.#port = 0
|
|
89
|
+
return this.#start()
|
|
90
|
+
}
|
|
81
91
|
const addr = getAddress(this.#server)
|
|
92
|
+
this.#port = addr.port
|
|
82
93
|
this.#log('server listening on port ' + addr.port)
|
|
83
94
|
}
|
|
84
95
|
|
|
@@ -276,15 +287,25 @@ export class LocalDiscovery extends TypedEmitter {
|
|
|
276
287
|
const { port } = getAddress(this.#server)
|
|
277
288
|
this.#server.close()
|
|
278
289
|
const closePromise = once(this.#server, 'close')
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
290
|
+
|
|
291
|
+
const forceClose = () => {
|
|
292
|
+
for (const socket of this.#noiseConnections.values()) {
|
|
293
|
+
socket.destroy()
|
|
294
|
+
}
|
|
295
|
+
return pTimeout(closePromise, { milliseconds: 500 })
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if (!force) {
|
|
299
|
+
await closePromise
|
|
300
|
+
} else if (timeout === 0) {
|
|
301
|
+
// If timeout is 0, we force-close immediately
|
|
302
|
+
await forceClose()
|
|
303
|
+
} else {
|
|
304
|
+
await pTimeout(closePromise, {
|
|
305
|
+
milliseconds: timeout,
|
|
306
|
+
fallback: forceClose,
|
|
307
|
+
})
|
|
308
|
+
}
|
|
288
309
|
this.#log(`stopped for ${port}`)
|
|
289
310
|
}
|
|
290
311
|
}
|
package/src/errors.js
CHANGED
|
@@ -37,14 +37,6 @@ export class ProjectDetailsSendFailError extends Error {
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
-
export class InviteInitialSyncFailError extends Error {
|
|
41
|
-
/** @param {string} [message] */
|
|
42
|
-
constructor(message = 'Failed to sync config for invite') {
|
|
43
|
-
super(message)
|
|
44
|
-
this.name = 'InviteInitialSyncFailError'
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
40
|
export class RPCDisconnectBeforeSendingError extends Error {
|
|
49
41
|
/** @param {string} [message] */
|
|
50
42
|
constructor(message = 'RPC disconnected before sending') {
|
package/src/invite/invite-api.js
CHANGED
|
@@ -281,35 +281,43 @@ export class InviteApi extends TypedEmitter {
|
|
|
281
281
|
* @returns {Promise<string>}
|
|
282
282
|
*/
|
|
283
283
|
async accept({ inviteId: inviteIdString }) {
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
const invite = this.#invites.get(inviteId)
|
|
287
|
-
assert(!!invite, new NotFoundError(`Cannot find invite ${inviteIdString}`))
|
|
288
|
-
assertCanSend(invite.actor, { type: 'ACCEPT_INVITE' })
|
|
284
|
+
try {
|
|
285
|
+
const inviteId = Buffer.from(inviteIdString, 'hex')
|
|
289
286
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
if (value.inviteId.equals(inviteId)) continue
|
|
295
|
-
const inviteIsForSameProject = value.projectInviteId.equals(
|
|
296
|
-
invite.value.projectInviteId
|
|
287
|
+
const invite = this.#invites.get(inviteId)
|
|
288
|
+
assert(
|
|
289
|
+
!!invite,
|
|
290
|
+
new NotFoundError(`Cannot find invite ${inviteIdString}`)
|
|
297
291
|
)
|
|
298
|
-
|
|
299
|
-
|
|
292
|
+
assertCanSend(invite.actor, { type: 'ACCEPT_INVITE' })
|
|
293
|
+
|
|
294
|
+
this.#l.log('Accepting invite %h', inviteId)
|
|
295
|
+
invite.actor.send({ type: 'ACCEPT_INVITE' })
|
|
296
|
+
|
|
297
|
+
for (const { value, actor } of this.#invites.values()) {
|
|
298
|
+
if (value.inviteId.equals(inviteId)) continue
|
|
299
|
+
const inviteIsForSameProject = value.projectInviteId.equals(
|
|
300
|
+
invite.value.projectInviteId
|
|
301
|
+
)
|
|
302
|
+
if (inviteIsForSameProject) {
|
|
303
|
+
actor.send({ type: 'ALREADY_IN_PROJECT' })
|
|
304
|
+
}
|
|
300
305
|
}
|
|
301
|
-
}
|
|
302
306
|
|
|
303
|
-
|
|
307
|
+
const { projectPublicId } = await toPromise(invite.actor)
|
|
304
308
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
309
|
+
if (!projectPublicId) {
|
|
310
|
+
const { context, value } = invite.actor.getSnapshot()
|
|
311
|
+
throw value === 'respondedAlready'
|
|
312
|
+
? new AlreadyJoinedError('Already joining or in project')
|
|
313
|
+
: context.error || new Error('Unknown error')
|
|
314
|
+
}
|
|
311
315
|
|
|
312
|
-
|
|
316
|
+
return projectPublicId
|
|
317
|
+
} catch (err) {
|
|
318
|
+
this.#l.log('ERROR: Unable to accept invite', err)
|
|
319
|
+
throw err
|
|
320
|
+
}
|
|
313
321
|
}
|
|
314
322
|
|
|
315
323
|
/**
|
package/src/mapeo-manager.js
CHANGED
|
@@ -38,6 +38,7 @@ import {
|
|
|
38
38
|
projectKeyToProjectInviteId,
|
|
39
39
|
projectKeyToPublicId,
|
|
40
40
|
} from './utils.js'
|
|
41
|
+
import { UNIX_EPOCH_DATE } from './constants.js'
|
|
41
42
|
import { openedNoiseSecretStream } from './lib/noise-secret-stream-helpers.js'
|
|
42
43
|
import { omit } from './lib/omit.js'
|
|
43
44
|
import { RandomAccessFilePool } from './core-manager/random-access-file-pool.js'
|
|
@@ -563,11 +564,13 @@ export class MapeoManager extends TypedEmitter {
|
|
|
563
564
|
(p) => p.projectId === projectId
|
|
564
565
|
)
|
|
565
566
|
|
|
567
|
+
if (!existingProject) continue
|
|
568
|
+
|
|
566
569
|
result.push(
|
|
567
570
|
deNullify({
|
|
568
571
|
projectId: projectPublicId,
|
|
569
|
-
createdAt: existingProject?.createdAt,
|
|
570
|
-
updatedAt: existingProject?.updatedAt,
|
|
572
|
+
createdAt: ignoreUnixDate(existingProject?.createdAt),
|
|
573
|
+
updatedAt: ignoreUnixDate(existingProject?.updatedAt),
|
|
571
574
|
name: existingProject?.name || projectInfo.name,
|
|
572
575
|
projectColor:
|
|
573
576
|
existingProject?.projectColor || projectInfo.projectColor,
|
|
@@ -640,31 +643,29 @@ export class MapeoManager extends TypedEmitter {
|
|
|
640
643
|
|
|
641
644
|
// Any errors from here we need to remove project from db because it has not
|
|
642
645
|
// been fully added and synced
|
|
646
|
+
let project = null
|
|
643
647
|
try {
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
}
|
|
660
|
-
|
|
661
|
-
// 5. Wait for initial project sync
|
|
662
|
-
if (waitForSync) {
|
|
663
|
-
await this.#waitForInitialSync(project)
|
|
648
|
+
project = await this.getProject(projectPublicId)
|
|
649
|
+
|
|
650
|
+
/** @type {import('drizzle-orm').InferInsertModel<typeof projectSettingsTable>} */
|
|
651
|
+
const settingsDoc = {
|
|
652
|
+
schemaName: 'projectSettings',
|
|
653
|
+
docId: projectId,
|
|
654
|
+
versionId: 'unknown',
|
|
655
|
+
originalVersionId: 'unknown',
|
|
656
|
+
createdAt: UNIX_EPOCH_DATE,
|
|
657
|
+
updatedAt: UNIX_EPOCH_DATE,
|
|
658
|
+
deleted: false,
|
|
659
|
+
links: [],
|
|
660
|
+
forks: [],
|
|
661
|
+
name: projectName,
|
|
662
|
+
projectDescription,
|
|
664
663
|
}
|
|
665
664
|
|
|
665
|
+
await this.#db.insert(projectSettingsTable).values([settingsDoc])
|
|
666
666
|
this.#activeProjects.set(projectPublicId, project)
|
|
667
667
|
} catch (e) {
|
|
668
|
+
// Only happens if getProject or the the DB insert fails
|
|
668
669
|
this.#l.log('ERROR: could not add project', e)
|
|
669
670
|
this.#db
|
|
670
671
|
.delete(projectKeysTable)
|
|
@@ -672,6 +673,29 @@ export class MapeoManager extends TypedEmitter {
|
|
|
672
673
|
.run()
|
|
673
674
|
throw e
|
|
674
675
|
}
|
|
676
|
+
|
|
677
|
+
try {
|
|
678
|
+
const deviceInfo = this.getDeviceInfo()
|
|
679
|
+
if (hasSavedDeviceInfo(deviceInfo)) {
|
|
680
|
+
await project[kSetOwnDeviceInfo](deviceInfo)
|
|
681
|
+
}
|
|
682
|
+
} catch (e) {
|
|
683
|
+
// Can ignore an error trying to write device info
|
|
684
|
+
this.#l.log(
|
|
685
|
+
'ERROR: failed to write project %h deviceInfo %o',
|
|
686
|
+
projectKey,
|
|
687
|
+
e
|
|
688
|
+
)
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
// 5. Wait for initial project sync
|
|
692
|
+
if (waitForSync) {
|
|
693
|
+
try {
|
|
694
|
+
await this.#waitForInitialSync(project)
|
|
695
|
+
} catch (e) {
|
|
696
|
+
this.#l.log('ERROR: could not do initial project sync', e)
|
|
697
|
+
}
|
|
698
|
+
}
|
|
675
699
|
this.#l.log('Added project %h, public ID: %S', projectKey, projectPublicId)
|
|
676
700
|
return projectPublicId
|
|
677
701
|
}
|
|
@@ -692,17 +716,15 @@ export class MapeoManager extends TypedEmitter {
|
|
|
692
716
|
* @returns {Promise<boolean>}
|
|
693
717
|
*/
|
|
694
718
|
async #waitForInitialSync(project, { timeoutMs = 5000 } = {}) {
|
|
695
|
-
const [ownRole,
|
|
719
|
+
const [ownRole, isProjectSettingsSynced] = await Promise.all([
|
|
696
720
|
project.$getOwnRole(),
|
|
697
|
-
project.$
|
|
721
|
+
project.$hasSyncedProjectSettings(),
|
|
698
722
|
])
|
|
699
723
|
const {
|
|
700
724
|
auth: { localState: authState },
|
|
701
725
|
config: { localState: configState },
|
|
702
726
|
} = project.$sync[kSyncState].getState()
|
|
703
727
|
const isRoleSynced = ownRole !== Roles.NO_ROLE
|
|
704
|
-
const isProjectSettingsSynced =
|
|
705
|
-
projectSettings !== MapeoProject.EMPTY_PROJECT_SETTINGS
|
|
706
728
|
// Assumes every project that someone is invited to has at least one record
|
|
707
729
|
// in the auth store - the row record for the invited device
|
|
708
730
|
const isAuthSynced = authState.want === 0 && authState.have > 0
|
|
@@ -721,7 +743,6 @@ export class MapeoManager extends TypedEmitter {
|
|
|
721
743
|
this.#l.log(
|
|
722
744
|
'Pending initial sync: role %s, projectSettings %o, auth %o, config %o',
|
|
723
745
|
isRoleSynced,
|
|
724
|
-
isProjectSettingsSynced,
|
|
725
746
|
isAuthSynced,
|
|
726
747
|
isConfigSynced
|
|
727
748
|
)
|
|
@@ -1012,3 +1033,13 @@ function validateProjectKeys(projectKeys) {
|
|
|
1012
1033
|
function hasSavedDeviceInfo(partialDeviceInfo) {
|
|
1013
1034
|
return Boolean(partialDeviceInfo.name)
|
|
1014
1035
|
}
|
|
1036
|
+
|
|
1037
|
+
/**
|
|
1038
|
+
* @param {string|undefined} date
|
|
1039
|
+
* @returns {string|null}
|
|
1040
|
+
*/
|
|
1041
|
+
function ignoreUnixDate(date) {
|
|
1042
|
+
if (date === UNIX_EPOCH_DATE) return null
|
|
1043
|
+
if (date === undefined) return null
|
|
1044
|
+
return date
|
|
1045
|
+
}
|
package/src/mapeo-project.js
CHANGED
|
@@ -10,7 +10,7 @@ import mime from 'mime/lite'
|
|
|
10
10
|
// @ts-expect-error
|
|
11
11
|
import { Readable, pipelinePromise } from 'streamx'
|
|
12
12
|
|
|
13
|
-
import { NAMESPACES, NAMESPACE_SCHEMAS } from './constants.js'
|
|
13
|
+
import { NAMESPACES, NAMESPACE_SCHEMAS, UNIX_EPOCH_DATE } from './constants.js'
|
|
14
14
|
import { CoreManager } from './core-manager/index.js'
|
|
15
15
|
import { DataStore } from './datastore/index.js'
|
|
16
16
|
import { DataType, kCreateWithDocId } from './datatype/index.js'
|
|
@@ -376,6 +376,7 @@ export class MapeoProject extends TypedEmitter {
|
|
|
376
376
|
deviceInfo: this.#dataTypes.deviceInfo,
|
|
377
377
|
project: this.#dataTypes.projectSettings,
|
|
378
378
|
},
|
|
379
|
+
logger: this.#l,
|
|
379
380
|
})
|
|
380
381
|
|
|
381
382
|
this.#blobStore = new BlobStore({
|
|
@@ -661,6 +662,21 @@ export class MapeoProject extends TypedEmitter {
|
|
|
661
662
|
}
|
|
662
663
|
}
|
|
663
664
|
|
|
665
|
+
/**
|
|
666
|
+
* @returns {Promise<boolean>}
|
|
667
|
+
*/
|
|
668
|
+
async $hasSyncedProjectSettings() {
|
|
669
|
+
try {
|
|
670
|
+
const settings = await this.#dataTypes.projectSettings.getByDocId(
|
|
671
|
+
this.#projectId
|
|
672
|
+
)
|
|
673
|
+
|
|
674
|
+
return settings.createdAt !== UNIX_EPOCH_DATE
|
|
675
|
+
} catch (e) {
|
|
676
|
+
return false
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
664
680
|
/**
|
|
665
681
|
* @returns {Promise<undefined | string>}
|
|
666
682
|
*/
|
|
@@ -973,15 +989,10 @@ export class MapeoProject extends TypedEmitter {
|
|
|
973
989
|
async #exportPrefix(type = '') {
|
|
974
990
|
const name = await this.#getProjectName()
|
|
975
991
|
const date = new Date()
|
|
976
|
-
const
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
day: 'numeric',
|
|
981
|
-
})
|
|
982
|
-
.replaceAll('/', '_')
|
|
983
|
-
.replaceAll('-', '_')
|
|
984
|
-
return `CoMapeo_${name}_${type}_${dateSection}`
|
|
992
|
+
const yyyy = date.getFullYear()
|
|
993
|
+
const mm = `${date.getMonth() + 1}`.padStart(2, '0')
|
|
994
|
+
const dd = `${date.getDate()}`.padStart(2, '0')
|
|
995
|
+
return `CoMapeo_${name}_${type}_${yyyy}_${mm}_${dd}`
|
|
985
996
|
}
|
|
986
997
|
|
|
987
998
|
/**
|
|
@@ -1129,10 +1140,8 @@ export class MapeoProject extends TypedEmitter {
|
|
|
1129
1140
|
const stream = this.#blobStore.createReadStream(blobId)
|
|
1130
1141
|
const name = path.posix.join(
|
|
1131
1142
|
mediaFolder,
|
|
1132
|
-
blobId.variant
|
|
1133
|
-
`${attachment.name}${extensionString}`
|
|
1143
|
+
`${attachment.name}_${blobId.variant}${extensionString}`
|
|
1134
1144
|
)
|
|
1135
|
-
|
|
1136
1145
|
// @ts-expect-error
|
|
1137
1146
|
await archive.entry(stream, { name })
|
|
1138
1147
|
}
|
package/src/member-api.js
CHANGED
|
@@ -12,20 +12,16 @@ import {
|
|
|
12
12
|
projectKeyToProjectInviteId,
|
|
13
13
|
projectKeyToPublicId,
|
|
14
14
|
} from './utils.js'
|
|
15
|
+
import { Logger } from './logger.js'
|
|
15
16
|
import { keyBy } from './lib/key-by.js'
|
|
16
17
|
import { abortSignalAny } from './lib/ponyfills.js'
|
|
17
18
|
import timingSafeEqual from 'string-timing-safe-equal'
|
|
18
19
|
import { isHostnameIpAddress } from './lib/is-hostname-ip-address.js'
|
|
19
20
|
import { ErrorWithCode, getErrorMessage } from './lib/error.js'
|
|
20
|
-
import {
|
|
21
|
-
InviteAbortedError,
|
|
22
|
-
InviteInitialSyncFailError,
|
|
23
|
-
ProjectDetailsSendFailError,
|
|
24
|
-
} from './errors.js'
|
|
21
|
+
import { InviteAbortedError, ProjectDetailsSendFailError } from './errors.js'
|
|
25
22
|
import { wsCoreReplicator } from './lib/ws-core-replicator.js'
|
|
26
23
|
import {
|
|
27
24
|
BLOCKED_ROLE_ID,
|
|
28
|
-
FAILED_ROLE_ID,
|
|
29
25
|
MEMBER_ROLE_ID,
|
|
30
26
|
ROLES,
|
|
31
27
|
isRoleIdForNewInvite,
|
|
@@ -71,6 +67,7 @@ export class MemberApi extends TypedEmitter {
|
|
|
71
67
|
#getReplicationStream
|
|
72
68
|
#waitForInitialSyncWithPeer
|
|
73
69
|
#dataTypes
|
|
70
|
+
#l
|
|
74
71
|
|
|
75
72
|
/** @type {Map<string, { abortController: AbortController }>} */
|
|
76
73
|
#outboundInvitesByDevice = new Map()
|
|
@@ -90,6 +87,7 @@ export class MemberApi extends TypedEmitter {
|
|
|
90
87
|
* @param {Object} opts.dataTypes
|
|
91
88
|
* @param {Pick<DeviceInfoDataType, 'getByDocId' | 'getMany'>} opts.dataTypes.deviceInfo
|
|
92
89
|
* @param {Pick<ProjectDataType, 'getByDocId'>} opts.dataTypes.project
|
|
90
|
+
* @param {Logger} [opts.logger]
|
|
93
91
|
*/
|
|
94
92
|
constructor({
|
|
95
93
|
deviceId,
|
|
@@ -103,8 +101,10 @@ export class MemberApi extends TypedEmitter {
|
|
|
103
101
|
getReplicationStream,
|
|
104
102
|
waitForInitialSyncWithPeer,
|
|
105
103
|
dataTypes,
|
|
104
|
+
logger,
|
|
106
105
|
}) {
|
|
107
106
|
super()
|
|
107
|
+
this.#l = Logger.create('member-api', logger)
|
|
108
108
|
this.#ownDeviceId = deviceId
|
|
109
109
|
this.#roles = roles
|
|
110
110
|
this.#coreOwnership = coreOwnership
|
|
@@ -128,6 +128,7 @@ export class MemberApi extends TypedEmitter {
|
|
|
128
128
|
* @param {string} [opts.roleName]
|
|
129
129
|
* @param {string} [opts.roleDescription]
|
|
130
130
|
* @param {Buffer} [opts.__testOnlyInviteId] Hard-code the invite ID. Only for tests.
|
|
131
|
+
* @param {number} [opts.initialSyncTimeoutMs=5000]
|
|
131
132
|
* @returns {Promise<(
|
|
132
133
|
* typeof InviteResponse_Decision.ACCEPT |
|
|
133
134
|
* typeof InviteResponse_Decision.REJECT |
|
|
@@ -141,6 +142,7 @@ export class MemberApi extends TypedEmitter {
|
|
|
141
142
|
roleName = ROLES[roleId]?.name,
|
|
142
143
|
roleDescription,
|
|
143
144
|
__testOnlyInviteId,
|
|
145
|
+
initialSyncTimeoutMs = 5000,
|
|
144
146
|
}
|
|
145
147
|
) {
|
|
146
148
|
assert(isRoleIdForNewInvite(roleId), 'Invalid role ID for new invite')
|
|
@@ -205,10 +207,6 @@ export class MemberApi extends TypedEmitter {
|
|
|
205
207
|
case InviteResponse_Decision.DECISION_UNSPECIFIED:
|
|
206
208
|
return InviteResponse_Decision.REJECT
|
|
207
209
|
case InviteResponse_Decision.ACCEPT:
|
|
208
|
-
// Technically we can assign after sending project details
|
|
209
|
-
// This lets us test role removal
|
|
210
|
-
await this.#roles.assignRole(deviceId, roleId)
|
|
211
|
-
|
|
212
210
|
try {
|
|
213
211
|
await this.#rpc.sendProjectJoinDetails(deviceId, {
|
|
214
212
|
inviteId,
|
|
@@ -216,27 +214,31 @@ export class MemberApi extends TypedEmitter {
|
|
|
216
214
|
encryptionKeys: this.#encryptionKeys,
|
|
217
215
|
})
|
|
218
216
|
} catch {
|
|
219
|
-
try {
|
|
220
|
-
// Mark them as "failed" so we can retry the flow
|
|
221
|
-
await this.#roles.assignRole(deviceId, FAILED_ROLE_ID)
|
|
222
|
-
} catch (e) {
|
|
223
|
-
console.error(e)
|
|
224
|
-
}
|
|
225
217
|
throw new ProjectDetailsSendFailError()
|
|
226
218
|
}
|
|
219
|
+
await this.#roles.assignRole(deviceId, roleId)
|
|
227
220
|
|
|
228
221
|
try {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
222
|
+
let abortSync = new AbortController().signal
|
|
223
|
+
if (initialSyncTimeoutMs) {
|
|
224
|
+
abortSync = AbortSignal.timeout(initialSyncTimeoutMs)
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
await this.#waitForInitialSyncWithPeer(deviceId, abortSync)
|
|
228
|
+
} catch (e) {
|
|
229
|
+
this.#l.log('ERROR: Could not initial sync with peer', e)
|
|
234
230
|
}
|
|
235
231
|
|
|
236
232
|
return inviteResponse.decision
|
|
237
233
|
default:
|
|
238
234
|
throw new ExhaustivenessError(inviteResponse.decision)
|
|
239
235
|
}
|
|
236
|
+
} catch (err) {
|
|
237
|
+
if (err instanceof Error && err.name === 'RPCDisconnectBeforeAckError') {
|
|
238
|
+
this.#l.log('ERROR: Disconnect before ack', err)
|
|
239
|
+
throw new InviteAbortedError()
|
|
240
|
+
}
|
|
241
|
+
throw err
|
|
240
242
|
} finally {
|
|
241
243
|
this.#outboundInvitesByDevice.delete(deviceId)
|
|
242
244
|
}
|
|
@@ -282,8 +284,10 @@ export class MemberApi extends TypedEmitter {
|
|
|
282
284
|
return await responsePromise
|
|
283
285
|
} catch (err) {
|
|
284
286
|
if (err instanceof Error && err.name === 'AbortError') {
|
|
287
|
+
this.#l.log('ERROR: Timed out sending invite', err)
|
|
285
288
|
throw new InviteAbortedError()
|
|
286
289
|
} else {
|
|
290
|
+
this.#l.log('ERROR: Unexpected error during invite send', err)
|
|
287
291
|
throw err
|
|
288
292
|
}
|
|
289
293
|
} finally {
|
|
@@ -472,6 +476,7 @@ export class MemberApi extends TypedEmitter {
|
|
|
472
476
|
)
|
|
473
477
|
}
|
|
474
478
|
|
|
479
|
+
const onClosePromise = pEvent(websocket, 'close')
|
|
475
480
|
const onErrorPromise = pEvent(websocket, 'error')
|
|
476
481
|
|
|
477
482
|
const replicationStream = this.#getReplicationStream()
|
|
@@ -494,7 +499,6 @@ export class MemberApi extends TypedEmitter {
|
|
|
494
499
|
websocket.close()
|
|
495
500
|
throw errorEvent.error
|
|
496
501
|
} else {
|
|
497
|
-
const onClosePromise = pEvent(websocket, 'close')
|
|
498
502
|
onErrorPromise.cancel()
|
|
499
503
|
websocket.close()
|
|
500
504
|
await onClosePromise
|
package/src/roles.js
CHANGED
|
@@ -12,7 +12,6 @@ export const COORDINATOR_ROLE_ID = 'f7c150f5a3a9a855'
|
|
|
12
12
|
export const MEMBER_ROLE_ID = '012fd2d431c0bf60'
|
|
13
13
|
export const BLOCKED_ROLE_ID = '9e6d29263cba36c9'
|
|
14
14
|
export const LEFT_ROLE_ID = '8ced989b1904606b'
|
|
15
|
-
export const FAILED_ROLE_ID = 'a24eaca65ab5d5d0'
|
|
16
15
|
export const NO_ROLE_ID = '08e4251e36f6e7ed'
|
|
17
16
|
|
|
18
17
|
/**
|
|
@@ -28,7 +27,6 @@ const ROLE_IDS = new Set(
|
|
|
28
27
|
MEMBER_ROLE_ID,
|
|
29
28
|
BLOCKED_ROLE_ID,
|
|
30
29
|
LEFT_ROLE_ID,
|
|
31
|
-
FAILED_ROLE_ID,
|
|
32
30
|
NO_ROLE_ID,
|
|
33
31
|
])
|
|
34
32
|
)
|
|
@@ -53,7 +51,6 @@ const ROLE_IDS_ASSIGNABLE_TO_ANYONE = new Set(
|
|
|
53
51
|
MEMBER_ROLE_ID,
|
|
54
52
|
BLOCKED_ROLE_ID,
|
|
55
53
|
LEFT_ROLE_ID,
|
|
56
|
-
FAILED_ROLE_ID,
|
|
57
54
|
])
|
|
58
55
|
)
|
|
59
56
|
const isRoleIdAssignableToAnyone = setHas(ROLE_IDS_ASSIGNABLE_TO_ANYONE)
|
|
@@ -129,34 +126,6 @@ const BLOCKED_ROLE = {
|
|
|
129
126
|
},
|
|
130
127
|
}
|
|
131
128
|
|
|
132
|
-
/**
|
|
133
|
-
* This role is used for devices that failed to sync after accepting an invite and being added
|
|
134
|
-
* @type {Role<typeof FAILED_ROLE_ID>}
|
|
135
|
-
*/
|
|
136
|
-
const FAILED_ROLE = {
|
|
137
|
-
roleId: FAILED_ROLE_ID,
|
|
138
|
-
name: 'Failed',
|
|
139
|
-
docs: mapObject(currentSchemaVersions, (key) => {
|
|
140
|
-
return [
|
|
141
|
-
key,
|
|
142
|
-
{
|
|
143
|
-
readOwn: false,
|
|
144
|
-
writeOwn: false,
|
|
145
|
-
readOthers: false,
|
|
146
|
-
writeOthers: false,
|
|
147
|
-
},
|
|
148
|
-
]
|
|
149
|
-
}),
|
|
150
|
-
roleAssignment: [],
|
|
151
|
-
sync: {
|
|
152
|
-
auth: 'blocked',
|
|
153
|
-
config: 'blocked',
|
|
154
|
-
data: 'blocked',
|
|
155
|
-
blobIndex: 'blocked',
|
|
156
|
-
blob: 'blocked',
|
|
157
|
-
},
|
|
158
|
-
}
|
|
159
|
-
|
|
160
129
|
/**
|
|
161
130
|
* This is the role assumed for a device when no role record can be found. This
|
|
162
131
|
* can happen when an invited device did not manage to sync with the device that
|
|
@@ -250,7 +219,6 @@ export const ROLES = {
|
|
|
250
219
|
},
|
|
251
220
|
},
|
|
252
221
|
[NO_ROLE_ID]: NO_ROLE,
|
|
253
|
-
[FAILED_ROLE_ID]: FAILED_ROLE,
|
|
254
222
|
}
|
|
255
223
|
|
|
256
224
|
/**
|
|
@@ -412,11 +380,6 @@ export class Roles extends TypedEmitter {
|
|
|
412
380
|
if (deviceId !== this.#ownDeviceId) {
|
|
413
381
|
throw new Error('Cannot assign LEFT role to another device')
|
|
414
382
|
}
|
|
415
|
-
} else if (roleId === FAILED_ROLE_ID) {
|
|
416
|
-
const ownRole = await this.getRole(this.#ownDeviceId)
|
|
417
|
-
if (!ownRole.roleAssignment.includes(COORDINATOR_ROLE_ID)) {
|
|
418
|
-
throw new Error('Lacks permission to assign role ' + roleId)
|
|
419
|
-
}
|
|
420
383
|
} else {
|
|
421
384
|
const ownRole = await this.getRole(this.#ownDeviceId)
|
|
422
385
|
if (!ownRole.roleAssignment.includes(roleId)) {
|