jazz-tools 0.20.15 → 0.20.17

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 (195) hide show
  1. package/.svelte-kit/__package__/svelte.svelte.d.ts +6 -6
  2. package/.svelte-kit/__package__/tests/TestAuthProviderWrapper.svelte.d.ts +6 -6
  3. package/.turbo/turbo-build.log +63 -63
  4. package/CHANGELOG.md +30 -0
  5. package/dist/better-auth/auth/svelte.d.ts +6 -6
  6. package/dist/better-auth/database-adapter/index.d.ts.map +1 -1
  7. package/dist/better-auth/database-adapter/tests/sync-utils.d.ts.map +1 -1
  8. package/dist/browser/auth/PasskeyAuth.d.ts.map +1 -1
  9. package/dist/browser/createBrowserContext.d.ts +1 -12
  10. package/dist/browser/createBrowserContext.d.ts.map +1 -1
  11. package/dist/browser/index.js +1 -2
  12. package/dist/browser/index.js.map +1 -1
  13. package/dist/{chunk-JYPPYCEU.js → chunk-3BV3JUMV.js} +635 -93
  14. package/dist/chunk-3BV3JUMV.js.map +1 -0
  15. package/dist/expo/auth/clerk/index.d.ts.map +1 -1
  16. package/dist/index.js +5 -3
  17. package/dist/index.js.map +1 -1
  18. package/dist/inspector/utils/transactions-changes.d.ts.map +1 -1
  19. package/dist/inspector/viewer/type-icon.d.ts.map +1 -1
  20. package/dist/inspector/viewer/types.d.ts.map +1 -1
  21. package/dist/inspector/viewer/use-resolve-covalue.d.ts.map +1 -1
  22. package/dist/inspector/viewer/value-renderer.d.ts.map +1 -1
  23. package/dist/mcp/backend-sqlite.d.ts.map +1 -1
  24. package/dist/mcp/server.d.ts.map +1 -1
  25. package/dist/mcp/server.js +4 -2
  26. package/dist/mcp/server.js.map +1 -1
  27. package/dist/media/create-image-factory.d.ts.map +1 -1
  28. package/dist/media/index.server.js.map +1 -1
  29. package/dist/react/auth/Clerk.d.ts.map +1 -1
  30. package/dist/react/auth/DemoAuth.d.ts.map +1 -1
  31. package/dist/react/auth/PasskeyAuth.d.ts.map +1 -1
  32. package/dist/react/tests/testUtils.d.ts.map +1 -1
  33. package/dist/react-core/hooks.d.ts +39 -1
  34. package/dist/react-core/hooks.d.ts.map +1 -1
  35. package/dist/react-core/index.js +13 -6
  36. package/dist/react-core/index.js.map +1 -1
  37. package/dist/react-core/tests/testUtils.d.ts.map +1 -1
  38. package/dist/react-native/index.js +4 -1
  39. package/dist/react-native/index.js.map +1 -1
  40. package/dist/react-native-core/auth/DemoAuthUI.d.ts.map +1 -1
  41. package/dist/react-native-core/auth/PasskeyAuth.d.ts.map +1 -1
  42. package/dist/react-native-core/auth/PasskeyAuthBasicUI.d.ts.map +1 -1
  43. package/dist/react-native-core/index.js +4 -1
  44. package/dist/react-native-core/index.js.map +1 -1
  45. package/dist/react-native-core/platform.d.ts.map +1 -1
  46. package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte.d.ts +2 -1
  47. package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte.d.ts.map +1 -1
  48. package/dist/svelte/jazz.class.svelte.d.ts +7 -1
  49. package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
  50. package/dist/svelte/jazz.class.svelte.js +2 -2
  51. package/dist/svelte/tests/testUtils.d.ts.map +1 -1
  52. package/dist/testing.js +1 -1
  53. package/dist/tools/auth/DemoAuth.d.ts.map +1 -1
  54. package/dist/tools/auth/PassphraseAuth.d.ts.map +1 -1
  55. package/dist/tools/auth/clerk/index.d.ts.map +1 -1
  56. package/dist/tools/coValues/CoValueBase.d.ts +3 -1
  57. package/dist/tools/coValues/CoValueBase.d.ts.map +1 -1
  58. package/dist/tools/coValues/account.d.ts +3 -1
  59. package/dist/tools/coValues/account.d.ts.map +1 -1
  60. package/dist/tools/coValues/coFeed.d.ts +4 -2
  61. package/dist/tools/coValues/coFeed.d.ts.map +1 -1
  62. package/dist/tools/coValues/coList.d.ts +3 -1
  63. package/dist/tools/coValues/coList.d.ts.map +1 -1
  64. package/dist/tools/coValues/coMap.d.ts +3 -1
  65. package/dist/tools/coValues/coMap.d.ts.map +1 -1
  66. package/dist/tools/coValues/deepLoading.d.ts +21 -1
  67. package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
  68. package/dist/tools/coValues/interfaces.d.ts +11 -1
  69. package/dist/tools/coValues/interfaces.d.ts.map +1 -1
  70. package/dist/tools/coValues/registeredSchemas.d.ts +1 -1
  71. package/dist/tools/coValues/registeredSchemas.d.ts.map +1 -1
  72. package/dist/tools/coValues/request.d.ts +2 -2
  73. package/dist/tools/coValues/request.d.ts.map +1 -1
  74. package/dist/tools/coValues/snapshotRef.d.ts +114 -0
  75. package/dist/tools/coValues/snapshotRef.d.ts.map +1 -0
  76. package/dist/tools/exports.d.ts +1 -1
  77. package/dist/tools/exports.d.ts.map +1 -1
  78. package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
  79. package/dist/tools/implementation/anonymousJazzAgent.d.ts.map +1 -1
  80. package/dist/tools/implementation/invites.d.ts +9 -1
  81. package/dist/tools/implementation/invites.d.ts.map +1 -1
  82. package/dist/tools/implementation/schemaRuntime.d.ts +1 -0
  83. package/dist/tools/implementation/schemaRuntime.d.ts.map +1 -1
  84. package/dist/tools/implementation/zodSchema/coExport.d.ts +2 -1
  85. package/dist/tools/implementation/zodSchema/coExport.d.ts.map +1 -1
  86. package/dist/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.d.ts.map +1 -1
  87. package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts +3 -0
  88. package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts.map +1 -1
  89. package/dist/tools/implementation/zodSchema/schemaInvariant.d.ts +2 -1
  90. package/dist/tools/implementation/zodSchema/schemaInvariant.d.ts.map +1 -1
  91. package/dist/tools/implementation/zodSchema/schemaPermissions.d.ts.map +1 -1
  92. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
  93. package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts +2 -1
  94. package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
  95. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +2 -1
  96. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
  97. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +2 -1
  98. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
  99. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +2 -1
  100. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
  101. package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts.map +1 -1
  102. package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +2 -1
  103. package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
  104. package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts.map +1 -1
  105. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
  106. package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts.map +1 -1
  107. package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +3 -1
  108. package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
  109. package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +3 -1
  110. package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
  111. package/dist/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.d.ts +106 -0
  112. package/dist/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.d.ts.map +1 -0
  113. package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts +2 -2
  114. package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts.map +1 -1
  115. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +2 -2
  116. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
  117. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts +3 -2
  118. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -1
  119. package/dist/tools/implementation/zodSchema/zodCo.d.ts +6 -6
  120. package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
  121. package/dist/tools/implementation/zodSchema/zodSchema.d.ts +4 -3
  122. package/dist/tools/implementation/zodSchema/zodSchema.d.ts.map +1 -1
  123. package/dist/tools/internal.d.ts +2 -0
  124. package/dist/tools/internal.d.ts.map +1 -1
  125. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +3 -2
  126. package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
  127. package/dist/tools/subscribe/SubscriptionCache.d.ts +2 -2
  128. package/dist/tools/subscribe/SubscriptionCache.d.ts.map +1 -1
  129. package/dist/tools/subscribe/SubscriptionScope.d.ts +10 -2
  130. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  131. package/dist/tools/subscribe/cursor.d.ts +15 -0
  132. package/dist/tools/subscribe/cursor.d.ts.map +1 -0
  133. package/dist/tools/subscribe/types.d.ts +9 -0
  134. package/dist/tools/subscribe/types.d.ts.map +1 -1
  135. package/dist/tools/subscribe/utils.d.ts +1 -0
  136. package/dist/tools/subscribe/utils.d.ts.map +1 -1
  137. package/dist/tools/testing.d.ts.map +1 -1
  138. package/dist/tools/tests/coValue.cursor.test.d.ts +2 -0
  139. package/dist/tools/tests/coValue.cursor.test.d.ts.map +1 -0
  140. package/dist/tools/tests/cursor.test.d.ts +2 -0
  141. package/dist/tools/tests/cursor.test.d.ts.map +1 -0
  142. package/dist/tools/tests/snapshotRef.test.d.ts +2 -0
  143. package/dist/tools/tests/snapshotRef.test.d.ts.map +1 -0
  144. package/package.json +5 -5
  145. package/src/browser/createBrowserContext.ts +0 -67
  146. package/src/browser/index.ts +1 -1
  147. package/src/mcp/backend-sqlite.ts +4 -1
  148. package/src/mcp/server.ts +4 -1
  149. package/src/media/create-image/server.ts +1 -1
  150. package/src/react-core/hooks.ts +51 -1
  151. package/src/react-native-core/platform.ts +4 -1
  152. package/src/svelte/jazz.class.svelte.ts +9 -1
  153. package/src/tools/coValues/CoValueBase.ts +14 -0
  154. package/src/tools/coValues/account.ts +4 -0
  155. package/src/tools/coValues/coFeed.ts +9 -5
  156. package/src/tools/coValues/coList.ts +4 -0
  157. package/src/tools/coValues/coMap.ts +4 -0
  158. package/src/tools/coValues/deepLoading.ts +46 -15
  159. package/src/tools/coValues/interfaces.ts +84 -25
  160. package/src/tools/coValues/registeredSchemas.ts +1 -1
  161. package/src/tools/coValues/snapshotRef.ts +364 -0
  162. package/src/tools/exports.ts +2 -0
  163. package/src/tools/implementation/invites.ts +26 -2
  164. package/src/tools/implementation/schemaRuntime.ts +1 -0
  165. package/src/tools/implementation/zodSchema/coExport.ts +2 -0
  166. package/src/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.ts +10 -0
  167. package/src/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.ts +1 -1
  168. package/src/tools/implementation/zodSchema/schemaInvariant.ts +3 -1
  169. package/src/tools/implementation/zodSchema/schemaPermissions.ts +2 -4
  170. package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +2 -0
  171. package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +2 -0
  172. package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +2 -0
  173. package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +3 -0
  174. package/src/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +2 -0
  175. package/src/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +4 -0
  176. package/src/tools/implementation/zodSchema/schemaTypes/RichTextSchema.ts +4 -0
  177. package/src/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.ts +259 -0
  178. package/src/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.ts +24 -19
  179. package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +11 -5
  180. package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.ts +18 -10
  181. package/src/tools/implementation/zodSchema/zodCo.ts +17 -0
  182. package/src/tools/implementation/zodSchema/zodSchema.ts +10 -3
  183. package/src/tools/internal.ts +2 -0
  184. package/src/tools/subscribe/CoValueCoreSubscription.ts +21 -2
  185. package/src/tools/subscribe/SubscriptionCache.ts +19 -2
  186. package/src/tools/subscribe/SubscriptionScope.ts +95 -7
  187. package/src/tools/subscribe/cursor.ts +109 -0
  188. package/src/tools/subscribe/types.ts +12 -0
  189. package/src/tools/subscribe/utils.ts +18 -3
  190. package/src/tools/tests/coValue.cursor.test.ts +817 -0
  191. package/src/tools/tests/cursor.test.ts +255 -0
  192. package/src/tools/tests/deepLoading.test.ts +0 -1
  193. package/src/tools/tests/invites.test.ts +13 -0
  194. package/src/tools/tests/snapshotRef.test.ts +688 -0
  195. package/dist/chunk-JYPPYCEU.js.map +0 -1
@@ -52,7 +52,7 @@ declare const Svelte: import("svelte").Component<{
52
52
  email: string;
53
53
  emailVerified: boolean;
54
54
  name: string;
55
- image?: string | null | undefined;
55
+ image?: string | null | undefined | undefined;
56
56
  };
57
57
  }>, {
58
58
  code?: string | undefined;
@@ -94,7 +94,7 @@ declare const Svelte: import("svelte").Component<{
94
94
  email: string;
95
95
  emailVerified: boolean;
96
96
  name: string;
97
- image?: string | null | undefined;
97
+ image?: string | null | undefined | undefined;
98
98
  };
99
99
  } | {
100
100
  token: string;
@@ -105,7 +105,7 @@ declare const Svelte: import("svelte").Component<{
105
105
  email: string;
106
106
  emailVerified: boolean;
107
107
  name: string;
108
- image?: string | null | undefined;
108
+ image?: string | null | undefined | undefined;
109
109
  };
110
110
  }>, {
111
111
  code?: string | undefined;
@@ -137,7 +137,7 @@ declare const Svelte: import("svelte").Component<{
137
137
  email: string;
138
138
  emailVerified: boolean;
139
139
  name: string;
140
- image?: string | null | undefined;
140
+ image?: string | null | undefined | undefined;
141
141
  };
142
142
  }, {
143
143
  code?: string | undefined;
@@ -308,8 +308,8 @@ declare const Svelte: import("svelte").Component<{
308
308
  userId: string;
309
309
  expiresAt: Date;
310
310
  token: string;
311
- ipAddress?: string | null | undefined;
312
- userAgent?: string | null | undefined;
311
+ ipAddress?: string | null | undefined | undefined;
312
+ userAgent?: string | null | undefined | undefined;
313
313
  }>[], {
314
314
  code?: string | undefined;
315
315
  message?: string | undefined;
@@ -51,7 +51,7 @@ declare const TestAuthProviderWrapper: import("svelte").Component<{
51
51
  email: string;
52
52
  emailVerified: boolean;
53
53
  name: string;
54
- image?: string | null | undefined;
54
+ image?: string | null | undefined | undefined;
55
55
  };
56
56
  }>, {
57
57
  code?: string | undefined;
@@ -93,7 +93,7 @@ declare const TestAuthProviderWrapper: import("svelte").Component<{
93
93
  email: string;
94
94
  emailVerified: boolean;
95
95
  name: string;
96
- image?: string | null | undefined;
96
+ image?: string | null | undefined | undefined;
97
97
  };
98
98
  } | {
99
99
  token: string;
@@ -104,7 +104,7 @@ declare const TestAuthProviderWrapper: import("svelte").Component<{
104
104
  email: string;
105
105
  emailVerified: boolean;
106
106
  name: string;
107
- image?: string | null | undefined;
107
+ image?: string | null | undefined | undefined;
108
108
  };
109
109
  }>, {
110
110
  code?: string | undefined;
@@ -136,7 +136,7 @@ declare const TestAuthProviderWrapper: import("svelte").Component<{
136
136
  email: string;
137
137
  emailVerified: boolean;
138
138
  name: string;
139
- image?: string | null | undefined;
139
+ image?: string | null | undefined | undefined;
140
140
  };
141
141
  }, {
142
142
  code?: string | undefined;
@@ -307,8 +307,8 @@ declare const TestAuthProviderWrapper: import("svelte").Component<{
307
307
  userId: string;
308
308
  expiresAt: Date;
309
309
  token: string;
310
- ipAddress?: string | null | undefined;
311
- userAgent?: string | null | undefined;
310
+ ipAddress?: string | null | undefined | undefined;
311
+ userAgent?: string | null | undefined | undefined;
312
312
  }>[], {
313
313
  code?: string | undefined;
314
314
  message?: string | undefined;
@@ -1,5 +1,5 @@
1
1
 
2
- > jazz-tools@0.20.15 build /home/runner/_work/jazz/jazz/packages/jazz-tools
2
+ > jazz-tools@0.20.17 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"}
@@ -114,117 +114,117 @@
114
114
  ESM Build start
115
115
  CLI Cleaning output folder
116
116
  ESM Build start
117
- ESM dist/worker/index.js 3.45 KB
118
- ESM dist/worker/napi-crypto.js 110.00 B
119
- ESM dist/worker/edge-wasm.js 259.00 B
120
- ESM dist/worker/index.js.map 6.97 KB
121
- ESM dist/worker/napi-crypto.js.map 162.00 B
122
- ESM dist/worker/edge-wasm.js.map 505.00 B
123
- ESM ⚡️ Build success in 29ms
124
117
  ESM dist/tiptap/index.js 572.00 B
125
118
  ESM dist/tiptap/index.js.map 1.29 KB
126
- ESM ⚡️ Build success in 30ms
127
- ESM dist/better-auth/auth/client.js 4.54 KB
119
+ ESM ⚡️ Build success in 47ms
128
120
  ESM dist/better-auth/auth/server.js 8.38 KB
121
+ ESM dist/better-auth/auth/client.js 4.54 KB
129
122
  ESM dist/better-auth/auth/react.js 813.00 B
130
- ESM dist/better-auth/auth/client.js.map 8.44 KB
131
123
  ESM dist/better-auth/auth/server.js.map 15.56 KB
124
+ ESM dist/better-auth/auth/client.js.map 8.44 KB
132
125
  ESM dist/better-auth/auth/react.js.map 2.07 KB
133
- ESM ⚡️ Build success in 27ms
126
+ ESM ⚡️ Build success in 36ms
127
+ ESM dist/worker/index.js 3.45 KB
128
+ ESM dist/worker/edge-wasm.js 259.00 B
129
+ ESM dist/worker/napi-crypto.js 110.00 B
130
+ ESM dist/worker/index.js.map 6.97 KB
131
+ ESM dist/worker/edge-wasm.js.map 505.00 B
132
+ ESM dist/worker/napi-crypto.js.map 162.00 B
133
+ ESM ⚡️ Build success in 46ms
134
+ ESM dist/mcp/server.js 21.02 KB
135
+ ESM dist/mcp/build-index.js 6.62 KB
136
+ ESM dist/mcp/build-index.js.map 16.00 KB
137
+ ESM dist/mcp/server.js.map 48.96 KB
138
+ ESM ⚡️ Build success in 67ms
134
139
  ESM dist/media/index.js 236.00 B
135
140
  ESM dist/media/index.browser.js 2.79 KB
136
- ESM dist/media/index.server.js 2.95 KB
137
141
  ESM dist/media/index.native.js 4.02 KB
142
+ ESM dist/media/index.server.js 2.95 KB
138
143
  ESM dist/media/chunk-IRL3KNPO.js 6.70 KB
139
144
  ESM dist/media/index.js.map 71.00 B
140
145
  ESM dist/media/index.browser.js.map 6.15 KB
141
- ESM dist/media/index.server.js.map 6.37 KB
142
146
  ESM dist/media/index.native.js.map 8.13 KB
147
+ ESM dist/media/index.server.js.map 6.38 KB
143
148
  ESM dist/media/chunk-IRL3KNPO.js.map 17.00 KB
144
- ESM ⚡️ Build success in 33ms
145
- ESM dist/mcp/server.js 20.95 KB
146
- ESM dist/mcp/build-index.js 6.62 KB
147
- ESM dist/mcp/build-index.js.map 16.00 KB
148
- ESM dist/mcp/server.js.map 48.56 KB
149
- ESM ⚡️ Build success in 41ms
150
- ESM dist/expo/index.js 5.65 KB
151
- ESM dist/expo/polyfills.js 858.00 B
152
- ESM dist/expo/testing.js 112.00 B
153
- ESM dist/expo/index.js.map 11.85 KB
154
- ESM dist/expo/polyfills.js.map 1.61 KB
155
- ESM dist/expo/testing.js.map 168.00 B
156
- ESM ⚡️ Build success in 40ms
149
+ ESM ⚡️ Build success in 65ms
150
+ ESM dist/react-core/index.js 18.06 KB
157
151
  ESM dist/react-core/testing.js 904.00 B
158
- ESM dist/react-core/index.js 17.87 KB
159
152
  ESM dist/react-core/chunk-UOYH6JFJ.js 189.00 B
153
+ ESM dist/react-core/index.js.map 60.18 KB
160
154
  ESM dist/react-core/testing.js.map 1.34 KB
161
- ESM dist/react-core/index.js.map 58.59 KB
162
155
  ESM dist/react-core/chunk-UOYH6JFJ.js.map 363.00 B
163
- ESM ⚡️ Build success in 45ms
164
- ESM dist/browser/index.js 15.96 KB
165
- ESM dist/browser/index.js.map 34.06 KB
166
- ESM ⚡️ Build success in 49ms
156
+ ESM ⚡️ Build success in 64ms
157
+ ESM dist/expo/testing.js 112.00 B
158
+ ESM dist/expo/index.js 5.65 KB
159
+ ESM dist/expo/polyfills.js 858.00 B
160
+ ESM dist/expo/index.js.map 11.85 KB
161
+ ESM dist/expo/testing.js.map 168.00 B
162
+ ESM dist/expo/polyfills.js.map 1.61 KB
163
+ ESM ⚡️ Build success in 59ms
167
164
  ESM dist/better-auth/database-adapter/index.js 26.86 KB
168
165
  ESM dist/better-auth/database-adapter/index.js.map 58.67 KB
169
- ESM ⚡️ Build success in 53ms
170
- ESM dist/react/index.js 26.02 KB
171
- ESM dist/react/testing.js 122.00 B
172
- ESM dist/react/ssr.js 693.00 B
173
- ESM dist/react/index.js.map 55.45 KB
174
- ESM dist/react/testing.js.map 165.00 B
175
- ESM dist/react/ssr.js.map 1.10 KB
176
166
  ESM ⚡️ Build success in 57ms
177
167
  ESM dist/prosemirror/index.js 78.48 KB
178
168
  ESM dist/prosemirror/index.js.map 309.11 KB
179
- ESM ⚡️ Build success in 68ms
180
- ESM dist/react-native-core/index.js 34.47 KB
169
+ ESM ⚡️ Build success in 73ms
170
+ ESM dist/browser/index.js 15.93 KB
171
+ ESM dist/browser/index.js.map 32.10 KB
172
+ ESM ⚡️ Build success in 85ms
173
+ ESM dist/react-native-core/index.js 34.50 KB
181
174
  ESM dist/react-native-core/testing.js 119.00 B
182
- ESM dist/react-native-core/index.js.map 69.10 KB
183
175
  ESM dist/react-native-core/testing.js.map 175.00 B
184
- ESM ⚡️ Build success in 68ms
185
- ESM dist/react-native/index.js 38.21 KB
176
+ ESM dist/react-native-core/index.js.map 69.16 KB
177
+ ESM ⚡️ Build success in 99ms
178
+ ESM dist/react-native/index.js 38.24 KB
186
179
  ESM dist/react-native/testing.js 120.00 B
187
180
  ESM dist/react-native/polyfills.js 858.00 B
188
- ESM dist/react-native/index.js.map 76.75 KB
189
181
  ESM dist/react-native/testing.js.map 176.00 B
182
+ ESM dist/react-native/index.js.map 76.81 KB
190
183
  ESM dist/react-native/polyfills.js.map 1.61 KB
191
- ESM ⚡️ Build success in 72ms
184
+ ESM ⚡️ Build success in 100ms
185
+ ESM dist/react/index.js 26.02 KB
186
+ ESM dist/react/testing.js 122.00 B
187
+ ESM dist/react/ssr.js 693.00 B
188
+ ESM dist/react/testing.js.map 165.00 B
189
+ ESM dist/react/ssr.js.map 1.10 KB
190
+ ESM dist/react/index.js.map 55.45 KB
191
+ ESM ⚡️ Build success in 96ms
192
192
  ESM dist/inspector/standalone.js 12.61 KB
193
- ESM dist/inspector/index.js 37.49 KB
194
193
  ESM dist/inspector/chunk-ORKZSKZF.js 128.83 KB
195
- ESM dist/inspector/index.js.map 63.80 KB
194
+ ESM dist/inspector/index.js 37.49 KB
196
195
  ESM dist/inspector/standalone.js.map 20.11 KB
196
+ ESM dist/inspector/index.js.map 63.80 KB
197
197
  ESM dist/inspector/chunk-ORKZSKZF.js.map 222.34 KB
198
- ESM ⚡️ Build success in 89ms
199
- ESM dist/index.js 32.18 KB
200
- ESM dist/testing.js 8.56 KB
201
- ESM dist/tools/ssr.js 156.00 B
198
+ ESM ⚡️ Build success in 127ms
202
199
  ESM dist/chunk-K4D7IMFM.js 690.00 B
203
200
  ESM dist/chunk-ZQWSQH6L.js 945.00 B
204
- ESM dist/chunk-JYPPYCEU.js 264.54 KB
205
- ESM dist/index.js.map 65.34 KB
201
+ ESM dist/testing.js 8.56 KB
202
+ ESM dist/index.js 32.38 KB
203
+ ESM dist/tools/ssr.js 156.00 B
204
+ ESM dist/chunk-3BV3JUMV.js 279.58 KB
205
+ ESM dist/chunk-ZQWSQH6L.js.map 71.00 B
206
+ ESM dist/chunk-K4D7IMFM.js.map 1.10 KB
206
207
  ESM dist/testing.js.map 16.22 KB
208
+ ESM dist/index.js.map 66.14 KB
207
209
  ESM dist/tools/ssr.js.map 71.00 B
208
- ESM dist/chunk-K4D7IMFM.js.map 1.10 KB
209
- ESM dist/chunk-ZQWSQH6L.js.map 71.00 B
210
- ESM dist/chunk-JYPPYCEU.js.map 609.16 KB
211
- ESM ⚡️ Build success in 109ms
210
+ ESM dist/chunk-3BV3JUMV.js.map 645.58 KB
211
+ ESM ⚡️ Build success in 151ms
212
212
  ESM dist/inspector/register-custom-element.js 305.00 B
213
213
  ESM dist/inspector/register-custom-element.js.map 445.00 B
214
214
  ESM dist/inspector/custom-element-7G7IZVLL.js 1.64 MB
215
215
  ESM dist/inspector/custom-element-7G7IZVLL.js.map 2.52 MB
216
- ESM ⚡️ Build success in 139ms
216
+ ESM ⚡️ Build success in 190ms
217
217
 
218
- > jazz-tools@0.20.15 types /home/runner/_work/jazz/jazz/packages/jazz-tools
218
+ > jazz-tools@0.20.17 types /home/runner/_work/jazz/jazz/packages/jazz-tools
219
219
  > tsc --outDir dist
220
220
 
221
221
 
222
- > jazz-tools@0.20.15 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
222
+ > jazz-tools@0.20.17 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.15 build:better-auth-svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
227
+ > jazz-tools@0.20.17 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,35 @@
1
1
  # jazz-tools
2
2
 
3
+ ## 0.20.17
4
+
5
+ ### Patch Changes
6
+
7
+ - d26dccc: Fix MCP docs server failing to use SQLite/FTS5 backend by preventing bundlers from stripping the `node:` prefix on `node:sqlite` imports.
8
+ - 6572f1f: Add new co.snapshotRef() CoValue that abstracts away cursor-based snapshotting and allows snapshots of values to be seamlessly referenced
9
+ - 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.
10
+ - cojson@0.20.17
11
+ - cojson-storage-indexeddb@0.20.17
12
+ - cojson-transport-ws@0.20.17
13
+
14
+ ## 0.20.16
15
+
16
+ ### Patch Changes
17
+
18
+ - f45aca2: Add cursor-based time travel for CoValues
19
+
20
+ Introduces the ability to create cursors (frontier snapshots) on loaded CoValues and later reload them at that exact point in time. Cursors encode the full frontier state of a CoValue and its resolved children, enabling read-only historical views.
21
+ - Add `createCursor()` and `cursor` getter to CoValue instances
22
+ - Support loading CoValues by cursor via `load()` and `ensureLoaded()`
23
+ - Add `useCurrentCursor` option to capture the current state as a cursor
24
+ - Prevent mutations on cursor-loaded (time-travel) CoValues
25
+ - Validate cursor root ID and resolve query compatibility (subset check)
26
+
27
+ - Updated dependencies [8b40b3a]
28
+ - Updated dependencies [f45aca2]
29
+ - cojson@0.20.16
30
+ - cojson-storage-indexeddb@0.20.16
31
+ - cojson-transport-ws@0.20.16
32
+
3
33
  ## 0.20.15
4
34
 
5
35
  ### Patch Changes
@@ -52,7 +52,7 @@ declare const Svelte: import("svelte").Component<{
52
52
  email: string;
53
53
  emailVerified: boolean;
54
54
  name: string;
55
- image?: string | null | undefined;
55
+ image?: string | null | undefined | undefined;
56
56
  };
57
57
  }>, {
58
58
  code?: string | undefined;
@@ -94,7 +94,7 @@ declare const Svelte: import("svelte").Component<{
94
94
  email: string;
95
95
  emailVerified: boolean;
96
96
  name: string;
97
- image?: string | null | undefined;
97
+ image?: string | null | undefined | undefined;
98
98
  };
99
99
  } | {
100
100
  token: string;
@@ -105,7 +105,7 @@ declare const Svelte: import("svelte").Component<{
105
105
  email: string;
106
106
  emailVerified: boolean;
107
107
  name: string;
108
- image?: string | null | undefined;
108
+ image?: string | null | undefined | undefined;
109
109
  };
110
110
  }>, {
111
111
  code?: string | undefined;
@@ -137,7 +137,7 @@ declare const Svelte: import("svelte").Component<{
137
137
  email: string;
138
138
  emailVerified: boolean;
139
139
  name: string;
140
- image?: string | null | undefined;
140
+ image?: string | null | undefined | undefined;
141
141
  };
142
142
  }, {
143
143
  code?: string | undefined;
@@ -308,8 +308,8 @@ declare const Svelte: import("svelte").Component<{
308
308
  userId: string;
309
309
  expiresAt: Date;
310
310
  token: string;
311
- ipAddress?: string | null | undefined;
312
- userAgent?: string | null | undefined;
311
+ ipAddress?: string | null | undefined | undefined;
312
+ userAgent?: string | null | undefined | undefined;
313
313
  }>[], {
314
314
  code?: string | undefined;
315
315
  message?: string | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/better-auth/database-adapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAY9B,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,6BAA6B,WAChC,iBAAiB,KACxB,UAAU,CAAC,OAAO,oBAAoB,CAqKrC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/better-auth/database-adapter/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,KAAK,uBAAuB,EAC7B,MAAM,sBAAsB,CAAC;AAY9B,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,6BAA6B,GACxC,QAAQ,iBAAiB,KACxB,UAAU,CAAC,OAAO,oBAAoB,CAqKrC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync-utils.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/tests/sync-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMnC,eAAO,MAAM,eAAe,UAAiB,MAAM;;;;;;EAsFlD,CAAC;AAEF,eAAO,MAAM,mBAAmB,8BAG7B;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;;;EAyBA,CAAC"}
1
+ {"version":3,"file":"sync-utils.d.ts","sourceRoot":"","sources":["../../../../src/better-auth/database-adapter/tests/sync-utils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAMnC,eAAO,MAAM,eAAe,GAAU,OAAO,MAAM;;;;;;EAsFlD,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAU,2BAGvC;IACD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;;;EAyBA,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"PasskeyAuth.d.ts","sourceRoot":"","sources":["../../../src/browser/auth/PasskeyAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiC,MAAM,QAAQ,CAAC;AACvE,OAAO,EAEL,iBAAiB,EACjB,2BAA2B,EAE5B,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB;IAE3B,SAAS,CAAC,MAAM,EAAE,cAAc;IAChC,SAAS,CAAC,YAAY,EAAE,2BAA2B;IACnD,SAAS,CAAC,iBAAiB,EAAE,iBAAiB;IACvC,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,MAAM;gBAJhB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,2BAA2B,EACzC,iBAAiB,EAAE,iBAAiB,EACvC,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAiC;IAGvD,MAAM,CAAC,QAAQ,CAAC,EAAE,aAAa;IAE/B,KAAK,sBAqCH;IAEF,MAAM,aAAoB,MAAM,mBA+B9B;YAEY,wBAAwB;YAoDxB,qBAAqB;CAoBpC"}
1
+ {"version":3,"file":"PasskeyAuth.d.ts","sourceRoot":"","sources":["../../../src/browser/auth/PasskeyAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAiC,MAAM,QAAQ,CAAC;AACvE,OAAO,EAEL,iBAAiB,EACjB,2BAA2B,EAE5B,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;GAUG;AACH,qBAAa,kBAAkB;IAE3B,SAAS,CAAC,MAAM,EAAE,cAAc;IAChC,SAAS,CAAC,YAAY,EAAE,2BAA2B;IACnD,SAAS,CAAC,iBAAiB,EAAE,iBAAiB;IACvC,OAAO,EAAE,MAAM;IACf,WAAW,EAAE,MAAM;gBAJhB,MAAM,EAAE,cAAc,EACtB,YAAY,EAAE,2BAA2B,EACzC,iBAAiB,EAAE,iBAAiB,EACvC,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,MAAiC;IAGvD,MAAM,CAAC,QAAQ,CAAC,EAAE,aAAa;IAE/B,KAAK,sBAqCH;IAEF,MAAM,GAAU,UAAU,MAAM,mBA+B9B;YAEY,wBAAwB;YAoDxB,qBAAqB;CAoBpC"}
@@ -1,5 +1,5 @@
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;
@@ -32,15 +32,4 @@ export declare function createJazzBrowserContext<S extends (AccountClass<Account
32
32
  }>;
33
33
  /** @category Auth Providers */
34
34
  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
35
  //# 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;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"}
@@ -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";
@@ -551,7 +550,7 @@ function createInviteLink(value, role, {
551
550
  baseURL = window.location.href.replace(/#.*$/, ""),
552
551
  valueHint
553
552
  } = {}) {
554
- return baseCreateInviteLink(value, role, baseURL, valueHint);
553
+ return baseCreateInviteLink(value, role, { baseURL, valueHint });
555
554
  }
556
555
  async function consumeInviteLinkFromWindowLocation({
557
556
  as,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/browser/index.ts","../../src/browser/utils/export-account-inspector.ts","../../src/browser/auth/PasskeyAuth.ts","../../src/browser/createBrowserContext.ts","../../src/browser/provideBrowserLockSession/index.ts","../../src/browser/provideBrowserLockSession/SessionIDStorage.ts","../../src/browser/provideBrowserLockSession/BrowserSessionProvider.ts","../../src/browser/BrowserContextManager.ts","../../src/browser/auth/LocalStorageKVStore.ts"],"sourcesContent":["import { AccountRole } from \"cojson\";\nimport {\n Account,\n CoValue,\n CoValueClassOrSchema,\n InviteSecret,\n createInviteLink as baseCreateInviteLink,\n consumeInviteLink,\n} from \"jazz-tools\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\nexport { BrowserPasskeyAuth } from \"./auth/PasskeyAuth.js\";\n\nsetupInspector();\n\nexport * from \"./createBrowserContext.js\";\nexport * from \"./BrowserContextManager.js\";\n\nexport { LocalStorageKVStore } from \"./auth/LocalStorageKVStore.js\";\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: AccountRole,\n // default to same address as window.location, but without hash\n {\n baseURL = window.location.href.replace(/#.*$/, \"\"),\n valueHint,\n }: { baseURL?: string; valueHint?: string } = {},\n): string {\n return baseCreateInviteLink(value, role, baseURL, valueHint);\n}\n\n/** @category Invite Links */\nexport { parseInviteLink } from \"jazz-tools\";\n\n/** @category Invite Links */\nexport async function consumeInviteLinkFromWindowLocation<\n S extends CoValueClassOrSchema,\n>({\n as,\n forValueHint,\n invitedObjectSchema,\n}: {\n as?: Account;\n forValueHint?: string;\n invitedObjectSchema: S;\n}): Promise<\n | {\n valueID: string;\n valueHint?: string;\n inviteSecret: InviteSecret;\n }\n | undefined\n> {\n const result = await consumeInviteLink({\n inviteURL: window.location.href,\n as,\n forValueHint,\n invitedObjectSchema,\n });\n\n if (result) {\n window.history.replaceState(\n {},\n \"\",\n window.location.href.replace(/#.*$/, \"\"),\n );\n }\n\n return result;\n}\n","import { AuthSecretStorage } from \"jazz-tools\";\n\nasync function exportAccountToInspector() {\n const authSecretStorage = new AuthSecretStorage();\n const localStorageData = await authSecretStorage.get();\n\n if (!localStorageData) {\n console.error(\"No account data found in localStorage\");\n return;\n }\n\n const encodedAccountSecret = btoa(localStorageData.accountSecret);\n window.open(\n new URL(\n `#/import/${localStorageData?.accountID}/${encodedAccountSecret}`,\n \"https://inspector.jazz.tools\",\n ).toString(),\n \"_blank\",\n );\n}\n\nfunction listenForCmdJ() {\n if (typeof window === \"undefined\") return;\n\n const cb = (e: any) => {\n if (e.metaKey && e.key === \"j\") {\n if (\n confirm(\n \"Are you sure you want to inspect your account using inspector.jazz.tools? This lets anyone with the secret inspector URL read your data and impersonate you.\",\n )\n ) {\n exportAccountToInspector();\n }\n }\n };\n\n window.addEventListener(\"keydown\", cb);\n\n return () => {\n window.removeEventListener(\"keydown\", cb);\n };\n}\n\n/**\n * Automatically sets up the Cmd+J listener if 'allowJazzInspector' is present in the URL\n * @returns A cleanup function if the listener was set up, undefined otherwise\n */\nexport function setupInspector() {\n if (typeof window === \"undefined\") return;\n\n const url = new URL(window.location.href);\n if (\n url.hash.includes(\"allowJazzInspector\") ||\n process.env.NODE_ENV === \"development\"\n ) {\n return listenForCmdJ();\n }\n}\n","import { CryptoProvider, RawAccountID, cojsonInternals } from \"cojson\";\nimport {\n Account,\n AuthSecretStorage,\n AuthenticateAccountFunction,\n ID,\n} from \"jazz-tools\";\n\n/**\n * `BrowserPasskeyAuth` provides a `JazzAuth` object for passkey authentication.\n *\n * ```ts\n * import { BrowserPasskeyAuth } from \"jazz-tools/browser\";\n *\n * const auth = new BrowserPasskeyAuth(driver, appName);\n * ```\n *\n * @category Auth Providers\n */\nexport class BrowserPasskeyAuth {\n constructor(\n protected crypto: CryptoProvider,\n protected authenticate: AuthenticateAccountFunction,\n protected authSecretStorage: AuthSecretStorage,\n public appName: string,\n public appHostname: string = window.location.hostname,\n ) {}\n\n static readonly id = \"passkey\";\n\n logIn = async () => {\n const { crypto, authenticate } = this;\n\n const webAuthNCredential = await this.getPasskeyCredentials();\n\n if (!webAuthNCredential) {\n return;\n }\n\n const webAuthNCredentialPayload = new Uint8Array(\n webAuthNCredential.response.userHandle,\n );\n const accountSecretSeed = webAuthNCredentialPayload.slice(\n 0,\n cojsonInternals.secretSeedLength,\n );\n\n const secret = crypto.agentSecretFromSecretSeed(accountSecretSeed);\n\n const accountID = cojsonInternals.rawCoIDfromBytes(\n webAuthNCredentialPayload.slice(\n cojsonInternals.secretSeedLength,\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n ),\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret: secret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed: accountSecretSeed,\n accountSecret: secret,\n provider: \"passkey\",\n });\n };\n\n signUp = async (username: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials?.secretSeed) {\n throw new Error(\n \"Not enough credentials to register the account with passkey\",\n );\n }\n\n await this.createPasskeyCredentials({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n username,\n });\n\n const currentAccount = await Account.getMe().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n if (username.trim().length !== 0) {\n currentAccount.profile.$jazz.set(\"name\", username);\n }\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passkey\",\n });\n };\n\n private async createPasskeyCredentials({\n accountID,\n secretSeed,\n username,\n }: {\n accountID: ID<Account>;\n secretSeed: Uint8Array;\n username: string;\n }) {\n const webAuthNCredentialPayload = new Uint8Array(\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n );\n\n webAuthNCredentialPayload.set(secretSeed);\n webAuthNCredentialPayload.set(\n cojsonInternals.rawCoIDtoBytes(accountID as unknown as RawAccountID),\n cojsonInternals.secretSeedLength,\n );\n\n try {\n await navigator.credentials.create({\n publicKey: {\n challenge: new Uint8Array(this.crypto.randomBytes(20)),\n rp: {\n name: this.appName,\n id: this.appHostname,\n },\n user: {\n id: webAuthNCredentialPayload,\n name: username + ` (${new Date().toLocaleString()})`,\n displayName: username,\n },\n pubKeyCredParams: [\n { alg: -7, type: \"public-key\" },\n { alg: -8, type: \"public-key\" },\n { alg: -37, type: \"public-key\" },\n { alg: -257, type: \"public-key\" },\n ],\n authenticatorSelection: {\n requireResidentKey: true,\n residentKey: \"required\",\n userVerification: \"preferred\",\n },\n timeout: 60000,\n attestation: \"direct\",\n },\n });\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n\n private async getPasskeyCredentials() {\n try {\n const value = await navigator.credentials.get({\n publicKey: {\n challenge: new Uint8Array(this.crypto.randomBytes(20)),\n rpId: this.appHostname,\n allowCredentials: [],\n timeout: 60000,\n userVerification: \"preferred\",\n },\n mediation: \"optional\",\n });\n\n return value as\n | (Credential & { response: { userHandle: ArrayBuffer } })\n | null;\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n}\n","import { LocalNode, Peer } from \"cojson\";\nimport { getIndexedDBStorage } from \"cojson-storage-indexeddb\";\nimport { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport { WasmCrypto } from \"cojson/crypto/WasmCrypto\";\nimport {\n Account,\n AccountClass,\n AgentID,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n CryptoProvider,\n ID,\n InviteSecret,\n NewAccountProps,\n SessionID,\n SyncConfig,\n cojsonInternals,\n createAnonymousJazzContext,\n} from \"jazz-tools\";\nimport { createJazzContext } from \"jazz-tools\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\nimport { getBrowserLockSessionProvider } from \"./provideBrowserLockSession/index.js\";\n\nsetupInspector();\n\nexport type BaseBrowserContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: \"indexedDB\";\n crypto?: CryptoProvider;\n authSecretStorage: AuthSecretStorage;\n};\n\nclass BrowserWebSocketPeerWithReconnection extends WebSocketPeerWithReconnection {\n onNetworkChange(callback: (connected: boolean) => void): () => void {\n const handler = () => callback(navigator.onLine);\n window.addEventListener(\"online\", handler);\n window.addEventListener(\"offline\", handler);\n\n return () => {\n window.removeEventListener(\"online\", handler);\n window.removeEventListener(\"offline\", handler);\n };\n }\n}\n\nasync function setupPeers(options: BaseBrowserContextOptions) {\n const crypto = options.crypto || (await WasmCrypto.create());\n let node: LocalNode | undefined = undefined;\n\n const peers: Peer[] = [];\n\n const storage = await getIndexedDBStorage();\n\n if (options.sync.when === \"never\") {\n return {\n addConnectionListener: () => () => {},\n connected: () => false,\n toggleNetwork: () => {},\n peers,\n syncWhen: options.sync.when,\n storage,\n setNode: () => {},\n crypto,\n };\n }\n\n const wsPeer = new BrowserWebSocketPeerWithReconnection({\n peer: options.sync.peer,\n reconnectionTimeout: options.reconnectionTimeout,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peers.push(peer);\n }\n },\n removePeer: (peer) => {\n peers.splice(peers.indexOf(peer), 1);\n },\n });\n\n function toggleNetwork(enabled: boolean) {\n if (enabled) {\n wsPeer.enable();\n } else {\n wsPeer.disable();\n }\n }\n\n function setNode(value: LocalNode) {\n node = value;\n }\n\n if (options.sync.when === \"always\" || !options.sync.when) {\n toggleNetwork(true);\n }\n\n return {\n toggleNetwork,\n addConnectionListener(listener: (connected: boolean) => void) {\n wsPeer.subscribe(listener);\n\n return () => {\n wsPeer.unsubscribe(listener);\n };\n },\n connected() {\n return wsPeer.connected;\n },\n peers,\n syncWhen: options.sync.when,\n storage,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzBrowserGuestContext(\n options: BaseBrowserContextOptions,\n) {\n const {\n toggleNetwork,\n peers,\n syncWhen,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peers,\n syncWhen,\n storage,\n });\n\n setNode(context.agent.node);\n\n options.authSecretStorage.emitUpdate(null);\n\n return {\n guest: context.agent,\n node: context.agent.node,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n addConnectionListener,\n connected,\n };\n}\n\nexport type BrowserContextOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n credentials?: AuthCredentials;\n AccountSchema?: S;\n newAccountProps?: NewAccountProps;\n defaultProfileName?: string;\n} & BaseBrowserContextOptions;\n\nexport async function createJazzBrowserContext<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: BrowserContextOptions<S>) {\n const {\n toggleNetwork,\n peers,\n syncWhen,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n let unsubscribeAuthUpdate = () => {};\n\n if (options.sync.when === \"signedUp\") {\n const authSecretStorage = options.authSecretStorage;\n const credentials = options.credentials ?? (await authSecretStorage.get());\n\n function handleAuthUpdate(isAuthenticated: boolean) {\n if (isAuthenticated) {\n toggleNetwork(true);\n } else {\n toggleNetwork(false);\n }\n }\n\n unsubscribeAuthUpdate = authSecretStorage.onUpdate(handleAuthUpdate);\n handleAuthUpdate(authSecretStorage.getIsAuthenticated(credentials));\n }\n\n const context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peers,\n syncWhen,\n storage,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: getBrowserLockSessionProvider(),\n authSecretStorage: options.authSecretStorage,\n });\n\n setNode(context.node);\n\n return {\n me: context.account,\n node: context.node,\n authSecretStorage: context.authSecretStorage,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n unsubscribeAuthUpdate();\n context.done();\n },\n logOut: () => {\n unsubscribeAuthUpdate();\n return context.logOut();\n },\n addConnectionListener,\n connected,\n };\n}\n\n/** @category Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n // default to same address as window.location, but without hash\n {\n baseURL = window.location.href.replace(/#.*$/, \"\"),\n valueHint,\n }: { baseURL?: string; valueHint?: string } = {},\n): string {\n const coValueCore = value.$jazz.raw.core;\n let currentCoValue = coValueCore;\n\n while (currentCoValue.verified.header.ruleset.type === \"ownedByGroup\") {\n currentCoValue = currentCoValue.getGroup().core;\n }\n\n const { ruleset, meta } = currentCoValue.verified.header;\n\n if (ruleset.type !== \"group\" || meta?.type === \"account\") {\n throw new Error(\"Can't create invite link for object without group\");\n }\n\n const group = cojsonInternals.expectGroup(currentCoValue.getCurrentContent());\n const inviteSecret = group.createInvite(role);\n\n return `${baseURL}#/invite/${valueHint ? valueHint + \"/\" : \"\"}${\n value.$jazz.id\n }/${inviteSecret}`;\n}\n\n/** @category Invite Links */\nexport function parseInviteLink<C extends CoValue>(\n inviteURL: string,\n):\n | {\n valueID: ID<C>;\n valueHint?: string;\n inviteSecret: InviteSecret;\n }\n | undefined {\n const url = new URL(inviteURL);\n const parts = url.hash.split(\"/\");\n\n let valueHint: string | undefined;\n let valueID: ID<C> | undefined;\n let inviteSecret: InviteSecret | undefined;\n\n if (parts[0] === \"#\" && parts[1] === \"invite\") {\n if (parts.length === 5) {\n valueHint = parts[2];\n valueID = parts[3] as ID<C>;\n inviteSecret = parts[4] as InviteSecret;\n } else if (parts.length === 4) {\n valueID = parts[2] as ID<C>;\n inviteSecret = parts[3] as InviteSecret;\n }\n\n if (!valueID || !inviteSecret) {\n return undefined;\n }\n return { valueID, inviteSecret, valueHint };\n }\n}\n","import { MockSessionProvider } from \"jazz-tools\";\nimport { BrowserSessionProvider } from \"./BrowserSessionProvider\";\n\nexport function getBrowserLockSessionProvider() {\n if (typeof navigator === \"undefined\" || !navigator.locks?.request) {\n // Fallback to random session ID for each tab session\n return new MockSessionProvider();\n }\n\n return new BrowserSessionProvider();\n}\n","import { SessionID } from \"cojson\";\n\nfunction getSessionKey(accountID: string, index: number) {\n return accountID + \"_\" + index;\n}\n\nexport class SessionIDStorage {\n static getSessionsList(accountID: string) {\n let sessionsList: SessionID[] = [];\n let i = 0;\n let lastSessionID: SessionID | null;\n\n do {\n lastSessionID = localStorage.getItem(\n getSessionKey(accountID, i),\n ) as SessionID | null;\n if (lastSessionID) {\n sessionsList.push(lastSessionID);\n }\n i++;\n } while (lastSessionID);\n\n return sessionsList;\n }\n\n static storeSessionID(\n accountID: string,\n sessionID: SessionID,\n index: number,\n ) {\n localStorage.setItem(getSessionKey(accountID, index), sessionID);\n }\n}\n","import { AgentID, CryptoProvider, RawAccountID, SessionID } from \"cojson\";\nimport { ID, Account, SessionProvider } from \"jazz-tools\";\nimport { SessionIDStorage } from \"./SessionIDStorage\";\n\nexport class BrowserSessionProvider implements SessionProvider {\n async acquireSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n ): Promise<{ sessionID: SessionID; sessionDone: () => void }> {\n const { sessionPromise, resolveSession } = createSessionLockPromise();\n\n // Get the list of sessions for the account, to try to acquire an existing session\n const sessionsList = SessionIDStorage.getSessionsList(accountID);\n\n for (const [index, sessionID] of sessionsList.entries()) {\n const sessionAcquired = await tryToAcquireSession(\n sessionID,\n sessionPromise,\n );\n\n if (sessionAcquired) {\n console.log(\"Using existing session\", sessionID, \"at index\", index); // This log is used in the e2e tests to verify the correctness of the feature\n return {\n sessionID,\n sessionDone: resolveSession,\n };\n }\n }\n\n const newSessionID = crypto.newRandomSessionID(\n accountID as RawAccountID | AgentID,\n );\n\n // Acquire exclusively the session to store the new session ID for reuse in future sessions\n await lockAndStoreSession(accountID, newSessionID, sessionPromise);\n\n console.log(\"Created new session\", newSessionID); // This log is used in the e2e tests to verify the correctness of the feature\n\n return {\n sessionID: newSessionID,\n sessionDone: resolveSession,\n };\n }\n\n async persistSession(\n accountID: ID<Account> | AgentID,\n sessionID: SessionID,\n ): Promise<{ sessionDone: () => void }> {\n const { sessionPromise, resolveSession } = createSessionLockPromise();\n\n // Store the session id for future use and lock it until the session is done\n await lockAndStoreSession(accountID, sessionID, sessionPromise);\n\n console.log(\"Stored new session\", sessionID);\n\n return { sessionDone: resolveSession };\n }\n}\n\nasync function lockAndStoreSession(\n accountID: ID<Account> | AgentID,\n sessionID: SessionID,\n sessionPromise: Promise<void>,\n) {\n const sessionAcquired = await tryToAcquireSession(sessionID, sessionPromise);\n\n if (!sessionAcquired) {\n // This should never happen because the session has been randomly generated\n throw new Error(\"Couldn't get lock on new session\");\n }\n\n // We don't need to wait for this to finish, we only need to acquire the lock on the new session\n storeSessionID(accountID, sessionID);\n}\n\nfunction tryToAcquireSession(\n sessionID: SessionID,\n sessionDonePromise: Promise<void>,\n) {\n return new Promise<boolean>((resolve) => {\n // Acquire exclusively the session if available\n navigator.locks.request(\n `load_session_${sessionID}`,\n { mode: \"exclusive\", ifAvailable: true },\n async (lock) => {\n if (!lock) {\n resolve(false); // Session already in use\n return;\n }\n\n resolve(true); // Session is available\n\n // Return the promise to lock the session until sessionDone is called\n return sessionDonePromise;\n },\n );\n });\n}\n\nfunction storeSessionID(\n accountID: ID<Account> | AgentID,\n sessionID: SessionID,\n) {\n return navigator.locks.request(\n `store_session_${accountID}`,\n { mode: \"exclusive\" },\n async (lock) => {\n if (!lock) {\n console.error(\"Couldn't get lock to store session ID\", accountID);\n }\n\n const sessionsList = SessionIDStorage.getSessionsList(accountID);\n SessionIDStorage.storeSessionID(\n accountID,\n sessionID,\n sessionsList.length,\n );\n },\n );\n}\n\nfunction createSessionLockPromise() {\n let resolveSession: () => void;\n const sessionPromise = new Promise<void>((resolve) => {\n resolveSession = resolve;\n });\n\n return {\n sessionPromise,\n resolveSession: resolveSession!,\n };\n}\n","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InMemoryKVStore,\n InstanceOfSchema,\n JazzContextManager,\n SyncConfig,\n} from \"jazz-tools\";\nimport { JazzContextManagerAuthProps } from \"jazz-tools\";\nimport { LocalStorageKVStore } from \"./auth/LocalStorageKVStore.js\";\nimport {\n BaseBrowserContextOptions,\n createJazzBrowserContext,\n createJazzBrowserGuestContext,\n} from \"./createBrowserContext.js\";\n\nexport type JazzContextManagerProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n guestMode?: boolean;\n sync: SyncConfig;\n onLogOut?: () => void;\n logOutReplacement?: () => void;\n onAnonymousAccountDiscarded?: (\n anonymousAccount: InstanceOfSchema<S>,\n ) => Promise<void>;\n storage?: BaseBrowserContextOptions[\"storage\"];\n AccountSchema?: S;\n defaultProfileName?: string;\n};\n\nexport class JazzBrowserContextManager<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {\n // TODO: When the storage changes, if the user is changed, update the context\n getKvStore() {\n if (typeof window === \"undefined\") {\n // To handle running in SSR\n return new InMemoryKVStore();\n } else {\n return new LocalStorageKVStore();\n }\n }\n\n async getNewContext(\n props: JazzContextManagerProps<S>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (props.guestMode) {\n return createJazzBrowserGuestContext({\n sync: props.sync,\n storage: props.storage,\n authSecretStorage: this.authSecretStorage,\n });\n } else {\n return createJazzBrowserContext<S>({\n sync: props.sync,\n storage: props.storage,\n AccountSchema: props.AccountSchema,\n credentials: authProps?.credentials,\n newAccountProps: authProps?.newAccountProps,\n defaultProfileName: props.defaultProfileName,\n authSecretStorage: this.authSecretStorage,\n });\n }\n }\n\n propsChanged(props: JazzContextManagerProps<S>) {\n if (!this.props) {\n return true;\n }\n\n return (\n this.props.sync.when !== props.sync.when ||\n this.props.sync.peer !== props.sync.peer ||\n this.props.guestMode !== props.guestMode\n );\n }\n}\n","import { KvStore } from \"jazz-tools\";\n\nexport class LocalStorageKVStore implements KvStore {\n constructor() {}\n\n async get(key: string) {\n return localStorage.getItem(key);\n }\n\n async set(key: string, value: string) {\n localStorage.setItem(key, value);\n }\n\n async delete(key: string) {\n localStorage.removeItem(key);\n }\n\n async clearAll() {\n localStorage.clear();\n }\n}\n"],"mappings":"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","names":["cojsonInternals","handleAuthUpdate"]}
1
+ {"version":3,"sources":["../../src/browser/index.ts","../../src/browser/utils/export-account-inspector.ts","../../src/browser/auth/PasskeyAuth.ts","../../src/browser/createBrowserContext.ts","../../src/browser/provideBrowserLockSession/index.ts","../../src/browser/provideBrowserLockSession/SessionIDStorage.ts","../../src/browser/provideBrowserLockSession/BrowserSessionProvider.ts","../../src/browser/BrowserContextManager.ts","../../src/browser/auth/LocalStorageKVStore.ts"],"sourcesContent":["import { AccountRole } from \"cojson\";\nimport {\n Account,\n CoValue,\n CoValueClassOrSchema,\n InviteSecret,\n createInviteLink as baseCreateInviteLink,\n consumeInviteLink,\n} from \"jazz-tools\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\nexport { BrowserPasskeyAuth } from \"./auth/PasskeyAuth.js\";\n\nsetupInspector();\n\nexport * from \"./createBrowserContext.js\";\nexport * from \"./BrowserContextManager.js\";\n\nexport { LocalStorageKVStore } from \"./auth/LocalStorageKVStore.js\";\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: AccountRole,\n // default to same address as window.location, but without hash\n {\n baseURL = window.location.href.replace(/#.*$/, \"\"),\n valueHint,\n }: { baseURL?: string; valueHint?: string } = {},\n): string {\n return baseCreateInviteLink(value, role, { baseURL, valueHint });\n}\n\n/** @category Invite Links */\nexport { parseInviteLink } from \"jazz-tools\";\n\n/** @category Invite Links */\nexport async function consumeInviteLinkFromWindowLocation<\n S extends CoValueClassOrSchema,\n>({\n as,\n forValueHint,\n invitedObjectSchema,\n}: {\n as?: Account;\n forValueHint?: string;\n invitedObjectSchema: S;\n}): Promise<\n | {\n valueID: string;\n valueHint?: string;\n inviteSecret: InviteSecret;\n }\n | undefined\n> {\n const result = await consumeInviteLink({\n inviteURL: window.location.href,\n as,\n forValueHint,\n invitedObjectSchema,\n });\n\n if (result) {\n window.history.replaceState(\n {},\n \"\",\n window.location.href.replace(/#.*$/, \"\"),\n );\n }\n\n return result;\n}\n","import { AuthSecretStorage } from \"jazz-tools\";\n\nasync function exportAccountToInspector() {\n const authSecretStorage = new AuthSecretStorage();\n const localStorageData = await authSecretStorage.get();\n\n if (!localStorageData) {\n console.error(\"No account data found in localStorage\");\n return;\n }\n\n const encodedAccountSecret = btoa(localStorageData.accountSecret);\n window.open(\n new URL(\n `#/import/${localStorageData?.accountID}/${encodedAccountSecret}`,\n \"https://inspector.jazz.tools\",\n ).toString(),\n \"_blank\",\n );\n}\n\nfunction listenForCmdJ() {\n if (typeof window === \"undefined\") return;\n\n const cb = (e: any) => {\n if (e.metaKey && e.key === \"j\") {\n if (\n confirm(\n \"Are you sure you want to inspect your account using inspector.jazz.tools? This lets anyone with the secret inspector URL read your data and impersonate you.\",\n )\n ) {\n exportAccountToInspector();\n }\n }\n };\n\n window.addEventListener(\"keydown\", cb);\n\n return () => {\n window.removeEventListener(\"keydown\", cb);\n };\n}\n\n/**\n * Automatically sets up the Cmd+J listener if 'allowJazzInspector' is present in the URL\n * @returns A cleanup function if the listener was set up, undefined otherwise\n */\nexport function setupInspector() {\n if (typeof window === \"undefined\") return;\n\n const url = new URL(window.location.href);\n if (\n url.hash.includes(\"allowJazzInspector\") ||\n process.env.NODE_ENV === \"development\"\n ) {\n return listenForCmdJ();\n }\n}\n","import { CryptoProvider, RawAccountID, cojsonInternals } from \"cojson\";\nimport {\n Account,\n AuthSecretStorage,\n AuthenticateAccountFunction,\n ID,\n} from \"jazz-tools\";\n\n/**\n * `BrowserPasskeyAuth` provides a `JazzAuth` object for passkey authentication.\n *\n * ```ts\n * import { BrowserPasskeyAuth } from \"jazz-tools/browser\";\n *\n * const auth = new BrowserPasskeyAuth(driver, appName);\n * ```\n *\n * @category Auth Providers\n */\nexport class BrowserPasskeyAuth {\n constructor(\n protected crypto: CryptoProvider,\n protected authenticate: AuthenticateAccountFunction,\n protected authSecretStorage: AuthSecretStorage,\n public appName: string,\n public appHostname: string = window.location.hostname,\n ) {}\n\n static readonly id = \"passkey\";\n\n logIn = async () => {\n const { crypto, authenticate } = this;\n\n const webAuthNCredential = await this.getPasskeyCredentials();\n\n if (!webAuthNCredential) {\n return;\n }\n\n const webAuthNCredentialPayload = new Uint8Array(\n webAuthNCredential.response.userHandle,\n );\n const accountSecretSeed = webAuthNCredentialPayload.slice(\n 0,\n cojsonInternals.secretSeedLength,\n );\n\n const secret = crypto.agentSecretFromSecretSeed(accountSecretSeed);\n\n const accountID = cojsonInternals.rawCoIDfromBytes(\n webAuthNCredentialPayload.slice(\n cojsonInternals.secretSeedLength,\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n ),\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret: secret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed: accountSecretSeed,\n accountSecret: secret,\n provider: \"passkey\",\n });\n };\n\n signUp = async (username: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials?.secretSeed) {\n throw new Error(\n \"Not enough credentials to register the account with passkey\",\n );\n }\n\n await this.createPasskeyCredentials({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n username,\n });\n\n const currentAccount = await Account.getMe().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n if (username.trim().length !== 0) {\n currentAccount.profile.$jazz.set(\"name\", username);\n }\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passkey\",\n });\n };\n\n private async createPasskeyCredentials({\n accountID,\n secretSeed,\n username,\n }: {\n accountID: ID<Account>;\n secretSeed: Uint8Array;\n username: string;\n }) {\n const webAuthNCredentialPayload = new Uint8Array(\n cojsonInternals.secretSeedLength + cojsonInternals.shortHashLength,\n );\n\n webAuthNCredentialPayload.set(secretSeed);\n webAuthNCredentialPayload.set(\n cojsonInternals.rawCoIDtoBytes(accountID as unknown as RawAccountID),\n cojsonInternals.secretSeedLength,\n );\n\n try {\n await navigator.credentials.create({\n publicKey: {\n challenge: new Uint8Array(this.crypto.randomBytes(20)),\n rp: {\n name: this.appName,\n id: this.appHostname,\n },\n user: {\n id: webAuthNCredentialPayload,\n name: username + ` (${new Date().toLocaleString()})`,\n displayName: username,\n },\n pubKeyCredParams: [\n { alg: -7, type: \"public-key\" },\n { alg: -8, type: \"public-key\" },\n { alg: -37, type: \"public-key\" },\n { alg: -257, type: \"public-key\" },\n ],\n authenticatorSelection: {\n requireResidentKey: true,\n residentKey: \"required\",\n userVerification: \"preferred\",\n },\n timeout: 60000,\n attestation: \"direct\",\n },\n });\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n\n private async getPasskeyCredentials() {\n try {\n const value = await navigator.credentials.get({\n publicKey: {\n challenge: new Uint8Array(this.crypto.randomBytes(20)),\n rpId: this.appHostname,\n allowCredentials: [],\n timeout: 60000,\n userVerification: \"preferred\",\n },\n mediation: \"optional\",\n });\n\n return value as\n | (Credential & { response: { userHandle: ArrayBuffer } })\n | null;\n } catch (error) {\n throw new Error(\"Passkey creation aborted\", { cause: error });\n }\n }\n}\n","import { LocalNode, Peer } from \"cojson\";\nimport { getIndexedDBStorage } from \"cojson-storage-indexeddb\";\nimport { WebSocketPeerWithReconnection } from \"cojson-transport-ws\";\nimport { WasmCrypto } from \"cojson/crypto/WasmCrypto\";\nimport {\n Account,\n AccountClass,\n AgentID,\n AnyAccountSchema,\n AuthCredentials,\n AuthSecretStorage,\n CoValue,\n CoValueFromRaw,\n CryptoProvider,\n ID,\n NewAccountProps,\n SessionID,\n SyncConfig,\n createAnonymousJazzContext,\n} from \"jazz-tools\";\nimport { createJazzContext } from \"jazz-tools\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\nimport { getBrowserLockSessionProvider } from \"./provideBrowserLockSession/index.js\";\n\nsetupInspector();\n\nexport type BaseBrowserContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: \"indexedDB\";\n crypto?: CryptoProvider;\n authSecretStorage: AuthSecretStorage;\n};\n\nclass BrowserWebSocketPeerWithReconnection extends WebSocketPeerWithReconnection {\n onNetworkChange(callback: (connected: boolean) => void): () => void {\n const handler = () => callback(navigator.onLine);\n window.addEventListener(\"online\", handler);\n window.addEventListener(\"offline\", handler);\n\n return () => {\n window.removeEventListener(\"online\", handler);\n window.removeEventListener(\"offline\", handler);\n };\n }\n}\n\nasync function setupPeers(options: BaseBrowserContextOptions) {\n const crypto = options.crypto || (await WasmCrypto.create());\n let node: LocalNode | undefined = undefined;\n\n const peers: Peer[] = [];\n\n const storage = await getIndexedDBStorage();\n\n if (options.sync.when === \"never\") {\n return {\n addConnectionListener: () => () => {},\n connected: () => false,\n toggleNetwork: () => {},\n peers,\n syncWhen: options.sync.when,\n storage,\n setNode: () => {},\n crypto,\n };\n }\n\n const wsPeer = new BrowserWebSocketPeerWithReconnection({\n peer: options.sync.peer,\n reconnectionTimeout: options.reconnectionTimeout,\n addPeer: (peer) => {\n if (node) {\n node.syncManager.addPeer(peer);\n } else {\n peers.push(peer);\n }\n },\n removePeer: (peer) => {\n peers.splice(peers.indexOf(peer), 1);\n },\n });\n\n function toggleNetwork(enabled: boolean) {\n if (enabled) {\n wsPeer.enable();\n } else {\n wsPeer.disable();\n }\n }\n\n function setNode(value: LocalNode) {\n node = value;\n }\n\n if (options.sync.when === \"always\" || !options.sync.when) {\n toggleNetwork(true);\n }\n\n return {\n toggleNetwork,\n addConnectionListener(listener: (connected: boolean) => void) {\n wsPeer.subscribe(listener);\n\n return () => {\n wsPeer.unsubscribe(listener);\n };\n },\n connected() {\n return wsPeer.connected;\n },\n peers,\n syncWhen: options.sync.when,\n storage,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzBrowserGuestContext(\n options: BaseBrowserContextOptions,\n) {\n const {\n toggleNetwork,\n peers,\n syncWhen,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peers,\n syncWhen,\n storage,\n });\n\n setNode(context.agent.node);\n\n options.authSecretStorage.emitUpdate(null);\n\n return {\n guest: context.agent,\n node: context.agent.node,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n addConnectionListener,\n connected,\n };\n}\n\nexport type BrowserContextOptions<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n credentials?: AuthCredentials;\n AccountSchema?: S;\n newAccountProps?: NewAccountProps;\n defaultProfileName?: string;\n} & BaseBrowserContextOptions;\n\nexport async function createJazzBrowserContext<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options: BrowserContextOptions<S>) {\n const {\n toggleNetwork,\n peers,\n syncWhen,\n setNode,\n crypto,\n storage,\n addConnectionListener,\n connected,\n } = await setupPeers(options);\n\n let unsubscribeAuthUpdate = () => {};\n\n if (options.sync.when === \"signedUp\") {\n const authSecretStorage = options.authSecretStorage;\n const credentials = options.credentials ?? (await authSecretStorage.get());\n\n function handleAuthUpdate(isAuthenticated: boolean) {\n if (isAuthenticated) {\n toggleNetwork(true);\n } else {\n toggleNetwork(false);\n }\n }\n\n unsubscribeAuthUpdate = authSecretStorage.onUpdate(handleAuthUpdate);\n handleAuthUpdate(authSecretStorage.getIsAuthenticated(credentials));\n }\n\n const context = await createJazzContext({\n credentials: options.credentials,\n newAccountProps: options.newAccountProps,\n peers,\n syncWhen,\n storage,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: getBrowserLockSessionProvider(),\n authSecretStorage: options.authSecretStorage,\n });\n\n setNode(context.node);\n\n return {\n me: context.account,\n node: context.node,\n authSecretStorage: context.authSecretStorage,\n done: () => {\n // TODO: Sync all the covalues before closing the connection & context\n toggleNetwork(false);\n unsubscribeAuthUpdate();\n context.done();\n },\n logOut: () => {\n unsubscribeAuthUpdate();\n return context.logOut();\n },\n addConnectionListener,\n connected,\n };\n}\n\n/** @category Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n","import { MockSessionProvider } from \"jazz-tools\";\nimport { BrowserSessionProvider } from \"./BrowserSessionProvider\";\n\nexport function getBrowserLockSessionProvider() {\n if (typeof navigator === \"undefined\" || !navigator.locks?.request) {\n // Fallback to random session ID for each tab session\n return new MockSessionProvider();\n }\n\n return new BrowserSessionProvider();\n}\n","import { SessionID } from \"cojson\";\n\nfunction getSessionKey(accountID: string, index: number) {\n return accountID + \"_\" + index;\n}\n\nexport class SessionIDStorage {\n static getSessionsList(accountID: string) {\n let sessionsList: SessionID[] = [];\n let i = 0;\n let lastSessionID: SessionID | null;\n\n do {\n lastSessionID = localStorage.getItem(\n getSessionKey(accountID, i),\n ) as SessionID | null;\n if (lastSessionID) {\n sessionsList.push(lastSessionID);\n }\n i++;\n } while (lastSessionID);\n\n return sessionsList;\n }\n\n static storeSessionID(\n accountID: string,\n sessionID: SessionID,\n index: number,\n ) {\n localStorage.setItem(getSessionKey(accountID, index), sessionID);\n }\n}\n","import { AgentID, CryptoProvider, RawAccountID, SessionID } from \"cojson\";\nimport { ID, Account, SessionProvider } from \"jazz-tools\";\nimport { SessionIDStorage } from \"./SessionIDStorage\";\n\nexport class BrowserSessionProvider implements SessionProvider {\n async acquireSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n ): Promise<{ sessionID: SessionID; sessionDone: () => void }> {\n const { sessionPromise, resolveSession } = createSessionLockPromise();\n\n // Get the list of sessions for the account, to try to acquire an existing session\n const sessionsList = SessionIDStorage.getSessionsList(accountID);\n\n for (const [index, sessionID] of sessionsList.entries()) {\n const sessionAcquired = await tryToAcquireSession(\n sessionID,\n sessionPromise,\n );\n\n if (sessionAcquired) {\n console.log(\"Using existing session\", sessionID, \"at index\", index); // This log is used in the e2e tests to verify the correctness of the feature\n return {\n sessionID,\n sessionDone: resolveSession,\n };\n }\n }\n\n const newSessionID = crypto.newRandomSessionID(\n accountID as RawAccountID | AgentID,\n );\n\n // Acquire exclusively the session to store the new session ID for reuse in future sessions\n await lockAndStoreSession(accountID, newSessionID, sessionPromise);\n\n console.log(\"Created new session\", newSessionID); // This log is used in the e2e tests to verify the correctness of the feature\n\n return {\n sessionID: newSessionID,\n sessionDone: resolveSession,\n };\n }\n\n async persistSession(\n accountID: ID<Account> | AgentID,\n sessionID: SessionID,\n ): Promise<{ sessionDone: () => void }> {\n const { sessionPromise, resolveSession } = createSessionLockPromise();\n\n // Store the session id for future use and lock it until the session is done\n await lockAndStoreSession(accountID, sessionID, sessionPromise);\n\n console.log(\"Stored new session\", sessionID);\n\n return { sessionDone: resolveSession };\n }\n}\n\nasync function lockAndStoreSession(\n accountID: ID<Account> | AgentID,\n sessionID: SessionID,\n sessionPromise: Promise<void>,\n) {\n const sessionAcquired = await tryToAcquireSession(sessionID, sessionPromise);\n\n if (!sessionAcquired) {\n // This should never happen because the session has been randomly generated\n throw new Error(\"Couldn't get lock on new session\");\n }\n\n // We don't need to wait for this to finish, we only need to acquire the lock on the new session\n storeSessionID(accountID, sessionID);\n}\n\nfunction tryToAcquireSession(\n sessionID: SessionID,\n sessionDonePromise: Promise<void>,\n) {\n return new Promise<boolean>((resolve) => {\n // Acquire exclusively the session if available\n navigator.locks.request(\n `load_session_${sessionID}`,\n { mode: \"exclusive\", ifAvailable: true },\n async (lock) => {\n if (!lock) {\n resolve(false); // Session already in use\n return;\n }\n\n resolve(true); // Session is available\n\n // Return the promise to lock the session until sessionDone is called\n return sessionDonePromise;\n },\n );\n });\n}\n\nfunction storeSessionID(\n accountID: ID<Account> | AgentID,\n sessionID: SessionID,\n) {\n return navigator.locks.request(\n `store_session_${accountID}`,\n { mode: \"exclusive\" },\n async (lock) => {\n if (!lock) {\n console.error(\"Couldn't get lock to store session ID\", accountID);\n }\n\n const sessionsList = SessionIDStorage.getSessionsList(accountID);\n SessionIDStorage.storeSessionID(\n accountID,\n sessionID,\n sessionsList.length,\n );\n },\n );\n}\n\nfunction createSessionLockPromise() {\n let resolveSession: () => void;\n const sessionPromise = new Promise<void>((resolve) => {\n resolveSession = resolve;\n });\n\n return {\n sessionPromise,\n resolveSession: resolveSession!,\n };\n}\n","import {\n Account,\n AccountClass,\n AnyAccountSchema,\n CoValueFromRaw,\n InMemoryKVStore,\n InstanceOfSchema,\n JazzContextManager,\n SyncConfig,\n} from \"jazz-tools\";\nimport { JazzContextManagerAuthProps } from \"jazz-tools\";\nimport { LocalStorageKVStore } from \"./auth/LocalStorageKVStore.js\";\nimport {\n BaseBrowserContextOptions,\n createJazzBrowserContext,\n createJazzBrowserGuestContext,\n} from \"./createBrowserContext.js\";\n\nexport type JazzContextManagerProps<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> = {\n guestMode?: boolean;\n sync: SyncConfig;\n onLogOut?: () => void;\n logOutReplacement?: () => void;\n onAnonymousAccountDiscarded?: (\n anonymousAccount: InstanceOfSchema<S>,\n ) => Promise<void>;\n storage?: BaseBrowserContextOptions[\"storage\"];\n AccountSchema?: S;\n defaultProfileName?: string;\n};\n\nexport class JazzBrowserContextManager<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n> extends JazzContextManager<InstanceOfSchema<S>, JazzContextManagerProps<S>> {\n // TODO: When the storage changes, if the user is changed, update the context\n getKvStore() {\n if (typeof window === \"undefined\") {\n // To handle running in SSR\n return new InMemoryKVStore();\n } else {\n return new LocalStorageKVStore();\n }\n }\n\n async getNewContext(\n props: JazzContextManagerProps<S>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (props.guestMode) {\n return createJazzBrowserGuestContext({\n sync: props.sync,\n storage: props.storage,\n authSecretStorage: this.authSecretStorage,\n });\n } else {\n return createJazzBrowserContext<S>({\n sync: props.sync,\n storage: props.storage,\n AccountSchema: props.AccountSchema,\n credentials: authProps?.credentials,\n newAccountProps: authProps?.newAccountProps,\n defaultProfileName: props.defaultProfileName,\n authSecretStorage: this.authSecretStorage,\n });\n }\n }\n\n propsChanged(props: JazzContextManagerProps<S>) {\n if (!this.props) {\n return true;\n }\n\n return (\n this.props.sync.when !== props.sync.when ||\n this.props.sync.peer !== props.sync.peer ||\n this.props.guestMode !== props.guestMode\n );\n }\n}\n","import { KvStore } from \"jazz-tools\";\n\nexport class LocalStorageKVStore implements KvStore {\n constructor() {}\n\n async get(key: string) {\n return localStorage.getItem(key);\n }\n\n async set(key: string, value: string) {\n localStorage.setItem(key, value);\n }\n\n async delete(key: string) {\n localStorage.removeItem(key);\n }\n\n async clearAll() {\n localStorage.clear();\n }\n}\n"],"mappings":"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","names":["handleAuthUpdate"]}