@graffiti-garden/implementation-local 0.2.11 → 0.2.12

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.
@@ -14,7 +14,7 @@ export declare class GraffitiSynchronize implements Pick<Graffiti, "put" | "get"
14
14
  protected readonly graffiti: GraffitiDatabaseMethods;
15
15
  protected readonly callbacks: Set<Callback>;
16
16
  constructor(graffiti: GraffitiDatabaseMethods, ajv?: Ajv);
17
- protected synchronizeDispatch(oldObject: GraffitiObjectBase, newObject?: GraffitiObjectBase): Promise<void>;
17
+ protected synchronizeDispatch(oldObject: GraffitiObjectBase, newObject?: GraffitiObjectBase, macroTask?: boolean): Promise<void>;
18
18
  get: Graffiti["get"];
19
19
  put: Graffiti["put"];
20
20
  patch: Graffiti["patch"];
@@ -1 +1 @@
1
- {"version":3,"file":"synchronize.d.ts","sourceRoot":"","sources":["../src/synchronize.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAY/D,KAAK,uBAAuB,GAAG,IAAI,CACjC,QAAQ,EACR,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,gBAAgB,CACnE,CAAC;AAEF,KAAK,QAAQ,GAAG,CACd,SAAS,EAAE,kBAAkB,EAC7B,SAAS,CAAC,EAAE,kBAAkB,KAC3B,IAAI,CAAC;AAEV;;;;;GAKG;AACH,qBAAa,mBACX,YACE,IAAI,CACF,QAAQ,EACN,KAAK,GACL,KAAK,GACL,OAAO,GACP,QAAQ,GACR,UAAU,GACV,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,2BAA2B,CAC9B;IAEH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IACrD,SAAS,CAAC,QAAQ,CAAC,SAAS,gBAAuB;gBAIvC,QAAQ,EAAE,uBAAuB,EAAE,GAAG,CAAC,EAAE,GAAG;cAKxC,mBAAmB,CACjC,SAAS,EAAE,kBAAkB,EAC7B,SAAS,CAAC,EAAE,kBAAkB;IAchC,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAIlB;IAEF,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAYlB;IAEF,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAStB;IAEF,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAIxB;IAEF,SAAS,CAAC,YAAY,CAAC,MAAM,SAAS,WAAW,EAC/C,QAAQ,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;;;;;;;;;IAiBlE,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAG5B;IAEF,cAAc,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAGxC;IAEF,SAAS,CAAC,WAAW,CAAC,MAAM,SAAS,WAAW,EAC9C,WAAW,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,EACpD,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAgClC,mBAAmB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAMlD;IAEF,cAAc,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAQxC;IAEF,yBAAyB,EAAE,QAAQ,CAAC,2BAA2B,CAAC,CAQ9D;CACH"}
1
+ {"version":3,"file":"synchronize.d.ts","sourceRoot":"","sources":["../src/synchronize.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,cAAc,CAAC;AAC/B,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,WAAW,EACZ,MAAM,sBAAsB,CAAC;AAC9B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAY/D,KAAK,uBAAuB,GAAG,IAAI,CACjC,QAAQ,EACR,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,gBAAgB,CACnE,CAAC;AAEF,KAAK,QAAQ,GAAG,CACd,SAAS,EAAE,kBAAkB,EAC7B,SAAS,CAAC,EAAE,kBAAkB,KAC3B,IAAI,CAAC;AAEV;;;;;GAKG;AACH,qBAAa,mBACX,YACE,IAAI,CACF,QAAQ,EACN,KAAK,GACL,KAAK,GACL,OAAO,GACP,QAAQ,GACR,UAAU,GACV,gBAAgB,GAChB,qBAAqB,GACrB,gBAAgB,GAChB,2BAA2B,CAC9B;IAEH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAC5B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IACrD,SAAS,CAAC,QAAQ,CAAC,SAAS,gBAAuB;gBAIvC,QAAQ,EAAE,uBAAuB,EAAE,GAAG,CAAC,EAAE,GAAG;cAKxC,mBAAmB,CACjC,SAAS,EAAE,kBAAkB,EAC7B,SAAS,CAAC,EAAE,kBAAkB,EAC9B,SAAS,UAAQ;IAsBnB,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAIlB;IAEF,GAAG,EAAE,QAAQ,CAAC,KAAK,CAAC,CAYlB;IAEF,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAStB;IAEF,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAIxB;IAEF,SAAS,CAAC,YAAY,CAAC,MAAM,SAAS,WAAW,EAC/C,QAAQ,EAAE,UAAU,CAAC,OAAO,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;;;;;;;;;IAiBlE,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,CAG5B;IAEF,cAAc,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAGxC;IAEF,SAAS,CAAC,WAAW,CAAC,MAAM,SAAS,WAAW,EAC9C,WAAW,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,OAAO,EACpD,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI;IAgClC,mBAAmB,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAMlD;IAEF,cAAc,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAQxC;IAEF,yBAAyB,EAAE,QAAQ,CAAC,2BAA2B,CAAC,CAQ9D;CACH"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@graffiti-garden/implementation-local",
3
- "version": "0.2.11",
3
+ "version": "0.2.12",
4
4
  "description": "A local implementation of the Graffiti API using PouchDB",
5
5
  "types": "./dist/index.d.ts",
6
6
  "module": "./dist/esm/index.js",
@@ -61,17 +61,26 @@ export class GraffitiSynchronize
61
61
  protected async synchronizeDispatch(
62
62
  oldObject: GraffitiObjectBase,
63
63
  newObject?: GraffitiObjectBase,
64
+ macroTask = false,
64
65
  ) {
65
66
  for (const callback of this.callbacks) {
66
67
  callback(oldObject, newObject);
67
68
  }
68
- // No idea why this works...
69
- // You can't await push in the callback
70
- // below, because the await will only resolve
71
- // after a subsequent .next() call
72
- await Promise.resolve();
73
- await Promise.resolve();
74
- await Promise.resolve();
69
+ if (macroTask) {
70
+ // Wait for one macro task cycle...
71
+ // This way the yields, triggered by the callbacks,
72
+ // will resolve first. Unfortunately, if we try to
73
+ // use @repeaterjs's `await push` in the callback,
74
+ // the promise won't resolve until the next
75
+ // .next() call of the iterator, so if only
76
+ // one .next() is called, this dispatch will hang.
77
+ //
78
+ // Only mutators (put, patch, delete) should bother
79
+ // using this, so that they can ensure the application
80
+ // state has been updated everywhere before returning,
81
+ // for proper feedback.
82
+ await new Promise((resolve) => setTimeout(resolve, 0));
83
+ }
75
84
  }
76
85
 
77
86
  get: Graffiti["get"] = async (...args) => {
@@ -90,7 +99,7 @@ export class GraffitiSynchronize
90
99
  allowed: partialObject.allowed,
91
100
  tombstone: false,
92
101
  };
93
- await this.synchronizeDispatch(oldObject, newObject);
102
+ await this.synchronizeDispatch(oldObject, newObject, true);
94
103
  return oldObject;
95
104
  };
96
105
 
@@ -101,13 +110,13 @@ export class GraffitiSynchronize
101
110
  for (const prop of ["value", "channels", "allowed"] as const) {
102
111
  applyGraffitiPatch(applyPatch, prop, args[0], newObject);
103
112
  }
104
- await this.synchronizeDispatch(oldObject, newObject);
113
+ await this.synchronizeDispatch(oldObject, newObject, true);
105
114
  return oldObject;
106
115
  };
107
116
 
108
117
  delete: Graffiti["delete"] = async (...args) => {
109
118
  const oldObject = await this.graffiti.delete(...args);
110
- await this.synchronizeDispatch(oldObject);
119
+ await this.synchronizeDispatch(oldObject, undefined, true);
111
120
  return oldObject;
112
121
  };
113
122
 
@@ -150,7 +159,7 @@ export class GraffitiSynchronize
150
159
  const repeater: ReturnType<
151
160
  typeof Graffiti.prototype.synchronizeDiscover<typeof schema>
152
161
  > = new Repeater(async (push, stop) => {
153
- const callback: Callback = async (oldObjectRaw, newObjectRaw) => {
162
+ const callback: Callback = (oldObjectRaw, newObjectRaw) => {
154
163
  for (const objectRaw of [newObjectRaw, oldObjectRaw]) {
155
164
  if (
156
165
  objectRaw &&