@verdant-web/store 3.9.0 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/bundle/index.js +6 -6
  2. package/dist/bundle/index.js.map +4 -4
  3. package/dist/esm/client/ClientDescriptor.d.ts +1 -1
  4. package/dist/esm/entities/Entity.d.ts +4 -0
  5. package/dist/esm/entities/Entity.js +8 -0
  6. package/dist/esm/entities/Entity.js.map +1 -1
  7. package/dist/esm/entities/types.d.ts +3 -1
  8. package/dist/esm/index.d.ts +2 -1
  9. package/dist/esm/index.js +1 -0
  10. package/dist/esm/index.js.map +1 -1
  11. package/dist/esm/metadata/MessageCreator.d.ts +5 -2
  12. package/dist/esm/metadata/MessageCreator.js +3 -2
  13. package/dist/esm/metadata/MessageCreator.js.map +1 -1
  14. package/dist/esm/sync/PresenceManager.d.ts +22 -3
  15. package/dist/esm/sync/PresenceManager.js +65 -7
  16. package/dist/esm/sync/PresenceManager.js.map +1 -1
  17. package/dist/esm/sync/PushPullSync.js +1 -1
  18. package/dist/esm/sync/PushPullSync.js.map +1 -1
  19. package/dist/esm/sync/Sync.js +6 -5
  20. package/dist/esm/sync/Sync.js.map +1 -1
  21. package/dist/esm/sync/WebSocketSync.js +1 -1
  22. package/dist/esm/sync/WebSocketSync.js.map +1 -1
  23. package/dist/esm/sync/cliSync.d.ts +10 -0
  24. package/dist/esm/sync/cliSync.js +13 -0
  25. package/dist/esm/sync/cliSync.js.map +1 -0
  26. package/package.json +2 -2
  27. package/src/client/ClientDescriptor.ts +1 -1
  28. package/src/entities/Entity.ts +9 -0
  29. package/src/entities/types.ts +11 -1
  30. package/src/index.ts +2 -0
  31. package/src/metadata/MessageCreator.ts +7 -4
  32. package/src/sync/PresenceManager.ts +94 -9
  33. package/src/sync/PushPullSync.ts +1 -3
  34. package/src/sync/Sync.ts +10 -5
  35. package/src/sync/WebSocketSync.ts +1 -3
  36. package/src/sync/cliSync.ts +18 -0
@@ -1 +1 @@
1
- {"version":3,"file":"WebSocketSync.js","sourceRoot":"","sources":["../../../src/sync/WebSocketSync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WebSocketSync.js","sourceRoot":"","sources":["../../../src/sync/WebSocketSync.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,eAAe,GAEf,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK3C,MAAM,OAAO,aACZ,SAAQ,eAAoC;IA2B5C,YAAY,EACX,gBAAgB,EAChB,IAAI,EACJ,QAAQ,EACR,GAAG,GAMH;QACA,KAAK,EAAE,CAAC;QAjCD,WAAM,GAAqB,IAAI,CAAC;QACxC,iDAAiD;QACzC,iBAAY,GAAoB,EAAE,CAAC;QAC3C,0CAA0C;QAClC,cAAS,GAAoB,EAAE,CAAC;QACxC,sCAAsC;QAC9B,kBAAa,GAAoB,EAAE,CAAC;QAEpC,YAAO,GAAwB,QAAQ,CAAC;QACxC,WAAM,GAAG,KAAK,CAAC;QACf,mBAAc,GAAG,KAAK,CAAC;QACvB,oBAAe,GAAG,KAAK,CAAC;QAEvB,SAAI,GAAG,UAAU,CAAC;QACnB,QAAG,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE,GAAE,CAAC,CAAC;QAE7B,cAAS,GAAG,IAAI,SAAS,EAAE,CAAC;QAE5B,uBAAkB,GAAG,IAAI,gBAAgB,CAChD,IAAI,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAC3B,CAAC;QA2BM,WAAM,GAAG,GAAG,EAAE;YACrB,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;YACpB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC9B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;oBACrC,IAAI,CAAC,GAAG,CAAC,wBAAwB,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBACjE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;gBACvC,CAAC;gBACD,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC3B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC1B,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QACjC,CAAC,CAAC;QAEM,mBAAc,GAAG,KAAK,EAAE,MAAe,EAAE,EAAE;YAClD,IAAI,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACnB,OAAO;YACR,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACb,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC;gBAC5B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;YACvB,CAAC;iBAAM,CAAC;gBACP,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC1B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC3B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;gBACpB,IAAI,CAAC,IAAI,CACR,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CACvE,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;gBAC5D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YACxB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC,CAAC;QAEM,cAAS,GAAG,KAAK,EAAE,KAAmB,EAAE,EAAE;YACjD,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBAC1B,IAAI,CAAC,GAAG,CACP,sDAAsD,EACtD,KAAK,CAAC,IAAI,CACV,CAAC;gBACF,OAAO;YACR,CAAC;YAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAkB,CAAC;YACxD,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gBACtB,KAAK,WAAW;oBACf,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;wBAC1B,yDAAyD;wBACzD,IAAI,CAAC,IAAI,CACR,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,CAAC,CAC9D,CAAC;oBACH,CAAC;oBACD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;oBACnB,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;wBAC3B,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC;4BAChC,IAAI,CAAC,GAAG,CACP,MAAM,EACN,0DAA0D,CAC1D,CAAC;4BACF,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;wBACrB,CAAC;6BAAM,CAAC;4BACP,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gCAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4BAChB,CAAC;4BACD,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;wBACrB,CAAC;oBACF,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC9B,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;wBAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;4BACtC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;wBAC3B,CAAC;wBACD,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;oBACzB,CAAC;oBACD,MAAM;gBACP,KAAK,YAAY,CAAC;gBAClB,KAAK,kBAAkB,CAAC;gBACxB,KAAK,kBAAkB;oBACtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC9B,MAAM;gBACP,KAAK,OAAO;oBACX,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;wBAClB,IAAI,CAAC,GAAG,CACP,2DAA2D,EAC3D,OAAO,CACP,CAAC;wBACF,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;wBACjC,MAAM;oBACP,CAAC;oBACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC9B,MAAM;gBACP,KAAK,oBAAoB;oBACxB,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;oBAC3B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC9B,MAAM;gBACP;oBACC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;oBAC/B,CAAC;oBACD,MAAM;YACR,CAAC;QACF,CAAC,CAAC;QAEM,YAAO,GAAG,CAAC,KAAY,EAAE,EAAE;YAClC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAChB,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC;YAE/B,IAAI,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;QACpD,CAAC,CAAC;QAEM,YAAO,GAAG,CAAC,KAAiB,EAAE,EAAE;YACvC,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAC9B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAC3B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC,CAAC;QAEM,qBAAgB,GAAG,KAAK,IAAI,EAAE;YACrC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE,CAAC;YAC5D,2CAA2C;YAC3C,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC5E,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACxD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC,MAAM,CAAC;QACpB,CAAC,CAAC;QAEM,kBAAa,GAAG,KAAK,IAAI,EAAE;YAClC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,cAAS,GAAG,GAAG,EAAE;YAChB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC,CAAC;QAEM,oBAAe,GAAG,CAAC,OAAsB,EAAE,EAAE;YACpD,OAAO,CACN,OAAO,CAAC,IAAI,KAAK,MAAM;gBACvB,OAAO,CAAC,IAAI,KAAK,iBAAiB;gBAClC,OAAO,CAAC,IAAI,KAAK,UAAU;gBAC3B,OAAO,CAAC,IAAI,KAAK,WAAW,CAC5B,CAAC;QACH,CAAC,CAAC;QAEF,SAAI,GAAG,CAAC,OAAsB,EAAE,EAAE;;YACjC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ;gBAAE,OAAO;YAErC,uEAAuE;YACvE,2EAA2E;YAC3E,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5D,OAAO;YACR,CAAC;YAED,IAAI,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,UAAU,MAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBAChD,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC9D,IAAI,CAAC,MAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC5C,CAAC;qBAAM,CAAC;oBACP,IAAI,CAAC,GAAG,CACP,yCAAyC,EACzC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAChC,CAAC;oBACF,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACjC,CAAC;YACF,CAAC;iBAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACxB,IAAI,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,UAAU,MAAK,SAAS,CAAC,IAAI,EAAE,CAAC;oBAChD,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;oBAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC3C,CAAC;YACF,CAAC;iBAAM,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBAChC,IAAI,CAAC,GAAG,CACP,iCAAiC,EACjC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAChC,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACF,CAAC,CAAC;QAEF,YAAO,GAAG,GAAG,EAAE;YACd,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,EAAE,CAAC;QACb,CAAC,CAAC;QAEF,UAAK,GAAG,KAAK,IAAI,EAAE;YAClB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO;YACR,CAAC;YACD,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACzB,CAAC,CAAC;QAEF,SAAI,GAAG,GAAG,EAAE;;YACX,MAAA,IAAI,CAAC,MAAM,0CAAE,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YAC5D,MAAA,IAAI,CAAC,MAAM,0CAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YACxD,MAAA,IAAI,CAAC,MAAM,0CAAE,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACzB,CAAC,CAAC;QAzND,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;QAC3B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAEzB,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC;IAED,IAAI,SAAS;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC;IACpB,CAAC;IAgND,cAAc;QACb,IAAI,CAAC,aAAa,GAAG,EAAE,CAAC;QACxB,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IAC7B,CAAC;IAED,IAAI,WAAW;;QACd,OAAO,CAAA,MAAA,IAAI,CAAC,MAAM,0CAAE,UAAU,MAAK,SAAS,CAAC,IAAI,CAAC;IACnD,CAAC;IAED,IAAI,MAAM;QACT,OAAO,IAAI,CAAC,OAAO,CAAC;IACrB,CAAC;CACD"}
@@ -0,0 +1,10 @@
1
+ export declare function cliSync<Presence extends any = any>(libraryId: string, { port, initialPresence, }?: {
2
+ port?: number;
3
+ initialPresence?: Presence;
4
+ }): {
5
+ defaultProfile: {
6
+ id: string;
7
+ };
8
+ initialPresence: Presence;
9
+ authEndpoint: string;
10
+ };
@@ -0,0 +1,13 @@
1
+ export function cliSync(libraryId, { port = 3242, initialPresence = {}, } = {}) {
2
+ let userId = localStorage.getItem('verdant-userId');
3
+ if (!userId) {
4
+ userId = `user-${Math.random().toString(36).slice(2)}`;
5
+ localStorage.setItem('verdant-userId', userId);
6
+ }
7
+ return {
8
+ defaultProfile: { id: userId },
9
+ initialPresence,
10
+ authEndpoint: `http://localhost:${port}/auth/${libraryId}?userId=${userId}`,
11
+ };
12
+ }
13
+ //# sourceMappingURL=cliSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cliSync.js","sourceRoot":"","sources":["../../../src/sync/cliSync.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,OAAO,CACtB,SAAiB,EACjB,EACC,IAAI,GAAG,IAAI,EACX,eAAe,GAAG,EAAS,MACuB,EAAE;IAErD,IAAI,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,GAAG,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,YAAY,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,OAAO;QACN,cAAc,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;QAC9B,eAAe;QACf,YAAY,EAAE,oBAAoB,IAAI,SAAS,SAAS,WAAW,MAAM,EAAE;KAC3E,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@verdant-web/store",
3
- "version": "3.9.0",
3
+ "version": "3.11.0",
4
4
  "access": "public",
5
5
  "type": "module",
6
6
  "exports": {
@@ -27,7 +27,7 @@
27
27
  "jwt-decode": "^3.1.2",
28
28
  "kysely": "^0.27.3",
29
29
  "weak-event": "^2.0.5",
30
- "@verdant-web/common": "2.4.0"
30
+ "@verdant-web/common": "2.5.1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "20.10.5",
@@ -91,7 +91,7 @@ export interface ClientDescriptorOptions<Presence = any, Profile = any> {
91
91
  export class ClientDescriptor<
92
92
  Presence = any,
93
93
  Profile = any,
94
- ClientImpl extends Client = Client,
94
+ ClientImpl extends Client = Client<Presence, Profile>,
95
95
  > {
96
96
  private readonly _readyPromise: Promise<ClientImpl>;
97
97
  // assertions because these are defined by plucking them from
@@ -396,6 +396,15 @@ export class Entity<
396
396
  return !!this.access;
397
397
  }
398
398
 
399
+ /**
400
+ * Introspects the schema of a child field of this entity.
401
+ */
402
+ getFieldSchema = (key: any): StorageFieldSchema => {
403
+ const fieldSchema = getChildFieldSchema(this.schema, key);
404
+ assert(fieldSchema, `No schema for key ${key}`);
405
+ return fieldSchema;
406
+ };
407
+
399
408
  /**
400
409
  * Pruning - when entities have invalid children, we 'prune' that
401
410
  * data up to the nearest prunable point - a nullable field,
@@ -1,4 +1,4 @@
1
- import { ObjectIdentifier } from '@verdant-web/common';
1
+ import { ObjectIdentifier, StorageFieldSchema } from '@verdant-web/common';
2
2
  import type { Entity } from './Entity.js';
3
3
 
4
4
  export type AccessibleEntityProperty<T> = T extends Array<any>
@@ -75,6 +75,9 @@ export interface BaseEntity<
75
75
  get<Key extends keyof Value>(key: Key): Value[Key];
76
76
  getAll(): Value;
77
77
  getSnapshot(): Snapshot;
78
+ getFieldSchema<FieldName extends keyof Value>(
79
+ key: FieldName,
80
+ ): StorageFieldSchema;
78
81
  readonly deleted: boolean;
79
82
  readonly updatedAt: number;
80
83
  readonly uid: string;
@@ -209,3 +212,10 @@ export type EntityDestructured<T extends AnyEntity<any, any, any> | null> =
209
212
  ? KeyValue
210
213
  : never)
211
214
  | (T extends null ? null : never);
215
+
216
+ export type EntityInit<T extends AnyEntity<any, any, any>> =
217
+ T extends ListEntity<infer Init, any, any>
218
+ ? Init
219
+ : T extends ObjectEntity<infer Init, any, any>
220
+ ? Init
221
+ : never;
package/src/index.ts CHANGED
@@ -19,6 +19,7 @@ export type {
19
19
  AccessibleEntityProperty,
20
20
  AnyEntity,
21
21
  EntityDestructured,
22
+ EntityInit,
22
23
  } from './entities/types.js';
23
24
  export { ServerSync } from './sync/Sync.js';
24
25
  export type { SyncTransportMode } from './sync/Sync.js';
@@ -56,3 +57,4 @@ export { MigrationPathError } from './migration/errors.js';
56
57
  export * from './utils/id.js';
57
58
  export { UndoHistory } from './UndoHistory.js';
58
59
  export * from './authorization.js';
60
+ export * from './sync/cliSync.js';
@@ -10,6 +10,7 @@ import {
10
10
  PresenceUpdateMessage,
11
11
  SyncAckMessage,
12
12
  SyncMessage,
13
+ VerdantInternalPresence,
13
14
  } from '@verdant-web/common';
14
15
 
15
16
  import { Metadata } from './Metadata.js';
@@ -110,14 +111,16 @@ export class MessageCreator {
110
111
  };
111
112
  };
112
113
 
113
- createPresenceUpdate = async (
114
- presence: any,
115
- ): Promise<PresenceUpdateMessage> => {
114
+ createPresenceUpdate = async (data: {
115
+ presence?: any;
116
+ internal?: VerdantInternalPresence;
117
+ }): Promise<PresenceUpdateMessage> => {
116
118
  const localReplicaInfo = await this.meta.localReplica.get();
117
119
  return {
118
120
  type: 'presence-update',
119
- presence,
121
+ presence: data.presence,
120
122
  replicaId: localReplicaInfo.id,
123
+ internal: data.internal,
121
124
  };
122
125
  };
123
126
 
@@ -3,6 +3,8 @@ import {
3
3
  EventSubscriber,
4
4
  Batcher,
5
5
  Batch,
6
+ VerdantInternalPresence,
7
+ initialInternalPresence,
6
8
  } from '@verdant-web/common';
7
9
  import type { UserInfo } from '../index.js';
8
10
  import {
@@ -30,8 +32,13 @@ export class PresenceManager<
30
32
  /** Fired when a peer presence goes offline */
31
33
  peerLeft: (userId: string, lastPresence: UserInfo<Profile, Presence>) => void;
32
34
  /** Fired after local presence changes are flushed to the server. */
33
- update: (presence: Partial<Presence>) => void;
35
+ update: (data: {
36
+ presence?: Presence;
37
+ internal?: VerdantInternalPresence;
38
+ }) => void;
34
39
  load: () => void;
40
+ /** Fired on any change to a peer or the local user */
41
+ change: () => void;
35
42
  }> {
36
43
  private _peers = {} as Record<string, UserInfo<Profile, Presence>>;
37
44
  private _self = { profile: {} } as UserInfo<Profile, Presence>;
@@ -39,7 +46,10 @@ export class PresenceManager<
39
46
  private _selfReplicaIds = new Set<string>();
40
47
  private _peerIds = new Array<string>();
41
48
  private _updateBatcher;
42
- private _updateBatch: Batch<Partial<Presence>>;
49
+ private _updateBatch: Batch<{
50
+ presence?: Partial<Presence>;
51
+ internal?: Partial<VerdantInternalPresence>;
52
+ }>;
43
53
 
44
54
  get self() {
45
55
  return this._self;
@@ -77,6 +87,7 @@ export class PresenceManager<
77
87
  super();
78
88
  this.self.presence = initialPresence;
79
89
  this.self.profile = defaultProfile;
90
+ this.self.internal = initialInternalPresence;
80
91
  this.self.id = '';
81
92
  this.self.replicaId = '';
82
93
 
@@ -119,12 +130,14 @@ export class PresenceManager<
119
130
  message: ServerMessage,
120
131
  ) => {
121
132
  let peersChanged = false;
133
+ let selfChanged = false;
122
134
  const peerIdsSet = new Set<string>(this.peerIds);
123
135
 
124
136
  if (message.type === 'presence-changed') {
125
137
  if (this.isSelf(localReplicaInfo, message.userInfo)) {
126
138
  this._self = message.userInfo;
127
139
  this._selfReplicaIds.add(message.userInfo.replicaId);
140
+ selfChanged = true;
128
141
  this.emit('selfChanged', message.userInfo);
129
142
  } else {
130
143
  peerIdsSet.add(message.userInfo.id);
@@ -141,6 +154,7 @@ export class PresenceManager<
141
154
  if (this.isSelf(localReplicaInfo, userInfo)) {
142
155
  this._self = userInfo;
143
156
  this._selfReplicaIds.add(userInfo.replicaId);
157
+ selfChanged = true;
144
158
  this.emit('selfChanged', userInfo);
145
159
  } else {
146
160
  peersChanged = true;
@@ -158,24 +172,95 @@ export class PresenceManager<
158
172
  this.emit('peerLeft', message.userId, lastPresence);
159
173
  }
160
174
  if (peersChanged) {
161
- this._peerIds = Array.from(peerIdsSet);
175
+ // important that this stays sorted to keep stable order, don't want
176
+ // peers swapping around.
177
+ this._peerIds = Array.from(peerIdsSet).sort();
162
178
  this.emit('peersChanged', this._peers);
163
179
  }
180
+ if (peersChanged || selfChanged) {
181
+ this.emit('change');
182
+ }
164
183
  };
165
184
 
166
185
  update = async (presence: Partial<Presence>) => {
167
186
  this._updateBatch.update({
168
- items: [presence],
187
+ items: [{ presence }],
169
188
  });
170
189
  // proactively update the local presence
171
190
  this.self.presence = { ...this.self.presence, ...presence };
172
191
  this.emit('selfChanged', this.self);
192
+ this.emit('change');
193
+ };
194
+
195
+ flushPresenceUpdates = (
196
+ presenceUpdates: {
197
+ presence?: Partial<Presence>;
198
+ internal?: Partial<VerdantInternalPresence>;
199
+ }[],
200
+ ) => {
201
+ const data = {
202
+ presence: this.self.presence,
203
+ internal: this.self.internal,
204
+ };
205
+ for (const update of presenceUpdates) {
206
+ if (update.presence) {
207
+ Object.assign(data.presence as any, update.presence);
208
+ }
209
+ if (update.internal) {
210
+ Object.assign(data.internal, update.internal);
211
+ }
212
+ }
213
+ this.emit('update', data);
173
214
  };
174
215
 
175
- flushPresenceUpdates = (presenceUpdates: Partial<Presence>[]) => {
176
- const presence = presenceUpdates.reduce((acc, update) => {
177
- return { ...acc, ...update };
178
- }, this.self.presence);
179
- this.emit('update', presence);
216
+ setViewId = (viewId: string | undefined) => {
217
+ this._updateBatch.update({
218
+ items: [{ internal: { viewId } }],
219
+ });
220
+ this.self.internal.viewId = viewId;
221
+ this.emit('selfChanged', this.self);
222
+ this.emit('change');
223
+ };
224
+
225
+ setFieldId = (fieldId: string | undefined, timestamp = Date.now()) => {
226
+ this._updateBatch.update({
227
+ items: [
228
+ { internal: { lastFieldId: fieldId, lastFieldTimestamp: timestamp } },
229
+ ],
230
+ });
231
+ this.self.internal.lastFieldId = fieldId;
232
+ this.emit('selfChanged', this.self);
233
+ this.emit('change');
234
+ };
235
+
236
+ /**
237
+ * Get all peers that are in the same view as the local user.
238
+ */
239
+ getViewPeers = () => {
240
+ return (
241
+ this._peerIds
242
+ .map((id) => this._peers[id])
243
+ // undefined view matches all peers. otherwise,
244
+ // filter to only those in the same view.
245
+ .filter(
246
+ (peer) =>
247
+ this.self.internal.viewId === undefined ||
248
+ peer.internal.viewId === this.self.internal.viewId,
249
+ )
250
+ );
251
+ };
252
+
253
+ /**
254
+ * Get all peers that have interacted with the specified
255
+ * field most recently.
256
+ */
257
+ getFieldPeers = (fieldId: string, expirationPeriod = 60 * 1000) => {
258
+ return this._peerIds
259
+ .map((id) => this._peers[id])
260
+ .filter(
261
+ (peer) =>
262
+ peer.internal.lastFieldId === fieldId &&
263
+ Date.now() - peer.internal.lastFieldTimestamp! < expirationPeriod,
264
+ );
180
265
  };
181
266
  }
@@ -204,9 +204,7 @@ export class PushPullSync
204
204
  // will include the client's own presence info and fill in missing profile
205
205
  // data on the first request. otherwise it would have to wait for the second.
206
206
  this.sendRequest([
207
- await this.meta.messageCreator.createPresenceUpdate(
208
- this.presence.self.presence,
209
- ),
207
+ await this.meta.messageCreator.createPresenceUpdate(this.presence.self),
210
208
  await this.meta.messageCreator.createSyncStep1(),
211
209
  ]);
212
210
  };
package/src/sync/Sync.ts CHANGED
@@ -8,6 +8,7 @@ import {
8
8
  rewriteAuthzOriginator,
9
9
  ServerMessage,
10
10
  VerdantError,
11
+ VerdantInternalPresence,
11
12
  } from '@verdant-web/common';
12
13
  import { Metadata } from '../metadata/Metadata.js';
13
14
  import { HANDLE_MESSAGE, PresenceManager } from './PresenceManager.js';
@@ -299,12 +300,13 @@ export class ServerSync<Presence = any, Profile = any>
299
300
 
300
301
  if (automaticTransportSelection && this.canDoRealtime) {
301
302
  // automatically shift between transport modes depending
302
- // on whether any peers are present
303
+ // on whether any peers are present (matching view if
304
+ // applicable)
303
305
  const decideIfUpgrade = () => {
304
306
  if (switchoverTimeout) {
305
307
  clearTimeout(switchoverTimeout);
306
308
  }
307
- const hasPeers = Object.keys(this.presence.peers).length > 0;
309
+ const hasPeers = this.presence.getViewPeers().length > 0;
308
310
  const shouldUpgrade =
309
311
  hasPeers ||
310
312
  (automaticTransportSelection !== 'peers-only' &&
@@ -314,7 +316,7 @@ export class ServerSync<Presence = any, Profile = any>
314
316
  } else if (!shouldUpgrade && this.mode === 'realtime') {
315
317
  // wait 1 second then switch to pull mode if still empty
316
318
  switchoverTimeout = setTimeout(() => {
317
- if (Object.keys(this.presence.peers).length === 0) {
319
+ if (this.presence.getViewPeers().length === 0) {
318
320
  this.setMode('pull');
319
321
  }
320
322
  }, 1000);
@@ -422,8 +424,11 @@ export class ServerSync<Presence = any, Profile = any>
422
424
  private handleOnlineChange = (online: boolean) => {
423
425
  this.emit('onlineChange', online);
424
426
  };
425
- private handlePresenceUpdate = async (presence: any) => {
426
- this.send(await this.meta.messageCreator.createPresenceUpdate(presence));
427
+ private handlePresenceUpdate = async (data: {
428
+ presence?: Presence;
429
+ internal?: VerdantInternalPresence;
430
+ }) => {
431
+ this.send(await this.meta.messageCreator.createPresenceUpdate(data));
427
432
  };
428
433
 
429
434
  setMode = (transport: SyncTransportMode) => {
@@ -94,9 +94,7 @@ export class WebSocketSync
94
94
  this.hasStartedSync = true;
95
95
  this.synced = false;
96
96
  this.send(
97
- await this.meta.messageCreator.createPresenceUpdate(
98
- this.presence.self.presence,
99
- ),
97
+ await this.meta.messageCreator.createPresenceUpdate(this.presence.self),
100
98
  );
101
99
  this.send(await this.meta.messageCreator.createSyncStep1());
102
100
  this.heartbeat.start();
@@ -0,0 +1,18 @@
1
+ export function cliSync<Presence extends any = any>(
2
+ libraryId: string,
3
+ {
4
+ port = 3242,
5
+ initialPresence = {} as any,
6
+ }: { port?: number; initialPresence?: Presence } = {},
7
+ ) {
8
+ let userId = localStorage.getItem('verdant-userId');
9
+ if (!userId) {
10
+ userId = `user-${Math.random().toString(36).slice(2)}`;
11
+ localStorage.setItem('verdant-userId', userId);
12
+ }
13
+ return {
14
+ defaultProfile: { id: userId },
15
+ initialPresence,
16
+ authEndpoint: `http://localhost:${port}/auth/${libraryId}?userId=${userId}`,
17
+ };
18
+ }