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.
- package/.svelte-kit/__package__/svelte.svelte.d.ts +6 -6
- package/.svelte-kit/__package__/tests/TestAuthProviderWrapper.svelte.d.ts +6 -6
- package/.turbo/turbo-build.log +63 -63
- package/CHANGELOG.md +30 -0
- package/dist/better-auth/auth/svelte.d.ts +6 -6
- package/dist/better-auth/database-adapter/index.d.ts.map +1 -1
- package/dist/better-auth/database-adapter/tests/sync-utils.d.ts.map +1 -1
- package/dist/browser/auth/PasskeyAuth.d.ts.map +1 -1
- package/dist/browser/createBrowserContext.d.ts +1 -12
- package/dist/browser/createBrowserContext.d.ts.map +1 -1
- package/dist/browser/index.js +1 -2
- package/dist/browser/index.js.map +1 -1
- package/dist/{chunk-JYPPYCEU.js → chunk-3BV3JUMV.js} +635 -93
- package/dist/chunk-3BV3JUMV.js.map +1 -0
- package/dist/expo/auth/clerk/index.d.ts.map +1 -1
- package/dist/index.js +5 -3
- package/dist/index.js.map +1 -1
- package/dist/inspector/utils/transactions-changes.d.ts.map +1 -1
- package/dist/inspector/viewer/type-icon.d.ts.map +1 -1
- package/dist/inspector/viewer/types.d.ts.map +1 -1
- package/dist/inspector/viewer/use-resolve-covalue.d.ts.map +1 -1
- package/dist/inspector/viewer/value-renderer.d.ts.map +1 -1
- package/dist/mcp/backend-sqlite.d.ts.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -2
- package/dist/mcp/server.js.map +1 -1
- package/dist/media/create-image-factory.d.ts.map +1 -1
- package/dist/media/index.server.js.map +1 -1
- package/dist/react/auth/Clerk.d.ts.map +1 -1
- package/dist/react/auth/DemoAuth.d.ts.map +1 -1
- package/dist/react/auth/PasskeyAuth.d.ts.map +1 -1
- package/dist/react/tests/testUtils.d.ts.map +1 -1
- package/dist/react-core/hooks.d.ts +39 -1
- package/dist/react-core/hooks.d.ts.map +1 -1
- package/dist/react-core/index.js +13 -6
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-core/tests/testUtils.d.ts.map +1 -1
- package/dist/react-native/index.js +4 -1
- package/dist/react-native/index.js.map +1 -1
- package/dist/react-native-core/auth/DemoAuthUI.d.ts.map +1 -1
- package/dist/react-native-core/auth/PasskeyAuth.d.ts.map +1 -1
- package/dist/react-native-core/auth/PasskeyAuthBasicUI.d.ts.map +1 -1
- package/dist/react-native-core/index.js +4 -1
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/platform.d.ts.map +1 -1
- package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte.d.ts +2 -1
- package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.d.ts +7 -1
- package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.js +2 -2
- package/dist/svelte/tests/testUtils.d.ts.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/tools/auth/DemoAuth.d.ts.map +1 -1
- package/dist/tools/auth/PassphraseAuth.d.ts.map +1 -1
- package/dist/tools/auth/clerk/index.d.ts.map +1 -1
- package/dist/tools/coValues/CoValueBase.d.ts +3 -1
- package/dist/tools/coValues/CoValueBase.d.ts.map +1 -1
- package/dist/tools/coValues/account.d.ts +3 -1
- package/dist/tools/coValues/account.d.ts.map +1 -1
- package/dist/tools/coValues/coFeed.d.ts +4 -2
- package/dist/tools/coValues/coFeed.d.ts.map +1 -1
- package/dist/tools/coValues/coList.d.ts +3 -1
- package/dist/tools/coValues/coList.d.ts.map +1 -1
- package/dist/tools/coValues/coMap.d.ts +3 -1
- package/dist/tools/coValues/coMap.d.ts.map +1 -1
- package/dist/tools/coValues/deepLoading.d.ts +21 -1
- package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
- package/dist/tools/coValues/interfaces.d.ts +11 -1
- package/dist/tools/coValues/interfaces.d.ts.map +1 -1
- package/dist/tools/coValues/registeredSchemas.d.ts +1 -1
- package/dist/tools/coValues/registeredSchemas.d.ts.map +1 -1
- package/dist/tools/coValues/request.d.ts +2 -2
- package/dist/tools/coValues/request.d.ts.map +1 -1
- package/dist/tools/coValues/snapshotRef.d.ts +114 -0
- package/dist/tools/coValues/snapshotRef.d.ts.map +1 -0
- package/dist/tools/exports.d.ts +1 -1
- package/dist/tools/exports.d.ts.map +1 -1
- package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
- package/dist/tools/implementation/anonymousJazzAgent.d.ts.map +1 -1
- package/dist/tools/implementation/invites.d.ts +9 -1
- package/dist/tools/implementation/invites.d.ts.map +1 -1
- package/dist/tools/implementation/schemaRuntime.d.ts +1 -0
- package/dist/tools/implementation/schemaRuntime.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/coExport.d.ts +2 -1
- package/dist/tools/implementation/zodSchema/coExport.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts +3 -0
- package/dist/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaInvariant.d.ts +2 -1
- package/dist/tools/implementation/zodSchema/schemaInvariant.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaPermissions.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts +2 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +2 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +2 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +2 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +2 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +3 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +3 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.d.ts +106 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts +2 -2
- package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +2 -2
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodCo.d.ts +6 -6
- package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodSchema.d.ts +4 -3
- package/dist/tools/implementation/zodSchema/zodSchema.d.ts.map +1 -1
- package/dist/tools/internal.d.ts +2 -0
- package/dist/tools/internal.d.ts.map +1 -1
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +3 -2
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionCache.d.ts +2 -2
- package/dist/tools/subscribe/SubscriptionCache.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +10 -2
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/dist/tools/subscribe/cursor.d.ts +15 -0
- package/dist/tools/subscribe/cursor.d.ts.map +1 -0
- package/dist/tools/subscribe/types.d.ts +9 -0
- package/dist/tools/subscribe/types.d.ts.map +1 -1
- package/dist/tools/subscribe/utils.d.ts +1 -0
- package/dist/tools/subscribe/utils.d.ts.map +1 -1
- package/dist/tools/testing.d.ts.map +1 -1
- package/dist/tools/tests/coValue.cursor.test.d.ts +2 -0
- package/dist/tools/tests/coValue.cursor.test.d.ts.map +1 -0
- package/dist/tools/tests/cursor.test.d.ts +2 -0
- package/dist/tools/tests/cursor.test.d.ts.map +1 -0
- package/dist/tools/tests/snapshotRef.test.d.ts +2 -0
- package/dist/tools/tests/snapshotRef.test.d.ts.map +1 -0
- package/package.json +5 -5
- package/src/browser/createBrowserContext.ts +0 -67
- package/src/browser/index.ts +1 -1
- package/src/mcp/backend-sqlite.ts +4 -1
- package/src/mcp/server.ts +4 -1
- package/src/media/create-image/server.ts +1 -1
- package/src/react-core/hooks.ts +51 -1
- package/src/react-native-core/platform.ts +4 -1
- package/src/svelte/jazz.class.svelte.ts +9 -1
- package/src/tools/coValues/CoValueBase.ts +14 -0
- package/src/tools/coValues/account.ts +4 -0
- package/src/tools/coValues/coFeed.ts +9 -5
- package/src/tools/coValues/coList.ts +4 -0
- package/src/tools/coValues/coMap.ts +4 -0
- package/src/tools/coValues/deepLoading.ts +46 -15
- package/src/tools/coValues/interfaces.ts +84 -25
- package/src/tools/coValues/registeredSchemas.ts +1 -1
- package/src/tools/coValues/snapshotRef.ts +364 -0
- package/src/tools/exports.ts +2 -0
- package/src/tools/implementation/invites.ts +26 -2
- package/src/tools/implementation/schemaRuntime.ts +1 -0
- package/src/tools/implementation/zodSchema/coExport.ts +2 -0
- package/src/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.ts +10 -0
- package/src/tools/implementation/zodSchema/runtimeConverters/schemaFieldToCoFieldDef.ts +1 -1
- package/src/tools/implementation/zodSchema/schemaInvariant.ts +3 -1
- package/src/tools/implementation/zodSchema/schemaPermissions.ts +2 -4
- package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +2 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +2 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +2 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +3 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +2 -0
- package/src/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +4 -0
- package/src/tools/implementation/zodSchema/schemaTypes/RichTextSchema.ts +4 -0
- package/src/tools/implementation/zodSchema/schemaTypes/SnapshotRefSchema.ts +259 -0
- package/src/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.ts +24 -19
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +11 -5
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.ts +18 -10
- package/src/tools/implementation/zodSchema/zodCo.ts +17 -0
- package/src/tools/implementation/zodSchema/zodSchema.ts +10 -3
- package/src/tools/internal.ts +2 -0
- package/src/tools/subscribe/CoValueCoreSubscription.ts +21 -2
- package/src/tools/subscribe/SubscriptionCache.ts +19 -2
- package/src/tools/subscribe/SubscriptionScope.ts +95 -7
- package/src/tools/subscribe/cursor.ts +109 -0
- package/src/tools/subscribe/types.ts +12 -0
- package/src/tools/subscribe/utils.ts +18 -3
- package/src/tools/tests/coValue.cursor.test.ts +817 -0
- package/src/tools/tests/cursor.test.ts +255 -0
- package/src/tools/tests/deepLoading.test.ts +0 -1
- package/src/tools/tests/invites.test.ts +13 -0
- package/src/tools/tests/snapshotRef.test.ts +688 -0
- 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;
|
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
> jazz-tools@0.20.
|
|
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
|
[34mCLI[39m Building entry: {"index":"src/index.ts","testing":"src/testing.ts","tools/ssr":"src/tools/ssr/index.ts"}
|
|
@@ -114,117 +114,117 @@
|
|
|
114
114
|
[34mESM[39m Build start
|
|
115
115
|
[34mCLI[39m Cleaning output folder
|
|
116
116
|
[34mESM[39m Build start
|
|
117
|
-
[32mESM[39m [1mdist/worker/index.js [22m[32m3.45 KB[39m
|
|
118
|
-
[32mESM[39m [1mdist/worker/napi-crypto.js [22m[32m110.00 B[39m
|
|
119
|
-
[32mESM[39m [1mdist/worker/edge-wasm.js [22m[32m259.00 B[39m
|
|
120
|
-
[32mESM[39m [1mdist/worker/index.js.map [22m[32m6.97 KB[39m
|
|
121
|
-
[32mESM[39m [1mdist/worker/napi-crypto.js.map [22m[32m162.00 B[39m
|
|
122
|
-
[32mESM[39m [1mdist/worker/edge-wasm.js.map [22m[32m505.00 B[39m
|
|
123
|
-
[32mESM[39m ⚡️ Build success in 29ms
|
|
124
117
|
[32mESM[39m [1mdist/tiptap/index.js [22m[32m572.00 B[39m
|
|
125
118
|
[32mESM[39m [1mdist/tiptap/index.js.map [22m[32m1.29 KB[39m
|
|
126
|
-
[32mESM[39m ⚡️ Build success in
|
|
127
|
-
[32mESM[39m [1mdist/better-auth/auth/client.js [22m[32m4.54 KB[39m
|
|
119
|
+
[32mESM[39m ⚡️ Build success in 47ms
|
|
128
120
|
[32mESM[39m [1mdist/better-auth/auth/server.js [22m[32m8.38 KB[39m
|
|
121
|
+
[32mESM[39m [1mdist/better-auth/auth/client.js [22m[32m4.54 KB[39m
|
|
129
122
|
[32mESM[39m [1mdist/better-auth/auth/react.js [22m[32m813.00 B[39m
|
|
130
|
-
[32mESM[39m [1mdist/better-auth/auth/client.js.map [22m[32m8.44 KB[39m
|
|
131
123
|
[32mESM[39m [1mdist/better-auth/auth/server.js.map [22m[32m15.56 KB[39m
|
|
124
|
+
[32mESM[39m [1mdist/better-auth/auth/client.js.map [22m[32m8.44 KB[39m
|
|
132
125
|
[32mESM[39m [1mdist/better-auth/auth/react.js.map [22m[32m2.07 KB[39m
|
|
133
|
-
[32mESM[39m ⚡️ Build success in
|
|
126
|
+
[32mESM[39m ⚡️ Build success in 36ms
|
|
127
|
+
[32mESM[39m [1mdist/worker/index.js [22m[32m3.45 KB[39m
|
|
128
|
+
[32mESM[39m [1mdist/worker/edge-wasm.js [22m[32m259.00 B[39m
|
|
129
|
+
[32mESM[39m [1mdist/worker/napi-crypto.js [22m[32m110.00 B[39m
|
|
130
|
+
[32mESM[39m [1mdist/worker/index.js.map [22m[32m6.97 KB[39m
|
|
131
|
+
[32mESM[39m [1mdist/worker/edge-wasm.js.map [22m[32m505.00 B[39m
|
|
132
|
+
[32mESM[39m [1mdist/worker/napi-crypto.js.map [22m[32m162.00 B[39m
|
|
133
|
+
[32mESM[39m ⚡️ Build success in 46ms
|
|
134
|
+
[32mESM[39m [1mdist/mcp/server.js [22m[32m21.02 KB[39m
|
|
135
|
+
[32mESM[39m [1mdist/mcp/build-index.js [22m[32m6.62 KB[39m
|
|
136
|
+
[32mESM[39m [1mdist/mcp/build-index.js.map [22m[32m16.00 KB[39m
|
|
137
|
+
[32mESM[39m [1mdist/mcp/server.js.map [22m[32m48.96 KB[39m
|
|
138
|
+
[32mESM[39m ⚡️ Build success in 67ms
|
|
134
139
|
[32mESM[39m [1mdist/media/index.js [22m[32m236.00 B[39m
|
|
135
140
|
[32mESM[39m [1mdist/media/index.browser.js [22m[32m2.79 KB[39m
|
|
136
|
-
[32mESM[39m [1mdist/media/index.server.js [22m[32m2.95 KB[39m
|
|
137
141
|
[32mESM[39m [1mdist/media/index.native.js [22m[32m4.02 KB[39m
|
|
142
|
+
[32mESM[39m [1mdist/media/index.server.js [22m[32m2.95 KB[39m
|
|
138
143
|
[32mESM[39m [1mdist/media/chunk-IRL3KNPO.js [22m[32m6.70 KB[39m
|
|
139
144
|
[32mESM[39m [1mdist/media/index.js.map [22m[32m71.00 B[39m
|
|
140
145
|
[32mESM[39m [1mdist/media/index.browser.js.map [22m[32m6.15 KB[39m
|
|
141
|
-
[32mESM[39m [1mdist/media/index.server.js.map [22m[32m6.37 KB[39m
|
|
142
146
|
[32mESM[39m [1mdist/media/index.native.js.map [22m[32m8.13 KB[39m
|
|
147
|
+
[32mESM[39m [1mdist/media/index.server.js.map [22m[32m6.38 KB[39m
|
|
143
148
|
[32mESM[39m [1mdist/media/chunk-IRL3KNPO.js.map [22m[32m17.00 KB[39m
|
|
144
|
-
[32mESM[39m ⚡️ Build success in
|
|
145
|
-
[32mESM[39m [1mdist/
|
|
146
|
-
[32mESM[39m [1mdist/mcp/build-index.js [22m[32m6.62 KB[39m
|
|
147
|
-
[32mESM[39m [1mdist/mcp/build-index.js.map [22m[32m16.00 KB[39m
|
|
148
|
-
[32mESM[39m [1mdist/mcp/server.js.map [22m[32m48.56 KB[39m
|
|
149
|
-
[32mESM[39m ⚡️ Build success in 41ms
|
|
150
|
-
[32mESM[39m [1mdist/expo/index.js [22m[32m5.65 KB[39m
|
|
151
|
-
[32mESM[39m [1mdist/expo/polyfills.js [22m[32m858.00 B[39m
|
|
152
|
-
[32mESM[39m [1mdist/expo/testing.js [22m[32m112.00 B[39m
|
|
153
|
-
[32mESM[39m [1mdist/expo/index.js.map [22m[32m11.85 KB[39m
|
|
154
|
-
[32mESM[39m [1mdist/expo/polyfills.js.map [22m[32m1.61 KB[39m
|
|
155
|
-
[32mESM[39m [1mdist/expo/testing.js.map [22m[32m168.00 B[39m
|
|
156
|
-
[32mESM[39m ⚡️ Build success in 40ms
|
|
149
|
+
[32mESM[39m ⚡️ Build success in 65ms
|
|
150
|
+
[32mESM[39m [1mdist/react-core/index.js [22m[32m18.06 KB[39m
|
|
157
151
|
[32mESM[39m [1mdist/react-core/testing.js [22m[32m904.00 B[39m
|
|
158
|
-
[32mESM[39m [1mdist/react-core/index.js [22m[32m17.87 KB[39m
|
|
159
152
|
[32mESM[39m [1mdist/react-core/chunk-UOYH6JFJ.js [22m[32m189.00 B[39m
|
|
153
|
+
[32mESM[39m [1mdist/react-core/index.js.map [22m[32m60.18 KB[39m
|
|
160
154
|
[32mESM[39m [1mdist/react-core/testing.js.map [22m[32m1.34 KB[39m
|
|
161
|
-
[32mESM[39m [1mdist/react-core/index.js.map [22m[32m58.59 KB[39m
|
|
162
155
|
[32mESM[39m [1mdist/react-core/chunk-UOYH6JFJ.js.map [22m[32m363.00 B[39m
|
|
163
|
-
[32mESM[39m ⚡️ Build success in
|
|
164
|
-
[32mESM[39m [1mdist/
|
|
165
|
-
[32mESM[39m [1mdist/
|
|
166
|
-
[32mESM[39m
|
|
156
|
+
[32mESM[39m ⚡️ Build success in 64ms
|
|
157
|
+
[32mESM[39m [1mdist/expo/testing.js [22m[32m112.00 B[39m
|
|
158
|
+
[32mESM[39m [1mdist/expo/index.js [22m[32m5.65 KB[39m
|
|
159
|
+
[32mESM[39m [1mdist/expo/polyfills.js [22m[32m858.00 B[39m
|
|
160
|
+
[32mESM[39m [1mdist/expo/index.js.map [22m[32m11.85 KB[39m
|
|
161
|
+
[32mESM[39m [1mdist/expo/testing.js.map [22m[32m168.00 B[39m
|
|
162
|
+
[32mESM[39m [1mdist/expo/polyfills.js.map [22m[32m1.61 KB[39m
|
|
163
|
+
[32mESM[39m ⚡️ Build success in 59ms
|
|
167
164
|
[32mESM[39m [1mdist/better-auth/database-adapter/index.js [22m[32m26.86 KB[39m
|
|
168
165
|
[32mESM[39m [1mdist/better-auth/database-adapter/index.js.map [22m[32m58.67 KB[39m
|
|
169
|
-
[32mESM[39m ⚡️ Build success in 53ms
|
|
170
|
-
[32mESM[39m [1mdist/react/index.js [22m[32m26.02 KB[39m
|
|
171
|
-
[32mESM[39m [1mdist/react/testing.js [22m[32m122.00 B[39m
|
|
172
|
-
[32mESM[39m [1mdist/react/ssr.js [22m[32m693.00 B[39m
|
|
173
|
-
[32mESM[39m [1mdist/react/index.js.map [22m[32m55.45 KB[39m
|
|
174
|
-
[32mESM[39m [1mdist/react/testing.js.map [22m[32m165.00 B[39m
|
|
175
|
-
[32mESM[39m [1mdist/react/ssr.js.map [22m[32m1.10 KB[39m
|
|
176
166
|
[32mESM[39m ⚡️ Build success in 57ms
|
|
177
167
|
[32mESM[39m [1mdist/prosemirror/index.js [22m[32m78.48 KB[39m
|
|
178
168
|
[32mESM[39m [1mdist/prosemirror/index.js.map [22m[32m309.11 KB[39m
|
|
179
|
-
[32mESM[39m ⚡️ Build success in
|
|
180
|
-
[32mESM[39m [1mdist/
|
|
169
|
+
[32mESM[39m ⚡️ Build success in 73ms
|
|
170
|
+
[32mESM[39m [1mdist/browser/index.js [22m[32m15.93 KB[39m
|
|
171
|
+
[32mESM[39m [1mdist/browser/index.js.map [22m[32m32.10 KB[39m
|
|
172
|
+
[32mESM[39m ⚡️ Build success in 85ms
|
|
173
|
+
[32mESM[39m [1mdist/react-native-core/index.js [22m[32m34.50 KB[39m
|
|
181
174
|
[32mESM[39m [1mdist/react-native-core/testing.js [22m[32m119.00 B[39m
|
|
182
|
-
[32mESM[39m [1mdist/react-native-core/index.js.map [22m[32m69.10 KB[39m
|
|
183
175
|
[32mESM[39m [1mdist/react-native-core/testing.js.map [22m[32m175.00 B[39m
|
|
184
|
-
[32mESM[39m
|
|
185
|
-
[32mESM[39m
|
|
176
|
+
[32mESM[39m [1mdist/react-native-core/index.js.map [22m[32m69.16 KB[39m
|
|
177
|
+
[32mESM[39m ⚡️ Build success in 99ms
|
|
178
|
+
[32mESM[39m [1mdist/react-native/index.js [22m[32m38.24 KB[39m
|
|
186
179
|
[32mESM[39m [1mdist/react-native/testing.js [22m[32m120.00 B[39m
|
|
187
180
|
[32mESM[39m [1mdist/react-native/polyfills.js [22m[32m858.00 B[39m
|
|
188
|
-
[32mESM[39m [1mdist/react-native/index.js.map [22m[32m76.75 KB[39m
|
|
189
181
|
[32mESM[39m [1mdist/react-native/testing.js.map [22m[32m176.00 B[39m
|
|
182
|
+
[32mESM[39m [1mdist/react-native/index.js.map [22m[32m76.81 KB[39m
|
|
190
183
|
[32mESM[39m [1mdist/react-native/polyfills.js.map [22m[32m1.61 KB[39m
|
|
191
|
-
[32mESM[39m ⚡️ Build success in
|
|
184
|
+
[32mESM[39m ⚡️ Build success in 100ms
|
|
185
|
+
[32mESM[39m [1mdist/react/index.js [22m[32m26.02 KB[39m
|
|
186
|
+
[32mESM[39m [1mdist/react/testing.js [22m[32m122.00 B[39m
|
|
187
|
+
[32mESM[39m [1mdist/react/ssr.js [22m[32m693.00 B[39m
|
|
188
|
+
[32mESM[39m [1mdist/react/testing.js.map [22m[32m165.00 B[39m
|
|
189
|
+
[32mESM[39m [1mdist/react/ssr.js.map [22m[32m1.10 KB[39m
|
|
190
|
+
[32mESM[39m [1mdist/react/index.js.map [22m[32m55.45 KB[39m
|
|
191
|
+
[32mESM[39m ⚡️ Build success in 96ms
|
|
192
192
|
[32mESM[39m [1mdist/inspector/standalone.js [22m[32m12.61 KB[39m
|
|
193
|
-
[32mESM[39m [1mdist/inspector/index.js [22m[32m37.49 KB[39m
|
|
194
193
|
[32mESM[39m [1mdist/inspector/chunk-ORKZSKZF.js [22m[32m128.83 KB[39m
|
|
195
|
-
[32mESM[39m [1mdist/inspector/index.js
|
|
194
|
+
[32mESM[39m [1mdist/inspector/index.js [22m[32m37.49 KB[39m
|
|
196
195
|
[32mESM[39m [1mdist/inspector/standalone.js.map [22m[32m20.11 KB[39m
|
|
196
|
+
[32mESM[39m [1mdist/inspector/index.js.map [22m[32m63.80 KB[39m
|
|
197
197
|
[32mESM[39m [1mdist/inspector/chunk-ORKZSKZF.js.map [22m[32m222.34 KB[39m
|
|
198
|
-
[32mESM[39m ⚡️ Build success in
|
|
199
|
-
[32mESM[39m [1mdist/index.js [22m[32m32.18 KB[39m
|
|
200
|
-
[32mESM[39m [1mdist/testing.js [22m[32m8.56 KB[39m
|
|
201
|
-
[32mESM[39m [1mdist/tools/ssr.js [22m[32m156.00 B[39m
|
|
198
|
+
[32mESM[39m ⚡️ Build success in 127ms
|
|
202
199
|
[32mESM[39m [1mdist/chunk-K4D7IMFM.js [22m[32m690.00 B[39m
|
|
203
200
|
[32mESM[39m [1mdist/chunk-ZQWSQH6L.js [22m[32m945.00 B[39m
|
|
204
|
-
[32mESM[39m [1mdist/
|
|
205
|
-
[32mESM[39m [1mdist/index.js
|
|
201
|
+
[32mESM[39m [1mdist/testing.js [22m[32m8.56 KB[39m
|
|
202
|
+
[32mESM[39m [1mdist/index.js [22m[32m32.38 KB[39m
|
|
203
|
+
[32mESM[39m [1mdist/tools/ssr.js [22m[32m156.00 B[39m
|
|
204
|
+
[32mESM[39m [1mdist/chunk-3BV3JUMV.js [22m[32m279.58 KB[39m
|
|
205
|
+
[32mESM[39m [1mdist/chunk-ZQWSQH6L.js.map [22m[32m71.00 B[39m
|
|
206
|
+
[32mESM[39m [1mdist/chunk-K4D7IMFM.js.map [22m[32m1.10 KB[39m
|
|
206
207
|
[32mESM[39m [1mdist/testing.js.map [22m[32m16.22 KB[39m
|
|
208
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m66.14 KB[39m
|
|
207
209
|
[32mESM[39m [1mdist/tools/ssr.js.map [22m[32m71.00 B[39m
|
|
208
|
-
[32mESM[39m [1mdist/chunk-
|
|
209
|
-
[32mESM[39m
|
|
210
|
-
[32mESM[39m [1mdist/chunk-JYPPYCEU.js.map [22m[32m609.16 KB[39m
|
|
211
|
-
[32mESM[39m ⚡️ Build success in 109ms
|
|
210
|
+
[32mESM[39m [1mdist/chunk-3BV3JUMV.js.map [22m[32m645.58 KB[39m
|
|
211
|
+
[32mESM[39m ⚡️ Build success in 151ms
|
|
212
212
|
[32mESM[39m [1mdist/inspector/register-custom-element.js [22m[32m305.00 B[39m
|
|
213
213
|
[32mESM[39m [1mdist/inspector/register-custom-element.js.map [22m[32m445.00 B[39m
|
|
214
214
|
[32mESM[39m [1mdist/inspector/custom-element-7G7IZVLL.js [22m[32m1.64 MB[39m
|
|
215
215
|
[32mESM[39m [1mdist/inspector/custom-element-7G7IZVLL.js.map [22m[32m2.52 MB[39m
|
|
216
|
-
[32mESM[39m ⚡️ Build success in
|
|
216
|
+
[32mESM[39m ⚡️ Build success in 190ms
|
|
217
217
|
|
|
218
|
-
> jazz-tools@0.20.
|
|
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.
|
|
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.
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/browser/index.js
CHANGED
|
@@ -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"]}
|