jazz-tools 0.18.3 → 0.18.5
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/.turbo/turbo-build.log +34 -34
- package/CHANGELOG.md +22 -0
- package/dist/better-auth/auth/react.d.ts +5 -2
- package/dist/better-auth/auth/react.d.ts.map +1 -1
- package/dist/better-auth/auth/server.d.ts +21 -1
- package/dist/better-auth/auth/server.d.ts.map +1 -1
- package/dist/better-auth/auth/server.js +10 -5
- package/dist/better-auth/auth/server.js.map +1 -1
- package/dist/browser/createBrowserContext.d.ts.map +1 -1
- package/dist/browser/index.js +7 -0
- package/dist/browser/index.js.map +1 -1
- package/dist/{chunk-IERUTUXB.js → chunk-3LE7N6TH.js} +121 -36
- package/dist/chunk-3LE7N6TH.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/react-core/index.js +120 -35
- package/dist/react-core/index.js.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/tools/coValues/account.d.ts.map +1 -1
- package/dist/tools/coValues/coFeed.d.ts +12 -0
- package/dist/tools/coValues/coFeed.d.ts.map +1 -1
- package/dist/tools/coValues/coMap.d.ts.map +1 -1
- package/dist/tools/implementation/anonymousJazzAgent.d.ts +1 -1
- package/dist/tools/implementation/anonymousJazzAgent.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/coExport.d.ts +2 -0
- package/dist/tools/implementation/zodSchema/coExport.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +19 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts +4 -0
- package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/TypeOfZodSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/unionUtils.d.ts.map +1 -1
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +61 -11
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
- package/dist/tools/subscribe/CoValueCoreSubscription.test.d.ts +2 -0
- package/dist/tools/subscribe/CoValueCoreSubscription.test.d.ts.map +1 -0
- package/dist/tools/testing.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/better-auth/auth/server.ts +38 -7
- package/src/better-auth/auth/tests/server.test.ts +95 -7
- package/src/browser/createBrowserContext.ts +8 -0
- package/src/tools/coValues/account.ts +3 -1
- package/src/tools/coValues/coFeed.ts +5 -0
- package/src/tools/coValues/coMap.ts +3 -1
- package/src/tools/implementation/anonymousJazzAgent.ts +1 -1
- package/src/tools/implementation/zodSchema/coExport.ts +2 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +19 -0
- package/src/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.ts +8 -1
- package/src/tools/implementation/zodSchema/typeConverters/TypeOfZodSchema.ts +0 -1
- package/src/tools/implementation/zodSchema/unionUtils.ts +0 -1
- package/src/tools/subscribe/CoValueCoreSubscription.test.ts +1000 -0
- package/src/tools/subscribe/CoValueCoreSubscription.ts +179 -43
- package/src/tools/tests/account.test.ts +12 -0
- package/src/tools/tests/coFeed.test.ts +25 -0
- package/src/tools/tests/coList.test-d.ts +17 -0
- package/src/tools/tests/coList.test.ts +20 -0
- package/src/tools/tests/coMap.record.test-d.ts +18 -0
- package/src/tools/tests/coMap.record.test.ts +1 -0
- package/src/tools/tests/coMap.test-d.ts +15 -0
- package/src/tools/tests/coMap.test.ts +12 -2
- package/dist/chunk-IERUTUXB.js.map +0 -1
package/.turbo/turbo-build.log
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
> jazz-tools@0.18.
|
2
|
+
> jazz-tools@0.18.5 build /home/runner/_work/jazz/jazz/packages/jazz-tools
|
3
3
|
> tsup && pnpm types && pnpm build:svelte
|
4
4
|
|
5
5
|
[34mCLI[39m Building entry: {"index":"src/index.ts","testing":"src/testing.ts"}
|
@@ -107,22 +107,22 @@
|
|
107
107
|
[34mESM[39m Build start
|
108
108
|
[34mCLI[39m Cleaning output folder
|
109
109
|
[34mESM[39m Build start
|
110
|
-
[32mESM[39m [1mdist/worker/index.js [22m[32m2.33 KB[39m
|
111
|
-
[32mESM[39m [1mdist/worker/index.js.map [22m[32m4.79 KB[39m
|
112
|
-
[32mESM[39m ⚡️ Build success in 17ms
|
113
110
|
[32mESM[39m [1mdist/tiptap/index.js [22m[32m564.00 B[39m
|
114
111
|
[32mESM[39m [1mdist/tiptap/index.js.map [22m[32m1.21 KB[39m
|
115
|
-
[32mESM[39m ⚡️ Build success in
|
112
|
+
[32mESM[39m ⚡️ Build success in 14ms
|
116
113
|
[32mESM[39m [1mdist/react/ssr.js [22m[32m688.00 B[39m
|
117
114
|
[32mESM[39m [1mdist/react/ssr.js.map [22m[32m1.12 KB[39m
|
118
|
-
[32mESM[39m ⚡️ Build success in
|
115
|
+
[32mESM[39m ⚡️ Build success in 17ms
|
116
|
+
[32mESM[39m [1mdist/worker/index.js [22m[32m2.33 KB[39m
|
117
|
+
[32mESM[39m [1mdist/worker/index.js.map [22m[32m4.79 KB[39m
|
118
|
+
[32mESM[39m ⚡️ Build success in 14ms
|
119
119
|
[32mESM[39m [1mdist/better-auth/auth/client.js [22m[32m4.36 KB[39m
|
120
|
-
[32mESM[39m [1mdist/better-auth/auth/server.js [22m[32m5.94 KB[39m
|
121
120
|
[32mESM[39m [1mdist/better-auth/auth/react.js [22m[32m1.19 KB[39m
|
121
|
+
[32mESM[39m [1mdist/better-auth/auth/server.js [22m[32m6.10 KB[39m
|
122
122
|
[32mESM[39m [1mdist/better-auth/auth/client.js.map [22m[32m8.12 KB[39m
|
123
|
-
[32mESM[39m [1mdist/better-auth/auth/server.js.map [22m[32m10.66 KB[39m
|
124
123
|
[32mESM[39m [1mdist/better-auth/auth/react.js.map [22m[32m3.37 KB[39m
|
125
|
-
[32mESM[39m
|
124
|
+
[32mESM[39m [1mdist/better-auth/auth/server.js.map [22m[32m11.54 KB[39m
|
125
|
+
[32mESM[39m ⚡️ Build success in 20ms
|
126
126
|
[32mESM[39m [1mdist/media/index.js [22m[32m236.00 B[39m
|
127
127
|
[32mESM[39m [1mdist/media/index.browser.js [22m[32m2.79 KB[39m
|
128
128
|
[32mESM[39m [1mdist/media/index.native.js [22m[32m2.90 KB[39m
|
@@ -133,67 +133,67 @@
|
|
133
133
|
[32mESM[39m [1mdist/media/index.native.js.map [22m[32m6.09 KB[39m
|
134
134
|
[32mESM[39m [1mdist/media/index.server.js.map [22m[32m6.37 KB[39m
|
135
135
|
[32mESM[39m [1mdist/media/chunk-W3S526L3.js.map [22m[32m16.57 KB[39m
|
136
|
-
[32mESM[39m ⚡️ Build success in
|
136
|
+
[32mESM[39m ⚡️ Build success in 32ms
|
137
137
|
[32mESM[39m [1mdist/react-native/index.js [22m[32m2.53 KB[39m
|
138
138
|
[32mESM[39m [1mdist/react-native/testing.js [22m[32m120.00 B[39m
|
139
139
|
[32mESM[39m [1mdist/react-native/crypto.js [22m[32m161.00 B[39m
|
140
140
|
[32mESM[39m [1mdist/react-native/index.js.map [22m[32m5.68 KB[39m
|
141
141
|
[32mESM[39m [1mdist/react-native/testing.js.map [22m[32m176.00 B[39m
|
142
142
|
[32mESM[39m [1mdist/react-native/crypto.js.map [22m[32m197.00 B[39m
|
143
|
-
[32mESM[39m ⚡️ Build success in
|
144
|
-
[32mESM[39m [1mdist/browser/index.js [22m[32m13.
|
145
|
-
[32mESM[39m [1mdist/browser/index.js.map [22m[
|
146
|
-
[32mESM[39m ⚡️ Build success in
|
143
|
+
[32mESM[39m ⚡️ Build success in 30ms
|
144
|
+
[32mESM[39m [1mdist/browser/index.js [22m[32m13.64 KB[39m
|
145
|
+
[32mESM[39m [1mdist/browser/index.js.map [22m[32m29.14 KB[39m
|
146
|
+
[32mESM[39m ⚡️ Build success in 39ms
|
147
147
|
[32mESM[39m [1mdist/expo/index.js [22m[32m4.68 KB[39m
|
148
148
|
[32mESM[39m [1mdist/expo/testing.js [22m[32m112.00 B[39m
|
149
149
|
[32mESM[39m [1mdist/expo/crypto.js [22m[32m153.00 B[39m
|
150
150
|
[32mESM[39m [1mdist/expo/index.js.map [22m[32m10.23 KB[39m
|
151
151
|
[32mESM[39m [1mdist/expo/testing.js.map [22m[32m168.00 B[39m
|
152
152
|
[32mESM[39m [1mdist/expo/crypto.js.map [22m[32m189.00 B[39m
|
153
|
-
[32mESM[39m ⚡️ Build success in
|
153
|
+
[32mESM[39m ⚡️ Build success in 45ms
|
154
154
|
[32mESM[39m [1mdist/react-native-core/index.js [22m[32m17.90 KB[39m
|
155
|
-
[32mESM[39m [1mdist/react-native-core/testing.js [22m[32m119.00 B[39m
|
156
155
|
[32mESM[39m [1mdist/react-native-core/crypto.js [22m[32m2.10 KB[39m
|
156
|
+
[32mESM[39m [1mdist/react-native-core/testing.js [22m[32m119.00 B[39m
|
157
157
|
[32mESM[39m [1mdist/react-native-core/index.js.map [22m[32m36.66 KB[39m
|
158
|
-
[32mESM[39m [1mdist/react-native-core/crypto.js.map [22m[32m4.25 KB[39m
|
159
158
|
[32mESM[39m [1mdist/react-native-core/testing.js.map [22m[32m175.00 B[39m
|
160
|
-
[32mESM[39m
|
159
|
+
[32mESM[39m [1mdist/react-native-core/crypto.js.map [22m[32m4.25 KB[39m
|
160
|
+
[32mESM[39m ⚡️ Build success in 48ms
|
161
161
|
[32mESM[39m [1mdist/react/testing.js [22m[32m122.00 B[39m
|
162
162
|
[32mESM[39m [1mdist/react/index.js [22m[32m24.66 KB[39m
|
163
163
|
[32mESM[39m [1mdist/react/testing.js.map [22m[32m165.00 B[39m
|
164
164
|
[32mESM[39m [1mdist/react/index.js.map [22m[32m53.43 KB[39m
|
165
|
-
[32mESM[39m ⚡️ Build success in
|
165
|
+
[32mESM[39m ⚡️ Build success in 51ms
|
166
166
|
[32mESM[39m [1mdist/prosemirror/index.js [22m[32m77.63 KB[39m
|
167
167
|
[32mESM[39m [1mdist/prosemirror/index.js.map [22m[32m306.98 KB[39m
|
168
|
-
[32mESM[39m ⚡️ Build success in
|
168
|
+
[32mESM[39m ⚡️ Build success in 59ms
|
169
169
|
[32mESM[39m [1mdist/inspector/index.js [22m[32m61.52 KB[39m
|
170
170
|
[32mESM[39m [1mdist/inspector/index.js.map [22m[32m109.98 KB[39m
|
171
|
-
[32mESM[39m ⚡️ Build success in
|
172
|
-
[32mESM[39m [1mdist/
|
173
|
-
[32mESM[39m [1mdist/index.js [22m[32m26.13 KB[39m
|
174
|
-
[32mESM[39m [1mdist/chunk-IERUTUXB.js [22m[32m163.90 KB[39m
|
175
|
-
[32mESM[39m [1mdist/testing.js.map [22m[32m14.10 KB[39m
|
176
|
-
[32mESM[39m [1mdist/index.js.map [22m[32m52.92 KB[39m
|
177
|
-
[32mESM[39m [1mdist/chunk-IERUTUXB.js.map [22m[32m389.03 KB[39m
|
178
|
-
[32mESM[39m ⚡️ Build success in 79ms
|
179
|
-
[32mESM[39m [1mdist/react-core/index.js [22m[32m141.07 KB[39m
|
171
|
+
[32mESM[39m ⚡️ Build success in 76ms
|
172
|
+
[32mESM[39m [1mdist/react-core/index.js [22m[32m143.63 KB[39m
|
180
173
|
[32mESM[39m [1mdist/react-core/testing.js [22m[32m1.17 KB[39m
|
181
174
|
[32mESM[39m [1mdist/react-core/chunk-7DYMJ74I.js [22m[32m279.00 B[39m
|
182
175
|
[32mESM[39m [1mdist/react-core/testing.js.map [22m[32m1.82 KB[39m
|
183
176
|
[32mESM[39m [1mdist/react-core/chunk-7DYMJ74I.js.map [22m[32m533.00 B[39m
|
184
|
-
[32mESM[39m [1mdist/react-core/index.js.map [22m[
|
185
|
-
[32mESM[39m ⚡️ Build success in
|
177
|
+
[32mESM[39m [1mdist/react-core/index.js.map [22m[32m390.21 KB[39m
|
178
|
+
[32mESM[39m ⚡️ Build success in 91ms
|
179
|
+
[32mESM[39m [1mdist/index.js [22m[32m26.13 KB[39m
|
180
|
+
[32mESM[39m [1mdist/chunk-3LE7N6TH.js [22m[32m166.47 KB[39m
|
181
|
+
[32mESM[39m [1mdist/testing.js [22m[32m7.17 KB[39m
|
182
|
+
[32mESM[39m [1mdist/index.js.map [22m[32m52.92 KB[39m
|
183
|
+
[32mESM[39m [1mdist/testing.js.map [22m[32m14.10 KB[39m
|
184
|
+
[32mESM[39m [1mdist/chunk-3LE7N6TH.js.map [22m[32m395.92 KB[39m
|
185
|
+
[32mESM[39m ⚡️ Build success in 96ms
|
186
186
|
[32mESM[39m [1mdist/inspector/register-custom-element.js [22m[32m218.00 B[39m
|
187
187
|
[32mESM[39m [1mdist/inspector/register-custom-element.js.map [22m[32m314.00 B[39m
|
188
188
|
[32mESM[39m [1mdist/inspector/custom-element-WCY6D3QJ.js [22m[32m1.53 MB[39m
|
189
189
|
[32mESM[39m [1mdist/inspector/custom-element-WCY6D3QJ.js.map [22m[32m2.35 MB[39m
|
190
|
-
[32mESM[39m ⚡️ Build success in
|
190
|
+
[32mESM[39m ⚡️ Build success in 125ms
|
191
191
|
|
192
|
-
> jazz-tools@0.18.
|
192
|
+
> jazz-tools@0.18.5 types /home/runner/_work/jazz/jazz/packages/jazz-tools
|
193
193
|
> tsc --outDir dist
|
194
194
|
|
195
195
|
|
196
|
-
> jazz-tools@0.18.
|
196
|
+
> jazz-tools@0.18.5 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
|
197
197
|
> rm -rf dist/svelte && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json
|
198
198
|
|
199
199
|
src/svelte -> dist/svelte
|
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,27 @@
|
|
1
1
|
# jazz-tools
|
2
2
|
|
3
|
+
## 0.18.5
|
4
|
+
|
5
|
+
### Patch Changes
|
6
|
+
|
7
|
+
- ff35d8c: fix: accountID property presence on typescript for Better Auth user's shape
|
8
|
+
- f23a7a7: fix: Jazz credentials were not properly retrieved during SSO flows in Better Auth
|
9
|
+
- f5d8424: Fallback to random session when running Jazz in a browser without navigator.lock support
|
10
|
+
- 4e976b8: Added the co.input convenience type, to easily extract the create payload type.
|
11
|
+
- cojson@0.18.5
|
12
|
+
- cojson-storage-indexeddb@0.18.5
|
13
|
+
- cojson-transport-ws@0.18.5
|
14
|
+
|
15
|
+
## 0.18.4
|
16
|
+
|
17
|
+
### Patch Changes
|
18
|
+
|
19
|
+
- 84313aa: Add `$jazz.id` to `toJSON` in Account, CoMap, CoFeed & FileStream
|
20
|
+
- 89aab7b: Deprecate `co.map().catchall`. Use a `co.record` nested inside a `co.map` if you need to store key-value properties.
|
21
|
+
- cojson@0.18.4
|
22
|
+
- cojson-storage-indexeddb@0.18.4
|
23
|
+
- cojson-transport-ws@0.18.4
|
24
|
+
|
3
25
|
## 0.18.3
|
4
26
|
|
5
27
|
### Patch Changes
|
@@ -188,6 +188,7 @@ export declare const AuthContext: import("react").Context<({
|
|
188
188
|
createdAt: Date;
|
189
189
|
updatedAt: Date;
|
190
190
|
image?: string | null | undefined;
|
191
|
+
accountID?: string | null | undefined;
|
191
192
|
};
|
192
193
|
session: {
|
193
194
|
id: string;
|
@@ -1834,7 +1835,7 @@ export declare const AuthContext: import("react").Context<({
|
|
1834
1835
|
image?: string;
|
1835
1836
|
callbackURL?: string;
|
1836
1837
|
fetchOptions?: FetchOptions | undefined;
|
1837
|
-
}>, data_1?: FetchOptions | undefined) => Promise<import("@better-fetch/fetch").BetterFetchResponse<NonNullable<{
|
1838
|
+
} & {} & {}>, data_1?: FetchOptions | undefined) => Promise<import("@better-fetch/fetch").BetterFetchResponse<NonNullable<{
|
1838
1839
|
token: null;
|
1839
1840
|
user: {
|
1840
1841
|
id: string;
|
@@ -1922,7 +1923,7 @@ export declare const AuthContext: import("react").Context<({
|
|
1922
1923
|
image?: string | null;
|
1923
1924
|
name?: string;
|
1924
1925
|
fetchOptions?: FetchOptions | undefined;
|
1925
|
-
} & Partial<{}>> | undefined, data_1?: FetchOptions | undefined) => Promise<import("@better-fetch/fetch").BetterFetchResponse<{
|
1926
|
+
} & Partial<{} & {}>> | undefined, data_1?: FetchOptions | undefined) => Promise<import("@better-fetch/fetch").BetterFetchResponse<{
|
1926
1927
|
status: boolean;
|
1927
1928
|
}, {
|
1928
1929
|
code?: string;
|
@@ -2014,6 +2015,7 @@ export declare const AuthContext: import("react").Context<({
|
|
2014
2015
|
createdAt: Date;
|
2015
2016
|
updatedAt: Date;
|
2016
2017
|
image?: string | null | undefined;
|
2018
|
+
accountID?: string | null | undefined;
|
2017
2019
|
};
|
2018
2020
|
session: {
|
2019
2021
|
id: string;
|
@@ -2109,6 +2111,7 @@ export declare const AuthContext: import("react").Context<({
|
|
2109
2111
|
createdAt: Date;
|
2110
2112
|
updatedAt: Date;
|
2111
2113
|
image?: string | null | undefined;
|
2114
|
+
accountID?: string | null | undefined;
|
2112
2115
|
};
|
2113
2116
|
session: {
|
2114
2117
|
id: string;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/react.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACf,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,KAAK,iBAAiB,EAIvB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,KAAK,iBAAiB,EAAiB,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,KAAK,UAAU,GAAG,UAAU,CAC1B,OAAO,gBAAgB,CAAC;IACtB,OAAO,EAAE,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC;CAChD,CAAC,CACH,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;6BA+E8jc,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAAk7yW,CAAC;+BAAyD,CAAC;gCAA0D,CAAC;6BAAuD,CAAC;;;;;;;;;;;;;;;;;;;;;;;qBAA9K,CAAC;2BAAyD,CAAC;4BAA0D,CAAC;yBAAuD,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;yBAAjmzW,CAAC
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/react.tsx"],"names":[],"mappings":"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"}
|
@@ -1,4 +1,23 @@
|
|
1
1
|
import { BetterAuthPlugin } from "better-auth/plugins";
|
2
|
+
type JazzPlugin = BetterAuthPlugin & {
|
3
|
+
schema: {
|
4
|
+
user: {
|
5
|
+
fields: {
|
6
|
+
accountID: {
|
7
|
+
type: "string";
|
8
|
+
required: false;
|
9
|
+
input: false;
|
10
|
+
};
|
11
|
+
encryptedCredentials: {
|
12
|
+
type: "string";
|
13
|
+
required: false;
|
14
|
+
input: false;
|
15
|
+
returned: false;
|
16
|
+
};
|
17
|
+
};
|
18
|
+
};
|
19
|
+
};
|
20
|
+
};
|
2
21
|
/**
|
3
22
|
* @returns The BetterAuth server plugin.
|
4
23
|
*
|
@@ -10,5 +29,6 @@ import { BetterAuthPlugin } from "better-auth/plugins";
|
|
10
29
|
* });
|
11
30
|
* ```
|
12
31
|
*/
|
13
|
-
export declare const jazzPlugin: () =>
|
32
|
+
export declare const jazzPlugin: () => JazzPlugin;
|
33
|
+
export {};
|
14
34
|
//# sourceMappingURL=server.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAC;
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/server.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAC;AAM7E,KAAK,UAAU,GAAG,gBAAgB,GAAG;IACnC,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,MAAM,EAAE;gBACN,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ,CAAC;oBACf,QAAQ,EAAE,KAAK,CAAC;oBAChB,KAAK,EAAE,KAAK,CAAC;iBACd,CAAC;gBACF,oBAAoB,EAAE;oBACpB,IAAI,EAAE,QAAQ,CAAC;oBACf,QAAQ,EAAE,KAAK,CAAC;oBAChB,KAAK,EAAE,KAAK,CAAC;oBACb,QAAQ,EAAE,KAAK,CAAC;iBACjB,CAAC;aACH,CAAC;SACH,CAAC;KACH,CAAC;CACH,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,UAAU,EAAE,MAAM,UAgM9B,CAAC"}
|
@@ -31,13 +31,13 @@ var jazzPlugin = () => {
|
|
31
31
|
before: async (user, context) => {
|
32
32
|
if (!contextContainsJazzAuth(context)) {
|
33
33
|
throw new APIError(422, {
|
34
|
-
message: "JazzAuth is required"
|
34
|
+
message: "JazzAuth is required on user creation"
|
35
35
|
});
|
36
36
|
}
|
37
37
|
return {
|
38
38
|
data: {
|
39
|
-
accountID: context
|
40
|
-
encryptedCredentials: context
|
39
|
+
accountID: context.jazzAuth.accountID,
|
40
|
+
encryptedCredentials: context.jazzAuth.encryptedCredentials
|
41
41
|
}
|
42
42
|
};
|
43
43
|
}
|
@@ -107,7 +107,7 @@ var jazzPlugin = () => {
|
|
107
107
|
*/
|
108
108
|
{
|
109
109
|
matcher: (context) => {
|
110
|
-
return context.path.startsWith("/callback");
|
110
|
+
return context.path.startsWith("/callback") || context.path.startsWith("/oauth2/callback");
|
111
111
|
},
|
112
112
|
handler: createAuthMiddleware(async (ctx) => {
|
113
113
|
const state = ctx.query?.state || ctx.body?.state;
|
@@ -129,7 +129,12 @@ var jazzPlugin = () => {
|
|
129
129
|
}
|
130
130
|
const parsed = JSON.parse(data.value);
|
131
131
|
if (parsed && "jazzAuth" in parsed) {
|
132
|
-
|
132
|
+
return {
|
133
|
+
context: {
|
134
|
+
...ctx,
|
135
|
+
jazzAuth: parsed.jazzAuth
|
136
|
+
}
|
137
|
+
};
|
133
138
|
} else {
|
134
139
|
throw new APIError(404, {
|
135
140
|
message: "JazzAuth not found in verification value"
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/better-auth/auth/server.ts"],"sourcesContent":["import { AuthContext, MiddlewareContext, MiddlewareOptions } from \"better-auth\";\nimport { APIError } from \"better-auth/api\";\nimport { symmetricDecrypt, symmetricEncrypt } from \"better-auth/crypto\";\nimport { BetterAuthPlugin, createAuthMiddleware } from \"better-auth/plugins\";\nimport type { Account, AuthCredentials, ID } from \"jazz-tools\";\n\n/**\n * @returns The BetterAuth server plugin.\n *\n * @example\n * ```ts\n * const auth = betterAuth({\n * plugins: [jazzPlugin()],\n * // ... other BetterAuth options\n * });\n * ```\n */\nexport const jazzPlugin = (): BetterAuthPlugin => {\n return {\n id: \"jazz-plugin\",\n schema: {\n user: {\n fields: {\n accountID: {\n type: \"string\",\n required: false,\n input: false,\n },\n encryptedCredentials: {\n type: \"string\",\n required: false,\n input: false,\n returned: false,\n },\n },\n },\n },\n\n init() {\n return {\n options: {\n databaseHooks: {\n user: {\n create: {\n before: async (user, context) => {\n // If the user is created without a jazzAuth, it will throw an error.\n if (!contextContainsJazzAuth(context)) {\n throw new APIError(422, {\n message: \"JazzAuth is required\",\n });\n }\n // Decorate the user with the jazz's credentials.\n return {\n data: {\n accountID: context?.jazzAuth?.accountID,\n encryptedCredentials:\n context?.jazzAuth?.encryptedCredentials,\n },\n };\n },\n },\n },\n verification: {\n create: {\n before: async (verification, context) => {\n // If a jazzAuth is provided, save it for later usage.\n if (contextContainsJazzAuth(context)) {\n const parsed = JSON.parse(verification.value);\n const newValue = JSON.stringify({\n ...parsed,\n jazzAuth: context.jazzAuth,\n });\n\n return {\n data: {\n value: newValue,\n },\n };\n }\n },\n },\n },\n },\n },\n };\n },\n\n hooks: {\n before: [\n /**\n * If the client sends a x-jazz-auth header,\n * we encrypt the credentials and inject them into the context.\n */\n {\n matcher: (context) => {\n return !!context.headers?.get(\"x-jazz-auth\");\n },\n handler: createAuthMiddleware(async (ctx) => {\n const jazzAuth = JSON.parse(ctx.headers?.get(\"x-jazz-auth\")!);\n\n const credentials: AuthCredentials = {\n accountID: jazzAuth.accountID as ID<Account>,\n secretSeed: jazzAuth.secretSeed,\n accountSecret: jazzAuth.accountSecret as any,\n // If the provider remains 'anonymous', Jazz will not consider us authenticated later.\n provider: \"better-auth\",\n };\n\n const encryptedCredentials = await symmetricEncrypt({\n key: ctx.context.secret,\n data: JSON.stringify(credentials),\n });\n\n return {\n context: {\n ...ctx,\n jazzAuth: {\n accountID: jazzAuth.accountID,\n encryptedCredentials: encryptedCredentials,\n },\n },\n };\n }),\n },\n\n /**\n * /callback is the endpoint that BetterAuth uses to authenticate the user coming from a social provider.\n * 1. Catch the state\n * 2. Find the verification value\n * 3. If the verification value contains a jazzAuth, inject into the context to have it in case of registration.\n */\n {\n matcher: (context) => {\n return context.path.startsWith(\"/callback\");\n },\n handler: createAuthMiddleware(async (ctx) => {\n const state = ctx.query?.state || ctx.body?.state;\n\n const data = await ctx.context.adapter.findOne<{ value: string }>({\n model: ctx.context.tables.verification!.modelName,\n where: [\n {\n field: \"identifier\",\n operator: \"eq\",\n value: state,\n },\n ],\n select: [\"value\"],\n });\n\n // if not found, the social plugin will throw later anyway\n if (!data) {\n throw new APIError(404, {\n message: \"Verification not found\",\n });\n }\n\n const parsed = JSON.parse(data.value);\n\n if (parsed && \"jazzAuth\" in parsed) {\n ctx.context.jazzAuth = parsed.jazzAuth;\n } else {\n throw new APIError(404, {\n message: \"JazzAuth not found in verification value\",\n });\n }\n }),\n },\n ],\n after: [\n /**\n * This middleware is used to extract the jazzAuth from the user and return it in the response.\n * It is used in the following endpoints that return the user:\n * - /sign-up/email\n * - /sign-in/email\n * - /get-session\n */\n {\n matcher: (context) => {\n return (\n context.path.startsWith(\"/sign-up\") ||\n context.path.startsWith(\"/sign-in\") ||\n context.path.startsWith(\"/get-session\")\n );\n },\n handler: createAuthMiddleware({}, async (ctx) => {\n const returned = ctx.context.returned as any;\n if (!returned?.user?.id) {\n return;\n }\n const jazzAuth = await extractJazzAuth(returned.user.id, ctx);\n\n return ctx.json({\n ...returned,\n jazzAuth: jazzAuth,\n });\n }),\n },\n ],\n },\n };\n};\n\nfunction contextContainsJazzAuth(ctx: unknown): ctx is {\n jazzAuth: {\n accountID: string;\n encryptedCredentials: string;\n };\n} {\n return !!ctx && typeof ctx === \"object\" && \"jazzAuth\" in ctx;\n}\n\nasync function extractJazzAuth(\n userId: string,\n ctx: MiddlewareContext<\n MiddlewareOptions,\n AuthContext & {\n returned?: unknown;\n responseHeaders?: Headers;\n }\n >,\n) {\n const user = await ctx.context.adapter.findOne<{\n accountID: string;\n encryptedCredentials: string;\n }>({\n model: ctx.context.tables.user!.modelName,\n where: [\n {\n field: \"id\",\n operator: \"eq\",\n value: userId,\n },\n ],\n select: [\"accountID\", \"encryptedCredentials\"],\n });\n\n if (!user) {\n return;\n }\n\n const jazzAuth = JSON.parse(\n await symmetricDecrypt({\n key: ctx.context.secret,\n data: user.encryptedCredentials,\n }),\n );\n\n return jazzAuth;\n}\n"],"mappings":"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","names":[]}
|
1
|
+
{"version":3,"sources":["../../../src/better-auth/auth/server.ts"],"sourcesContent":["import { AuthContext, MiddlewareContext, MiddlewareOptions } from \"better-auth\";\nimport { APIError } from \"better-auth/api\";\nimport { symmetricDecrypt, symmetricEncrypt } from \"better-auth/crypto\";\nimport { BetterAuthPlugin, createAuthMiddleware } from \"better-auth/plugins\";\nimport type { Account, AuthCredentials, ID } from \"jazz-tools\";\n\n// Define a type to have user fields mapped in the better-auth instance\n// It should be automatic, but it needs an hard reference to BetterAuthPlugin type\n// in order to be exported as library.\ntype JazzPlugin = BetterAuthPlugin & {\n schema: {\n user: {\n fields: {\n accountID: {\n type: \"string\";\n required: false;\n input: false;\n };\n encryptedCredentials: {\n type: \"string\";\n required: false;\n input: false;\n returned: false;\n };\n };\n };\n };\n};\n\n/**\n * @returns The BetterAuth server plugin.\n *\n * @example\n * ```ts\n * const auth = betterAuth({\n * plugins: [jazzPlugin()],\n * // ... other BetterAuth options\n * });\n * ```\n */\nexport const jazzPlugin: () => JazzPlugin = () => {\n return {\n id: \"jazz-plugin\",\n schema: {\n user: {\n fields: {\n accountID: {\n type: \"string\",\n required: false,\n input: false,\n },\n encryptedCredentials: {\n type: \"string\",\n required: false,\n input: false,\n returned: false,\n },\n },\n },\n },\n\n init() {\n return {\n options: {\n databaseHooks: {\n user: {\n create: {\n before: async (user, context) => {\n // If the user is created without a jazzAuth, it will throw an error.\n if (!contextContainsJazzAuth(context)) {\n throw new APIError(422, {\n message: \"JazzAuth is required on user creation\",\n });\n }\n // Decorate the user with the jazz's credentials.\n return {\n data: {\n accountID: context.jazzAuth.accountID,\n encryptedCredentials:\n context.jazzAuth.encryptedCredentials,\n },\n };\n },\n },\n },\n verification: {\n create: {\n before: async (verification, context) => {\n // If a jazzAuth is provided, save it for later usage.\n if (contextContainsJazzAuth(context)) {\n const parsed = JSON.parse(verification.value);\n const newValue = JSON.stringify({\n ...parsed,\n jazzAuth: context.jazzAuth,\n });\n\n return {\n data: {\n value: newValue,\n },\n };\n }\n },\n },\n },\n },\n },\n };\n },\n\n hooks: {\n before: [\n /**\n * If the client sends a x-jazz-auth header,\n * we encrypt the credentials and inject them into the context.\n */\n {\n matcher: (context) => {\n return !!context.headers?.get(\"x-jazz-auth\");\n },\n handler: createAuthMiddleware(async (ctx) => {\n const jazzAuth = JSON.parse(ctx.headers?.get(\"x-jazz-auth\")!);\n\n const credentials: AuthCredentials = {\n accountID: jazzAuth.accountID as ID<Account>,\n secretSeed: jazzAuth.secretSeed,\n accountSecret: jazzAuth.accountSecret as any,\n // If the provider remains 'anonymous', Jazz will not consider us authenticated later.\n provider: \"better-auth\",\n };\n\n const encryptedCredentials = await symmetricEncrypt({\n key: ctx.context.secret,\n data: JSON.stringify(credentials),\n });\n\n return {\n context: {\n ...ctx,\n jazzAuth: {\n accountID: jazzAuth.accountID,\n encryptedCredentials: encryptedCredentials,\n },\n },\n };\n }),\n },\n\n /**\n * /callback is the endpoint that BetterAuth uses to authenticate the user coming from a social provider.\n * 1. Catch the state\n * 2. Find the verification value\n * 3. If the verification value contains a jazzAuth, inject into the context to have it in case of registration.\n */\n {\n matcher: (context) => {\n return (\n context.path.startsWith(\"/callback\") ||\n context.path.startsWith(\"/oauth2/callback\")\n );\n },\n handler: createAuthMiddleware(async (ctx) => {\n const state = ctx.query?.state || ctx.body?.state;\n\n const data = await ctx.context.adapter.findOne<{ value: string }>({\n model: ctx.context.tables.verification!.modelName,\n where: [\n {\n field: \"identifier\",\n operator: \"eq\",\n value: state,\n },\n ],\n select: [\"value\"],\n });\n\n // if not found, the social plugin will throw later anyway\n if (!data) {\n throw new APIError(404, {\n message: \"Verification not found\",\n });\n }\n\n const parsed = JSON.parse(data.value);\n\n if (parsed && \"jazzAuth\" in parsed) {\n return {\n context: {\n ...ctx,\n jazzAuth: parsed.jazzAuth,\n },\n };\n } else {\n throw new APIError(404, {\n message: \"JazzAuth not found in verification value\",\n });\n }\n }),\n },\n ],\n after: [\n /**\n * This middleware is used to extract the jazzAuth from the user and return it in the response.\n * It is used in the following endpoints that return the user:\n * - /sign-up/email\n * - /sign-in/email\n * - /get-session\n */\n {\n matcher: (context) => {\n return (\n context.path.startsWith(\"/sign-up\") ||\n context.path.startsWith(\"/sign-in\") ||\n context.path.startsWith(\"/get-session\")\n );\n },\n handler: createAuthMiddleware({}, async (ctx) => {\n const returned = ctx.context.returned as any;\n if (!returned?.user?.id) {\n return;\n }\n const jazzAuth = await extractJazzAuth(returned.user.id, ctx);\n\n return ctx.json({\n ...returned,\n jazzAuth: jazzAuth,\n });\n }),\n },\n ],\n },\n } satisfies JazzPlugin;\n};\n\nfunction contextContainsJazzAuth(ctx: unknown): ctx is {\n jazzAuth: {\n accountID: string;\n encryptedCredentials: string;\n };\n} {\n return !!ctx && typeof ctx === \"object\" && \"jazzAuth\" in ctx;\n}\n\nasync function extractJazzAuth(\n userId: string,\n ctx: MiddlewareContext<\n MiddlewareOptions,\n AuthContext & {\n returned?: unknown;\n responseHeaders?: Headers;\n }\n >,\n) {\n const user = await ctx.context.adapter.findOne<{\n accountID: string;\n encryptedCredentials: string;\n }>({\n model: ctx.context.tables.user!.modelName,\n where: [\n {\n field: \"id\",\n operator: \"eq\",\n value: userId,\n },\n ],\n select: [\"accountID\", \"encryptedCredentials\"],\n });\n\n if (!user) {\n return;\n }\n\n const jazzAuth = JSON.parse(\n await symmetricDecrypt({\n key: ctx.context.secret,\n data: user.encryptedCredentials,\n }),\n );\n\n return jazzAuth;\n}\n"],"mappings":"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","names":[]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createBrowserContext.d.ts","sourceRoot":"","sources":["../../src/browser/createBrowserContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,YAAY,EAAE,MAAM,QAAQ,CAAC;AAIvD,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;AAEpB,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAKvE,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AA2EF,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,yBAAyB;;;;;GA2BnC;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;;;;;;GAmDlC;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,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,EAChC,MAAM,EAAE,cAAc
|
1
|
+
{"version":3,"file":"createBrowserContext.d.ts","sourceRoot":"","sources":["../../src/browser/createBrowserContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,YAAY,EAAE,MAAM,QAAQ,CAAC;AAIvD,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;AAEpB,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAKvE,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AA2EF,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,yBAAyB;;;;;GA2BnC;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;;;;;;GAmDlC;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,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,EAChC,MAAM,EAAE,cAAc;;;GAwDvB;AAED,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"}
|
package/dist/browser/index.js
CHANGED
@@ -330,6 +330,13 @@ async function createJazzBrowserContext(options) {
|
|
330
330
|
};
|
331
331
|
}
|
332
332
|
function provideBrowserLockSession(accountID, crypto) {
|
333
|
+
if (typeof navigator === "undefined" || !navigator.locks?.request) {
|
334
|
+
return Promise.resolve({
|
335
|
+
sessionID: crypto.newRandomSessionID(accountID),
|
336
|
+
sessionDone: () => {
|
337
|
+
}
|
338
|
+
});
|
339
|
+
}
|
333
340
|
let sessionDone;
|
334
341
|
const donePromise = new Promise((resolve) => {
|
335
342
|
sessionDone = resolve;
|
@@ -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/storageOptions.ts","../../src/browser/BrowserContextManager.ts","../../src/browser/auth/LocalStorageKVStore.ts"],"sourcesContent":["import {\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: \"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 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: 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: Uint8Array.from([0, 1, 2]),\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, RawAccountID } 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 { StorageConfig, getStorageOptions } from \"./storageOptions.js\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\n\nsetupInspector();\n\nexport type BaseBrowserContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: StorageConfig;\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 { useIndexedDB } = getStorageOptions(options.storage);\n\n const peersToLoadFrom: Peer[] = [];\n\n const storage = useIndexedDB ? await getIndexedDBStorage() : undefined;\n\n if (options.sync.when === \"never\") {\n return {\n toggleNetwork: () => {},\n peersToLoadFrom,\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 peersToLoadFrom.push(peer);\n }\n },\n removePeer: (peer) => {\n peersToLoadFrom.splice(peersToLoadFrom.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 peersToLoadFrom,\n storage,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzBrowserGuestContext(\n options: BaseBrowserContextOptions,\n) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\n await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peersToLoadFrom,\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 };\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 { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\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 peersToLoadFrom,\n storage,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: provideBrowserLockSession,\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 };\n}\n\n/** @category Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\nexport function provideBrowserLockSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n) {\n let sessionDone!: () => void;\n const donePromise = new Promise<void>((resolve) => {\n sessionDone = resolve;\n });\n\n let resolveSession: (sessionID: SessionID) => void;\n const sessionPromise = new Promise<SessionID>((resolve) => {\n resolveSession = resolve;\n });\n\n void (async function () {\n for (let idx = 0; idx < 100; idx++) {\n // To work better around StrictMode\n for (let retry = 0; retry < 2; retry++) {\n // console.debug(\"Trying to get lock\", accountID + \"_\" + idx);\n const sessionFinishedOrNoLock = await navigator.locks.request(\n accountID + \"_\" + idx,\n { ifAvailable: true },\n async (lock) => {\n if (!lock) return \"noLock\";\n\n const sessionID =\n localStorage.getItem(accountID + \"_\" + idx) ||\n crypto.newRandomSessionID(accountID as RawAccountID | AgentID);\n localStorage.setItem(accountID + \"_\" + idx, sessionID);\n\n resolveSession(sessionID as SessionID);\n\n await donePromise;\n console.log(\"Done with lock\", accountID + \"_\" + idx, sessionID);\n return \"sessionFinished\";\n },\n );\n\n if (sessionFinishedOrNoLock === \"sessionFinished\") {\n return;\n }\n }\n }\n throw new Error(\"Couldn't get lock on session after 100x2 tries\");\n })();\n\n return sessionPromise.then((sessionID) => ({\n sessionID,\n sessionDone,\n }));\n}\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","type StorageOption = \"indexedDB\";\ntype CombinedStorageOption = [\"indexedDB\"];\nexport type StorageConfig =\n | StorageOption\n | CombinedStorageOption\n | [StorageOption];\n\nexport function getStorageOptions(storage?: StorageConfig): {\n useIndexedDB: boolean;\n} {\n const useIndexedDB =\n !storage ||\n (Array.isArray(storage) && storage.includes(\"indexedDB\")) ||\n storage === \"indexedDB\";\n\n return { useIndexedDB };\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/storageOptions.ts","../../src/browser/BrowserContextManager.ts","../../src/browser/auth/LocalStorageKVStore.ts"],"sourcesContent":["import {\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: \"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 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: 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: Uint8Array.from([0, 1, 2]),\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, RawAccountID } 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 { StorageConfig, getStorageOptions } from \"./storageOptions.js\";\nimport { setupInspector } from \"./utils/export-account-inspector.js\";\n\nsetupInspector();\n\nexport type BaseBrowserContextOptions = {\n sync: SyncConfig;\n reconnectionTimeout?: number;\n storage?: StorageConfig;\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 { useIndexedDB } = getStorageOptions(options.storage);\n\n const peersToLoadFrom: Peer[] = [];\n\n const storage = useIndexedDB ? await getIndexedDBStorage() : undefined;\n\n if (options.sync.when === \"never\") {\n return {\n toggleNetwork: () => {},\n peersToLoadFrom,\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 peersToLoadFrom.push(peer);\n }\n },\n removePeer: (peer) => {\n peersToLoadFrom.splice(peersToLoadFrom.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 peersToLoadFrom,\n storage,\n setNode,\n crypto,\n };\n}\n\nexport async function createJazzBrowserGuestContext(\n options: BaseBrowserContextOptions,\n) {\n const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\n await setupPeers(options);\n\n const context = await createAnonymousJazzContext({\n crypto,\n peersToLoadFrom,\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 };\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 { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =\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 peersToLoadFrom,\n storage,\n crypto,\n defaultProfileName: options.defaultProfileName,\n AccountSchema: options.AccountSchema,\n sessionProvider: provideBrowserLockSession,\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 };\n}\n\n/** @category Auth Providers */\nexport type SessionProvider = (\n accountID: ID<Account> | AgentID,\n) => Promise<SessionID>;\n\nexport function provideBrowserLockSession(\n accountID: ID<Account> | AgentID,\n crypto: CryptoProvider,\n) {\n if (typeof navigator === \"undefined\" || !navigator.locks?.request) {\n // Fallback to random session ID for each tab session\n return Promise.resolve({\n sessionID: crypto.newRandomSessionID(accountID as RawAccountID | AgentID),\n sessionDone: () => {},\n });\n }\n\n let sessionDone!: () => void;\n const donePromise = new Promise<void>((resolve) => {\n sessionDone = resolve;\n });\n\n let resolveSession: (sessionID: SessionID) => void;\n const sessionPromise = new Promise<SessionID>((resolve) => {\n resolveSession = resolve;\n });\n\n void (async function () {\n for (let idx = 0; idx < 100; idx++) {\n // To work better around StrictMode\n for (let retry = 0; retry < 2; retry++) {\n // console.debug(\"Trying to get lock\", accountID + \"_\" + idx);\n const sessionFinishedOrNoLock = await navigator.locks.request(\n accountID + \"_\" + idx,\n { ifAvailable: true },\n async (lock) => {\n if (!lock) return \"noLock\";\n\n const sessionID =\n localStorage.getItem(accountID + \"_\" + idx) ||\n crypto.newRandomSessionID(accountID as RawAccountID | AgentID);\n localStorage.setItem(accountID + \"_\" + idx, sessionID);\n\n resolveSession(sessionID as SessionID);\n\n await donePromise;\n console.log(\"Done with lock\", accountID + \"_\" + idx, sessionID);\n return \"sessionFinished\";\n },\n );\n\n if (sessionFinishedOrNoLock === \"sessionFinished\") {\n return;\n }\n }\n }\n throw new Error(\"Couldn't get lock on session after 100x2 tries\");\n })();\n\n return sessionPromise.then((sessionID) => ({\n sessionID,\n sessionDone,\n }));\n}\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","type StorageOption = \"indexedDB\";\ntype CombinedStorageOption = [\"indexedDB\"];\nexport type StorageConfig =\n | StorageOption\n | CombinedStorageOption\n | [StorageOption];\n\nexport function getStorageOptions(storage?: StorageConfig): {\n useIndexedDB: boolean;\n} {\n const useIndexedDB =\n !storage ||\n (Array.isArray(storage) && storage.includes(\"indexedDB\")) ||\n storage === \"indexedDB\";\n\n return { useIndexedDB };\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":";AAAA;AAAA,EAKE,oBAAoB;AAAA,EACpB;AAAA,OACK;;;ACPP,SAAS,yBAAyB;AAElC,eAAe,2BAA2B;AACxC,QAAM,oBAAoB,IAAI,kBAAkB;AAChD,QAAM,mBAAmB,MAAM,kBAAkB,IAAI;AAErD,MAAI,CAAC,kBAAkB;AACrB,YAAQ,MAAM,uCAAuC;AACrD;AAAA,EACF;AAEA,QAAM,uBAAuB,KAAK,iBAAiB,aAAa;AAChE,SAAO;AAAA,IACL,IAAI;AAAA,MACF,YAAY,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,MAC/D;AAAA,IACF,EAAE,SAAS;AAAA,IACX;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB;AACvB,MAAI,OAAO,WAAW,YAAa;AAEnC,QAAM,KAAK,CAAC,MAAW;AACrB,QAAI,EAAE,WAAW,EAAE,QAAQ,KAAK;AAC9B,UACE;AAAA,QACE;AAAA,MACF,GACA;AACA,iCAAyB;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAEA,SAAO,iBAAiB,WAAW,EAAE;AAErC,SAAO,MAAM;AACX,WAAO,oBAAoB,WAAW,EAAE;AAAA,EAC1C;AACF;AAMO,SAAS,iBAAiB;AAC/B,MAAI,OAAO,WAAW,YAAa;AAEnC,QAAM,MAAM,IAAI,IAAI,OAAO,SAAS,IAAI;AACxC,MACE,IAAI,KAAK,SAAS,oBAAoB,KACtC,QAAQ,IAAI,aAAa,eACzB;AACA,WAAO,cAAc;AAAA,EACvB;AACF;;;ACzDA,SAAuC,uBAAuB;AAC9D;AAAA,EACE;AAAA,OAIK;AAaA,IAAM,qBAAN,MAAyB;AAAA,EAC9B,YACY,QACA,cACA,mBACH,SACA,cAAsB,OAAO,SAAS,UAC7C;AALU;AACA;AACA;AACH;AACA;AAKT,iBAAQ,YAAY;AAClB,YAAM,EAAE,QAAQ,aAAa,IAAI;AAEjC,YAAM,qBAAqB,MAAM,KAAK,sBAAsB;AAE5D,UAAI,CAAC,oBAAoB;AACvB;AAAA,MACF;AAEA,YAAM,4BAA4B,IAAI;AAAA,QACpC,mBAAmB,SAAS;AAAA,MAC9B;AACA,YAAM,oBAAoB,0BAA0B;AAAA,QAClD;AAAA,QACA,gBAAgB;AAAA,MAClB;AAEA,YAAM,SAAS,OAAO,0BAA0B,iBAAiB;AAEjE,YAAM,YAAY,gBAAgB;AAAA,QAChC,0BAA0B;AAAA,UACxB,gBAAgB;AAAA,UAChB,gBAAgB,mBAAmB,gBAAgB;AAAA,QACrD;AAAA,MACF;AAEA,YAAM,aAAa;AAAA,QACjB;AAAA,QACA,eAAe;AAAA,MACjB,CAAC;AAED,YAAM,KAAK,kBAAkB,IAAI;AAAA,QAC/B;AAAA,QACA,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,kBAAS,OAAO,aAAqB;AACnC,YAAM,cAAc,MAAM,KAAK,kBAAkB,IAAI;AAErD,UAAI,CAAC,aAAa,YAAY;AAC5B,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,YAAM,KAAK,yBAAyB;AAAA,QAClC,WAAW,YAAY;AAAA,QACvB,YAAY,YAAY;AAAA,QACxB;AAAA,MACF,CAAC;AAED,YAAM,iBAAiB,MAAM,QAAQ,MAAM,EAAE,MAAM,aAAa;AAAA,QAC9D,SAAS;AAAA,UACP,SAAS;AAAA,QACX;AAAA,MACF,CAAC;AAED,UAAI,SAAS,KAAK,EAAE,WAAW,GAAG;AAChC,uBAAe,QAAQ,MAAM,IAAI,QAAQ,QAAQ;AAAA,MACnD;AAEA,YAAM,KAAK,kBAAkB,IAAI;AAAA,QAC/B,WAAW,YAAY;AAAA,QACvB,YAAY,YAAY;AAAA,QACxB,eAAe,YAAY;AAAA,QAC3B,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAAA,EA1EG;AAAA,EA4EH,MAAc,yBAAyB;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAIG;AACD,UAAM,4BAA4B,IAAI;AAAA,MACpC,gBAAgB,mBAAmB,gBAAgB;AAAA,IACrD;AAEA,8BAA0B,IAAI,UAAU;AACxC,8BAA0B;AAAA,MACxB,gBAAgB,eAAe,SAAoC;AAAA,MACnE,gBAAgB;AAAA,IAClB;AAEA,QAAI;AACF,YAAM,UAAU,YAAY,OAAO;AAAA,QACjC,WAAW;AAAA,UACT,WAAW,KAAK,OAAO,YAAY,EAAE;AAAA,UACrC,IAAI;AAAA,YACF,MAAM,KAAK;AAAA,YACX,IAAI,KAAK;AAAA,UACX;AAAA,UACA,MAAM;AAAA,YACJ,IAAI;AAAA,YACJ,MAAM,WAAW,MAAK,oBAAI,KAAK,GAAE,eAAe,CAAC;AAAA,YACjD,aAAa;AAAA,UACf;AAAA,UACA,kBAAkB;AAAA,YAChB,EAAE,KAAK,IAAI,MAAM,aAAa;AAAA,YAC9B,EAAE,KAAK,IAAI,MAAM,aAAa;AAAA,YAC9B,EAAE,KAAK,KAAK,MAAM,aAAa;AAAA,YAC/B,EAAE,KAAK,MAAM,MAAM,aAAa;AAAA,UAClC;AAAA,UACA,wBAAwB;AAAA,YACtB,oBAAoB;AAAA,YACpB,aAAa;AAAA,YACb,kBAAkB;AAAA,UACpB;AAAA,UACA,SAAS;AAAA,UACT,aAAa;AAAA,QACf;AAAA,MACF,CAAC;AAAA,IACH,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,4BAA4B,EAAE,OAAO,MAAM,CAAC;AAAA,IAC9D;AAAA,EACF;AAAA,EAEA,MAAc,wBAAwB;AACpC,QAAI;AACF,YAAM,QAAQ,MAAM,UAAU,YAAY,IAAI;AAAA,QAC5C,WAAW;AAAA,UACT,WAAW,WAAW,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;AAAA,UACpC,MAAM,KAAK;AAAA,UACX,kBAAkB,CAAC;AAAA,UACnB,SAAS;AAAA,UACT,kBAAkB;AAAA,QACpB;AAAA,QACA,WAAW;AAAA,MACb,CAAC;AAED,aAAO;AAAA,IAGT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,4BAA4B,EAAE,OAAO,MAAM,CAAC;AAAA,IAC9D;AAAA,EACF;AACF;AA3Ja,mBASK,KAAK;;;AC3BvB,SAAS,2BAA2B;AACpC,SAAS,qCAAqC;AAC9C,SAAS,kBAAkB;AAC3B;AAAA,EAeE,mBAAAA;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB;;;ACf3B,SAAS,kBAAkB,SAEhC;AACA,QAAM,eACJ,CAAC,WACA,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,WAAW,KACvD,YAAY;AAEd,SAAO,EAAE,aAAa;AACxB;;;ADUA,eAAe;AAUf,IAAM,uCAAN,cAAmD,8BAA8B;AAAA,EAC/E,gBAAgB,UAAoD;AAClE,UAAM,UAAU,MAAM,SAAS,UAAU,MAAM;AAC/C,WAAO,iBAAiB,UAAU,OAAO;AACzC,WAAO,iBAAiB,WAAW,OAAO;AAE1C,WAAO,MAAM;AACX,aAAO,oBAAoB,UAAU,OAAO;AAC5C,aAAO,oBAAoB,WAAW,OAAO;AAAA,IAC/C;AAAA,EACF;AACF;AAEA,eAAe,WAAW,SAAoC;AAC5D,QAAM,SAAS,QAAQ,UAAW,MAAM,WAAW,OAAO;AAC1D,MAAI,OAA8B;AAElC,QAAM,EAAE,aAAa,IAAI,kBAAkB,QAAQ,OAAO;AAE1D,QAAM,kBAA0B,CAAC;AAEjC,QAAM,UAAU,eAAe,MAAM,oBAAoB,IAAI;AAE7D,MAAI,QAAQ,KAAK,SAAS,SAAS;AACjC,WAAO;AAAA,MACL,eAAe,MAAM;AAAA,MAAC;AAAA,MACtB;AAAA,MACA;AAAA,MACA,SAAS,MAAM;AAAA,MAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AAEA,QAAM,SAAS,IAAI,qCAAqC;AAAA,IACtD,MAAM,QAAQ,KAAK;AAAA,IACnB,qBAAqB,QAAQ;AAAA,IAC7B,SAAS,CAAC,SAAS;AACjB,UAAI,MAAM;AACR,aAAK,YAAY,QAAQ,IAAI;AAAA,MAC/B,OAAO;AACL,wBAAgB,KAAK,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,YAAY,CAAC,SAAS;AACpB,sBAAgB,OAAO,gBAAgB,QAAQ,IAAI,GAAG,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AAED,WAAS,cAAc,SAAkB;AACvC,QAAI,SAAS;AACX,aAAO,OAAO;AAAA,IAChB,OAAO;AACL,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAEA,WAAS,QAAQ,OAAkB;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,KAAK,SAAS,YAAY,CAAC,QAAQ,KAAK,MAAM;AACxD,kBAAc,IAAI;AAAA,EACpB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,eAAsB,8BACpB,SACA;AACA,QAAM,EAAE,eAAe,iBAAiB,SAAS,QAAQ,QAAQ,IAC/D,MAAM,WAAW,OAAO;AAE1B,QAAM,UAAU,MAAM,2BAA2B;AAAA,IAC/C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,UAAQ,QAAQ,MAAM,IAAI;AAE1B,UAAQ,kBAAkB,WAAW,IAAI;AAEzC,SAAO;AAAA,IACL,OAAO,QAAQ;AAAA,IACf,MAAM,QAAQ,MAAM;AAAA,IACpB,MAAM,MAAM;AAEV,oBAAc,KAAK;AACnB,cAAQ,KAAK;AAAA,IACf;AAAA,IACA,QAAQ,MAAM;AACZ,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AACF;AAaA,eAAsB,yBAIpB,SAAmC;AACnC,QAAM,EAAE,eAAe,iBAAiB,SAAS,QAAQ,QAAQ,IAC/D,MAAM,WAAW,OAAO;AAE1B,MAAI,wBAAwB,MAAM;AAAA,EAAC;AAEnC,MAAI,QAAQ,KAAK,SAAS,YAAY;AAIpC,QAASC,oBAAT,SAA0B,iBAA0B;AAClD,UAAI,iBAAiB;AACnB,sBAAc,IAAI;AAAA,MACpB,OAAO;AACL,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AANS,2BAAAA;AAHT,UAAM,oBAAoB,QAAQ;AAClC,UAAM,cAAc,QAAQ,eAAgB,MAAM,kBAAkB,IAAI;AAUxE,4BAAwB,kBAAkB,SAASA,iBAAgB;AACnE,IAAAA,kBAAiB,kBAAkB,mBAAmB,WAAW,CAAC;AAAA,EACpE;AAEA,QAAM,UAAU,MAAM,kBAAkB;AAAA,IACtC,aAAa,QAAQ;AAAA,IACrB,iBAAiB,QAAQ;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB,QAAQ;AAAA,IAC5B,eAAe,QAAQ;AAAA,IACvB,iBAAiB;AAAA,IACjB,mBAAmB,QAAQ;AAAA,EAC7B,CAAC;AAED,UAAQ,QAAQ,IAAI;AAEpB,SAAO;AAAA,IACL,IAAI,QAAQ;AAAA,IACZ,MAAM,QAAQ;AAAA,IACd,mBAAmB,QAAQ;AAAA,IAC3B,MAAM,MAAM;AAEV,oBAAc,KAAK;AACnB,4BAAsB;AACtB,cAAQ,KAAK;AAAA,IACf;AAAA,IACA,QAAQ,MAAM;AACZ,4BAAsB;AACtB,aAAO,QAAQ,OAAO;AAAA,IACxB;AAAA,EACF;AACF;AAOO,SAAS,0BACd,WACA,QACA;AACA,MAAI,OAAO,cAAc,eAAe,CAAC,UAAU,OAAO,SAAS;AAEjE,WAAO,QAAQ,QAAQ;AAAA,MACrB,WAAW,OAAO,mBAAmB,SAAmC;AAAA,MACxE,aAAa,MAAM;AAAA,MAAC;AAAA,IACtB,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,QAAM,cAAc,IAAI,QAAc,CAAC,YAAY;AACjD,kBAAc;AAAA,EAChB,CAAC;AAED,MAAI;AACJ,QAAM,iBAAiB,IAAI,QAAmB,CAAC,YAAY;AACzD,qBAAiB;AAAA,EACnB,CAAC;AAED,OAAM,iBAAkB;AACtB,aAAS,MAAM,GAAG,MAAM,KAAK,OAAO;AAElC,eAAS,QAAQ,GAAG,QAAQ,GAAG,SAAS;AAEtC,cAAM,0BAA0B,MAAM,UAAU,MAAM;AAAA,UACpD,YAAY,MAAM;AAAA,UAClB,EAAE,aAAa,KAAK;AAAA,UACpB,OAAO,SAAS;AACd,gBAAI,CAAC,KAAM,QAAO;AAElB,kBAAM,YACJ,aAAa,QAAQ,YAAY,MAAM,GAAG,KAC1C,OAAO,mBAAmB,SAAmC;AAC/D,yBAAa,QAAQ,YAAY,MAAM,KAAK,SAAS;AAErD,2BAAe,SAAsB;AAErC,kBAAM;AACN,oBAAQ,IAAI,kBAAkB,YAAY,MAAM,KAAK,SAAS;AAC9D,mBAAO;AAAA,UACT;AAAA,QACF;AAEA,YAAI,4BAA4B,mBAAmB;AACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE,EAAG;AAEH,SAAO,eAAe,KAAK,CAAC,eAAe;AAAA,IACzC;AAAA,IACA;AAAA,EACF,EAAE;AACJ;;;AE9QA;AAAA,EAKE;AAAA,EAEA;AAAA,OAEK;;;ACPA,IAAM,sBAAN,MAA6C;AAAA,EAClD,cAAc;AAAA,EAAC;AAAA,EAEf,MAAM,IAAI,KAAa;AACrB,WAAO,aAAa,QAAQ,GAAG;AAAA,EACjC;AAAA,EAEA,MAAM,IAAI,KAAa,OAAe;AACpC,iBAAa,QAAQ,KAAK,KAAK;AAAA,EACjC;AAAA,EAEA,MAAM,OAAO,KAAa;AACxB,iBAAa,WAAW,GAAG;AAAA,EAC7B;AAAA,EAEA,MAAM,WAAW;AACf,iBAAa,MAAM;AAAA,EACrB;AACF;;;ADeO,IAAM,4BAAN,cAIG,mBAAoE;AAAA;AAAA,EAE5E,aAAa;AACX,QAAI,OAAO,WAAW,aAAa;AAEjC,aAAO,IAAI,gBAAgB;AAAA,IAC7B,OAAO;AACL,aAAO,IAAI,oBAAoB;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,cACJ,OACA,WACA;AACA,QAAI,MAAM,WAAW;AACnB,aAAO,8BAA8B;AAAA,QACnC,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AAAA,IACH,OAAO;AACL,aAAO,yBAA4B;AAAA,QACjC,MAAM,MAAM;AAAA,QACZ,SAAS,MAAM;AAAA,QACf,eAAe,MAAM;AAAA,QACrB,aAAa,WAAW;AAAA,QACxB,iBAAiB,WAAW;AAAA,QAC5B,oBAAoB,MAAM;AAAA,QAC1B,mBAAmB,KAAK;AAAA,MAC1B,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,aAAa,OAAmC;AAC9C,QAAI,CAAC,KAAK,OAAO;AACf,aAAO;AAAA,IACT;AAEA,WACE,KAAK,MAAM,KAAK,SAAS,MAAM,KAAK,QACpC,KAAK,MAAM,KAAK,SAAS,MAAM,KAAK,QACpC,KAAK,MAAM,cAAc,MAAM;AAAA,EAEnC;AACF;;;ALpDA,SAAS,uBAAuB;AArBhC,eAAe;AAQR,SAAS,iBACd,OACA,MAEA;AAAA,EACE,UAAU,OAAO,SAAS,KAAK,QAAQ,QAAQ,EAAE;AAAA,EACjD;AACF,IAA8C,CAAC,GACvC;AACR,SAAO,qBAAqB,OAAO,MAAM,SAAS,SAAS;AAC7D;AAMA,eAAsB,oCAEpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAWE;AACA,QAAM,SAAS,MAAM,kBAAkB;AAAA,IACrC,WAAW,OAAO,SAAS;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,MAAI,QAAQ;AACV,WAAO,QAAQ;AAAA,MACb,CAAC;AAAA,MACD;AAAA,MACA,OAAO,SAAS,KAAK,QAAQ,QAAQ,EAAE;AAAA,IACzC;AAAA,EACF;AAEA,SAAO;AACT;","names":["cojsonInternals","handleAuthUpdate"]}
|