jazz-tools 0.20.16 → 0.20.18

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 (131) hide show
  1. package/.svelte-kit/__package__/client.d.ts.map +1 -1
  2. package/.svelte-kit/__package__/client.js +8 -1
  3. package/.svelte-kit/__package__/tests/client.test.js +67 -0
  4. package/.turbo/turbo-build.log +65 -65
  5. package/CHANGELOG.md +24 -0
  6. package/dist/better-auth/auth/client.d.ts.map +1 -1
  7. package/dist/better-auth/auth/client.js +12 -1
  8. package/dist/better-auth/auth/client.js.map +1 -1
  9. package/dist/browser/BrowserContextManager.d.ts +1 -0
  10. package/dist/browser/BrowserContextManager.d.ts.map +1 -1
  11. package/dist/browser/createBrowserContext.d.ts +2 -12
  12. package/dist/browser/createBrowserContext.d.ts.map +1 -1
  13. package/dist/browser/index.js +12 -6
  14. package/dist/browser/index.js.map +1 -1
  15. package/dist/{chunk-WAYFZQXB.js → chunk-MIPBSAS7.js} +474 -86
  16. package/dist/chunk-MIPBSAS7.js.map +1 -0
  17. package/dist/index.js +5 -3
  18. package/dist/index.js.map +1 -1
  19. package/dist/mcp/backend-sqlite.d.ts.map +1 -1
  20. package/dist/mcp/server.d.ts.map +1 -1
  21. package/dist/mcp/server.js +4 -2
  22. package/dist/mcp/server.js.map +1 -1
  23. package/dist/react/index.js +11 -3
  24. package/dist/react/index.js.map +1 -1
  25. package/dist/react/provider.d.ts +1 -1
  26. package/dist/react/provider.d.ts.map +1 -1
  27. package/dist/react-native/index.js +26 -8
  28. package/dist/react-native/index.js.map +1 -1
  29. package/dist/react-native-core/ReactNativeContextManager.d.ts +1 -0
  30. package/dist/react-native-core/ReactNativeContextManager.d.ts.map +1 -1
  31. package/dist/react-native-core/index.js +26 -8
  32. package/dist/react-native-core/index.js.map +1 -1
  33. package/dist/react-native-core/platform.d.ts +1 -0
  34. package/dist/react-native-core/platform.d.ts.map +1 -1
  35. package/dist/react-native-core/provider.d.ts +1 -1
  36. package/dist/react-native-core/provider.d.ts.map +1 -1
  37. package/dist/svelte/Provider.svelte +3 -0
  38. package/dist/svelte/Provider.svelte.d.ts.map +1 -1
  39. package/dist/testing.js +1 -1
  40. package/dist/tools/coValues/deepLoading.d.ts +21 -1
  41. package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
  42. package/dist/tools/coValues/interfaces.d.ts +1 -0
  43. package/dist/tools/coValues/interfaces.d.ts.map +1 -1
  44. package/dist/tools/coValues/registeredSchemas.d.ts +1 -1
  45. package/dist/tools/coValues/registeredSchemas.d.ts.map +1 -1
  46. package/dist/tools/coValues/schemaUnion.d.ts +9 -0
  47. package/dist/tools/coValues/schemaUnion.d.ts.map +1 -1
  48. package/dist/tools/coValues/snapshotRef.d.ts +114 -0
  49. package/dist/tools/coValues/snapshotRef.d.ts.map +1 -0
  50. package/dist/tools/implementation/createContext.d.ts +7 -3
  51. package/dist/tools/implementation/createContext.d.ts.map +1 -1
  52. package/dist/tools/implementation/invites.d.ts +9 -1
  53. package/dist/tools/implementation/invites.d.ts.map +1 -1
  54. package/dist/tools/implementation/schemaRuntime.d.ts +1 -0
  55. package/dist/tools/implementation/schemaRuntime.d.ts.map +1 -1
  56. package/dist/tools/implementation/zodSchema/coExport.d.ts +2 -1
  57. package/dist/tools/implementation/zodSchema/coExport.d.ts.map +1 -1
  58. package/dist/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.d.ts.map +1 -1
  59. package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts +3 -0
  60. package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts.map +1 -1
  61. package/dist/tools/implementation/zodSchema/schemaInvariant.d.ts +2 -1
  62. package/dist/tools/implementation/zodSchema/schemaInvariant.d.ts.map +1 -1
  63. package/dist/tools/implementation/zodSchema/schemaPermissions.d.ts.map +1 -1
  64. package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
  65. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
  66. package/dist/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.d.ts +106 -0
  67. package/dist/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.d.ts.map +1 -0
  68. package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts +2 -2
  69. package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts.map +1 -1
  70. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +2 -2
  71. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
  72. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts +3 -2
  73. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -1
  74. package/dist/tools/implementation/zodSchema/unionUtils.d.ts.map +1 -1
  75. package/dist/tools/implementation/zodSchema/zodCo.d.ts +5 -1
  76. package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
  77. package/dist/tools/implementation/zodSchema/zodSchema.d.ts +4 -3
  78. package/dist/tools/implementation/zodSchema/zodSchema.d.ts.map +1 -1
  79. package/dist/tools/internal.d.ts +2 -0
  80. package/dist/tools/internal.d.ts.map +1 -1
  81. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  82. package/dist/tools/tests/snapshotRef.test.d.ts +2 -0
  83. package/dist/tools/tests/snapshotRef.test.d.ts.map +1 -0
  84. package/dist/worker/index.d.ts +1 -0
  85. package/dist/worker/index.d.ts.map +1 -1
  86. package/dist/worker/index.js +6 -2
  87. package/dist/worker/index.js.map +1 -1
  88. package/package.json +4 -4
  89. package/src/better-auth/auth/client.ts +15 -1
  90. package/src/better-auth/auth/tests/client.test.ts +92 -0
  91. package/src/browser/BrowserContextManager.ts +5 -0
  92. package/src/browser/createBrowserContext.ts +8 -67
  93. package/src/browser/index.ts +1 -1
  94. package/src/mcp/backend-sqlite.ts +4 -1
  95. package/src/mcp/server.ts +4 -1
  96. package/src/react/provider.tsx +9 -1
  97. package/src/react-native-core/ReactNativeContextManager.ts +5 -0
  98. package/src/react-native-core/platform.ts +12 -1
  99. package/src/react-native-core/provider.tsx +9 -1
  100. package/src/svelte/Provider.svelte +3 -0
  101. package/src/tools/coValues/deepLoading.ts +46 -15
  102. package/src/tools/coValues/interfaces.ts +29 -24
  103. package/src/tools/coValues/registeredSchemas.ts +1 -1
  104. package/src/tools/coValues/schemaUnion.ts +13 -0
  105. package/src/tools/coValues/snapshotRef.ts +364 -0
  106. package/src/tools/implementation/createContext.ts +14 -0
  107. package/src/tools/implementation/invites.ts +26 -2
  108. package/src/tools/implementation/schemaRuntime.ts +1 -0
  109. package/src/tools/implementation/zodSchema/coExport.ts +2 -0
  110. package/src/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.ts +10 -0
  111. package/src/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.ts +1 -1
  112. package/src/tools/implementation/zodSchema/schemaInvariant.ts +3 -1
  113. package/src/tools/implementation/zodSchema/schemaPermissions.ts +2 -4
  114. package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +0 -1
  115. package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +24 -8
  116. package/src/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.ts +259 -0
  117. package/src/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.ts +24 -19
  118. package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +11 -5
  119. package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.ts +18 -10
  120. package/src/tools/implementation/zodSchema/unionUtils.ts +2 -1
  121. package/src/tools/implementation/zodSchema/zodCo.ts +17 -0
  122. package/src/tools/implementation/zodSchema/zodSchema.ts +10 -3
  123. package/src/tools/internal.ts +2 -0
  124. package/src/tools/subscribe/SubscriptionScope.ts +45 -5
  125. package/src/tools/tests/coMap.test.ts +30 -0
  126. package/src/tools/tests/createContext.test.ts +64 -0
  127. package/src/tools/tests/invites.test.ts +13 -0
  128. package/src/tools/tests/schemaUnion.test.ts +19 -0
  129. package/src/tools/tests/snapshotRef.test.ts +688 -0
  130. package/src/worker/index.ts +6 -0
  131. package/dist/chunk-WAYFZQXB.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAmBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA+H1D,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAqBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA2I1D,CAAC"}
@@ -16,7 +16,9 @@ export const jazzPluginClient = () => {
16
16
  let jazzContext;
17
17
  let authSecretStorage;
18
18
  let signOutUnsubscription;
19
+ let authGeneration = 0;
19
20
  const authenticateOnJazz = async (jazzAuth) => {
21
+ authGeneration++;
20
22
  const parsedJazzAuth = {
21
23
  ...jazzAuth,
22
24
  secretSeed: jazzAuth.secretSeed
@@ -74,6 +76,9 @@ export const jazzPluginClient = () => {
74
76
  name: "jazz-plugin",
75
77
  hooks: {
76
78
  async onRequest(context) {
79
+ if (context.url.toString().includes("/get-session")) {
80
+ context.headers.set("x-jazz-auth-generation", String(authGeneration));
81
+ }
77
82
  if (SIGNUP_URLS.some((url) => context.url.toString().includes(url))) {
78
83
  const credentials = await authSecretStorage.get();
79
84
  if (!credentials) {
@@ -99,7 +104,9 @@ export const jazzPluginClient = () => {
99
104
  }
100
105
  if (context.request.url.toString().includes("/get-session")) {
101
106
  if (context.data === null) {
102
- if (authSecretStorage.isAuthenticated === true) {
107
+ const requestAuthGeneration = Number(context.request.headers.get("x-jazz-auth-generation") ?? "0");
108
+ if (authSecretStorage.isAuthenticated === true &&
109
+ requestAuthGeneration === authGeneration) {
103
110
  console.info("Jazz is authenticated, but the session is null. Logging out");
104
111
  await jazzContext.logOut();
105
112
  }
@@ -421,6 +421,73 @@ describe("Better-Auth client plugin", () => {
421
421
  await expect(Promise.all(promises)).rejects.toThrow();
422
422
  expect(customFetchImpl).toHaveBeenCalledTimes(3);
423
423
  });
424
+ it("should NOT logout from Jazz if a stale null get-session arrives after authentication", async () => {
425
+ const credentials = await authSecretStorage.get();
426
+ assert(credentials, "Jazz credentials are not available");
427
+ // This test validates race condition handling where a stale null response
428
+ // arrives after authentication. The authGeneration is tracked via the
429
+ // x-jazz-auth-generation header set in onRequest and read in onSuccess.
430
+ // Since authGeneration increments after sign-in, the stale response's
431
+ // generation number will be older, preventing an unintended logout.
432
+ const capturedHeaders = [];
433
+ let resolveStaleSession;
434
+ const staleSessionPromise = new Promise((resolve) => {
435
+ resolveStaleSession = resolve;
436
+ });
437
+ customFetchImpl.mockImplementation((urlOrRequest, init) => {
438
+ const headers = urlOrRequest instanceof Request
439
+ ? urlOrRequest.headers
440
+ : init?.headers || {};
441
+ capturedHeaders.push(headers);
442
+ const url = urlOrRequest instanceof Request ? urlOrRequest.url : urlOrRequest;
443
+ if (url.toString().includes("/get-session")) {
444
+ return staleSessionPromise;
445
+ }
446
+ return Promise.resolve(new Response(JSON.stringify({
447
+ user: {
448
+ id: "user-1",
449
+ email: "test@jazz.dev",
450
+ name: "Matteo",
451
+ },
452
+ jazzAuth: {
453
+ accountID: credentials.accountID,
454
+ secretSeed: credentials.secretSeed,
455
+ accountSecret: credentials.accountSecret,
456
+ provider: "better-auth",
457
+ },
458
+ })));
459
+ });
460
+ const staleSessionFetch = authClient.getSession();
461
+ // We need to wait a tick for onRequest to be called and customFetchImpl to be triggered
462
+ await new Promise((resolve) => setTimeout(resolve, 0));
463
+ const getHeader = (headers, name) => {
464
+ if (!headers)
465
+ return null;
466
+ if (typeof headers.get === "function")
467
+ return headers.get(name);
468
+ if (Array.isArray(headers)) {
469
+ const pair = headers.find((h) => h[0]?.toLowerCase() === name.toLowerCase());
470
+ return pair ? pair[1] : null;
471
+ }
472
+ return headers[name] || headers[name.toLowerCase()] || null;
473
+ };
474
+ // Verify the stale request had authGeneration=0 in the header
475
+ expect(getHeader(capturedHeaders[0], "x-jazz-auth-generation")).toBe("0");
476
+ // Now sign in, which increments authGeneration to 1
477
+ await authClient.signIn.email({
478
+ email: "test@jazz.dev",
479
+ password: "password",
480
+ });
481
+ expect(authSecretStorage.isAuthenticated).toBe(true);
482
+ // Verify the sign-in request had no x-jazz-auth-generation header (it is gated to get-session)
483
+ expect(getHeader(capturedHeaders[1], "x-jazz-auth-generation")).toBeNull();
484
+ // Resolve the stale get-session response with null
485
+ resolveStaleSession(new Response(JSON.stringify(null)));
486
+ await staleSessionFetch;
487
+ // The stale null response should not trigger a logout because its
488
+ // authGeneration (0) < current authGeneration (1), so >= comparison fails
489
+ expect(authSecretStorage.isAuthenticated).toBe(true);
490
+ });
424
491
  it("should deduplicate auth requests for the same account", async () => {
425
492
  const credentials = await authSecretStorage.get();
426
493
  assert(credentials, "Jazz credentials are not available");
@@ -1,5 +1,5 @@
1
1
 
2
- > jazz-tools@0.20.16 build /home/runner/_work/jazz/jazz/packages/jazz-tools
2
+ > jazz-tools@0.20.18 build /home/runner/_work/jazz/jazz/packages/jazz-tools
3
3
  > tsup && pnpm types && pnpm build:svelte && pnpm build:better-auth-svelte
4
4
 
5
5
  CLI Building entry: {"index":"src/index.ts","testing":"src/testing.ts","tools/ssr":"src/tools/ssr/index.ts"}
@@ -116,115 +116,115 @@
116
116
  ESM Build start
117
117
  ESM dist/tiptap/index.js 572.00 B
118
118
  ESM dist/tiptap/index.js.map 1.29 KB
119
- ESM ⚡️ Build success in 46ms
120
- ESM dist/better-auth/auth/client.js 4.54 KB
121
- ESM dist/better-auth/auth/react.js 813.00 B
122
- ESM dist/better-auth/auth/server.js 8.38 KB
123
- ESM dist/better-auth/auth/client.js.map 8.44 KB
124
- ESM dist/better-auth/auth/react.js.map 2.07 KB
125
- ESM dist/better-auth/auth/server.js.map 15.56 KB
126
- ESM ⚡️ Build success in 35ms
127
- ESM dist/worker/index.js 3.45 KB
119
+ ESM ⚡️ Build success in 34ms
120
+ ESM dist/worker/index.js 3.63 KB
128
121
  ESM dist/worker/edge-wasm.js 259.00 B
129
122
  ESM dist/worker/napi-crypto.js 110.00 B
130
- ESM dist/worker/index.js.map 6.97 KB
123
+ ESM dist/worker/index.js.map 7.29 KB
131
124
  ESM dist/worker/edge-wasm.js.map 505.00 B
132
125
  ESM dist/worker/napi-crypto.js.map 162.00 B
133
- ESM ⚡️ Build success in 46ms
126
+ ESM ⚡️ Build success in 35ms
127
+ ESM dist/better-auth/auth/client.js 4.99 KB
128
+ ESM dist/better-auth/auth/server.js 8.38 KB
129
+ ESM dist/better-auth/auth/react.js 813.00 B
130
+ ESM dist/better-auth/auth/client.js.map 9.19 KB
131
+ ESM dist/better-auth/auth/server.js.map 15.56 KB
132
+ ESM dist/better-auth/auth/react.js.map 2.07 KB
133
+ ESM ⚡️ Build success in 26ms
134
134
  ESM dist/media/index.js 236.00 B
135
135
  ESM dist/media/index.browser.js 2.79 KB
136
136
  ESM dist/media/index.native.js 4.02 KB
137
137
  ESM dist/media/index.server.js 2.95 KB
138
138
  ESM dist/media/chunk-IRL3KNPO.js 6.70 KB
139
139
  ESM dist/media/index.js.map 71.00 B
140
- ESM dist/media/index.browser.js.map 6.15 KB
141
140
  ESM dist/media/index.native.js.map 8.13 KB
142
141
  ESM dist/media/index.server.js.map 6.38 KB
142
+ ESM dist/media/index.browser.js.map 6.15 KB
143
143
  ESM dist/media/chunk-IRL3KNPO.js.map 17.00 KB
144
- ESM ⚡️ Build success in 52ms
145
- ESM dist/mcp/server.js 20.95 KB
144
+ ESM ⚡️ Build success in 49ms
145
+ ESM dist/mcp/server.js 21.02 KB
146
146
  ESM dist/mcp/build-index.js 6.62 KB
147
- ESM dist/mcp/server.js.map 48.56 KB
147
+ ESM dist/mcp/server.js.map 48.96 KB
148
148
  ESM dist/mcp/build-index.js.map 16.00 KB
149
- ESM ⚡️ Build success in 55ms
149
+ ESM ⚡️ Build success in 53ms
150
+ ESM dist/react-core/index.js 18.06 KB
151
+ ESM dist/react-core/chunk-UOYH6JFJ.js 189.00 B
152
+ ESM dist/react-core/testing.js 904.00 B
153
+ ESM dist/react-core/index.js.map 60.18 KB
154
+ ESM dist/react-core/chunk-UOYH6JFJ.js.map 363.00 B
155
+ ESM dist/react-core/testing.js.map 1.34 KB
156
+ ESM ⚡️ Build success in 50ms
150
157
  ESM dist/expo/index.js 5.65 KB
151
158
  ESM dist/expo/testing.js 112.00 B
152
159
  ESM dist/expo/polyfills.js 858.00 B
153
160
  ESM dist/expo/index.js.map 11.85 KB
154
161
  ESM dist/expo/testing.js.map 168.00 B
155
162
  ESM dist/expo/polyfills.js.map 1.61 KB
156
- ESM ⚡️ Build success in 49ms
157
- ESM dist/react-core/index.js 18.06 KB
158
- ESM dist/react-core/testing.js 904.00 B
159
- ESM dist/react-core/chunk-UOYH6JFJ.js 189.00 B
160
- ESM dist/react-core/index.js.map 60.18 KB
161
- ESM dist/react-core/testing.js.map 1.34 KB
162
- ESM dist/react-core/chunk-UOYH6JFJ.js.map 363.00 B
163
- ESM ⚡️ Build success in 55ms
163
+ ESM ⚡️ Build success in 45ms
164
164
  ESM dist/better-auth/database-adapter/index.js 26.86 KB
165
165
  ESM dist/better-auth/database-adapter/index.js.map 58.67 KB
166
- ESM ⚡️ Build success in 53ms
167
- ESM dist/browser/index.js 15.96 KB
168
- ESM dist/browser/index.js.map 34.06 KB
169
- ESM ⚡️ Build success in 66ms
170
- ESM dist/react/ssr.js 693.00 B
171
- ESM dist/react/testing.js 122.00 B
172
- ESM dist/react/index.js 26.02 KB
173
- ESM dist/react/ssr.js.map 1.10 KB
174
- ESM dist/react/testing.js.map 165.00 B
175
- ESM dist/react/index.js.map 55.45 KB
176
- ESM ⚡️ Build success in 69ms
177
- ESM dist/prosemirror/index.js 78.48 KB
178
- ESM dist/prosemirror/index.js.map 309.11 KB
179
- ESM ⚡️ Build success in 87ms
166
+ ESM ⚡️ Build success in 45ms
167
+ ESM dist/react-native-core/index.js 35.08 KB
180
168
  ESM dist/react-native-core/testing.js 119.00 B
181
- ESM dist/react-native-core/index.js 34.47 KB
169
+ ESM dist/react-native-core/index.js.map 70.09 KB
182
170
  ESM dist/react-native-core/testing.js.map 175.00 B
183
- ESM dist/react-native-core/index.js.map 69.10 KB
184
- ESM ⚡️ Build success in 85ms
185
- ESM dist/react-native/polyfills.js 858.00 B
171
+ ESM ⚡️ Build success in 62ms
172
+ ESM dist/prosemirror/index.js 78.48 KB
173
+ ESM dist/prosemirror/index.js.map 309.11 KB
174
+ ESM ⚡️ Build success in 78ms
175
+ ESM dist/browser/index.js 16.36 KB
176
+ ESM dist/browser/index.js.map 32.83 KB
177
+ ESM ⚡️ Build success in 80ms
178
+ ESM dist/react/index.js 26.16 KB
179
+ ESM dist/react/testing.js 122.00 B
180
+ ESM dist/react/ssr.js 693.00 B
181
+ ESM dist/react/index.js.map 55.65 KB
182
+ ESM dist/react/testing.js.map 165.00 B
183
+ ESM dist/react/ssr.js.map 1.10 KB
184
+ ESM ⚡️ Build success in 72ms
185
+ ESM dist/react-native/index.js 38.82 KB
186
186
  ESM dist/react-native/testing.js 120.00 B
187
- ESM dist/react-native/index.js 38.21 KB
188
- ESM dist/react-native/polyfills.js.map 1.61 KB
187
+ ESM dist/react-native/polyfills.js 858.00 B
188
+ ESM dist/react-native/index.js.map 77.74 KB
189
189
  ESM dist/react-native/testing.js.map 176.00 B
190
- ESM dist/react-native/index.js.map 76.75 KB
191
- ESM ⚡️ Build success in 90ms
192
- ESM dist/inspector/index.js 37.49 KB
190
+ ESM dist/react-native/polyfills.js.map 1.61 KB
191
+ ESM ⚡️ Build success in 81ms
193
192
  ESM dist/inspector/standalone.js 12.61 KB
193
+ ESM dist/inspector/index.js 37.49 KB
194
194
  ESM dist/inspector/chunk-ORKZSKZF.js 128.83 KB
195
- ESM dist/inspector/index.js.map 63.80 KB
196
195
  ESM dist/inspector/standalone.js.map 20.11 KB
197
196
  ESM dist/inspector/chunk-ORKZSKZF.js.map 222.34 KB
198
- ESM ⚡️ Build success in 111ms
199
- ESM dist/index.js 32.18 KB
200
- ESM dist/chunk-WAYFZQXB.js 269.90 KB
197
+ ESM dist/inspector/index.js.map 63.80 KB
198
+ ESM ⚡️ Build success in 90ms
199
+ ESM dist/inspector/register-custom-element.js 305.00 B
200
+ ESM dist/inspector/register-custom-element.js.map 445.00 B
201
+ ESM dist/inspector/custom-element-7G7IZVLL.js 1.64 MB
202
+ ESM dist/inspector/custom-element-7G7IZVLL.js.map 2.52 MB
203
+ ESM ⚡️ Build success in 138ms
204
+ ESM dist/index.js 32.38 KB
201
205
  ESM dist/testing.js 8.56 KB
202
206
  ESM dist/chunk-K4D7IMFM.js 690.00 B
203
- ESM dist/chunk-ZQWSQH6L.js 945.00 B
204
207
  ESM dist/tools/ssr.js 156.00 B
205
- ESM dist/index.js.map 65.34 KB
206
- ESM dist/testing.js.map 16.22 KB
208
+ ESM dist/chunk-ZQWSQH6L.js 945.00 B
209
+ ESM dist/chunk-MIPBSAS7.js 281.05 KB
210
+ ESM dist/index.js.map 66.14 KB
207
211
  ESM dist/chunk-K4D7IMFM.js.map 1.10 KB
208
212
  ESM dist/chunk-ZQWSQH6L.js.map 71.00 B
213
+ ESM dist/testing.js.map 16.22 KB
209
214
  ESM dist/tools/ssr.js.map 71.00 B
210
- ESM dist/chunk-WAYFZQXB.js.map 621.94 KB
211
- ESM ⚡️ Build success in 135ms
212
- ESM dist/inspector/register-custom-element.js 305.00 B
213
- ESM dist/inspector/register-custom-element.js.map 445.00 B
214
- ESM dist/inspector/custom-element-7G7IZVLL.js 1.64 MB
215
- ESM dist/inspector/custom-element-7G7IZVLL.js.map 2.52 MB
216
- ESM ⚡️ Build success in 166ms
215
+ ESM dist/chunk-MIPBSAS7.js.map 648.81 KB
216
+ ESM ⚡️ Build success in 136ms
217
217
 
218
- > jazz-tools@0.20.16 types /home/runner/_work/jazz/jazz/packages/jazz-tools
218
+ > jazz-tools@0.20.18 types /home/runner/_work/jazz/jazz/packages/jazz-tools
219
219
  > tsc --outDir dist
220
220
 
221
221
 
222
- > jazz-tools@0.20.16 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
222
+ > jazz-tools@0.20.18 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
223
223
  > rm -rf dist/svelte && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json
224
224
 
225
225
  src/svelte -> dist/svelte
226
226
 
227
- > jazz-tools@0.20.16 build:better-auth-svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
227
+ > jazz-tools@0.20.18 build:better-auth-svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
228
228
  > mkdir -p dist/better-auth/auth && svelte-package -i src/better-auth/auth -o dist/better-auth/auth-temp --tsconfig tsconfig.svelte.json && cp dist/better-auth/auth-temp/svelte.svelte dist/better-auth/auth/svelte.svelte && cp dist/better-auth/auth-temp/svelte.svelte.d.ts dist/better-auth/auth/svelte.d.ts && rm -rf dist/better-auth/auth-temp
229
229
 
230
230
  src/better-auth/auth -> dist/better-auth/auth-temp
package/CHANGELOG.md CHANGED
@@ -1,5 +1,29 @@
1
1
  # jazz-tools
2
2
 
3
+ ## 0.20.18
4
+
5
+ ### Patch Changes
6
+
7
+ - ab2e90b: Fix a Better Auth race condition where a slow `/get-session` request returning `null` after a successful sign-in would incorrectly log the user out. The client plugin now tracks an `authGeneration` counter, attaches it to `/get-session` requests via an `x-jazz-auth-generation` header, and ignores stale null responses whose generation no longer matches the current one.
8
+ - 12b27e1: Add opt-in experimental clock synchronisation from server pings.
9
+ - 1c6e9ff: Fix circularity issues when using CoMap `extend()` or `safeExtend()`
10
+ - ab2e90b: Fix `createJazzContext` hanging when an account migration loads a `co.discriminatedUnion()` CoValue whose stored value matches no declared variant. The runtime discriminator now throws a dedicated `SchemaUnionNoMatchingVariantError` that `SubscriptionScope` catches and surfaces as `UNAVAILABLE`, so `load()` settles instead of hanging. Other instantiation errors (e.g. `CoVector` dimension mismatches) still throw loudly.
11
+ - Updated dependencies [12b27e1]
12
+ - cojson@0.20.18
13
+ - cojson-transport-ws@0.20.18
14
+ - cojson-storage-indexeddb@0.20.18
15
+
16
+ ## 0.20.17
17
+
18
+ ### Patch Changes
19
+
20
+ - d26dccc: Fix MCP docs server failing to use SQLite/FTS5 backend by preventing bundlers from stripping the `node:` prefix on `node:sqlite` imports.
21
+ - 6572f1f: Add new co.snapshotRef() CoValue that abstracts away cursor-based snapshotting and allows snapshots of values to be seamlessly referenced
22
+ - 754df86: Accept an options object `{ baseURL, valueHint? }` as the third argument to `createInviteLink`, matching the signature already used by the browser and React Native wrappers. The positional form `(value, role, baseURL, valueHint?)` is deprecated but still supported.
23
+ - cojson@0.20.17
24
+ - cojson-storage-indexeddb@0.20.17
25
+ - cojson-transport-ws@0.20.17
26
+
3
27
  ## 0.20.16
4
28
 
5
29
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAmBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA+H1D,CAAC"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAqBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA2I1D,CAAC"}
@@ -9,7 +9,9 @@ var jazzPluginClient = () => {
9
9
  let jazzContext;
10
10
  let authSecretStorage;
11
11
  let signOutUnsubscription;
12
+ let authGeneration = 0;
12
13
  const authenticateOnJazz = async (jazzAuth) => {
14
+ authGeneration++;
13
15
  const parsedJazzAuth = {
14
16
  ...jazzAuth,
15
17
  secretSeed: jazzAuth.secretSeed ? Uint8Array.from(jazzAuth.secretSeed) : void 0
@@ -57,6 +59,12 @@ var jazzPluginClient = () => {
57
59
  name: "jazz-plugin",
58
60
  hooks: {
59
61
  async onRequest(context) {
62
+ if (context.url.toString().includes("/get-session")) {
63
+ context.headers.set(
64
+ "x-jazz-auth-generation",
65
+ String(authGeneration)
66
+ );
67
+ }
60
68
  if (SIGNUP_URLS.some((url) => context.url.toString().includes(url))) {
61
69
  const credentials = await authSecretStorage.get();
62
70
  if (!credentials) {
@@ -83,7 +91,10 @@ var jazzPluginClient = () => {
83
91
  }
84
92
  if (context.request.url.toString().includes("/get-session")) {
85
93
  if (context.data === null) {
86
- if (authSecretStorage.isAuthenticated === true) {
94
+ const requestAuthGeneration = Number(
95
+ context.request.headers.get("x-jazz-auth-generation") ?? "0"
96
+ );
97
+ if (authSecretStorage.isAuthenticated === true && requestAuthGeneration === authGeneration) {
87
98
  console.info(
88
99
  "Jazz is authenticated, but the session is null. Logging out"
89
100
  );
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/better-auth/auth/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type {\n Account,\n AuthSecretStorage,\n AuthSetPayload,\n JazzContextType,\n} from \"jazz-tools\";\nimport type { jazzPlugin } from \"./server.js\";\n\nconst SIGNUP_URLS = [\n \"/sign-up\",\n \"/sign-in/social\",\n \"/sign-in/oauth2\",\n \"/email-otp/send-verification-otp\",\n];\n\n/**\n * @example\n * ```ts\n * const auth = betterAuth({\n * plugins: [jazzPluginClient()],\n * });\n * ```\n */\nexport const jazzPluginClient = () => {\n let jazzContext: JazzContextType<Account>;\n let authSecretStorage: AuthSecretStorage;\n let signOutUnsubscription: () => void;\n\n const authenticateOnJazz = async (jazzAuth: AuthSetPayload) => {\n const parsedJazzAuth = {\n ...jazzAuth,\n secretSeed: jazzAuth.secretSeed\n ? Uint8Array.from(jazzAuth.secretSeed)\n : undefined,\n };\n\n await jazzContext.authenticate(parsedJazzAuth);\n await authSecretStorage.set(parsedJazzAuth);\n };\n\n return {\n id: \"jazz-plugin\",\n $InferServerPlugin: {} as ReturnType<typeof jazzPlugin>,\n getActions: ($fetch, $store) => {\n return {\n jazz: {\n setJazzContext: (context: JazzContextType<Account>) => {\n jazzContext = context;\n },\n setAuthSecretStorage: (storage: AuthSecretStorage) => {\n authSecretStorage = storage;\n if (signOutUnsubscription) signOutUnsubscription();\n\n // This is a workaround to logout from Better Auth when user logs out directly from Jazz\n signOutUnsubscription = authSecretStorage.onUpdate(\n (isAuthenticated) => {\n if (isAuthenticated === false) {\n const session = $store.atoms.session?.get();\n if (!session) return;\n\n // if the user logs out from Better Auth, the get session is immediately called\n // so we must wait the next fetched session to understand if we need to call sign-out\n if (session.isPending || session.isRefetching) {\n // listen once for next session's data\n const unsub = $store.atoms.session?.listen((session) => {\n unsub?.();\n // if the session is null, user has been already logged out from Better Auth\n if (session.data !== null) {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n });\n }\n // if the session is not pending, it means user logged out from Jazz only\n // so we call the sign-out api\n else {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n }\n },\n );\n },\n },\n };\n },\n fetchPlugins: [\n {\n id: \"jazz-plugin\",\n name: \"jazz-plugin\",\n hooks: {\n async onRequest(context) {\n if (\n SIGNUP_URLS.some((url) => context.url.toString().includes(url))\n ) {\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n context.headers.set(\n \"x-jazz-auth\",\n JSON.stringify({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined,\n accountSecret: credentials.accountSecret,\n }),\n );\n }\n },\n async onSuccess(context) {\n if (context.request.url.toString().includes(\"/sign-up\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-in/email\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/get-session\")) {\n if (context.data === null) {\n if (authSecretStorage.isAuthenticated === true) {\n console.info(\n \"Jazz is authenticated, but the session is null. Logging out\",\n );\n await jazzContext.logOut();\n }\n return;\n }\n\n if (!context.data?.user) {\n return;\n }\n\n if (authSecretStorage.isAuthenticated === false) {\n console.info(\n \"Jazz is not authenticated, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n const sessionAccountID = context.data.user.accountID;\n\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n if (credentials.accountID !== sessionAccountID) {\n console.info(\n \"Jazz credentials mismatch, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n }\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-out\")) {\n await jazzContext.logOut();\n return;\n }\n\n if (context.request.url.toString().includes(\"/delete-user\")) {\n await jazzContext.logOut();\n return;\n }\n },\n },\n },\n ],\n } satisfies BetterAuthClientPlugin;\n};\n"],"mappings":"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","names":["session"]}
1
+ {"version":3,"sources":["../../../src/better-auth/auth/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type {\n Account,\n AuthSecretStorage,\n AuthSetPayload,\n JazzContextType,\n} from \"jazz-tools\";\nimport type { jazzPlugin } from \"./server.js\";\n\nconst SIGNUP_URLS = [\n \"/sign-up\",\n \"/sign-in/social\",\n \"/sign-in/oauth2\",\n \"/email-otp/send-verification-otp\",\n];\n\n/**\n * @example\n * ```ts\n * const auth = betterAuth({\n * plugins: [jazzPluginClient()],\n * });\n * ```\n */\nexport const jazzPluginClient = () => {\n let jazzContext: JazzContextType<Account>;\n let authSecretStorage: AuthSecretStorage;\n let signOutUnsubscription: () => void;\n let authGeneration = 0;\n\n const authenticateOnJazz = async (jazzAuth: AuthSetPayload) => {\n authGeneration++;\n const parsedJazzAuth = {\n ...jazzAuth,\n secretSeed: jazzAuth.secretSeed\n ? Uint8Array.from(jazzAuth.secretSeed)\n : undefined,\n };\n\n await jazzContext.authenticate(parsedJazzAuth);\n await authSecretStorage.set(parsedJazzAuth);\n };\n\n return {\n id: \"jazz-plugin\",\n $InferServerPlugin: {} as ReturnType<typeof jazzPlugin>,\n getActions: ($fetch, $store) => {\n return {\n jazz: {\n setJazzContext: (context: JazzContextType<Account>) => {\n jazzContext = context;\n },\n setAuthSecretStorage: (storage: AuthSecretStorage) => {\n authSecretStorage = storage;\n if (signOutUnsubscription) signOutUnsubscription();\n\n // This is a workaround to logout from Better Auth when user logs out directly from Jazz\n signOutUnsubscription = authSecretStorage.onUpdate(\n (isAuthenticated) => {\n if (isAuthenticated === false) {\n const session = $store.atoms.session?.get();\n if (!session) return;\n\n // if the user logs out from Better Auth, the get session is immediately called\n // so we must wait the next fetched session to understand if we need to call sign-out\n if (session.isPending || session.isRefetching) {\n // listen once for next session's data\n const unsub = $store.atoms.session?.listen((session) => {\n unsub?.();\n // if the session is null, user has been already logged out from Better Auth\n if (session.data !== null) {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n });\n }\n // if the session is not pending, it means user logged out from Jazz only\n // so we call the sign-out api\n else {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n }\n },\n );\n },\n },\n };\n },\n fetchPlugins: [\n {\n id: \"jazz-plugin\",\n name: \"jazz-plugin\",\n hooks: {\n async onRequest(context) {\n if (context.url.toString().includes(\"/get-session\")) {\n context.headers.set(\n \"x-jazz-auth-generation\",\n String(authGeneration),\n );\n }\n if (\n SIGNUP_URLS.some((url) => context.url.toString().includes(url))\n ) {\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n context.headers.set(\n \"x-jazz-auth\",\n JSON.stringify({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined,\n accountSecret: credentials.accountSecret,\n }),\n );\n }\n },\n async onSuccess(context) {\n if (context.request.url.toString().includes(\"/sign-up\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-in/email\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/get-session\")) {\n if (context.data === null) {\n const requestAuthGeneration = Number(\n context.request.headers.get(\"x-jazz-auth-generation\") ?? \"0\",\n );\n if (\n authSecretStorage.isAuthenticated === true &&\n requestAuthGeneration === authGeneration\n ) {\n console.info(\n \"Jazz is authenticated, but the session is null. Logging out\",\n );\n await jazzContext.logOut();\n }\n return;\n }\n\n if (!context.data?.user) {\n return;\n }\n\n if (authSecretStorage.isAuthenticated === false) {\n console.info(\n \"Jazz is not authenticated, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n const sessionAccountID = context.data.user.accountID;\n\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n if (credentials.accountID !== sessionAccountID) {\n console.info(\n \"Jazz credentials mismatch, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n }\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-out\")) {\n await jazzContext.logOut();\n return;\n }\n\n if (context.request.url.toString().includes(\"/delete-user\")) {\n await jazzContext.logOut();\n return;\n }\n },\n },\n },\n ],\n } satisfies BetterAuthClientPlugin;\n};\n"],"mappings":"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","names":["session"]}
@@ -11,6 +11,7 @@ export type JazzContextManagerProps<S extends (AccountClass<Account> & CoValueFr
11
11
  storage?: BaseBrowserContextOptions["storage"];
12
12
  AccountSchema?: S;
13
13
  defaultProfileName?: string;
14
+ experimental_clockSyncFromServerPings?: boolean;
14
15
  };
15
16
  export declare class JazzBrowserContextManager<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {
16
17
  getKvStore(): InMemoryKVStore | LocalStorageKVStore;
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserContextManager.d.ts","sourceRoot":"","sources":["../../src/browser/BrowserContextManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,yBAAyB,EAG1B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,uBAAuB,CACjC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,2BAA2B,CAAC,EAAE,CAC5B,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,qBAAa,yBAAyB,CACpC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,CACpB,SAAQ,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAE3E,UAAU;IASJ,aAAa,CACjB,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,EACjC,SAAS,CAAC,EAAE,2BAA2B;;;;;;;;;;;;;;;;IAqBzC,YAAY,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;CAW/C"}
1
+ {"version":3,"file":"BrowserContextManager.d.ts","sourceRoot":"","sources":["../../src/browser/BrowserContextManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,yBAAyB,EAG1B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,uBAAuB,CACjC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,2BAA2B,CAAC,EAAE,CAC5B,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qCAAqC,CAAC,EAAE,OAAO,CAAC;CACjD,CAAC;AAEF,qBAAa,yBAAyB,CACpC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,CACpB,SAAQ,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAE3E,UAAU;IASJ,aAAa,CACjB,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,EACjC,SAAS,CAAC,EAAE,2BAA2B;;;;;;;;;;;;;;;;IAyBzC,YAAY,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;CAW/C"}
@@ -1,11 +1,12 @@
1
1
  import { LocalNode } from "cojson";
2
- import { Account, AccountClass, AgentID, AnyAccountSchema, AuthCredentials, AuthSecretStorage, CoValue, CoValueFromRaw, CryptoProvider, ID, InviteSecret, NewAccountProps, SessionID, SyncConfig } from "jazz-tools";
2
+ import { Account, AccountClass, AgentID, AnyAccountSchema, AuthCredentials, AuthSecretStorage, CoValueFromRaw, CryptoProvider, ID, NewAccountProps, SessionID, SyncConfig } from "jazz-tools";
3
3
  export type BaseBrowserContextOptions = {
4
4
  sync: SyncConfig;
5
5
  reconnectionTimeout?: number;
6
6
  storage?: "indexedDB";
7
7
  crypto?: CryptoProvider;
8
8
  authSecretStorage: AuthSecretStorage;
9
+ experimental_clockSyncFromServerPings?: boolean;
9
10
  };
10
11
  export declare function createJazzBrowserGuestContext(options: BaseBrowserContextOptions): Promise<{
11
12
  guest: import("jazz-tools").AnonymousJazzAgent;
@@ -32,15 +33,4 @@ export declare function createJazzBrowserContext<S extends (AccountClass<Account
32
33
  }>;
33
34
  /** @category Auth Providers */
34
35
  export type SessionProvider = (accountID: ID<Account> | AgentID) => Promise<SessionID>;
35
- /** @category Invite Links */
36
- export declare function createInviteLink<C extends CoValue>(value: C, role: "reader" | "writer" | "admin" | "writeOnly", { baseURL, valueHint, }?: {
37
- baseURL?: string;
38
- valueHint?: string;
39
- }): string;
40
- /** @category Invite Links */
41
- export declare function parseInviteLink<C extends CoValue>(inviteURL: string): {
42
- valueID: ID<C>;
43
- valueHint?: string;
44
- inviteSecret: InviteSecret;
45
- } | undefined;
46
36
  //# sourceMappingURL=createBrowserContext.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createBrowserContext.d.ts","sourceRoot":"","sources":["../../src/browser/createBrowserContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,MAAM,QAAQ,CAAC;AAIzC,OAAO,EACL,OAAO,EACP,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,cAAc,EACd,EAAE,EACF,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EAGX,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAuFF,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,yBAAyB;;;;;4DAnBA,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GAyD/D;AAED,MAAM,MAAM,qBAAqB,CAC/B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,yBAAyB,CAAC;AAE9B,wBAAsB,wBAAwB,CAC5C,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;;;;;;4DA1EC,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GAwI/D;AAED,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,CAC5B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAC;AAExB,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,EAEjD,EACE,OAAkD,EAClD,SAAS,GACV,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,MAAM,CAoBR;AAED,6BAA6B;AAC7B,wBAAgB,eAAe,CAAC,CAAC,SAAS,OAAO,EAC/C,SAAS,EAAE,MAAM,GAEf;IACE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B,GACD,SAAS,CAuBZ"}
1
+ {"version":3,"file":"createBrowserContext.d.ts","sourceRoot":"","sources":["../../src/browser/createBrowserContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,MAAM,QAAQ,CAAC;AAIzC,OAAO,EACL,OAAO,EACP,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EAEjB,cAAc,EACd,cAAc,EACd,EAAE,EACF,eAAe,EACf,SAAS,EACT,UAAU,EAEX,MAAM,YAAY,CAAC;AAOpB,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,WAAW,CAAC;IACtB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,qCAAqC,CAAC,EAAE,OAAO,CAAC;CACjD,CAAC;AA0FF,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,yBAAyB;;;;;4DAnBA,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GA2D/D;AAED,MAAM,MAAM,qBAAqB,CAC/B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,yBAAyB,CAAC;AAE9B,wBAAsB,wBAAwB,CAC5C,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;;;;;;4DA5EC,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GA4I/D;AAED,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,CAC5B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAC"}
@@ -187,7 +187,6 @@ import { getIndexedDBStorage } from "cojson-storage-indexeddb";
187
187
  import { WebSocketPeerWithReconnection } from "cojson-transport-ws";
188
188
  import { WasmCrypto } from "cojson/crypto/WasmCrypto";
189
189
  import {
190
- cojsonInternals as cojsonInternals2,
191
190
  createAnonymousJazzContext
192
191
  } from "jazz-tools";
193
192
  import { createJazzContext } from "jazz-tools";
@@ -359,6 +358,9 @@ async function setupPeers(options) {
359
358
  },
360
359
  removePeer: (peer) => {
361
360
  peers.splice(peers.indexOf(peer), 1);
361
+ },
362
+ onPingReceived: (sample) => {
363
+ node?.clockOffset.addSample(sample);
362
364
  }
363
365
  });
364
366
  function toggleNetwork(enabled) {
@@ -407,7 +409,8 @@ async function createJazzBrowserGuestContext(options) {
407
409
  crypto,
408
410
  peers,
409
411
  syncWhen,
410
- storage
412
+ storage,
413
+ experimental_clockSyncFromServerPings: options.experimental_clockSyncFromServerPings
411
414
  });
412
415
  setNode(context.agent.node);
413
416
  options.authSecretStorage.emitUpdate(null);
@@ -462,7 +465,8 @@ async function createJazzBrowserContext(options) {
462
465
  defaultProfileName: options.defaultProfileName,
463
466
  AccountSchema: options.AccountSchema,
464
467
  sessionProvider: getBrowserLockSessionProvider(),
465
- authSecretStorage: options.authSecretStorage
468
+ authSecretStorage: options.authSecretStorage,
469
+ experimental_clockSyncFromServerPings: options.experimental_clockSyncFromServerPings
466
470
  });
467
471
  setNode(context.node);
468
472
  return {
@@ -522,7 +526,8 @@ var JazzBrowserContextManager = class extends JazzContextManager {
522
526
  return createJazzBrowserGuestContext({
523
527
  sync: props.sync,
524
528
  storage: props.storage,
525
- authSecretStorage: this.authSecretStorage
529
+ authSecretStorage: this.authSecretStorage,
530
+ experimental_clockSyncFromServerPings: props.experimental_clockSyncFromServerPings
526
531
  });
527
532
  } else {
528
533
  return createJazzBrowserContext({
@@ -532,7 +537,8 @@ var JazzBrowserContextManager = class extends JazzContextManager {
532
537
  credentials: authProps?.credentials,
533
538
  newAccountProps: authProps?.newAccountProps,
534
539
  defaultProfileName: props.defaultProfileName,
535
- authSecretStorage: this.authSecretStorage
540
+ authSecretStorage: this.authSecretStorage,
541
+ experimental_clockSyncFromServerPings: props.experimental_clockSyncFromServerPings
536
542
  });
537
543
  }
538
544
  }
@@ -551,7 +557,7 @@ function createInviteLink(value, role, {
551
557
  baseURL = window.location.href.replace(/#.*$/, ""),
552
558
  valueHint
553
559
  } = {}) {
554
- return baseCreateInviteLink(value, role, baseURL, valueHint);
560
+ return baseCreateInviteLink(value, role, { baseURL, valueHint });
555
561
  }
556
562
  async function consumeInviteLinkFromWindowLocation({
557
563
  as,