@comapeo/core 4.1.0 → 4.1.2
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/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-writer/index.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 +1 -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/dist/sync/peer-sync-controller.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/discovery/local-discovery.js +38 -13
- package/src/errors.js +0 -8
- package/src/index-writer/index.js +12 -10
- package/src/invite/invite-api.js +31 -23
- package/src/invite/invite-state-machine.js +2 -2
- package/src/mapeo-manager.js +28 -24
- package/src/mapeo-project.js +6 -12
- package/src/member-api.js +25 -21
- package/src/roles.js +0 -37
- package/src/sync/peer-sync-controller.js +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-discovery.d.ts","sourceRoot":"","sources":["../../src/discovery/local-discovery.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"local-discovery.d.ts","sourceRoot":"","sources":["../../src/discovery/local-discovery.js"],"names":[],"mappings":"AAyBA,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;sBA5Sa;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE;mCACxC,kBAAkB,GAAG,CAAC,MAAM,CAAC;;gBAc7B,CAAC,UAAU,EAAE,oBAAoB,KAAK,IAAI;;6BA7B3B,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index-writer/index.js"],"names":[],"mappings":"AAMA,mEAAmE;AACnE,6DAA6D;AAE7D;;GAEG;AACH;;GAEG;AAEH;;GAEG;AACH,yBAF+B,OAAO,SAAzB,cAAgB;IAY3B;;;;;;;;OAQG;IACH,2DANG;QAAgD,MAAM,EAA9C,OAAO,gBAAgB,EAAE,QAAQ;QACjB,MAAM,EAAtB,OAAO,EAAE;QAC4D,MAAM,UAArE,gBAAgB,WAAW,eAAe,KAAK,QAAQ;QACE,SAAS;QAC1D,MAAM;KAAC,EAiB/B;IAED;;OAEG;IACH,8CAEC;IAED;;;OAGG;IACH,eAHW,OAAO,oBAAoB,EAAE,KAAK,EAAE,GAClC,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index-writer/index.js"],"names":[],"mappings":"AAMA,mEAAmE;AACnE,6DAA6D;AAE7D;;GAEG;AACH;;GAEG;AAEH;;GAEG;AACH,yBAF+B,OAAO,SAAzB,cAAgB;IAY3B;;;;;;;;OAQG;IACH,2DANG;QAAgD,MAAM,EAA9C,OAAO,gBAAgB,EAAE,QAAQ;QACjB,MAAM,EAAtB,OAAO,EAAE;QAC4D,MAAM,UAArE,gBAAgB,WAAW,eAAe,KAAK,QAAQ;QACE,SAAS;QAC1D,MAAM;KAAC,EAiB/B;IAED;;OAEG;IACH,8CAEC;IAED;;;OAGG;IACH,eAHW,OAAO,oBAAoB,EAAE,KAAK,EAAE,GAClC,OAAO,CAAC,aAAa,CAAC,CAiDlC;IAED;;OAEG;IACH,qDAMC;;CACF;4BAnHY,GAAG,CAA2B,IAAtB,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAE;+BAG5C,UAAU,CAAC,OAAO,MAAM,CAAC;oCANF,sBAAsB;qCADX,iBAAiB;8BAAjB,iBAAiB;uBADzC,cAAc;uBALd,iBAAiB"}
|
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":"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,
|
|
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
|
@@ -1278,7 +1278,7 @@ export class MapeoProject extends TypedEmitter<{
|
|
|
1278
1278
|
* @returns {Promise<boolean>}
|
|
1279
1279
|
*/
|
|
1280
1280
|
$hasSyncedProjectSettings(): Promise<boolean>;
|
|
1281
|
-
$getOwnRole(): Promise<import("./roles.js").Role<"a12a6702b93bd7ff" | "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b" | "
|
|
1281
|
+
$getOwnRole(): Promise<import("./roles.js").Role<"a12a6702b93bd7ff" | "f7c150f5a3a9a855" | "012fd2d431c0bf60" | "9e6d29263cba36c9" | "8ced989b1904606b" | "08e4251e36f6e7ed">>;
|
|
1282
1282
|
/**
|
|
1283
1283
|
* @param {string} originalVersionId The `originalVersionId` from a document.
|
|
1284
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"peer-sync-controller.d.ts","sourceRoot":"","sources":["../../src/sync/peer-sync-controller.js"],"names":[],"mappings":"AAKA,6DAA6D;AAC7D,0CAA0C;AAC1C,wDAAwD;AACxD,+CAA+C;AAC/C,iFAAiF;AAEjF;;GAEG;AAEH;IAsBE;;;;;;;OAOG;IACH,iEANG;QAAoD,QAAQ,EAApD,OAAO,UAAU,EAAE,iBAAiB,CAAC;QACgB,WAAW,EAAhE,OAAO,0BAA0B,EAAE,WAAW;QACJ,SAAS,EAAnD,OAAO,iBAAiB,EAAE,SAAS;QACD,KAAK,EAAvC,OAAO,aAAa,EAAE,KAAK;QACb,MAAM;KAAC,EAkB/B;IAED,sBAEC;IAED,qBAEC;IAED,gGAEC;IAED,iDAAiD;IACjD,sCADY,gBAAgB,QAO3B;IAED;;OAEG;IACH,iCAFW,MAAM,QAoBhB;;
|
|
1
|
+
{"version":3,"file":"peer-sync-controller.d.ts","sourceRoot":"","sources":["../../src/sync/peer-sync-controller.js"],"names":[],"mappings":"AAKA,6DAA6D;AAC7D,0CAA0C;AAC1C,wDAAwD;AACxD,+CAA+C;AAC/C,iFAAiF;AAEjF;;GAEG;AAEH;IAsBE;;;;;;;OAOG;IACH,iEANG;QAAoD,QAAQ,EAApD,OAAO,UAAU,EAAE,iBAAiB,CAAC;QACgB,WAAW,EAAhE,OAAO,0BAA0B,EAAE,WAAW;QACJ,SAAS,EAAnD,OAAO,iBAAiB,EAAE,SAAS;QACD,KAAK,EAAvC,OAAO,aAAa,EAAE,KAAK;QACb,MAAM;KAAC,EAkB/B;IAED,sBAEC;IAED,qBAEC;IAED,gGAEC;IAED,iDAAiD;IACjD,sCADY,gBAAgB,QAO3B;IAED;;OAEG;IACH,iCAFW,MAAM,QAoBhB;;CAuMF;wBAGY,GAAG,SAAsB,IAAT,SAAS,CAAC,CAAC,EAAE,OAAO,sBAAsB,EAAE,kBAAkB,GAAE;yBAG/E,MAAM,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;6BA1SpD,IAAI,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,GAAG,SAAS;sCALV,eAAe;uCAEd,uCAAuC;uBAPvD,cAAc;+BAMN,aAAa;0BAFlB,aAAa"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@comapeo/core",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.2",
|
|
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",
|
|
@@ -15,9 +15,13 @@ import { getErrorCode } from '../lib/error.js'
|
|
|
15
15
|
/** @typedef {{ publicKey: Buffer, secretKey: Buffer }} Keypair */
|
|
16
16
|
/** @typedef {OpenedNoiseStream<net.Socket>} OpenedNetNoiseStream */
|
|
17
17
|
|
|
18
|
+
/** @satisfies {import('node:net').ServerOpts | import('node:net').TcpNetConnectOpts} */
|
|
18
19
|
const TCP_KEEP_ALIVE_OPTIONS = {
|
|
19
20
|
keepAlive: true,
|
|
20
|
-
keepAliveInitialDelay:
|
|
21
|
+
keepAliveInitialDelay: 30_000,
|
|
22
|
+
// Turn off Nagle's algorythm, to reduce latency
|
|
23
|
+
// https://github.com/digidem/comapeo-core/issues/1070
|
|
24
|
+
noDelay: true,
|
|
21
25
|
}
|
|
22
26
|
export const ERR_DUPLICATE = 'Duplicate connection'
|
|
23
27
|
|
|
@@ -40,6 +44,7 @@ export class LocalDiscovery extends TypedEmitter {
|
|
|
40
44
|
/** @type {(e: Error) => void} */
|
|
41
45
|
#handleSocketError
|
|
42
46
|
#l
|
|
47
|
+
#port = 0
|
|
43
48
|
|
|
44
49
|
/**
|
|
45
50
|
* @param {Object} opts
|
|
@@ -76,9 +81,19 @@ export class LocalDiscovery extends TypedEmitter {
|
|
|
76
81
|
/** @returns {Promise<void>} */
|
|
77
82
|
async #start() {
|
|
78
83
|
// Let OS choose port, listen on ip4, all interfaces
|
|
79
|
-
this.#server
|
|
80
|
-
|
|
84
|
+
const onListening = once(this.#server, 'listening')
|
|
85
|
+
|
|
86
|
+
try {
|
|
87
|
+
this.#server.listen(this.#port, '0.0.0.0')
|
|
88
|
+
await onListening
|
|
89
|
+
} catch (e) {
|
|
90
|
+
if (this.#port === 0) throw e
|
|
91
|
+
// Account for errors from re-binding the port failing
|
|
92
|
+
this.#port = 0
|
|
93
|
+
return this.#start()
|
|
94
|
+
}
|
|
81
95
|
const addr = getAddress(this.#server)
|
|
96
|
+
this.#port = addr.port
|
|
82
97
|
this.#log('server listening on port ' + addr.port)
|
|
83
98
|
}
|
|
84
99
|
|
|
@@ -97,9 +112,9 @@ export class LocalDiscovery extends TypedEmitter {
|
|
|
97
112
|
return
|
|
98
113
|
}
|
|
99
114
|
const socket = net.connect({
|
|
115
|
+
...TCP_KEEP_ALIVE_OPTIONS,
|
|
100
116
|
host: address,
|
|
101
117
|
port,
|
|
102
|
-
...TCP_KEEP_ALIVE_OPTIONS,
|
|
103
118
|
})
|
|
104
119
|
socket.on('error', this.#handleSocketError)
|
|
105
120
|
socket.once('connect', () => {
|
|
@@ -276,15 +291,25 @@ export class LocalDiscovery extends TypedEmitter {
|
|
|
276
291
|
const { port } = getAddress(this.#server)
|
|
277
292
|
this.#server.close()
|
|
278
293
|
const closePromise = once(this.#server, 'close')
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
294
|
+
|
|
295
|
+
const forceClose = () => {
|
|
296
|
+
for (const socket of this.#noiseConnections.values()) {
|
|
297
|
+
socket.destroy()
|
|
298
|
+
}
|
|
299
|
+
return pTimeout(closePromise, { milliseconds: 500 })
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
if (!force) {
|
|
303
|
+
await closePromise
|
|
304
|
+
} else if (timeout === 0) {
|
|
305
|
+
// If timeout is 0, we force-close immediately
|
|
306
|
+
await forceClose()
|
|
307
|
+
} else {
|
|
308
|
+
await pTimeout(closePromise, {
|
|
309
|
+
milliseconds: timeout,
|
|
310
|
+
fallback: forceClose,
|
|
311
|
+
})
|
|
312
|
+
}
|
|
288
313
|
this.#log(`stopped for ${port}`)
|
|
289
314
|
}
|
|
290
315
|
}
|
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') {
|
|
@@ -97,16 +97,18 @@ export class IndexWriter {
|
|
|
97
97
|
const indexer = this.#indexers.get(schemaName)
|
|
98
98
|
if (!indexer) continue // Won't happen, but TS doesn't know that
|
|
99
99
|
indexer.batch(docs)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
100
|
+
// TODO: selectively turn this on when log level is 'trace' or 'debug'
|
|
101
|
+
// Otherwise this has a big performance overhead because this is all synchronous
|
|
102
|
+
// if (this.#l.log.enabled) {
|
|
103
|
+
// for (const doc of docs) {
|
|
104
|
+
// this.#l.log(
|
|
105
|
+
// 'Indexed %s %S @ %S',
|
|
106
|
+
// doc.schemaName,
|
|
107
|
+
// doc.docId,
|
|
108
|
+
// doc.versionId
|
|
109
|
+
// )
|
|
110
|
+
// }
|
|
111
|
+
// }
|
|
110
112
|
}
|
|
111
113
|
return indexed
|
|
112
114
|
}
|
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
|
/**
|
|
@@ -4,8 +4,8 @@ import { InviteResponse_Decision } from '../generated/rpc.js'
|
|
|
4
4
|
import ensureError from 'ensure-error'
|
|
5
5
|
import { TimeoutError } from '../errors.js'
|
|
6
6
|
|
|
7
|
-
const RECEIVE_PROJECT_DETAILS_TIMEOUT_MS =
|
|
8
|
-
const ADD_PROJECT_TIMEOUT_MS =
|
|
7
|
+
const RECEIVE_PROJECT_DETAILS_TIMEOUT_MS = 45_000
|
|
8
|
+
const ADD_PROJECT_TIMEOUT_MS = 45_000
|
|
9
9
|
|
|
10
10
|
/** @import { StringToTaggedUnion } from '../types.js' */
|
|
11
11
|
/** @import { ProjectJoinDetails } from '../generated/rpc.js' */
|
package/src/mapeo-manager.js
CHANGED
|
@@ -643,23 +643,9 @@ export class MapeoManager extends TypedEmitter {
|
|
|
643
643
|
|
|
644
644
|
// Any errors from here we need to remove project from db because it has not
|
|
645
645
|
// been fully added and synced
|
|
646
|
+
let project = null
|
|
646
647
|
try {
|
|
647
|
-
|
|
648
|
-
const project = await this.getProject(projectPublicId)
|
|
649
|
-
|
|
650
|
-
try {
|
|
651
|
-
const deviceInfo = this.getDeviceInfo()
|
|
652
|
-
if (hasSavedDeviceInfo(deviceInfo)) {
|
|
653
|
-
await project[kSetOwnDeviceInfo](deviceInfo)
|
|
654
|
-
}
|
|
655
|
-
} catch (e) {
|
|
656
|
-
// Can ignore an error trying to write device info
|
|
657
|
-
this.#l.log(
|
|
658
|
-
'ERROR: failed to write project %h deviceInfo %o',
|
|
659
|
-
projectKey,
|
|
660
|
-
e
|
|
661
|
-
)
|
|
662
|
-
}
|
|
648
|
+
project = await this.getProject(projectPublicId)
|
|
663
649
|
|
|
664
650
|
/** @type {import('drizzle-orm').InferInsertModel<typeof projectSettingsTable>} */
|
|
665
651
|
const settingsDoc = {
|
|
@@ -677,14 +663,9 @@ export class MapeoManager extends TypedEmitter {
|
|
|
677
663
|
}
|
|
678
664
|
|
|
679
665
|
await this.#db.insert(projectSettingsTable).values([settingsDoc])
|
|
680
|
-
|
|
681
|
-
// 5. Wait for initial project sync
|
|
682
|
-
if (waitForSync) {
|
|
683
|
-
await this.#waitForInitialSync(project)
|
|
684
|
-
}
|
|
685
|
-
|
|
686
666
|
this.#activeProjects.set(projectPublicId, project)
|
|
687
667
|
} catch (e) {
|
|
668
|
+
// Only happens if getProject or the the DB insert fails
|
|
688
669
|
this.#l.log('ERROR: could not add project', e)
|
|
689
670
|
this.#db
|
|
690
671
|
.delete(projectKeysTable)
|
|
@@ -692,6 +673,29 @@ export class MapeoManager extends TypedEmitter {
|
|
|
692
673
|
.run()
|
|
693
674
|
throw e
|
|
694
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
|
+
}
|
|
695
699
|
this.#l.log('Added project %h, public ID: %S', projectKey, projectPublicId)
|
|
696
700
|
return projectPublicId
|
|
697
701
|
}
|
|
@@ -704,14 +708,14 @@ export class MapeoManager extends TypedEmitter {
|
|
|
704
708
|
*
|
|
705
709
|
* @param {MapeoProject} project
|
|
706
710
|
* @param {object} [opts]
|
|
707
|
-
* @param {number} [opts.timeoutMs=
|
|
711
|
+
* @param {number} [opts.timeoutMs=300_000] Timeout in milliseconds for max time
|
|
708
712
|
* to wait between sync status updates before giving up. As long as syncing is
|
|
709
713
|
* happening, this will never timeout, but if more than timeoutMs passes
|
|
710
714
|
* without any sync activity, then this will resolve `false` e.g. data has not
|
|
711
715
|
* synced
|
|
712
716
|
* @returns {Promise<boolean>}
|
|
713
717
|
*/
|
|
714
|
-
async #waitForInitialSync(project, { timeoutMs =
|
|
718
|
+
async #waitForInitialSync(project, { timeoutMs = 300_000 } = {}) {
|
|
715
719
|
const [ownRole, isProjectSettingsSynced] = await Promise.all([
|
|
716
720
|
project.$getOwnRole(),
|
|
717
721
|
project.$hasSyncedProjectSettings(),
|
package/src/mapeo-project.js
CHANGED
|
@@ -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({
|
|
@@ -988,15 +989,10 @@ export class MapeoProject extends TypedEmitter {
|
|
|
988
989
|
async #exportPrefix(type = '') {
|
|
989
990
|
const name = await this.#getProjectName()
|
|
990
991
|
const date = new Date()
|
|
991
|
-
const
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
|
|
995
|
-
day: 'numeric',
|
|
996
|
-
})
|
|
997
|
-
.replaceAll('/', '_')
|
|
998
|
-
.replaceAll('-', '_')
|
|
999
|
-
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}`
|
|
1000
996
|
}
|
|
1001
997
|
|
|
1002
998
|
/**
|
|
@@ -1144,10 +1140,8 @@ export class MapeoProject extends TypedEmitter {
|
|
|
1144
1140
|
const stream = this.#blobStore.createReadStream(blobId)
|
|
1145
1141
|
const name = path.posix.join(
|
|
1146
1142
|
mediaFolder,
|
|
1147
|
-
blobId.variant
|
|
1148
|
-
`${attachment.name}${extensionString}`
|
|
1143
|
+
`${attachment.name}_${blobId.variant}${extensionString}`
|
|
1149
1144
|
)
|
|
1150
|
-
|
|
1151
1145
|
// @ts-expect-error
|
|
1152
1146
|
await archive.entry(stream, { name })
|
|
1153
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 {
|
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)) {
|
|
@@ -132,7 +132,9 @@ export class PeerSyncController {
|
|
|
132
132
|
const localState = mapObject(state, (ns, nsState) => {
|
|
133
133
|
return [ns, nsState.localState]
|
|
134
134
|
})
|
|
135
|
-
this
|
|
135
|
+
// TODO: Turn this on when log level is 'trace' or 'debug'
|
|
136
|
+
// This logs _a lot_ of data, which has a performance overhead
|
|
137
|
+
// this.#log('state %X', state)
|
|
136
138
|
|
|
137
139
|
// Map of which namespaces have received new data since last sync change
|
|
138
140
|
const didUpdate = mapObject(state, (ns) => {
|