@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.
- package/dist/cjs/synchronize.js +1 -1
- package/dist/cjs/synchronize.js.map +3 -3
- package/dist/esm/synchronize.js +1 -1
- package/dist/esm/synchronize.js.map +3 -3
- package/dist/index.browser.js +1 -1
- package/dist/index.browser.js.map +3 -3
- package/dist/synchronize.d.ts +1 -1
- package/dist/synchronize.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/synchronize.ts +20 -11
package/dist/synchronize.d.ts
CHANGED
|
@@ -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;
|
|
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
package/src/synchronize.ts
CHANGED
|
@@ -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
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
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 =
|
|
162
|
+
const callback: Callback = (oldObjectRaw, newObjectRaw) => {
|
|
154
163
|
for (const objectRaw of [newObjectRaw, oldObjectRaw]) {
|
|
155
164
|
if (
|
|
156
165
|
objectRaw &&
|