jazz-tools 0.18.10 → 0.18.11

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.
@@ -32,7 +32,7 @@ export declare function getAuthSecretStorage(): AuthSecretStorage;
32
32
  export declare class InviteListener<V extends CoValueClassOrSchema> {
33
33
  constructor({ invitedObjectSchema, onAccept, forValueHint, }: {
34
34
  invitedObjectSchema: V;
35
- onAccept: (projectID: ID<V>) => void;
35
+ onAccept: (coValueID: ID<V>) => void;
36
36
  forValueHint?: string;
37
37
  });
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jazz.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,oBAAoB,EACpB,EAAE,EAEF,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,CAAC;AAE1C;;GAEG;AACH,eAAO,MAAM,QAAQ,IAAK,CAAC;AAC3B,eAAO,MAAM,aAAa,IAAK,CAAC;AAEhC;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,OAAO,IAAI;IAC7C,OAAO,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,SAAS,OAAO,KAW9B;IAChB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC/B,CACF;AAED,wBAAgB,oBAAoB,sBAUnC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,oBAAoB;gBAC5C,EACV,mBAAmB,EACnB,QAAQ,EACR,YAAY,GACb,EAAE;QACD,mBAAmB,EAAE,CAAC,CAAC;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACrC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CA+BF"}
1
+ {"version":3,"file":"jazz.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,oBAAoB,EACpB,EAAE,EAEF,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,CAAC;AAE1C;;GAEG;AACH,eAAO,MAAM,QAAQ,IAAK,CAAC;AAC3B,eAAO,MAAM,aAAa,IAAK,CAAC;AAEhC;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,OAAO,IAAI;IAC7C,OAAO,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,SAAS,OAAO,KAW9B;IAChB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC/B,CACF;AAED,wBAAgB,oBAAoB,sBAUnC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,oBAAoB;gBAC5C,EACV,mBAAmB,EACnB,QAAQ,EACR,YAAY,GACb,EAAE;QACD,mBAAmB,EAAE,CAAC,CAAC;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACrC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CA2BF"}
@@ -1,5 +1,5 @@
1
1
  import { consumeInviteLinkFromWindowLocation } from "jazz-tools/browser";
2
- import { getContext, untrack } from "svelte";
2
+ import { getContext, onDestroy, untrack } from "svelte";
3
3
  import Provider from "./Provider.svelte";
4
4
  export { Provider as JazzSvelteProvider };
5
5
  /**
@@ -38,33 +38,26 @@ export function getAuthSecretStorage() {
38
38
  */
39
39
  export class InviteListener {
40
40
  constructor({ invitedObjectSchema, onAccept, forValueHint, }) {
41
- // TODO Listen to the hashchange event
42
41
  const _onAccept = onAccept;
43
- // Subscribe to the onAccept function.
42
+ const ctx = getJazzContext();
43
+ const tryConsume = () => {
44
+ if (!ctx.current || !("me" in ctx.current))
45
+ return;
46
+ consumeInviteLinkFromWindowLocation({
47
+ as: ctx.current.me,
48
+ invitedObjectSchema,
49
+ forValueHint,
50
+ })
51
+ .then((result) => result && _onAccept(result.valueID))
52
+ .catch((e) => console.error("Failed to accept invite", e));
53
+ };
54
+ // run once when instantiated
44
55
  $effect(() => {
45
- const ctx = getJazzContext();
46
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
47
- _onAccept;
48
- // Subscribe to the onAccept function.
49
- untrack(() => {
50
- // If there is no context, return.
51
- if (!ctx.current)
52
- return;
53
- if (!("me" in ctx.current))
54
- return;
55
- // Consume the invite link from the window location.
56
- const result = consumeInviteLinkFromWindowLocation({
57
- as: ctx.current.me,
58
- invitedObjectSchema,
59
- forValueHint,
60
- });
61
- // If the result is valid, call the onAccept function.
62
- result
63
- .then((result) => result && _onAccept(result?.valueID))
64
- .catch((e) => {
65
- console.error("Failed to accept invite", e);
66
- });
67
- });
56
+ untrack(tryConsume);
57
+ });
58
+ window.addEventListener("hashchange", tryConsume);
59
+ onDestroy(() => {
60
+ window.removeEventListener("hashchange", tryConsume);
68
61
  });
69
62
  }
70
63
  }
@@ -1,5 +1,5 @@
1
1
 
2
- > jazz-tools@0.18.10 build /home/runner/_work/jazz/jazz/packages/jazz-tools
2
+ > jazz-tools@0.18.11 build /home/runner/_work/jazz/jazz/packages/jazz-tools
3
3
  > tsup && pnpm types && pnpm build:svelte
4
4
 
5
5
  CLI Building entry: {"index":"src/index.ts","testing":"src/testing.ts"}
@@ -107,22 +107,22 @@
107
107
  ESM Build start
108
108
  CLI Cleaning output folder
109
109
  ESM Build start
110
- ESM dist/react/ssr.js 688.00 B
111
- ESM dist/react/ssr.js.map 1.12 KB
112
- ESM ⚡️ Build success in 26ms
113
- ESM dist/worker/index.js 2.47 KB
114
- ESM dist/worker/index.js.map 5.26 KB
115
- ESM ⚡️ Build success in 22ms
116
110
  ESM dist/tiptap/index.js 564.00 B
117
111
  ESM dist/tiptap/index.js.map 1.21 KB
118
- ESM ⚡️ Build success in 22ms
112
+ ESM ⚡️ Build success in 11ms
113
+ ESM dist/react/ssr.js 688.00 B
114
+ ESM dist/react/ssr.js.map 1.12 KB
115
+ ESM ⚡️ Build success in 14ms
116
+ ESM dist/worker/index.js 3.19 KB
117
+ ESM dist/worker/index.js.map 6.17 KB
118
+ ESM ⚡️ Build success in 14ms
119
119
  ESM dist/better-auth/auth/client.js 4.44 KB
120
120
  ESM dist/better-auth/auth/server.js 8.36 KB
121
121
  ESM dist/better-auth/auth/react.js 799.00 B
122
122
  ESM dist/better-auth/auth/client.js.map 8.24 KB
123
123
  ESM dist/better-auth/auth/server.js.map 15.29 KB
124
124
  ESM dist/better-auth/auth/react.js.map 2.04 KB
125
- ESM ⚡️ Build success in 25ms
125
+ ESM ⚡️ Build success in 18ms
126
126
  ESM dist/media/index.js 236.00 B
127
127
  ESM dist/media/index.browser.js 2.79 KB
128
128
  ESM dist/media/index.native.js 2.90 KB
@@ -133,67 +133,67 @@
133
133
  ESM dist/media/index.native.js.map 6.09 KB
134
134
  ESM dist/media/index.server.js.map 6.37 KB
135
135
  ESM dist/media/chunk-W3S526L3.js.map 16.57 KB
136
- ESM ⚡️ Build success in 40ms
136
+ ESM ⚡️ Build success in 25ms
137
137
  ESM dist/expo/index.js 4.68 KB
138
138
  ESM dist/expo/testing.js 112.00 B
139
139
  ESM dist/expo/crypto.js 153.00 B
140
140
  ESM dist/expo/index.js.map 10.23 KB
141
141
  ESM dist/expo/testing.js.map 168.00 B
142
142
  ESM dist/expo/crypto.js.map 189.00 B
143
- ESM ⚡️ Build success in 40ms
143
+ ESM ⚡️ Build success in 24ms
144
+ ESM dist/browser/index.js 13.64 KB
145
+ ESM dist/browser/index.js.map 29.14 KB
146
+ ESM ⚡️ Build success in 34ms
144
147
  ESM dist/react-native/index.js 2.53 KB
145
148
  ESM dist/react-native/testing.js 120.00 B
146
149
  ESM dist/react-native/crypto.js 161.00 B
147
150
  ESM dist/react-native/index.js.map 5.68 KB
148
151
  ESM dist/react-native/testing.js.map 176.00 B
149
152
  ESM dist/react-native/crypto.js.map 197.00 B
150
- ESM ⚡️ Build success in 36ms
151
- ESM dist/browser/index.js 13.64 KB
152
- ESM dist/browser/index.js.map 29.14 KB
153
- ESM ⚡️ Build success in 41ms
153
+ ESM ⚡️ Build success in 29ms
154
154
  ESM dist/react-native-core/index.js 18.00 KB
155
155
  ESM dist/react-native-core/testing.js 119.00 B
156
156
  ESM dist/react-native-core/crypto.js 2.10 KB
157
157
  ESM dist/react-native-core/index.js.map 36.73 KB
158
158
  ESM dist/react-native-core/testing.js.map 175.00 B
159
159
  ESM dist/react-native-core/crypto.js.map 4.25 KB
160
- ESM ⚡️ Build success in 46ms
161
- ESM dist/prosemirror/index.js 77.63 KB
162
- ESM dist/prosemirror/index.js.map 306.98 KB
163
- ESM ⚡️ Build success in 49ms
164
- ESM dist/react/index.js 24.76 KB
160
+ ESM ⚡️ Build success in 38ms
165
161
  ESM dist/react/testing.js 122.00 B
166
- ESM dist/react/index.js.map 53.56 KB
162
+ ESM dist/react/index.js 24.76 KB
167
163
  ESM dist/react/testing.js.map 165.00 B
168
- ESM ⚡️ Build success in 49ms
164
+ ESM dist/react/index.js.map 53.56 KB
165
+ ESM ⚡️ Build success in 41ms
166
+ ESM dist/prosemirror/index.js 77.63 KB
167
+ ESM dist/prosemirror/index.js.map 306.98 KB
168
+ ESM ⚡️ Build success in 43ms
169
169
  ESM dist/inspector/index.js 69.71 KB
170
170
  ESM dist/inspector/index.js.map 121.38 KB
171
- ESM ⚡️ Build success in 61ms
171
+ ESM ⚡️ Build success in 54ms
172
172
  ESM dist/testing.js 7.17 KB
173
173
  ESM dist/index.js 26.13 KB
174
174
  ESM dist/chunk-RQHJFPIB.js 169.74 KB
175
175
  ESM dist/testing.js.map 14.10 KB
176
176
  ESM dist/index.js.map 52.92 KB
177
177
  ESM dist/chunk-RQHJFPIB.js.map 402.59 KB
178
- ESM ⚡️ Build success in 88ms
179
- ESM dist/react-core/index.js 146.19 KB
178
+ ESM ⚡️ Build success in 78ms
180
179
  ESM dist/react-core/testing.js 1.17 KB
181
180
  ESM dist/react-core/chunk-7DYMJ74I.js 279.00 B
181
+ ESM dist/react-core/index.js 146.19 KB
182
182
  ESM dist/react-core/testing.js.map 1.82 KB
183
183
  ESM dist/react-core/chunk-7DYMJ74I.js.map 533.00 B
184
184
  ESM dist/react-core/index.js.map 404.45 KB
185
- ESM ⚡️ Build success in 90ms
185
+ ESM ⚡️ Build success in 77ms
186
186
  ESM dist/inspector/register-custom-element.js 218.00 B
187
187
  ESM dist/inspector/register-custom-element.js.map 314.00 B
188
188
  ESM dist/inspector/custom-element-G6SPZEBR.js 1.54 MB
189
189
  ESM dist/inspector/custom-element-G6SPZEBR.js.map 2.36 MB
190
- ESM ⚡️ Build success in 122ms
190
+ ESM ⚡️ Build success in 109ms
191
191
 
192
- > jazz-tools@0.18.10 types /home/runner/_work/jazz/jazz/packages/jazz-tools
192
+ > jazz-tools@0.18.11 types /home/runner/_work/jazz/jazz/packages/jazz-tools
193
193
  > tsc --outDir dist
194
194
 
195
195
 
196
- > jazz-tools@0.18.10 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
196
+ > jazz-tools@0.18.11 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
197
197
  > rm -rf dist/svelte && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json
198
198
 
199
199
  src/svelte -> dist/svelte
package/CHANGELOG.md CHANGED
@@ -1,5 +1,16 @@
1
1
  # jazz-tools
2
2
 
3
+ ## 0.18.11
4
+
5
+ ### Patch Changes
6
+
7
+ - 06b4617: Update the Svelte InviteListener to listen to hash change events
8
+ - 70eb465: Add docs to the worker API and deprecate done in favor of shutdownWorker
9
+ - Updated dependencies [a4a9a1e]
10
+ - cojson@0.18.11
11
+ - cojson-storage-indexeddb@0.18.11
12
+ - cojson-transport-ws@0.18.11
13
+
3
14
  ## 0.18.10
4
15
 
5
16
  ### Patch Changes
@@ -32,7 +32,7 @@ export declare function getAuthSecretStorage(): AuthSecretStorage;
32
32
  export declare class InviteListener<V extends CoValueClassOrSchema> {
33
33
  constructor({ invitedObjectSchema, onAccept, forValueHint, }: {
34
34
  invitedObjectSchema: V;
35
- onAccept: (projectID: ID<V>) => void;
35
+ onAccept: (coValueID: ID<V>) => void;
36
36
  forValueHint?: string;
37
37
  });
38
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"jazz.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,oBAAoB,EACpB,EAAE,EAEF,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,CAAC;AAE1C;;GAEG;AACH,eAAO,MAAM,QAAQ,IAAK,CAAC;AAC3B,eAAO,MAAM,aAAa,IAAK,CAAC;AAEhC;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,OAAO,IAAI;IAC7C,OAAO,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,SAAS,OAAO,KAW9B;IAChB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC/B,CACF;AAED,wBAAgB,oBAAoB,sBAUnC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,oBAAoB;gBAC5C,EACV,mBAAmB,EACnB,QAAQ,EACR,YAAY,GACb,EAAE;QACD,mBAAmB,EAAE,CAAC,CAAC;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACrC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CA+BF"}
1
+ {"version":3,"file":"jazz.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,oBAAoB,EACpB,EAAE,EAEF,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,QAAQ,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,CAAC;AAE1C;;GAEG;AACH,eAAO,MAAM,QAAQ,IAAK,CAAC;AAC3B,eAAO,MAAM,aAAa,IAAK,CAAC;AAEhC;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,OAAO,IAAI;IAC7C,OAAO,CAAC,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAChC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,SAAS,OAAO,KAW9B;IAChB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC;CAC/B,CACF;AAED,wBAAgB,oBAAoB,sBAUnC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,oBAAoB;gBAC5C,EACV,mBAAmB,EACnB,QAAQ,EACR,YAAY,GACb,EAAE;QACD,mBAAmB,EAAE,CAAC,CAAC;QACvB,QAAQ,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;QACrC,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB;CA2BF"}
@@ -1,5 +1,5 @@
1
1
  import { consumeInviteLinkFromWindowLocation } from "jazz-tools/browser";
2
- import { getContext, untrack } from "svelte";
2
+ import { getContext, onDestroy, untrack } from "svelte";
3
3
  import Provider from "./Provider.svelte";
4
4
  export { Provider as JazzSvelteProvider };
5
5
  /**
@@ -38,33 +38,26 @@ export function getAuthSecretStorage() {
38
38
  */
39
39
  export class InviteListener {
40
40
  constructor({ invitedObjectSchema, onAccept, forValueHint, }) {
41
- // TODO Listen to the hashchange event
42
41
  const _onAccept = onAccept;
43
- // Subscribe to the onAccept function.
42
+ const ctx = getJazzContext();
43
+ const tryConsume = () => {
44
+ if (!ctx.current || !("me" in ctx.current))
45
+ return;
46
+ consumeInviteLinkFromWindowLocation({
47
+ as: ctx.current.me,
48
+ invitedObjectSchema,
49
+ forValueHint,
50
+ })
51
+ .then((result) => result && _onAccept(result.valueID))
52
+ .catch((e) => console.error("Failed to accept invite", e));
53
+ };
54
+ // run once when instantiated
44
55
  $effect(() => {
45
- const ctx = getJazzContext();
46
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
47
- _onAccept;
48
- // Subscribe to the onAccept function.
49
- untrack(() => {
50
- // If there is no context, return.
51
- if (!ctx.current)
52
- return;
53
- if (!("me" in ctx.current))
54
- return;
55
- // Consume the invite link from the window location.
56
- const result = consumeInviteLinkFromWindowLocation({
57
- as: ctx.current.me,
58
- invitedObjectSchema,
59
- forValueHint,
60
- });
61
- // If the result is valid, call the onAccept function.
62
- result
63
- .then((result) => result && _onAccept(result?.valueID))
64
- .catch((e) => {
65
- console.error("Failed to accept invite", e);
66
- });
67
- });
56
+ untrack(tryConsume);
57
+ });
58
+ window.addEventListener("hashchange", tryConsume);
59
+ onDestroy(() => {
60
+ window.removeEventListener("hashchange", tryConsume);
68
61
  });
69
62
  }
70
63
  }
@@ -19,17 +19,43 @@ type WorkerOptions<S extends (AccountClass<Account> & CoValueFromRaw<Account>) |
19
19
  };
20
20
  /** @category Context Creation */
21
21
  export declare function startWorker<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>(options: WorkerOptions<S>): Promise<{
22
+ /**
23
+ * The worker account instance.
24
+ */
22
25
  worker: Loaded<S>;
23
26
  experimental: {
27
+ /**
28
+ * API to subscribe to the inbox messages.
29
+ *
30
+ * More info on the Inbox API: https://jazz.tools/docs/react/server-side/inbox
31
+ */
24
32
  inbox: {
25
33
  subscribe: Inbox["subscribe"];
26
34
  } | {
27
35
  subscribe: () => void;
28
36
  };
29
37
  };
38
+ /**
39
+ * Wait for the connection to the sync server to be established.
40
+ *
41
+ * If already connected, it will resolve immediately.
42
+ */
30
43
  waitForConnection(): Promise<void>;
31
44
  subscribeToConnectionChange(listener: (connected: boolean) => void): () => void;
45
+ /**
46
+ * Waits for all CoValues to sync and then shuts down the worker.
47
+ *
48
+ * To only wait for sync use worker.$jazz.waitForAllCoValuesSync()
49
+ *
50
+ * @deprecated Use shutdownWorker
51
+ */
32
52
  done: () => Promise<void>;
53
+ /**
54
+ * Waits for all CoValues to sync and then shuts down the worker.
55
+ *
56
+ * To only wait for sync use worker.$jazz.waitForAllCoValuesSync()
57
+ */
58
+ shutdownWorker(): Promise<void>;
33
59
  }>;
34
60
  export {};
35
61
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,cAAc,EAAmB,MAAM,QAAQ,CAAC;AACtE,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,KAAK,EAEL,MAAM,EAGP,MAAM,YAAY,CAAC;AAEpB,KAAK,aAAa,CAChB,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,iCAAiC;AACjC,wBAAsB,WAAW,CAC/B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;YAiFI,MAAM,CAAC,CAAC,CAAC;;;uBAPU,KAAK,CAAC,WAAW,CAAC;;;;;;0CAc1B,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GASrE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,cAAc,EAAmB,MAAM,QAAQ,CAAC;AACtE,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,KAAK,EAEL,MAAM,EAGP,MAAM,YAAY,CAAC;AAEpB,KAAK,aAAa,CAChB,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,iCAAiC;AACjC,wBAAsB,WAAW,CAC/B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAgFvB;;OAEG;YACwB,MAAM,CAAC,CAAC,CAAC;;QAElC;;;;WAIG;;uBAhByC,KAAK,CAAC,WAAW,CAAC;;;;;IAmBhE;;;;OAIG;;0CAImC,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;IAOlE;;;;;;OAMG;;IAEH;;;;OAIG;;GAKN"}
@@ -53,7 +53,6 @@ async function startWorker(options) {
53
53
  secret: accountSecret
54
54
  },
55
55
  AccountSchema,
56
- // TODO: locked sessions similar to browser
57
56
  sessionProvider: randomSessionProvider,
58
57
  peersToLoadFrom,
59
58
  crypto: options.crypto ?? await WasmCrypto.create(),
@@ -77,10 +76,23 @@ async function startWorker(options) {
77
76
  }
78
77
  };
79
78
  return {
79
+ /**
80
+ * The worker account instance.
81
+ */
80
82
  worker: context.account,
81
83
  experimental: {
84
+ /**
85
+ * API to subscribe to the inbox messages.
86
+ *
87
+ * More info on the Inbox API: https://jazz.tools/docs/react/server-side/inbox
88
+ */
82
89
  inbox: inboxPublicApi
83
90
  },
91
+ /**
92
+ * Wait for the connection to the sync server to be established.
93
+ *
94
+ * If already connected, it will resolve immediately.
95
+ */
84
96
  waitForConnection() {
85
97
  return wsPeer.waitUntilConnected();
86
98
  },
@@ -90,7 +102,22 @@ async function startWorker(options) {
90
102
  wsPeer.unsubscribe(listener);
91
103
  };
92
104
  },
93
- done
105
+ /**
106
+ * Waits for all CoValues to sync and then shuts down the worker.
107
+ *
108
+ * To only wait for sync use worker.$jazz.waitForAllCoValuesSync()
109
+ *
110
+ * @deprecated Use shutdownWorker
111
+ */
112
+ done,
113
+ /**
114
+ * Waits for all CoValues to sync and then shuts down the worker.
115
+ *
116
+ * To only wait for sync use worker.$jazz.waitForAllCoValuesSync()
117
+ */
118
+ shutdownWorker() {
119
+ return done();
120
+ }
94
121
  };
95
122
  }
96
123
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/worker/index.ts"],"sourcesContent":["import { AgentSecret, CryptoProvider, LocalNode, Peer } from \"cojson\";\nimport {\n type AnyWebSocketConstructor,\n WebSocketPeerWithReconnection,\n} from \"cojson-transport-ws\";\nimport { WasmCrypto } from \"cojson/crypto/WasmCrypto\";\nimport {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n Inbox,\n InstanceOfSchema,\n Loaded,\n createJazzContextFromExistingCredentials,\n randomSessionProvider,\n} from \"jazz-tools\";\n\ntype WorkerOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n accountID?: string;\n accountSecret?: string;\n syncServer?: string;\n WebSocket?: AnyWebSocketConstructor;\n AccountSchema?: S;\n crypto?: CryptoProvider;\n /**\n * If true, the inbox will not be loaded.\n */\n skipInboxLoad?: boolean;\n /**\n * If false, the worker will not set in the global account context\n */\n asActiveAccount?: boolean;\n};\n\n/** @category Context Creation */\nexport async function startWorker<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: WorkerOptions<S>) {\n const {\n accountID = process.env.JAZZ_WORKER_ACCOUNT,\n accountSecret = process.env.JAZZ_WORKER_SECRET,\n syncServer = \"wss://cloud.jazz.tools\",\n AccountSchema = Account as unknown as S,\n skipInboxLoad = false,\n asActiveAccount = true,\n } = options;\n\n let node: LocalNode | undefined = undefined;\n\n const peersToLoadFrom: Peer[] = [];\n\n const wsPeer = new WebSocketPeerWithReconnection({\n peer: syncServer,\n reconnectionTimeout: 100,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peersToLoadFrom.push(peer);\n }\n },\n removePeer: () => {},\n WebSocketConstructor: options.WebSocket,\n });\n\n wsPeer.enable();\n\n if (!accountID) {\n throw new Error(\"No accountID provided\");\n }\n if (!accountSecret) {\n throw new Error(\"No accountSecret provided\");\n }\n if (!accountID.startsWith(\"co_\")) {\n throw new Error(\"Invalid accountID\");\n }\n if (!accountSecret?.startsWith(\"sealerSecret_\")) {\n throw new Error(\"Invalid accountSecret\");\n }\n\n const context = await createJazzContextFromExistingCredentials({\n credentials: {\n accountID: accountID,\n secret: accountSecret as AgentSecret,\n },\n AccountSchema,\n // TODO: locked sessions similar to browser\n sessionProvider: randomSessionProvider,\n peersToLoadFrom,\n crypto: options.crypto ?? (await WasmCrypto.create()),\n asActiveAccount,\n });\n\n const account = context.account as InstanceOfSchema<S>;\n node = account.$jazz.localNode;\n\n if (!account.$jazz.refs.profile?.id) {\n throw new Error(\"Account has no profile\");\n }\n\n const inbox = skipInboxLoad ? undefined : await Inbox.load(account);\n\n async function done() {\n await context.account.$jazz.waitForAllCoValuesSync();\n\n wsPeer.disable();\n context.done();\n }\n\n const inboxPublicApi = inbox\n ? {\n subscribe: inbox.subscribe.bind(inbox) as Inbox[\"subscribe\"],\n }\n : {\n subscribe: () => {},\n };\n\n return {\n worker: context.account as Loaded<S>,\n experimental: {\n inbox: inboxPublicApi,\n },\n waitForConnection() {\n return wsPeer.waitUntilConnected();\n },\n subscribeToConnectionChange(listener: (connected: boolean) => void) {\n wsPeer.subscribe(listener);\n\n return () => {\n wsPeer.unsubscribe(listener);\n };\n },\n done,\n };\n}\n"],"mappings":";AACA;AAAA,EAEE;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EAIA;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAwBP,eAAsB,YAIpB,SAA2B;AAC3B,QAAM;AAAA,IACJ,YAAY,QAAQ,IAAI;AAAA,IACxB,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB,IAAI;AAEJ,MAAI,OAA8B;AAElC,QAAM,kBAA0B,CAAC;AAEjC,QAAM,SAAS,IAAI,8BAA8B;AAAA,IAC/C,MAAM;AAAA,IACN,qBAAqB;AAAA,IACrB,SAAS,CAAC,SAAS;AACjB,UAAI,MAAM;AACR,aAAK,YAAY,QAAQ,IAAI;AAAA,MAC/B,OAAO;AACL,wBAAgB,KAAK,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,YAAY,MAAM;AAAA,IAAC;AAAA,IACnB,sBAAsB,QAAQ;AAAA,EAChC,CAAC;AAED,SAAO,OAAO;AAEd,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,MAAI,CAAC,UAAU,WAAW,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AACA,MAAI,CAAC,eAAe,WAAW,eAAe,GAAG;AAC/C,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAEA,QAAM,UAAU,MAAM,yCAAyC;AAAA,IAC7D,aAAa;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA;AAAA;AAAA,IAEA,iBAAiB;AAAA,IACjB;AAAA,IACA,QAAQ,QAAQ,UAAW,MAAM,WAAW,OAAO;AAAA,IACnD;AAAA,EACF,CAAC;AAED,QAAM,UAAU,QAAQ;AACxB,SAAO,QAAQ,MAAM;AAErB,MAAI,CAAC,QAAQ,MAAM,KAAK,SAAS,IAAI;AACnC,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,QAAM,QAAQ,gBAAgB,SAAY,MAAM,MAAM,KAAK,OAAO;AAElE,iBAAe,OAAO;AACpB,UAAM,QAAQ,QAAQ,MAAM,uBAAuB;AAEnD,WAAO,QAAQ;AACf,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,iBAAiB,QACnB;AAAA,IACE,WAAW,MAAM,UAAU,KAAK,KAAK;AAAA,EACvC,IACA;AAAA,IACE,WAAW,MAAM;AAAA,IAAC;AAAA,EACpB;AAEJ,SAAO;AAAA,IACL,QAAQ,QAAQ;AAAA,IAChB,cAAc;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IACA,oBAAoB;AAClB,aAAO,OAAO,mBAAmB;AAAA,IACnC;AAAA,IACA,4BAA4B,UAAwC;AAClE,aAAO,UAAU,QAAQ;AAEzB,aAAO,MAAM;AACX,eAAO,YAAY,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA,IACA;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/worker/index.ts"],"sourcesContent":["import { AgentSecret, CryptoProvider, LocalNode, Peer } from \"cojson\";\nimport {\n type AnyWebSocketConstructor,\n WebSocketPeerWithReconnection,\n} from \"cojson-transport-ws\";\nimport { WasmCrypto } from \"cojson/crypto/WasmCrypto\";\nimport {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n Inbox,\n InstanceOfSchema,\n Loaded,\n createJazzContextFromExistingCredentials,\n randomSessionProvider,\n} from \"jazz-tools\";\n\ntype WorkerOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n accountID?: string;\n accountSecret?: string;\n syncServer?: string;\n WebSocket?: AnyWebSocketConstructor;\n AccountSchema?: S;\n crypto?: CryptoProvider;\n /**\n * If true, the inbox will not be loaded.\n */\n skipInboxLoad?: boolean;\n /**\n * If false, the worker will not set in the global account context\n */\n asActiveAccount?: boolean;\n};\n\n/** @category Context Creation */\nexport async function startWorker<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: WorkerOptions<S>) {\n const {\n accountID = process.env.JAZZ_WORKER_ACCOUNT,\n accountSecret = process.env.JAZZ_WORKER_SECRET,\n syncServer = \"wss://cloud.jazz.tools\",\n AccountSchema = Account as unknown as S,\n skipInboxLoad = false,\n asActiveAccount = true,\n } = options;\n\n let node: LocalNode | undefined = undefined;\n\n const peersToLoadFrom: Peer[] = [];\n\n const wsPeer = new WebSocketPeerWithReconnection({\n peer: syncServer,\n reconnectionTimeout: 100,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peersToLoadFrom.push(peer);\n }\n },\n removePeer: () => {},\n WebSocketConstructor: options.WebSocket,\n });\n\n wsPeer.enable();\n\n if (!accountID) {\n throw new Error(\"No accountID provided\");\n }\n if (!accountSecret) {\n throw new Error(\"No accountSecret provided\");\n }\n if (!accountID.startsWith(\"co_\")) {\n throw new Error(\"Invalid accountID\");\n }\n if (!accountSecret?.startsWith(\"sealerSecret_\")) {\n throw new Error(\"Invalid accountSecret\");\n }\n\n const context = await createJazzContextFromExistingCredentials({\n credentials: {\n accountID: accountID,\n secret: accountSecret as AgentSecret,\n },\n AccountSchema,\n sessionProvider: randomSessionProvider,\n peersToLoadFrom,\n crypto: options.crypto ?? (await WasmCrypto.create()),\n asActiveAccount,\n });\n\n const account = context.account as InstanceOfSchema<S>;\n node = account.$jazz.localNode;\n\n if (!account.$jazz.refs.profile?.id) {\n throw new Error(\"Account has no profile\");\n }\n\n const inbox = skipInboxLoad ? undefined : await Inbox.load(account);\n\n async function done() {\n await context.account.$jazz.waitForAllCoValuesSync();\n\n wsPeer.disable();\n context.done();\n }\n\n const inboxPublicApi = inbox\n ? {\n subscribe: inbox.subscribe.bind(inbox) as Inbox[\"subscribe\"],\n }\n : {\n subscribe: () => {},\n };\n\n return {\n /**\n * The worker account instance.\n */\n worker: context.account as Loaded<S>,\n experimental: {\n /**\n * API to subscribe to the inbox messages.\n *\n * More info on the Inbox API: https://jazz.tools/docs/react/server-side/inbox\n */\n inbox: inboxPublicApi,\n },\n /**\n * Wait for the connection to the sync server to be established.\n *\n * If already connected, it will resolve immediately.\n */\n waitForConnection() {\n return wsPeer.waitUntilConnected();\n },\n subscribeToConnectionChange(listener: (connected: boolean) => void) {\n wsPeer.subscribe(listener);\n\n return () => {\n wsPeer.unsubscribe(listener);\n };\n },\n /**\n * Waits for all CoValues to sync and then shuts down the worker.\n *\n * To only wait for sync use worker.$jazz.waitForAllCoValuesSync()\n *\n * @deprecated Use shutdownWorker\n */\n done,\n /**\n * Waits for all CoValues to sync and then shuts down the worker.\n *\n * To only wait for sync use worker.$jazz.waitForAllCoValuesSync()\n */\n shutdownWorker() {\n return done();\n },\n };\n}\n"],"mappings":";AACA;AAAA,EAEE;AAAA,OACK;AACP,SAAS,kBAAkB;AAC3B;AAAA,EACE;AAAA,EAIA;AAAA,EAGA;AAAA,EACA;AAAA,OACK;AAwBP,eAAsB,YAIpB,SAA2B;AAC3B,QAAM;AAAA,IACJ,YAAY,QAAQ,IAAI;AAAA,IACxB,gBAAgB,QAAQ,IAAI;AAAA,IAC5B,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB,IAAI;AAEJ,MAAI,OAA8B;AAElC,QAAM,kBAA0B,CAAC;AAEjC,QAAM,SAAS,IAAI,8BAA8B;AAAA,IAC/C,MAAM;AAAA,IACN,qBAAqB;AAAA,IACrB,SAAS,CAAC,SAAS;AACjB,UAAI,MAAM;AACR,aAAK,YAAY,QAAQ,IAAI;AAAA,MAC/B,OAAO;AACL,wBAAgB,KAAK,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,YAAY,MAAM;AAAA,IAAC;AAAA,IACnB,sBAAsB,QAAQ;AAAA,EAChC,CAAC;AAED,SAAO,OAAO;AAEd,MAAI,CAAC,WAAW;AACd,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AACA,MAAI,CAAC,eAAe;AAClB,UAAM,IAAI,MAAM,2BAA2B;AAAA,EAC7C;AACA,MAAI,CAAC,UAAU,WAAW,KAAK,GAAG;AAChC,UAAM,IAAI,MAAM,mBAAmB;AAAA,EACrC;AACA,MAAI,CAAC,eAAe,WAAW,eAAe,GAAG;AAC/C,UAAM,IAAI,MAAM,uBAAuB;AAAA,EACzC;AAEA,QAAM,UAAU,MAAM,yCAAyC;AAAA,IAC7D,aAAa;AAAA,MACX;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,IACA;AAAA,IACA,iBAAiB;AAAA,IACjB;AAAA,IACA,QAAQ,QAAQ,UAAW,MAAM,WAAW,OAAO;AAAA,IACnD;AAAA,EACF,CAAC;AAED,QAAM,UAAU,QAAQ;AACxB,SAAO,QAAQ,MAAM;AAErB,MAAI,CAAC,QAAQ,MAAM,KAAK,SAAS,IAAI;AACnC,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAEA,QAAM,QAAQ,gBAAgB,SAAY,MAAM,MAAM,KAAK,OAAO;AAElE,iBAAe,OAAO;AACpB,UAAM,QAAQ,QAAQ,MAAM,uBAAuB;AAEnD,WAAO,QAAQ;AACf,YAAQ,KAAK;AAAA,EACf;AAEA,QAAM,iBAAiB,QACnB;AAAA,IACE,WAAW,MAAM,UAAU,KAAK,KAAK;AAAA,EACvC,IACA;AAAA,IACE,WAAW,MAAM;AAAA,IAAC;AAAA,EACpB;AAEJ,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,QAAQ,QAAQ;AAAA,IAChB,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMZ,OAAO;AAAA,IACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,oBAAoB;AAClB,aAAO,OAAO,mBAAmB;AAAA,IACnC;AAAA,IACA,4BAA4B,UAAwC;AAClE,aAAO,UAAU,QAAQ;AAEzB,aAAO,MAAM;AACX,eAAO,YAAY,QAAQ;AAAA,MAC7B;AAAA,IACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA,iBAAiB;AACf,aAAO,KAAK;AAAA,IACd;AAAA,EACF;AACF;","names":[]}
package/package.json CHANGED
@@ -167,7 +167,7 @@
167
167
  },
168
168
  "type": "module",
169
169
  "license": "MIT",
170
- "version": "0.18.10",
170
+ "version": "0.18.11",
171
171
  "dependencies": {
172
172
  "@manuscripts/prosemirror-recreate-steps": "^0.1.4",
173
173
  "@scure/base": "1.2.1",
@@ -184,9 +184,9 @@
184
184
  "prosemirror-transform": "^1.9.0",
185
185
  "use-sync-external-store": "^1.5.0",
186
186
  "zod": "3.25.76",
187
- "cojson": "0.18.10",
188
- "cojson-storage-indexeddb": "0.18.10",
189
- "cojson-transport-ws": "0.18.10"
187
+ "cojson": "0.18.11",
188
+ "cojson-storage-indexeddb": "0.18.11",
189
+ "cojson-transport-ws": "0.18.11"
190
190
  },
191
191
  "devDependencies": {
192
192
  "@scure/bip39": "^1.3.0",
@@ -8,7 +8,7 @@ import type {
8
8
  } from "jazz-tools";
9
9
  import { Account } from "jazz-tools";
10
10
  import { consumeInviteLinkFromWindowLocation } from "jazz-tools/browser";
11
- import { getContext, untrack } from "svelte";
11
+ import { getContext, onDestroy, untrack } from "svelte";
12
12
  import Provider from "./Provider.svelte";
13
13
 
14
14
  export { Provider as JazzSvelteProvider };
@@ -73,37 +73,33 @@ export class InviteListener<V extends CoValueClassOrSchema> {
73
73
  forValueHint,
74
74
  }: {
75
75
  invitedObjectSchema: V;
76
- onAccept: (projectID: ID<V>) => void;
76
+ onAccept: (coValueID: ID<V>) => void;
77
77
  forValueHint?: string;
78
78
  }) {
79
- // TODO Listen to the hashchange event
80
79
  const _onAccept = onAccept;
80
+ const ctx = getJazzContext<InstanceOfSchema<AccountClass<Account>>>();
81
81
 
82
- // Subscribe to the onAccept function.
82
+ const tryConsume = () => {
83
+ if (!ctx.current || !("me" in ctx.current)) return;
84
+
85
+ consumeInviteLinkFromWindowLocation({
86
+ as: ctx.current.me,
87
+ invitedObjectSchema,
88
+ forValueHint,
89
+ })
90
+ .then((result) => result && _onAccept(result.valueID))
91
+ .catch((e) => console.error("Failed to accept invite", e));
92
+ };
93
+
94
+ // run once when instantiated
83
95
  $effect(() => {
84
- const ctx = getJazzContext<InstanceOfSchema<AccountClass<Account>>>();
85
-
86
- // eslint-disable-next-line @typescript-eslint/no-unused-expressions
87
- _onAccept;
88
- // Subscribe to the onAccept function.
89
- untrack(() => {
90
- // If there is no context, return.
91
- if (!ctx.current) return;
92
- if (!("me" in ctx.current)) return;
93
-
94
- // Consume the invite link from the window location.
95
- const result = consumeInviteLinkFromWindowLocation({
96
- as: ctx.current.me,
97
- invitedObjectSchema,
98
- forValueHint,
99
- });
100
- // If the result is valid, call the onAccept function.
101
- result
102
- .then((result) => result && _onAccept(result?.valueID))
103
- .catch((e) => {
104
- console.error("Failed to accept invite", e);
105
- });
106
- });
96
+ untrack(tryConsume);
97
+ });
98
+
99
+ window.addEventListener("hashchange", tryConsume);
100
+
101
+ onDestroy(() => {
102
+ window.removeEventListener("hashchange", tryConsume);
107
103
  });
108
104
  }
109
105
  }
@@ -91,7 +91,6 @@ export async function startWorker<
91
91
  secret: accountSecret as AgentSecret,
92
92
  },
93
93
  AccountSchema,
94
- // TODO: locked sessions similar to browser
95
94
  sessionProvider: randomSessionProvider,
96
95
  peersToLoadFrom,
97
96
  crypto: options.crypto ?? (await WasmCrypto.create()),
@@ -123,10 +122,23 @@ export async function startWorker<
123
122
  };
124
123
 
125
124
  return {
125
+ /**
126
+ * The worker account instance.
127
+ */
126
128
  worker: context.account as Loaded<S>,
127
129
  experimental: {
130
+ /**
131
+ * API to subscribe to the inbox messages.
132
+ *
133
+ * More info on the Inbox API: https://jazz.tools/docs/react/server-side/inbox
134
+ */
128
135
  inbox: inboxPublicApi,
129
136
  },
137
+ /**
138
+ * Wait for the connection to the sync server to be established.
139
+ *
140
+ * If already connected, it will resolve immediately.
141
+ */
130
142
  waitForConnection() {
131
143
  return wsPeer.waitUntilConnected();
132
144
  },
@@ -137,6 +149,21 @@ export async function startWorker<
137
149
  wsPeer.unsubscribe(listener);
138
150
  };
139
151
  },
152
+ /**
153
+ * Waits for all CoValues to sync and then shuts down the worker.
154
+ *
155
+ * To only wait for sync use worker.$jazz.waitForAllCoValuesSync()
156
+ *
157
+ * @deprecated Use shutdownWorker
158
+ */
140
159
  done,
160
+ /**
161
+ * Waits for all CoValues to sync and then shuts down the worker.
162
+ *
163
+ * To only wait for sync use worker.$jazz.waitForAllCoValuesSync()
164
+ */
165
+ shutdownWorker() {
166
+ return done();
167
+ },
141
168
  };
142
169
  }