jazz-tools 0.17.14 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/.svelte-kit/__package__/jazz.class.svelte.js +1 -1
  2. package/.svelte-kit/__package__/media/image.svelte +3 -9
  3. package/.svelte-kit/__package__/media/image.svelte.d.ts +1 -6
  4. package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
  5. package/.svelte-kit/__package__/media/image.types.d.ts +7 -0
  6. package/.svelte-kit/__package__/media/image.types.d.ts.map +1 -0
  7. package/.svelte-kit/__package__/media/image.types.js +1 -0
  8. package/.svelte-kit/__package__/tests/media/image.svelte.test.js +31 -31
  9. package/.turbo/turbo-build.log +50 -50
  10. package/CHANGELOG.md +31 -0
  11. package/dist/browser/index.js +2 -2
  12. package/dist/browser/index.js.map +1 -1
  13. package/dist/{chunk-LZOF6WP5.js → chunk-HJ3GTGY7.js} +1320 -1018
  14. package/dist/chunk-HJ3GTGY7.js.map +1 -0
  15. package/dist/index.js +18 -18
  16. package/dist/index.js.map +1 -1
  17. package/dist/inspector/{custom-element-ZSNTCECD.js → custom-element-WCY6D3QJ.js} +3 -3
  18. package/dist/inspector/{custom-element-ZSNTCECD.js.map → custom-element-WCY6D3QJ.js.map} +1 -1
  19. package/dist/inspector/index.js +1 -1
  20. package/dist/inspector/index.js.map +1 -1
  21. package/dist/inspector/register-custom-element.js +1 -1
  22. package/dist/media/{chunk-E5J3WLQW.js → chunk-KR2V6X2N.js} +14 -9
  23. package/dist/media/chunk-KR2V6X2N.js.map +1 -0
  24. package/dist/media/create-image.d.ts +6 -6
  25. package/dist/media/index.browser.d.ts +6 -6
  26. package/dist/media/index.browser.js +1 -1
  27. package/dist/media/index.d.ts +1 -1
  28. package/dist/media/index.js +1 -1
  29. package/dist/media/index.native.d.ts +6 -6
  30. package/dist/media/index.native.js +1 -1
  31. package/dist/media/utils.d.ts.map +1 -1
  32. package/dist/prosemirror/index.js +2 -2
  33. package/dist/prosemirror/index.js.map +1 -1
  34. package/dist/react/index.js +7 -5
  35. package/dist/react/index.js.map +1 -1
  36. package/dist/react-core/hooks.d.ts.map +1 -1
  37. package/dist/react-core/index.js +4658 -23
  38. package/dist/react-core/index.js.map +1 -1
  39. package/dist/react-native-core/index.js +1 -1
  40. package/dist/react-native-core/index.js.map +1 -1
  41. package/dist/svelte/jazz.class.svelte.js +1 -1
  42. package/dist/svelte/media/image.svelte +3 -9
  43. package/dist/svelte/media/image.svelte.d.ts +1 -6
  44. package/dist/svelte/media/image.svelte.d.ts.map +1 -1
  45. package/dist/svelte/media/image.types.d.ts +7 -0
  46. package/dist/svelte/media/image.types.d.ts.map +1 -0
  47. package/dist/svelte/media/image.types.js +1 -0
  48. package/dist/svelte/tests/media/image.svelte.test.js +31 -31
  49. package/dist/testing.js +18 -14
  50. package/dist/testing.js.map +1 -1
  51. package/dist/tools/coValues/CoFieldInit.d.ts +13 -0
  52. package/dist/tools/coValues/CoFieldInit.d.ts.map +1 -0
  53. package/dist/tools/coValues/CoValueBase.d.ts +18 -15
  54. package/dist/tools/coValues/CoValueBase.d.ts.map +1 -1
  55. package/dist/tools/coValues/account.d.ts +100 -46
  56. package/dist/tools/coValues/account.d.ts.map +1 -1
  57. package/dist/tools/coValues/coFeed.d.ts +78 -62
  58. package/dist/tools/coValues/coFeed.d.ts.map +1 -1
  59. package/dist/tools/coValues/coList.d.ts +212 -99
  60. package/dist/tools/coValues/coList.d.ts.map +1 -1
  61. package/dist/tools/coValues/coMap.d.ts +200 -192
  62. package/dist/tools/coValues/coMap.d.ts.map +1 -1
  63. package/dist/tools/coValues/coPlainText.d.ts +30 -22
  64. package/dist/tools/coValues/coPlainText.d.ts.map +1 -1
  65. package/dist/tools/coValues/deepLoading.d.ts +13 -13
  66. package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
  67. package/dist/tools/coValues/extensions/imageDef.d.ts +1 -1
  68. package/dist/tools/coValues/group.d.ts +32 -32
  69. package/dist/tools/coValues/group.d.ts.map +1 -1
  70. package/dist/tools/coValues/inbox.d.ts.map +1 -1
  71. package/dist/tools/coValues/interfaces.d.ts +18 -17
  72. package/dist/tools/coValues/interfaces.d.ts.map +1 -1
  73. package/dist/tools/coValues/profile.d.ts +6 -5
  74. package/dist/tools/coValues/profile.d.ts.map +1 -1
  75. package/dist/tools/coValues/schemaUnion.d.ts +3 -3
  76. package/dist/tools/coValues/schemaUnion.d.ts.map +1 -1
  77. package/dist/tools/exports.d.ts +1 -1
  78. package/dist/tools/exports.d.ts.map +1 -1
  79. package/dist/tools/implementation/anonymousJazzAgent.d.ts +2 -1
  80. package/dist/tools/implementation/anonymousJazzAgent.d.ts.map +1 -1
  81. package/dist/tools/implementation/schema.d.ts +5 -5
  82. package/dist/tools/implementation/schema.d.ts.map +1 -1
  83. package/dist/tools/implementation/symbols.d.ts +2 -0
  84. package/dist/tools/implementation/symbols.d.ts.map +1 -1
  85. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +2 -2
  86. package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
  87. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +6 -2
  88. package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
  89. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +8 -3
  90. package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
  91. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +12 -7
  92. package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
  93. package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +13 -7
  94. package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
  95. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +11 -2
  96. package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
  97. package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +4 -0
  98. package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
  99. package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +4 -0
  100. package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
  101. package/dist/tools/implementation/zodSchema/typeConverters/{CoFieldInit.d.ts → CoFieldSchemaInit.d.ts} +7 -7
  102. package/dist/tools/implementation/zodSchema/typeConverters/CoFieldSchemaInit.d.ts.map +1 -0
  103. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +4 -4
  104. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
  105. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts +4 -4
  106. package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts.map +1 -1
  107. package/dist/tools/implementation/zodSchema/zodCo.d.ts +2 -2
  108. package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
  109. package/dist/tools/internal.d.ts +2 -1
  110. package/dist/tools/internal.d.ts.map +1 -1
  111. package/dist/tools/lib/migration.d.ts +1 -1
  112. package/dist/tools/lib/migration.d.ts.map +1 -1
  113. package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
  114. package/dist/tools/subscribe/index.d.ts +1 -1
  115. package/dist/tools/subscribe/index.d.ts.map +1 -1
  116. package/dist/tools/subscribe/utils.d.ts +2 -2
  117. package/dist/tools/subscribe/utils.d.ts.map +1 -1
  118. package/dist/tools/testing.d.ts.map +1 -1
  119. package/dist/tools/tests/utils.d.ts +2 -6
  120. package/dist/tools/tests/utils.d.ts.map +1 -1
  121. package/dist/worker/index.js +3 -3
  122. package/dist/worker/index.js.map +1 -1
  123. package/package.json +4 -4
  124. package/src/browser/auth/PasskeyAuth.ts +2 -2
  125. package/src/browser/createBrowserContext.ts +2 -2
  126. package/src/browser/tests/PasskeyAuth.test.ts +2 -2
  127. package/src/inspector/custom-element.tsx +2 -2
  128. package/src/inspector/viewer/new-app.tsx +1 -1
  129. package/src/media/create-image.test.ts +7 -7
  130. package/src/media/create-image.ts +5 -3
  131. package/src/media/index.ts +1 -1
  132. package/src/media/utils.test.ts +72 -66
  133. package/src/media/utils.ts +9 -6
  134. package/src/prosemirror/lib/plugin.ts +1 -1
  135. package/src/prosemirror/lib/sync.ts +1 -1
  136. package/src/prosemirror/tests/plugin.test.ts +4 -4
  137. package/src/react/media/image.tsx +2 -2
  138. package/src/react/tests/media/image.test.tsx +52 -32
  139. package/src/react-core/hooks.ts +11 -5
  140. package/src/react-core/tests/useAccount.test.ts +16 -22
  141. package/src/react-core/tests/useCoState.test.ts +19 -19
  142. package/src/react-core/tests/useInboxSender.test.ts +5 -2
  143. package/src/react-core/tests/usePassPhraseAuth.test.ts +6 -6
  144. package/src/react-native-core/media/image.tsx +1 -1
  145. package/src/svelte/jazz.class.svelte.ts +1 -1
  146. package/src/svelte/media/image.svelte +3 -9
  147. package/src/svelte/media/image.types.ts +7 -0
  148. package/src/svelte/tests/media/image.svelte.test.ts +34 -32
  149. package/src/tools/auth/DemoAuth.ts +2 -2
  150. package/src/tools/auth/PassphraseAuth.ts +2 -2
  151. package/src/tools/auth/clerk/index.ts +2 -2
  152. package/src/tools/auth/clerk/tests/JazzClerkAuth.test.ts +1 -1
  153. package/src/tools/coValues/CoFieldInit.ts +20 -0
  154. package/src/tools/coValues/CoValueBase.ts +40 -60
  155. package/src/tools/coValues/account.ts +306 -232
  156. package/src/tools/coValues/coFeed.ts +185 -153
  157. package/src/tools/coValues/coList.ts +507 -334
  158. package/src/tools/coValues/coMap.ts +420 -286
  159. package/src/tools/coValues/coPlainText.ts +94 -110
  160. package/src/tools/coValues/deepLoading.ts +13 -13
  161. package/src/tools/coValues/group.ts +100 -114
  162. package/src/tools/coValues/inbox.ts +16 -14
  163. package/src/tools/coValues/interfaces.ts +49 -31
  164. package/src/tools/coValues/profile.ts +8 -6
  165. package/src/tools/coValues/request.ts +9 -9
  166. package/src/tools/coValues/schemaUnion.ts +11 -5
  167. package/src/tools/exports.ts +1 -1
  168. package/src/tools/implementation/ContextManager.ts +4 -4
  169. package/src/tools/implementation/anonymousJazzAgent.ts +2 -1
  170. package/src/tools/implementation/createContext.ts +1 -1
  171. package/src/tools/implementation/devtoolsFormatters.ts +9 -9
  172. package/src/tools/implementation/invites.ts +2 -2
  173. package/src/tools/implementation/schema.ts +7 -7
  174. package/src/tools/implementation/symbols.ts +3 -0
  175. package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +2 -2
  176. package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +11 -2
  177. package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +18 -7
  178. package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +17 -7
  179. package/src/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +20 -11
  180. package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +19 -2
  181. package/src/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +6 -0
  182. package/src/tools/implementation/zodSchema/schemaTypes/RichTextSchema.ts +6 -0
  183. package/src/tools/implementation/zodSchema/typeConverters/{CoFieldInit.ts → CoFieldSchemaInit.ts} +11 -11
  184. package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +4 -4
  185. package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.ts +4 -4
  186. package/src/tools/implementation/zodSchema/zodCo.ts +2 -2
  187. package/src/tools/internal.ts +2 -1
  188. package/src/tools/lib/migration.ts +5 -5
  189. package/src/tools/subscribe/SubscriptionScope.ts +32 -24
  190. package/src/tools/subscribe/index.ts +4 -4
  191. package/src/tools/subscribe/utils.ts +11 -11
  192. package/src/tools/testing.ts +17 -13
  193. package/src/tools/tests/ContextManager.test.ts +68 -57
  194. package/src/tools/tests/PassphraseAuth.test.ts +2 -2
  195. package/src/tools/tests/account.test.ts +139 -69
  196. package/src/tools/tests/coDiscriminatedUnion.test-d.ts +12 -6
  197. package/src/tools/tests/coDiscriminatedUnion.test.ts +26 -17
  198. package/src/tools/tests/coFeed.test-d.ts +18 -17
  199. package/src/tools/tests/coFeed.test.ts +108 -97
  200. package/src/tools/tests/coList.test-d.ts +18 -23
  201. package/src/tools/tests/coList.test.ts +350 -165
  202. package/src/tools/tests/coMap.record.test-d.ts +9 -13
  203. package/src/tools/tests/coMap.record.test.ts +37 -23
  204. package/src/tools/tests/coMap.test-d.ts +43 -21
  205. package/src/tools/tests/coMap.test.ts +360 -182
  206. package/src/tools/tests/coOptional.test.ts +28 -13
  207. package/src/tools/tests/coPlainText.test.ts +15 -15
  208. package/src/tools/tests/createContext.test.ts +14 -14
  209. package/src/tools/tests/deepLoading.test.ts +95 -94
  210. package/src/tools/tests/exportImport.test.ts +61 -41
  211. package/src/tools/tests/groupsAndAccounts.test.ts +333 -116
  212. package/src/tools/tests/inbox.test.ts +22 -17
  213. package/src/tools/tests/interfaces.test.ts +12 -11
  214. package/src/tools/tests/invites.test.ts +6 -4
  215. package/src/tools/tests/load.test.ts +20 -18
  216. package/src/tools/tests/patterns/notifications.test.ts +6 -6
  217. package/src/tools/tests/patterns/quest.test.ts +3 -3
  218. package/src/tools/tests/patterns/requestToJoin.test.ts +22 -22
  219. package/src/tools/tests/request.test.ts +38 -39
  220. package/src/tools/tests/schemaUnion.test.ts +64 -10
  221. package/src/tools/tests/subscribe.test.ts +64 -64
  222. package/src/tools/tests/testing.test.ts +5 -9
  223. package/src/tools/tests/utils.ts +3 -3
  224. package/src/tools/tests/zod.test.ts +3 -3
  225. package/src/worker/index.ts +3 -3
  226. package/dist/chunk-LZOF6WP5.js.map +0 -1
  227. package/dist/media/chunk-E5J3WLQW.js.map +0 -1
  228. package/dist/tools/implementation/zodSchema/typeConverters/CoFieldInit.d.ts.map +0 -1
package/dist/index.js CHANGED
@@ -37,7 +37,7 @@ import {
37
37
  randomSessionProvider,
38
38
  subscribeToCoValue,
39
39
  zodReExport_exports
40
- } from "./chunk-LZOF6WP5.js";
40
+ } from "./chunk-HJ3GTGY7.js";
41
41
 
42
42
  // src/tools/auth/clerk/index.ts
43
43
  import {
@@ -145,14 +145,14 @@ var JazzClerkAuth = class _JazzClerkAuth {
145
145
  jazzAccountSeed
146
146
  }
147
147
  });
148
- const currentAccount = await Account2.getMe().ensureLoaded({
148
+ const currentAccount = await Account2.getMe().$jazz.ensureLoaded({
149
149
  resolve: {
150
150
  profile: true
151
151
  }
152
152
  });
153
153
  const username = getClerkUsername(clerkClient);
154
154
  if (username) {
155
- currentAccount.profile.name = username;
155
+ currentAccount.profile.$jazz.set("name", username);
156
156
  }
157
157
  await _JazzClerkAuth.loadClerkAuthData(
158
158
  {
@@ -229,12 +229,12 @@ var DemoAuth = class {
229
229
  if (!credentials) {
230
230
  throw new Error("No credentials found");
231
231
  }
232
- const currentAccount = await Account.getMe().ensureLoaded({
232
+ const currentAccount = await Account.getMe().$jazz.ensureLoaded({
233
233
  resolve: {
234
234
  profile: true
235
235
  }
236
236
  });
237
- currentAccount.profile.name = username;
237
+ currentAccount.profile.$jazz.set("name", username);
238
238
  await this.authSecretStorage.set({
239
239
  accountID: credentials.accountID,
240
240
  accountSecret: credentials.accountSecret,
@@ -372,12 +372,12 @@ var PassphraseAuth = class {
372
372
  provider: "passphrase"
373
373
  });
374
374
  if (name?.trim()) {
375
- const currentAccount = await Account.getMe().ensureLoaded({
375
+ const currentAccount = await Account.getMe().$jazz.ensureLoaded({
376
376
  resolve: {
377
377
  profile: true
378
378
  }
379
379
  });
380
- currentAccount.profile.name = name;
380
+ currentAccount.profile.$jazz.set("name", name);
381
381
  }
382
382
  return passphrase;
383
383
  };
@@ -426,7 +426,7 @@ var PassphraseAuth = class {
426
426
  // src/tools/implementation/invites.ts
427
427
  import { cojsonInternals as cojsonInternals2 } from "cojson";
428
428
  function createInviteLink(value, role, baseURL, valueHint) {
429
- const coValueCore = value._raw.core;
429
+ const coValueCore = value.$jazz.raw.core;
430
430
  let currentCoValue = coValueCore;
431
431
  while (currentCoValue.verified.header.ruleset.type === "ownedByGroup") {
432
432
  currentCoValue = currentCoValue.getGroup().core;
@@ -437,7 +437,7 @@ function createInviteLink(value, role, baseURL, valueHint) {
437
437
  }
438
438
  const group = cojsonInternals2.expectGroup(currentCoValue.getCurrentContent());
439
439
  const inviteSecret = group.createInvite(role);
440
- return `${baseURL}#/invite/${valueHint ? valueHint + "/" : ""}${value.id}/${inviteSecret}`;
440
+ return `${baseURL}#/invite/${valueHint ? valueHint + "/" : ""}${value.$jazz.id}/${inviteSecret}`;
441
441
  }
442
442
  function parseInviteLink(inviteURL) {
443
443
  const url = new URL(inviteURL);
@@ -502,13 +502,13 @@ async function serializeMessagePayload({
502
502
  target
503
503
  }) {
504
504
  const me = owner ?? Account.getMe();
505
- const node = me._raw.core.node;
505
+ const node = me.$jazz.localNode;
506
506
  const crypto = node.crypto;
507
507
  const agent = node.getCurrentAgent();
508
508
  const signerID = agent.currentSignerID();
509
509
  const signerSecret = agent.currentSignerSecret();
510
510
  const envelope = createMessageEnvelope(schema, value, me, target, type);
511
- const contentPieces = await exportCoValue(schema, envelope.id, {
511
+ const contentPieces = await exportCoValue(schema, envelope.$jazz.id, {
512
512
  resolve,
513
513
  loadAs: me,
514
514
  bestEffortResolution: true
@@ -516,14 +516,14 @@ async function serializeMessagePayload({
516
516
  const createdAt = Date.now();
517
517
  const signPayload = crypto.secureHash({
518
518
  contentPieces,
519
- id: envelope.id,
519
+ id: envelope.$jazz.id,
520
520
  createdAt,
521
521
  signerID
522
522
  });
523
523
  const authToken = crypto.sign(signerSecret, signPayload);
524
524
  return {
525
525
  contentPieces,
526
- id: envelope.id,
526
+ id: envelope.$jazz.id,
527
527
  createdAt,
528
528
  authToken,
529
529
  signerID
@@ -547,7 +547,7 @@ async function handleMessagePayload({
547
547
  request,
548
548
  loadAs
549
549
  }) {
550
- const node = loadAs._raw.core.node;
550
+ const node = loadAs.$jazz.localNode;
551
551
  const crypto = node.crypto;
552
552
  const requestParsed = requestSchema.safeParse(request);
553
553
  if (!requestParsed.success) {
@@ -562,7 +562,7 @@ async function handleMessagePayload({
562
562
  const core = await node.loadCoValueCore(requestData.id, void 0, true);
563
563
  if (core.isAvailable()) {
564
564
  const content = core.getCurrentContent();
565
- if (content.get("$handled") === loadAs.id) {
565
+ if (content.get("$handled") === loadAs.$jazz.id) {
566
566
  throw new JazzRequestError("Request payload is already handled", 400);
567
567
  }
568
568
  }
@@ -622,7 +622,7 @@ async function handleMessagePayload({
622
622
  throw new JazzRequestError("Value not found", 400);
623
623
  }
624
624
  if (type === "request") {
625
- value._raw.set("$handled", loadAs.id);
625
+ value.$jazz.raw.set("$handled", loadAs.$jazz.id);
626
626
  }
627
627
  return {
628
628
  value,
@@ -662,7 +662,7 @@ var HttpRoute = class {
662
662
  }
663
663
  };
664
664
  this.executeHandleRequest = async (request, as, callback) => {
665
- const node = as._raw.core.node;
665
+ const node = as.$jazz.localNode;
666
666
  const body = await request.json();
667
667
  const data = await handleMessagePayload({
668
668
  type: "request",
@@ -809,7 +809,7 @@ function safeVerifySignature(crypto, signPayload, signerID, authToken) {
809
809
  }
810
810
  }
811
811
  async function loadWorkerAccountOrGroup(id, loadAs) {
812
- const node = loadAs._raw.core.node;
812
+ const node = loadAs.$jazz.localNode;
813
813
  const coValue = await node.loadCoValueCore(id);
814
814
  if (!coValue.isAvailable()) {
815
815
  return null;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/tools/auth/clerk/index.ts","../src/tools/auth/clerk/getClerkUsername.ts","../src/tools/auth/clerk/types.ts","../src/tools/auth/DemoAuth.ts","../src/tools/auth/PassphraseAuth.ts","../src/tools/implementation/invites.ts","../src/tools/coValues/request.ts","../src/tools/index.ts"],"sourcesContent":["import {\n Account,\n AuthCredentials,\n AuthSecretStorage,\n AuthenticateAccountFunction,\n} from \"jazz-tools\";\nimport { getClerkUsername } from \"./getClerkUsername.js\";\nimport {\n ClerkCredentials,\n MinimalClerkClient,\n isClerkAuthStateEqual,\n isClerkCredentials,\n} from \"./types.js\";\n\nexport type { MinimalClerkClient };\nexport { isClerkCredentials };\n\nexport class JazzClerkAuth {\n constructor(\n private authenticate: AuthenticateAccountFunction,\n private logOut: () => Promise<void> | void,\n private authSecretStorage: AuthSecretStorage,\n ) {}\n\n /**\n * Loads the Jazz auth data from the Clerk user and sets it in the auth secret storage.\n */\n static loadClerkAuthData(\n credentials: ClerkCredentials,\n storage: AuthSecretStorage,\n ) {\n return storage.set({\n accountID: credentials.jazzAccountID,\n accountSecret: credentials.jazzAccountSecret,\n secretSeed: credentials.jazzAccountSeed\n ? Uint8Array.from(credentials.jazzAccountSeed)\n : undefined,\n provider: \"clerk\",\n });\n }\n\n static async initializeAuth(clerk: MinimalClerkClient) {\n const secretStorage = new AuthSecretStorage();\n\n if (!isClerkCredentials(clerk.user?.unsafeMetadata)) {\n return;\n }\n\n await JazzClerkAuth.loadClerkAuthData(\n clerk.user.unsafeMetadata,\n secretStorage,\n );\n }\n\n private isFirstCall = true;\n\n registerListener(clerkClient: MinimalClerkClient) {\n let previousUser: MinimalClerkClient[\"user\"] | null =\n clerkClient.user ?? null;\n\n // Need to use addListener because the clerk user object is not updated when the user logs in\n return clerkClient.addListener((event) => {\n const user = (event as Pick<MinimalClerkClient, \"user\">).user ?? null;\n\n if (!isClerkAuthStateEqual(previousUser, user) || this.isFirstCall) {\n this.onClerkUserChange({ user });\n previousUser = user;\n this.isFirstCall = false;\n }\n });\n }\n\n onClerkUserChange = async (clerkClient: Pick<MinimalClerkClient, \"user\">) => {\n const isAuthenticated = this.authSecretStorage.isAuthenticated;\n\n // LogOut is driven by Clerk. The framework adapters will need to pass `logOutReplacement` to the `JazzProvider`\n // to make the logOut work correctly.\n if (!clerkClient.user) {\n if (isAuthenticated) {\n this.authSecretStorage.clear();\n await this.logOut();\n }\n return;\n }\n\n if (isAuthenticated) return;\n\n const clerkCredentials = clerkClient.user\n .unsafeMetadata as ClerkCredentials;\n\n if (!clerkCredentials.jazzAccountID) {\n await this.signIn(clerkClient);\n } else {\n await this.logIn(clerkClient);\n }\n };\n\n logIn = async (clerkClient: Pick<MinimalClerkClient, \"user\">) => {\n if (!clerkClient.user) {\n throw new Error(\"Not signed in on Clerk\");\n }\n\n const clerkCredentials = clerkClient.user.unsafeMetadata;\n if (!isClerkCredentials(clerkCredentials)) {\n throw new Error(\"No credentials found on Clerk\");\n }\n\n const credentials = {\n accountID: clerkCredentials.jazzAccountID,\n accountSecret: clerkCredentials.jazzAccountSecret,\n secretSeed: clerkCredentials.jazzAccountSeed\n ? Uint8Array.from(clerkCredentials.jazzAccountSeed)\n : undefined,\n provider: \"clerk\",\n } satisfies AuthCredentials;\n\n await this.authenticate(credentials);\n\n await JazzClerkAuth.loadClerkAuthData(\n {\n jazzAccountID: credentials.accountID,\n jazzAccountSecret: credentials.accountSecret,\n jazzAccountSeed: clerkCredentials.jazzAccountSeed,\n },\n this.authSecretStorage,\n );\n };\n\n signIn = async (clerkClient: Pick<MinimalClerkClient, \"user\">) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"No credentials found\");\n }\n\n const jazzAccountSeed = credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined;\n\n await clerkClient.user?.update({\n unsafeMetadata: {\n jazzAccountID: credentials.accountID,\n jazzAccountSecret: credentials.accountSecret,\n jazzAccountSeed,\n } satisfies ClerkCredentials,\n });\n\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n const username = getClerkUsername(clerkClient);\n\n if (username) {\n currentAccount.profile.name = username;\n }\n\n await JazzClerkAuth.loadClerkAuthData(\n {\n jazzAccountID: credentials.accountID,\n jazzAccountSecret: credentials.accountSecret,\n jazzAccountSeed,\n },\n this.authSecretStorage,\n );\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace BrowserClerkAuth {\n export interface Driver {\n onError: (error: string | Error) => void;\n }\n}\n","import type { MinimalClerkClient } from \"./types.js\";\n\nexport function getClerkUsername(\n clerkClient: Pick<MinimalClerkClient, \"user\">,\n) {\n if (!clerkClient.user) {\n return null;\n }\n\n if (clerkClient.user.fullName) {\n return clerkClient.user.fullName;\n }\n\n if (clerkClient.user.firstName) {\n if (clerkClient.user.lastName) {\n return `${clerkClient.user.firstName} ${clerkClient.user.lastName}`;\n }\n\n return clerkClient.user.firstName;\n }\n\n if (clerkClient.user.username) {\n return clerkClient.user.username;\n }\n\n if (clerkClient.user.primaryEmailAddress?.emailAddress) {\n const emailUsername =\n clerkClient.user.primaryEmailAddress.emailAddress.split(\"@\")[0];\n\n if (emailUsername) {\n return emailUsername;\n }\n }\n\n return clerkClient.user.id;\n}\n","import { AgentSecret } from \"cojson\";\nimport { Account, ID } from \"jazz-tools\";\n\nexport type MinimalClerkClient = {\n user:\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n unsafeMetadata: Record<string, any>;\n fullName: string | null;\n username: string | null;\n firstName: string | null;\n lastName: string | null;\n id: string;\n primaryEmailAddress: {\n emailAddress: string | null;\n } | null;\n update: (args: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n unsafeMetadata: Record<string, any>;\n }) => Promise<unknown>;\n }\n | null\n | undefined;\n signOut: () => Promise<void>;\n addListener: (listener: (data: unknown) => void) => void;\n};\n\nexport type ClerkCredentials = {\n jazzAccountID: ID<Account>;\n jazzAccountSecret: AgentSecret;\n jazzAccountSeed?: number[];\n};\n\n/**\n * Checks if the Clerk user metadata contains the necessary credentials for Jazz auth.\n * **Note**: It does not validate the credentials, only checks if the necessary fields are present in the metadata object.\n */\nexport function isClerkCredentials(\n data: NonNullable<MinimalClerkClient[\"user\"]>[\"unsafeMetadata\"] | undefined,\n): data is ClerkCredentials {\n return !!data && \"jazzAccountID\" in data && \"jazzAccountSecret\" in data;\n}\n\nexport function isClerkAuthStateEqual(\n previousUser: MinimalClerkClient[\"user\"] | null | undefined,\n newUser: MinimalClerkClient[\"user\"] | null | undefined,\n) {\n if (Boolean(previousUser) !== Boolean(newUser)) {\n return false;\n }\n\n const previousCredentials = isClerkCredentials(previousUser?.unsafeMetadata);\n const newCredentials = isClerkCredentials(newUser?.unsafeMetadata);\n\n return previousCredentials === newCredentials;\n}\n","import { AgentSecret } from \"cojson\";\nimport { Account, ID } from \"../internal.js\";\nimport { AuthenticateAccountFunction } from \"../types.js\";\nimport { AuthSecretStorage } from \"./AuthSecretStorage.js\";\nimport { KvStore, KvStoreContext } from \"./KvStoreContext.js\";\n\ntype StorageData = {\n accountID: ID<Account>;\n accountSecret: AgentSecret;\n secretSeed?: number[];\n};\n\n/**\n * `DemoAuth` provides a `JazzAuth` object for demo authentication.\n *\n * Demo authentication is useful for quickly testing your app, as it allows you to create new accounts and log in as existing ones.\n *\n * ```\n * import { DemoAuth } from \"jazz-tools\";\n *\n * const auth = new DemoAuth(jazzContext.authenticate, new AuthSecretStorage());\n * ```\n *\n * @category Auth Providers\n */\nexport class DemoAuth {\n constructor(\n private authenticate: AuthenticateAccountFunction,\n private authSecretStorage: AuthSecretStorage,\n ) {}\n\n logIn = async (username: string) => {\n const existingUsers = await this.getExisitingUsersWithData();\n const storageData = existingUsers[username];\n\n if (!storageData?.accountID) {\n throw new Error(\"User not found\");\n }\n\n await this.authenticate({\n accountID: storageData.accountID,\n accountSecret: storageData.accountSecret,\n });\n\n await this.authSecretStorage.set({\n accountID: storageData.accountID,\n accountSecret: storageData.accountSecret,\n secretSeed: storageData.secretSeed\n ? new Uint8Array(storageData.secretSeed)\n : undefined,\n provider: \"demo\",\n });\n };\n\n signUp = async (username: string) => {\n const existingUsers = await this.getExistingUsers();\n if (existingUsers.includes(username)) {\n throw new Error(\"User already registered\");\n }\n\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"No credentials found\");\n }\n\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n currentAccount.profile.name = username;\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n accountSecret: credentials.accountSecret,\n secretSeed: credentials.secretSeed\n ? new Uint8Array(credentials.secretSeed)\n : undefined,\n provider: \"demo\",\n });\n\n await this.addToExistingUsers(username, {\n accountID: credentials.accountID,\n accountSecret: credentials.accountSecret,\n secretSeed: credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined,\n });\n };\n\n private async addToExistingUsers(username: string, data: StorageData) {\n const existingUsers = await this.getExisitingUsersWithData();\n\n if (existingUsers[username]) {\n return;\n }\n\n existingUsers[username] = data;\n\n const kvStore = KvStoreContext.getInstance().getStorage();\n await kvStore.set(\"demo-auth-users\", JSON.stringify(existingUsers));\n }\n\n private async getExisitingUsersWithData() {\n const kvStore = KvStoreContext.getInstance().getStorage();\n await migrateExistingUsers(kvStore);\n\n const existingUsers = await kvStore.get(\"demo-auth-users\");\n return existingUsers ? JSON.parse(existingUsers) : {};\n }\n\n getExistingUsers = async () => {\n return Object.keys(await this.getExisitingUsersWithData());\n };\n}\n\nexport function encodeUsername(username: string) {\n return btoa(username)\n .replace(/=/g, \"-\")\n .replace(/\\+/g, \"_\")\n .replace(/\\//g, \".\");\n}\n\nasync function getStorageVersion(kvStore: KvStore) {\n try {\n const version = await kvStore.get(\"demo-auth-storage-version\");\n return version ? parseInt(version) : 1;\n } catch (error) {\n return 1;\n }\n}\n\nasync function setStorageVersion(kvStore: KvStore, version: number) {\n await kvStore.set(\"demo-auth-storage-version\", version.toString());\n}\n\nasync function getExistingUsersList(kvStore: KvStore) {\n const existingUsers = await kvStore.get(\"demo-auth-existing-users\");\n return existingUsers ? existingUsers.split(\",\") : [];\n}\n\n/**\n * Migrates existing users keys to work with any storage.\n */\nasync function migrateExistingUsers(kvStore: KvStore) {\n if ((await getStorageVersion(kvStore)) < 2) {\n const existingUsers = await getExistingUsersList(kvStore);\n\n for (const username of existingUsers) {\n const legacyKey = `demo-auth-existing-users-${username}`;\n const storageData = await kvStore.get(legacyKey);\n if (storageData) {\n await kvStore.set(\n `demo-auth-existing-users-${encodeUsername(username)}`,\n storageData,\n );\n await kvStore.delete(legacyKey);\n }\n }\n\n await setStorageVersion(kvStore, 2);\n }\n\n if ((await getStorageVersion(kvStore)) < 3) {\n const existingUsersList = await getExistingUsersList(kvStore);\n\n const existingUsers: Record<string, StorageData> = {};\n const keysToDelete: string[] = [\"demo-auth-existing-users\"];\n\n for (const username of existingUsersList) {\n const key = `demo-auth-existing-users-${encodeUsername(username)}`;\n const storageData = await kvStore.get(key);\n if (storageData) {\n existingUsers[username] = JSON.parse(storageData);\n keysToDelete.push(key);\n }\n }\n\n await kvStore.set(\"demo-auth-users\", JSON.stringify(existingUsers));\n\n for (const key of keysToDelete) {\n await kvStore.delete(key);\n }\n\n await setStorageVersion(kvStore, 3);\n }\n}\n","import * as bip39 from \"@scure/bip39\";\nimport { entropyToMnemonic } from \"@scure/bip39\";\nimport { CryptoProvider, cojsonInternals } from \"cojson\";\nimport type { ID } from \"../internal.js\";\nimport { Account } from \"../internal.js\";\nimport type {\n AuthenticateAccountFunction,\n RegisterAccountFunction,\n} from \"../types.js\";\nimport { AuthSecretStorage } from \"./AuthSecretStorage.js\";\n\n/**\n * `PassphraseAuth` provides a `JazzAuth` object for passphrase authentication.\n *\n * ```ts\n * import { PassphraseAuth } from \"jazz-tools\";\n *\n * const auth = new PassphraseAuth(crypto, jazzContext.authenticate, new AuthSecretStorage(), wordlist);\n * ```\n *\n * @category Auth Providers\n */\nexport class PassphraseAuth {\n passphrase: string = \"\";\n\n constructor(\n private crypto: CryptoProvider,\n private authenticate: AuthenticateAccountFunction,\n private register: RegisterAccountFunction,\n private authSecretStorage: AuthSecretStorage,\n public wordlist: string[],\n ) {}\n\n logIn = async (passphrase: string) => {\n const { crypto, authenticate } = this;\n\n let secretSeed;\n\n try {\n secretSeed = bip39.mnemonicToEntropy(passphrase, this.wordlist);\n } catch (e) {\n throw new Error(\"Invalid passphrase\");\n }\n\n const accountSecret = crypto.agentSecretFromSecretSeed(secretSeed);\n\n const accountID = cojsonInternals.idforHeader(\n cojsonInternals.accountHeaderForInitialAgentSecret(accountSecret, crypto),\n crypto,\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed,\n accountSecret,\n provider: \"passphrase\",\n });\n\n this.passphrase = passphrase;\n this.notify();\n };\n\n signUp = async (name?: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials || !credentials.secretSeed) {\n throw new Error(\"No credentials found\");\n }\n\n const passphrase = entropyToMnemonic(credentials.secretSeed, this.wordlist);\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passphrase\",\n });\n\n if (name?.trim()) {\n const currentAccount = await Account.getMe().ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n currentAccount.profile.name = name;\n }\n\n return passphrase;\n };\n\n registerNewAccount = async (passphrase: string, name: string) => {\n const secretSeed = bip39.mnemonicToEntropy(passphrase, this.wordlist);\n const accountSecret = this.crypto.agentSecretFromSecretSeed(secretSeed);\n const accountID = await this.register(accountSecret, { name });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed,\n accountSecret,\n provider: \"passphrase\",\n });\n\n return accountID;\n };\n\n getCurrentAccountPassphrase = async () => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials || !credentials.secretSeed) {\n throw new Error(\"No credentials found\");\n }\n\n return entropyToMnemonic(credentials.secretSeed, this.wordlist);\n };\n\n generateRandomPassphrase = () => {\n return entropyToMnemonic(this.crypto.newRandomSecretSeed(), this.wordlist);\n };\n\n loadCurrentAccountPassphrase = async () => {\n const passphrase = await this.getCurrentAccountPassphrase();\n this.passphrase = passphrase;\n this.notify();\n };\n\n listeners = new Set<() => void>();\n subscribe = (callback: () => void) => {\n this.listeners.add(callback);\n\n return () => {\n this.listeners.delete(callback);\n };\n };\n\n notify() {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n","import { type InviteSecret, cojsonInternals } from \"cojson\";\nimport { Account } from \"../coValues/account.js\";\nimport type {\n CoValue,\n CoValueClass,\n CoValueClassOrSchema,\n ID,\n} from \"../internal.js\";\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n baseURL: string,\n valueHint?: string,\n): string {\n const coValueCore = value._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.id\n }/${inviteSecret}`;\n}\n\n/** @category Invite Links */\nexport function parseInviteLink(inviteURL: string):\n | {\n valueID: string;\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: string | 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];\n inviteSecret = parts[4] as InviteSecret;\n } else if (parts.length === 4) {\n valueID = parts[2];\n inviteSecret = parts[3] as InviteSecret;\n }\n\n if (!valueID || !inviteSecret) {\n return undefined;\n }\n return { valueID, inviteSecret, valueHint };\n }\n}\n\n/** @category Invite Links */\nexport function consumeInviteLink<S extends CoValueClassOrSchema>({\n inviteURL,\n as = Account.getMe(),\n forValueHint,\n invitedObjectSchema,\n}: {\n inviteURL: string;\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 return new Promise((resolve, reject) => {\n const result = parseInviteLink(inviteURL);\n\n if (result && result.valueHint === forValueHint) {\n as.acceptInvite(result.valueID, result.inviteSecret, invitedObjectSchema)\n .then(() => {\n resolve(result);\n })\n .catch(reject);\n } else {\n resolve(undefined);\n }\n });\n}\n","import {\n CoValueCore,\n CojsonInternalTypes,\n CryptoProvider,\n RawAccount,\n RawCoMap,\n cojsonInternals,\n} from \"cojson\";\nimport z from \"zod/v4\";\nimport {\n AnyZodOrCoValueSchema,\n CoMap,\n CoMapSchema,\n CoMapSchemaInit,\n CoValueClass,\n CoreCoMapSchema,\n Group,\n Loaded,\n ResolveQuery,\n ResolveQueryStrict,\n Simplify,\n coMapDefiner,\n coValueClassFromCoValueClassOrSchema,\n exportCoValue,\n importContentPieces,\n loadCoValue,\n} from \"../internal.js\";\nimport { isCoValueId } from \"../lib/id.js\";\nimport { Account } from \"./account.js\";\n\ntype MessageShape = Record<string, AnyZodOrCoValueSchema>;\n\ntype RequestSchemaDefinition<\n S extends MessageShape,\n R extends ResolveQuery<CoMapSchema<S>> = true,\n> =\n | S\n | {\n schema: S;\n resolve?: R;\n };\n\n/**\n * Configuration options for defining HTTP request/response schemas in Jazz.\n *\n * This interface defines the structure for creating typed HTTP routes with\n * request and response validation using CoMap schemas.\n *\n * @template RequestShape - The shape of the request message schema (must extend MessageShape)\n * @template RequestResolve - The resolve query type for the request CoMap schema\n * @template ResponseShape - The shape of the response message schema (must extend MessageShape)\n * @template ResponseResolve - The resolve query type for the response CoMap schema\n */\ninterface RequestOptions<\n RequestShape extends MessageShape,\n RequestResolve extends ResolveQuery<CoMapSchema<RequestShape>>,\n ResponseShape extends MessageShape,\n ResponseResolve extends ResolveQuery<CoMapSchema<ResponseShape>>,\n> {\n /**\n * The URL endpoint for the HTTP route.\n * This is used by the client to send requests to the server.\n */\n url: string;\n\n /**\n * The id of the worker Account or Group.\n */\n workerId: string;\n\n /**\n * Schema definition for the request payload.\n * Can be either a direct schema object or an object with schema and optional resolve properties.\n * The schema defines the structure and validation rules for incoming requests.\n */\n request: RequestSchemaDefinition<\n RequestShape,\n ResolveQueryStrict<CoMapSchema<RequestShape>, RequestResolve>\n >;\n\n /**\n * Schema definition for the response payload.\n * Can be either a direct schema object or an object with schema and optional resolve properties.\n * The schema defines the structure and validation rules for outgoing responses.\n */\n response: RequestSchemaDefinition<\n ResponseShape,\n ResolveQueryStrict<CoMapSchema<ResponseShape>, ResponseResolve>\n >;\n}\n\ntype AsNullablePayload<T extends MessageShape> = T extends Record<string, never>\n ? undefined\n : never;\ntype MessageValuePayload<T extends MessageShape> =\n | Simplify<CoMapSchemaInit<T>>\n | AsNullablePayload<T>;\n\nfunction createMessageEnvelope<S extends MessageShape>(\n schema: CoreCoMapSchema,\n value: MessageValuePayload<S>,\n owner: Account,\n sharedWith: Account | Group,\n type: \"request\" | \"response\",\n): Loaded<CoMapSchema<S>> {\n const group = Group.create({ owner });\n\n if (type === \"request\") {\n group.addMember(sharedWith, \"writer\");\n } else {\n group.addMember(sharedWith, \"reader\");\n }\n\n // @ts-expect-error - CoreCoMapSchema doesn't have static methods\n return schema.create(value ?? {}, group);\n}\n\n/**\n * Function that exports the input CoValue in a serializable format and prepares the information\n * required for the other side to safely verify the identity of the sender.\n */\nasync function serializeMessagePayload({\n type,\n schema,\n resolve,\n value,\n owner,\n target,\n}: {\n // Skipping type validation here to avoid excessive type complexity that affects the typecheck performance\n type: \"request\" | \"response\";\n schema: CoreCoMapSchema;\n resolve: any;\n value: any;\n owner: Account;\n target: Account | Group;\n}) {\n const me = owner ?? Account.getMe();\n const node = me._raw.core.node;\n const crypto = node.crypto;\n\n const agent = node.getCurrentAgent();\n const signerID = agent.currentSignerID();\n const signerSecret = agent.currentSignerSecret();\n\n const envelope = createMessageEnvelope(schema, value, me, target, type);\n\n const contentPieces =\n (await exportCoValue(schema, envelope.id, {\n resolve,\n loadAs: me,\n bestEffortResolution: true,\n })) ?? [];\n\n const createdAt = Date.now();\n\n const signPayload = crypto.secureHash({\n contentPieces,\n id: envelope.id,\n createdAt,\n signerID,\n });\n\n const authToken = crypto.sign(signerSecret, signPayload);\n\n return {\n contentPieces,\n id: envelope.id,\n createdAt,\n authToken,\n signerID,\n };\n}\n\nconst requestSchema = z.object({\n contentPieces: z.array(z.json()),\n id: z.custom<`co_z${string}`>(isCoValueId),\n createdAt: z.number(),\n authToken: z.custom<`signature_z${string}`>(\n (value) => typeof value === \"string\" && value.startsWith(\"signature_z\"),\n ),\n signerID: z.custom<`signer_z${string}`>(\n (value) => typeof value === \"string\" && value.startsWith(\"signer_z\"),\n ),\n});\n\n/**\n * Function that parses the message payload, verifies the identity of the sender and loads the data.\n *\n * @returns The data from the message.\n */\nasync function handleMessagePayload({\n type,\n schema,\n resolve,\n request,\n loadAs,\n}: {\n type: \"request\" | \"response\";\n // Skipping type validation here to avoid excessive type complexity that affects the typecheck performance\n schema: CoreCoMapSchema;\n resolve: any;\n request: unknown;\n loadAs: Account;\n}) {\n const node = loadAs._raw.core.node;\n const crypto = node.crypto;\n\n const requestParsed = requestSchema.safeParse(request);\n\n if (!requestParsed.success) {\n throw new JazzRequestError(\n \"Request payload is not valid\",\n 400,\n requestParsed.error,\n );\n }\n\n const requestData = requestParsed.data;\n\n if (type === \"request\") {\n const core = await node.loadCoValueCore(requestData.id, undefined, true);\n\n // Check if the message has already been handled to prevent replay attacks\n if (core.isAvailable()) {\n const content = core.getCurrentContent() as RawCoMap;\n\n if (content.get(\"$handled\") === loadAs.id) {\n throw new JazzRequestError(\"Request payload is already handled\", 400);\n }\n }\n\n // Check if the message is expired as extra protection\n if (requestData.createdAt + 1000 * 60 < Date.now()) {\n throw new JazzRequestError(\"Authentication token is expired\", 401);\n }\n }\n\n // Verify the signature of the message to prevent tampering\n const signPayload = crypto.secureHash({\n contentPieces: requestData.contentPieces,\n id: requestData.id,\n createdAt: requestData.createdAt,\n signerID: requestData.signerID,\n });\n\n if (\n !safeVerifySignature(\n crypto,\n signPayload,\n requestData.signerID,\n requestData.authToken,\n )\n ) {\n throw new JazzRequestError(\"Invalid signature\", 401);\n }\n\n let contentPieces =\n requestData.contentPieces as CojsonInternalTypes.NewContentMessage[];\n\n if (type === \"request\") {\n const coValueContent = contentPieces.find(\n (piece) => piece.id === requestData.id,\n );\n\n if (coValueContent && coValueContent.header) {\n const validValues = cojsonInternals.getDependedOnCoValues(\n coValueContent.header,\n coValueContent,\n );\n validValues.add(requestData.id);\n contentPieces = contentPieces.filter((piece) =>\n validValues.has(piece.id),\n );\n } else {\n contentPieces = [];\n }\n }\n\n importContentPieces(contentPieces, loadAs);\n\n const coValue = await node.loadCoValueCore(requestData.id);\n const accountId = getCoValueCreatorAccountId(coValue);\n\n const madeBy = await Account.load(accountId, {\n loadAs,\n });\n\n if (!madeBy) {\n throw new JazzRequestError(\"Creator account not found\", 400);\n }\n\n const coSchema = coValueClassFromCoValueClassOrSchema(\n schema,\n ) as CoValueClass<CoMap>;\n const value = await loadCoValue<CoMap, true>(coSchema, requestData.id, {\n resolve,\n loadAs,\n });\n\n if (!value) {\n throw new JazzRequestError(\"Value not found\", 400);\n }\n\n if (type === \"request\") {\n value._raw.set(\"$handled\", loadAs.id);\n }\n\n return {\n value: value as unknown,\n madeBy,\n };\n}\n\nfunction parseSchemaAndResolve<\n S extends MessageShape,\n R extends ResolveQuery<CoMapSchema<S>>,\n>(options: RequestSchemaDefinition<S, R>) {\n if (\"schema\" in options) {\n return {\n // Using a type cast to reduce the type complexity\n schema: coMapDefiner(options.schema) as CoreCoMapSchema,\n resolve: options.resolve as any,\n };\n }\n\n return {\n schema: coMapDefiner(options) as CoreCoMapSchema,\n resolve: true as any,\n };\n}\n\nexport class HttpRoute<\n RequestShape extends MessageShape = z.core.$ZodLooseShape,\n RequestResolve extends ResolveQuery<CoMapSchema<RequestShape>> = any,\n ResponseShape extends MessageShape = z.core.$ZodLooseShape,\n ResponseResolve extends ResolveQuery<CoMapSchema<ResponseShape>> = any,\n> {\n private requestDefinition: {\n schema: CoreCoMapSchema;\n resolve: any;\n };\n private responseDefinition: {\n schema: CoreCoMapSchema;\n resolve: any;\n };\n private url: string;\n private workerId: string;\n\n constructor(\n params: RequestOptions<\n RequestShape,\n RequestResolve,\n ResponseShape,\n ResponseResolve\n >,\n ) {\n this.requestDefinition = parseSchemaAndResolve(params.request);\n this.responseDefinition = parseSchemaAndResolve(params.response);\n this.url = params.url;\n this.workerId = params.workerId;\n\n if (params.workerId === undefined) {\n throw new TypeError(\"Worker ID is required\");\n }\n }\n\n async send(\n values: MessageValuePayload<RequestShape>,\n options?: { owner?: Account },\n ): Promise<Loaded<CoMapSchema<ResponseShape>, ResponseResolve>> {\n const as = options?.owner ?? Account.getMe();\n\n const target = await loadWorkerAccountOrGroup(this.workerId, as);\n if (!target) {\n throw new JazzRequestError(\"Worker account not found\", 400);\n }\n\n const response = await fetch(this.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(\n await serializeMessagePayload({\n type: \"request\",\n schema: this.requestDefinition.schema,\n resolve: true, // export only the envelope\n value: values,\n owner: as,\n target,\n }),\n ),\n });\n\n if (!response.ok) {\n if (response.headers.has(\"X-Jazz-Request-Error\")) {\n const error = await response.json();\n throw new JazzRequestError(error.message, error.code, error.details);\n }\n\n throw new JazzRequestError(\"Request failed\", response.status);\n }\n\n const responseBody = await response.json();\n\n const responseParsed = z\n .object({\n type: z.literal(\"success\"),\n payload: z.any(),\n })\n .safeParse(responseBody);\n\n if (!responseParsed.success) {\n throw new JazzRequestError(\n \"Response payload is not valid\",\n 400,\n responseParsed.error,\n );\n }\n\n const data = await handleMessagePayload({\n type: \"response\",\n schema: this.responseDefinition.schema,\n resolve: this.responseDefinition.resolve,\n request: responseParsed.data.payload,\n loadAs: as,\n });\n\n return data.value as Loaded<CoMapSchema<ResponseShape>, ResponseResolve>;\n }\n\n handle = async (\n request: Request,\n as: Account,\n callback: (\n value: Loaded<CoMapSchema<RequestShape>, RequestResolve>,\n madeBy: Account,\n ) =>\n | Promise<MessageValuePayload<ResponseShape>>\n | MessageValuePayload<ResponseShape>,\n ): Promise<Response> => {\n try {\n const response = await this.executeHandleRequest(request, as, callback);\n return response;\n } catch (error) {\n // Serialize the error to make it possible to handle it on the client side\n if (isJazzRequestError(error)) {\n return new Response(JSON.stringify(error.toJSON()), {\n status: error.code,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Jazz-Request-Error\": \"true\",\n },\n });\n }\n\n throw error;\n }\n };\n\n executeHandleRequest = async (\n request: Request,\n as: Account,\n callback: (\n value: Loaded<CoMapSchema<RequestShape>, RequestResolve>,\n madeBy: Account,\n ) =>\n | Promise<MessageValuePayload<ResponseShape>>\n | MessageValuePayload<ResponseShape>,\n ): Promise<Response> => {\n const node = as._raw.core.node;\n const body = await request.json();\n const data = await handleMessagePayload({\n type: \"request\",\n schema: this.requestDefinition.schema,\n resolve: this.requestDefinition.resolve,\n request: body,\n loadAs: as,\n });\n\n const tracking = node.syncManager.trackDirtyCoValues();\n\n const responseValue = await callback(\n data.value as Loaded<CoMapSchema<RequestShape>, RequestResolve>,\n data.madeBy,\n );\n\n const responsePayload = await serializeMessagePayload({\n type: \"response\",\n schema: this.responseDefinition.schema,\n resolve: this.responseDefinition.resolve,\n value: responseValue,\n owner: as,\n target: data.madeBy,\n });\n\n const responseBody = JSON.stringify({\n type: \"success\",\n payload: responsePayload,\n });\n\n // TODO: Detect the defer support from the environment\n await Promise.all(\n Array.from(tracking.done(), (id) => node.syncManager.waitForSync(id)),\n );\n\n return new Response(responseBody, {\n status: 200,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n };\n\n get requestSchema(): CoMapSchema<RequestShape> {\n return this.requestDefinition.schema as CoMapSchema<RequestShape>;\n }\n\n get responseSchema() {\n return this.responseDefinition.schema as CoMapSchema<ResponseShape>;\n }\n}\n\n/**\n * Define a request route.\n *\n * @param params - The parameters for the request route.\n * @returns The request route.\n *\n * @see {@link https://jazz.tools/docs/react/server-side/http-requests}\n */\nexport function experimental_defineRequest<\n RequestShape extends MessageShape,\n RequestResolve extends ResolveQuery<CoMapSchema<RequestShape>>,\n ResponseShape extends MessageShape,\n ResponseResolve extends ResolveQuery<CoMapSchema<ResponseShape>>,\n>(\n params: RequestOptions<\n RequestShape,\n RequestResolve,\n ResponseShape,\n ResponseResolve\n >,\n) {\n return new HttpRoute(params);\n}\n\nfunction getCoValueCreatorAccountId(coValue: CoValueCore) {\n if (!coValue.isAvailable()) {\n throw new Error(\"Unable to load the request payload\");\n }\n\n const creatorSessionId = coValue.getValidSortedTransactions().at(0)\n ?.txID.sessionID;\n\n if (!creatorSessionId) {\n throw new JazzRequestError(\n \"Request payload is not valid, creator session ID not found\",\n 400,\n );\n }\n\n const accountId =\n cojsonInternals.accountOrAgentIDfromSessionID(creatorSessionId);\n\n if (!isCoValueId(accountId)) {\n throw new JazzRequestError(\n \"Request payload is not valid, the creator is not a valid account\",\n 400,\n );\n }\n\n return accountId;\n}\n\nexport class JazzRequestError {\n public readonly isJazzRequestError = true;\n\n constructor(\n public readonly message: string,\n public readonly code: number,\n public readonly details?: unknown,\n ) {}\n\n toJSON() {\n return { message: this.message, code: this.code, details: this.details };\n }\n}\n\nexport function isJazzRequestError(error: unknown): error is JazzRequestError {\n return (\n error instanceof JazzRequestError ||\n (typeof error === \"object\" &&\n error !== null &&\n \"isJazzRequestError\" in error &&\n Boolean(error.isJazzRequestError))\n );\n}\n\nfunction safeVerifySignature(\n crypto: CryptoProvider,\n signPayload: `hash_z${string}`,\n signerID: `signer_z${string}`,\n authToken: `signature_z${string}`,\n) {\n try {\n return crypto.verify(authToken, signPayload, signerID);\n } catch (error) {\n return false;\n }\n}\n\nasync function loadWorkerAccountOrGroup(id: string, loadAs: Account) {\n const node = loadAs._raw.core.node;\n const coValue = await node.loadCoValueCore(id as `co_z${string}`);\n\n if (!coValue.isAvailable()) {\n return null;\n }\n\n const content = coValue.getCurrentContent();\n\n if (content instanceof RawAccount) {\n return Account.load(content.id, {\n loadAs,\n });\n }\n\n return Group.load(content.id, {\n loadAs,\n });\n}\n","export * from \"./exports.js\";\n\nexport {\n cojsonInternals,\n logger,\n LogLevel,\n} from \"cojson\";\n"],"mappings":"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","names":["Account","AuthSecretStorage","Account","AuthSecretStorage","cojsonInternals","cojsonInternals","cojsonInternals","cojsonInternals","cojsonInternals"]}
1
+ {"version":3,"sources":["../src/tools/auth/clerk/index.ts","../src/tools/auth/clerk/getClerkUsername.ts","../src/tools/auth/clerk/types.ts","../src/tools/auth/DemoAuth.ts","../src/tools/auth/PassphraseAuth.ts","../src/tools/implementation/invites.ts","../src/tools/coValues/request.ts","../src/tools/index.ts"],"sourcesContent":["import {\n Account,\n AuthCredentials,\n AuthSecretStorage,\n AuthenticateAccountFunction,\n} from \"jazz-tools\";\nimport { getClerkUsername } from \"./getClerkUsername.js\";\nimport {\n ClerkCredentials,\n MinimalClerkClient,\n isClerkAuthStateEqual,\n isClerkCredentials,\n} from \"./types.js\";\n\nexport type { MinimalClerkClient };\nexport { isClerkCredentials };\n\nexport class JazzClerkAuth {\n constructor(\n private authenticate: AuthenticateAccountFunction,\n private logOut: () => Promise<void> | void,\n private authSecretStorage: AuthSecretStorage,\n ) {}\n\n /**\n * Loads the Jazz auth data from the Clerk user and sets it in the auth secret storage.\n */\n static loadClerkAuthData(\n credentials: ClerkCredentials,\n storage: AuthSecretStorage,\n ) {\n return storage.set({\n accountID: credentials.jazzAccountID,\n accountSecret: credentials.jazzAccountSecret,\n secretSeed: credentials.jazzAccountSeed\n ? Uint8Array.from(credentials.jazzAccountSeed)\n : undefined,\n provider: \"clerk\",\n });\n }\n\n static async initializeAuth(clerk: MinimalClerkClient) {\n const secretStorage = new AuthSecretStorage();\n\n if (!isClerkCredentials(clerk.user?.unsafeMetadata)) {\n return;\n }\n\n await JazzClerkAuth.loadClerkAuthData(\n clerk.user.unsafeMetadata,\n secretStorage,\n );\n }\n\n private isFirstCall = true;\n\n registerListener(clerkClient: MinimalClerkClient) {\n let previousUser: MinimalClerkClient[\"user\"] | null =\n clerkClient.user ?? null;\n\n // Need to use addListener because the clerk user object is not updated when the user logs in\n return clerkClient.addListener((event) => {\n const user = (event as Pick<MinimalClerkClient, \"user\">).user ?? null;\n\n if (!isClerkAuthStateEqual(previousUser, user) || this.isFirstCall) {\n this.onClerkUserChange({ user });\n previousUser = user;\n this.isFirstCall = false;\n }\n });\n }\n\n onClerkUserChange = async (clerkClient: Pick<MinimalClerkClient, \"user\">) => {\n const isAuthenticated = this.authSecretStorage.isAuthenticated;\n\n // LogOut is driven by Clerk. The framework adapters will need to pass `logOutReplacement` to the `JazzProvider`\n // to make the logOut work correctly.\n if (!clerkClient.user) {\n if (isAuthenticated) {\n this.authSecretStorage.clear();\n await this.logOut();\n }\n return;\n }\n\n if (isAuthenticated) return;\n\n const clerkCredentials = clerkClient.user\n .unsafeMetadata as ClerkCredentials;\n\n if (!clerkCredentials.jazzAccountID) {\n await this.signIn(clerkClient);\n } else {\n await this.logIn(clerkClient);\n }\n };\n\n logIn = async (clerkClient: Pick<MinimalClerkClient, \"user\">) => {\n if (!clerkClient.user) {\n throw new Error(\"Not signed in on Clerk\");\n }\n\n const clerkCredentials = clerkClient.user.unsafeMetadata;\n if (!isClerkCredentials(clerkCredentials)) {\n throw new Error(\"No credentials found on Clerk\");\n }\n\n const credentials = {\n accountID: clerkCredentials.jazzAccountID,\n accountSecret: clerkCredentials.jazzAccountSecret,\n secretSeed: clerkCredentials.jazzAccountSeed\n ? Uint8Array.from(clerkCredentials.jazzAccountSeed)\n : undefined,\n provider: \"clerk\",\n } satisfies AuthCredentials;\n\n await this.authenticate(credentials);\n\n await JazzClerkAuth.loadClerkAuthData(\n {\n jazzAccountID: credentials.accountID,\n jazzAccountSecret: credentials.accountSecret,\n jazzAccountSeed: clerkCredentials.jazzAccountSeed,\n },\n this.authSecretStorage,\n );\n };\n\n signIn = async (clerkClient: Pick<MinimalClerkClient, \"user\">) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"No credentials found\");\n }\n\n const jazzAccountSeed = credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined;\n\n await clerkClient.user?.update({\n unsafeMetadata: {\n jazzAccountID: credentials.accountID,\n jazzAccountSecret: credentials.accountSecret,\n jazzAccountSeed,\n } satisfies ClerkCredentials,\n });\n\n const currentAccount = await Account.getMe().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n const username = getClerkUsername(clerkClient);\n\n if (username) {\n currentAccount.profile.$jazz.set(\"name\", username);\n }\n\n await JazzClerkAuth.loadClerkAuthData(\n {\n jazzAccountID: credentials.accountID,\n jazzAccountSecret: credentials.accountSecret,\n jazzAccountSeed,\n },\n this.authSecretStorage,\n );\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nexport namespace BrowserClerkAuth {\n export interface Driver {\n onError: (error: string | Error) => void;\n }\n}\n","import type { MinimalClerkClient } from \"./types.js\";\n\nexport function getClerkUsername(\n clerkClient: Pick<MinimalClerkClient, \"user\">,\n) {\n if (!clerkClient.user) {\n return null;\n }\n\n if (clerkClient.user.fullName) {\n return clerkClient.user.fullName;\n }\n\n if (clerkClient.user.firstName) {\n if (clerkClient.user.lastName) {\n return `${clerkClient.user.firstName} ${clerkClient.user.lastName}`;\n }\n\n return clerkClient.user.firstName;\n }\n\n if (clerkClient.user.username) {\n return clerkClient.user.username;\n }\n\n if (clerkClient.user.primaryEmailAddress?.emailAddress) {\n const emailUsername =\n clerkClient.user.primaryEmailAddress.emailAddress.split(\"@\")[0];\n\n if (emailUsername) {\n return emailUsername;\n }\n }\n\n return clerkClient.user.id;\n}\n","import { AgentSecret } from \"cojson\";\nimport { Account, ID } from \"jazz-tools\";\n\nexport type MinimalClerkClient = {\n user:\n | {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n unsafeMetadata: Record<string, any>;\n fullName: string | null;\n username: string | null;\n firstName: string | null;\n lastName: string | null;\n id: string;\n primaryEmailAddress: {\n emailAddress: string | null;\n } | null;\n update: (args: {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n unsafeMetadata: Record<string, any>;\n }) => Promise<unknown>;\n }\n | null\n | undefined;\n signOut: () => Promise<void>;\n addListener: (listener: (data: unknown) => void) => void;\n};\n\nexport type ClerkCredentials = {\n jazzAccountID: ID<Account>;\n jazzAccountSecret: AgentSecret;\n jazzAccountSeed?: number[];\n};\n\n/**\n * Checks if the Clerk user metadata contains the necessary credentials for Jazz auth.\n * **Note**: It does not validate the credentials, only checks if the necessary fields are present in the metadata object.\n */\nexport function isClerkCredentials(\n data: NonNullable<MinimalClerkClient[\"user\"]>[\"unsafeMetadata\"] | undefined,\n): data is ClerkCredentials {\n return !!data && \"jazzAccountID\" in data && \"jazzAccountSecret\" in data;\n}\n\nexport function isClerkAuthStateEqual(\n previousUser: MinimalClerkClient[\"user\"] | null | undefined,\n newUser: MinimalClerkClient[\"user\"] | null | undefined,\n) {\n if (Boolean(previousUser) !== Boolean(newUser)) {\n return false;\n }\n\n const previousCredentials = isClerkCredentials(previousUser?.unsafeMetadata);\n const newCredentials = isClerkCredentials(newUser?.unsafeMetadata);\n\n return previousCredentials === newCredentials;\n}\n","import { AgentSecret } from \"cojson\";\nimport { Account, ID } from \"../internal.js\";\nimport { AuthenticateAccountFunction } from \"../types.js\";\nimport { AuthSecretStorage } from \"./AuthSecretStorage.js\";\nimport { KvStore, KvStoreContext } from \"./KvStoreContext.js\";\n\ntype StorageData = {\n accountID: ID<Account>;\n accountSecret: AgentSecret;\n secretSeed?: number[];\n};\n\n/**\n * `DemoAuth` provides a `JazzAuth` object for demo authentication.\n *\n * Demo authentication is useful for quickly testing your app, as it allows you to create new accounts and log in as existing ones.\n *\n * ```\n * import { DemoAuth } from \"jazz-tools\";\n *\n * const auth = new DemoAuth(jazzContext.authenticate, new AuthSecretStorage());\n * ```\n *\n * @category Auth Providers\n */\nexport class DemoAuth {\n constructor(\n private authenticate: AuthenticateAccountFunction,\n private authSecretStorage: AuthSecretStorage,\n ) {}\n\n logIn = async (username: string) => {\n const existingUsers = await this.getExisitingUsersWithData();\n const storageData = existingUsers[username];\n\n if (!storageData?.accountID) {\n throw new Error(\"User not found\");\n }\n\n await this.authenticate({\n accountID: storageData.accountID,\n accountSecret: storageData.accountSecret,\n });\n\n await this.authSecretStorage.set({\n accountID: storageData.accountID,\n accountSecret: storageData.accountSecret,\n secretSeed: storageData.secretSeed\n ? new Uint8Array(storageData.secretSeed)\n : undefined,\n provider: \"demo\",\n });\n };\n\n signUp = async (username: string) => {\n const existingUsers = await this.getExistingUsers();\n if (existingUsers.includes(username)) {\n throw new Error(\"User already registered\");\n }\n\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"No credentials found\");\n }\n\n const currentAccount = await Account.getMe().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n currentAccount.profile.$jazz.set(\"name\", username);\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n accountSecret: credentials.accountSecret,\n secretSeed: credentials.secretSeed\n ? new Uint8Array(credentials.secretSeed)\n : undefined,\n provider: \"demo\",\n });\n\n await this.addToExistingUsers(username, {\n accountID: credentials.accountID,\n accountSecret: credentials.accountSecret,\n secretSeed: credentials.secretSeed\n ? Array.from(credentials.secretSeed)\n : undefined,\n });\n };\n\n private async addToExistingUsers(username: string, data: StorageData) {\n const existingUsers = await this.getExisitingUsersWithData();\n\n if (existingUsers[username]) {\n return;\n }\n\n existingUsers[username] = data;\n\n const kvStore = KvStoreContext.getInstance().getStorage();\n await kvStore.set(\"demo-auth-users\", JSON.stringify(existingUsers));\n }\n\n private async getExisitingUsersWithData() {\n const kvStore = KvStoreContext.getInstance().getStorage();\n await migrateExistingUsers(kvStore);\n\n const existingUsers = await kvStore.get(\"demo-auth-users\");\n return existingUsers ? JSON.parse(existingUsers) : {};\n }\n\n getExistingUsers = async () => {\n return Object.keys(await this.getExisitingUsersWithData());\n };\n}\n\nexport function encodeUsername(username: string) {\n return btoa(username)\n .replace(/=/g, \"-\")\n .replace(/\\+/g, \"_\")\n .replace(/\\//g, \".\");\n}\n\nasync function getStorageVersion(kvStore: KvStore) {\n try {\n const version = await kvStore.get(\"demo-auth-storage-version\");\n return version ? parseInt(version) : 1;\n } catch (error) {\n return 1;\n }\n}\n\nasync function setStorageVersion(kvStore: KvStore, version: number) {\n await kvStore.set(\"demo-auth-storage-version\", version.toString());\n}\n\nasync function getExistingUsersList(kvStore: KvStore) {\n const existingUsers = await kvStore.get(\"demo-auth-existing-users\");\n return existingUsers ? existingUsers.split(\",\") : [];\n}\n\n/**\n * Migrates existing users keys to work with any storage.\n */\nasync function migrateExistingUsers(kvStore: KvStore) {\n if ((await getStorageVersion(kvStore)) < 2) {\n const existingUsers = await getExistingUsersList(kvStore);\n\n for (const username of existingUsers) {\n const legacyKey = `demo-auth-existing-users-${username}`;\n const storageData = await kvStore.get(legacyKey);\n if (storageData) {\n await kvStore.set(\n `demo-auth-existing-users-${encodeUsername(username)}`,\n storageData,\n );\n await kvStore.delete(legacyKey);\n }\n }\n\n await setStorageVersion(kvStore, 2);\n }\n\n if ((await getStorageVersion(kvStore)) < 3) {\n const existingUsersList = await getExistingUsersList(kvStore);\n\n const existingUsers: Record<string, StorageData> = {};\n const keysToDelete: string[] = [\"demo-auth-existing-users\"];\n\n for (const username of existingUsersList) {\n const key = `demo-auth-existing-users-${encodeUsername(username)}`;\n const storageData = await kvStore.get(key);\n if (storageData) {\n existingUsers[username] = JSON.parse(storageData);\n keysToDelete.push(key);\n }\n }\n\n await kvStore.set(\"demo-auth-users\", JSON.stringify(existingUsers));\n\n for (const key of keysToDelete) {\n await kvStore.delete(key);\n }\n\n await setStorageVersion(kvStore, 3);\n }\n}\n","import * as bip39 from \"@scure/bip39\";\nimport { entropyToMnemonic } from \"@scure/bip39\";\nimport { CryptoProvider, cojsonInternals } from \"cojson\";\nimport type { ID } from \"../internal.js\";\nimport { Account } from \"../internal.js\";\nimport type {\n AuthenticateAccountFunction,\n RegisterAccountFunction,\n} from \"../types.js\";\nimport { AuthSecretStorage } from \"./AuthSecretStorage.js\";\n\n/**\n * `PassphraseAuth` provides a `JazzAuth` object for passphrase authentication.\n *\n * ```ts\n * import { PassphraseAuth } from \"jazz-tools\";\n *\n * const auth = new PassphraseAuth(crypto, jazzContext.authenticate, new AuthSecretStorage(), wordlist);\n * ```\n *\n * @category Auth Providers\n */\nexport class PassphraseAuth {\n passphrase: string = \"\";\n\n constructor(\n private crypto: CryptoProvider,\n private authenticate: AuthenticateAccountFunction,\n private register: RegisterAccountFunction,\n private authSecretStorage: AuthSecretStorage,\n public wordlist: string[],\n ) {}\n\n logIn = async (passphrase: string) => {\n const { crypto, authenticate } = this;\n\n let secretSeed;\n\n try {\n secretSeed = bip39.mnemonicToEntropy(passphrase, this.wordlist);\n } catch (e) {\n throw new Error(\"Invalid passphrase\");\n }\n\n const accountSecret = crypto.agentSecretFromSecretSeed(secretSeed);\n\n const accountID = cojsonInternals.idforHeader(\n cojsonInternals.accountHeaderForInitialAgentSecret(accountSecret, crypto),\n crypto,\n ) as ID<Account>;\n\n await authenticate({\n accountID,\n accountSecret,\n });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed,\n accountSecret,\n provider: \"passphrase\",\n });\n\n this.passphrase = passphrase;\n this.notify();\n };\n\n signUp = async (name?: string) => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials || !credentials.secretSeed) {\n throw new Error(\"No credentials found\");\n }\n\n const passphrase = entropyToMnemonic(credentials.secretSeed, this.wordlist);\n\n await this.authSecretStorage.set({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n provider: \"passphrase\",\n });\n\n if (name?.trim()) {\n const currentAccount = await Account.getMe().$jazz.ensureLoaded({\n resolve: {\n profile: true,\n },\n });\n\n currentAccount.profile.$jazz.set(\"name\", name);\n }\n\n return passphrase;\n };\n\n registerNewAccount = async (passphrase: string, name: string) => {\n const secretSeed = bip39.mnemonicToEntropy(passphrase, this.wordlist);\n const accountSecret = this.crypto.agentSecretFromSecretSeed(secretSeed);\n const accountID = await this.register(accountSecret, { name });\n\n await this.authSecretStorage.set({\n accountID,\n secretSeed,\n accountSecret,\n provider: \"passphrase\",\n });\n\n return accountID;\n };\n\n getCurrentAccountPassphrase = async () => {\n const credentials = await this.authSecretStorage.get();\n\n if (!credentials || !credentials.secretSeed) {\n throw new Error(\"No credentials found\");\n }\n\n return entropyToMnemonic(credentials.secretSeed, this.wordlist);\n };\n\n generateRandomPassphrase = () => {\n return entropyToMnemonic(this.crypto.newRandomSecretSeed(), this.wordlist);\n };\n\n loadCurrentAccountPassphrase = async () => {\n const passphrase = await this.getCurrentAccountPassphrase();\n this.passphrase = passphrase;\n this.notify();\n };\n\n listeners = new Set<() => void>();\n subscribe = (callback: () => void) => {\n this.listeners.add(callback);\n\n return () => {\n this.listeners.delete(callback);\n };\n };\n\n notify() {\n for (const listener of this.listeners) {\n listener();\n }\n }\n}\n","import { type InviteSecret, cojsonInternals } from \"cojson\";\nimport { Account } from \"../coValues/account.js\";\nimport type {\n CoValue,\n CoValueClass,\n CoValueClassOrSchema,\n ID,\n} from \"../internal.js\";\n\n/** @category Invite Links */\nexport function createInviteLink<C extends CoValue>(\n value: C,\n role: \"reader\" | \"writer\" | \"admin\" | \"writeOnly\",\n baseURL: string,\n 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(inviteURL: string):\n | {\n valueID: string;\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: string | 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];\n inviteSecret = parts[4] as InviteSecret;\n } else if (parts.length === 4) {\n valueID = parts[2];\n inviteSecret = parts[3] as InviteSecret;\n }\n\n if (!valueID || !inviteSecret) {\n return undefined;\n }\n return { valueID, inviteSecret, valueHint };\n }\n}\n\n/** @category Invite Links */\nexport function consumeInviteLink<S extends CoValueClassOrSchema>({\n inviteURL,\n as = Account.getMe(),\n forValueHint,\n invitedObjectSchema,\n}: {\n inviteURL: string;\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 return new Promise((resolve, reject) => {\n const result = parseInviteLink(inviteURL);\n\n if (result && result.valueHint === forValueHint) {\n as.acceptInvite(result.valueID, result.inviteSecret, invitedObjectSchema)\n .then(() => {\n resolve(result);\n })\n .catch(reject);\n } else {\n resolve(undefined);\n }\n });\n}\n","import {\n CoValueCore,\n CojsonInternalTypes,\n CryptoProvider,\n RawAccount,\n RawCoMap,\n cojsonInternals,\n} from \"cojson\";\nimport z from \"zod/v4\";\nimport {\n AnyZodOrCoValueSchema,\n CoMap,\n CoMapSchema,\n CoMapSchemaInit,\n CoValueClass,\n CoreCoMapSchema,\n Group,\n Loaded,\n ResolveQuery,\n ResolveQueryStrict,\n Simplify,\n coMapDefiner,\n coValueClassFromCoValueClassOrSchema,\n exportCoValue,\n importContentPieces,\n loadCoValue,\n} from \"../internal.js\";\nimport { isCoValueId } from \"../lib/id.js\";\nimport { Account } from \"./account.js\";\n\ntype MessageShape = Record<string, AnyZodOrCoValueSchema>;\n\ntype RequestSchemaDefinition<\n S extends MessageShape,\n R extends ResolveQuery<CoMapSchema<S>> = true,\n> =\n | S\n | {\n schema: S;\n resolve?: R;\n };\n\n/**\n * Configuration options for defining HTTP request/response schemas in Jazz.\n *\n * This interface defines the structure for creating typed HTTP routes with\n * request and response validation using CoMap schemas.\n *\n * @template RequestShape - The shape of the request message schema (must extend MessageShape)\n * @template RequestResolve - The resolve query type for the request CoMap schema\n * @template ResponseShape - The shape of the response message schema (must extend MessageShape)\n * @template ResponseResolve - The resolve query type for the response CoMap schema\n */\ninterface RequestOptions<\n RequestShape extends MessageShape,\n RequestResolve extends ResolveQuery<CoMapSchema<RequestShape>>,\n ResponseShape extends MessageShape,\n ResponseResolve extends ResolveQuery<CoMapSchema<ResponseShape>>,\n> {\n /**\n * The URL endpoint for the HTTP route.\n * This is used by the client to send requests to the server.\n */\n url: string;\n\n /**\n * The id of the worker Account or Group.\n */\n workerId: string;\n\n /**\n * Schema definition for the request payload.\n * Can be either a direct schema object or an object with schema and optional resolve properties.\n * The schema defines the structure and validation rules for incoming requests.\n */\n request: RequestSchemaDefinition<\n RequestShape,\n ResolveQueryStrict<CoMapSchema<RequestShape>, RequestResolve>\n >;\n\n /**\n * Schema definition for the response payload.\n * Can be either a direct schema object or an object with schema and optional resolve properties.\n * The schema defines the structure and validation rules for outgoing responses.\n */\n response: RequestSchemaDefinition<\n ResponseShape,\n ResolveQueryStrict<CoMapSchema<ResponseShape>, ResponseResolve>\n >;\n}\n\ntype AsNullablePayload<T extends MessageShape> = T extends Record<string, never>\n ? undefined\n : never;\ntype MessageValuePayload<T extends MessageShape> =\n | Simplify<CoMapSchemaInit<T>>\n | AsNullablePayload<T>;\n\nfunction createMessageEnvelope<S extends MessageShape>(\n schema: CoreCoMapSchema,\n value: MessageValuePayload<S>,\n owner: Account,\n sharedWith: Account | Group,\n type: \"request\" | \"response\",\n): Loaded<CoMapSchema<S>> {\n const group = Group.create({ owner });\n\n if (type === \"request\") {\n group.addMember(sharedWith, \"writer\");\n } else {\n group.addMember(sharedWith, \"reader\");\n }\n\n // @ts-expect-error - CoreCoMapSchema doesn't have static methods\n return schema.create(value ?? {}, group);\n}\n\n/**\n * Function that exports the input CoValue in a serializable format and prepares the information\n * required for the other side to safely verify the identity of the sender.\n */\nasync function serializeMessagePayload({\n type,\n schema,\n resolve,\n value,\n owner,\n target,\n}: {\n // Skipping type validation here to avoid excessive type complexity that affects the typecheck performance\n type: \"request\" | \"response\";\n schema: CoreCoMapSchema;\n resolve: any;\n value: any;\n owner: Account;\n target: Account | Group;\n}) {\n const me = owner ?? Account.getMe();\n const node = me.$jazz.localNode;\n const crypto = node.crypto;\n\n const agent = node.getCurrentAgent();\n const signerID = agent.currentSignerID();\n const signerSecret = agent.currentSignerSecret();\n\n const envelope = createMessageEnvelope(schema, value, me, target, type);\n\n const contentPieces =\n (await exportCoValue(schema, envelope.$jazz.id, {\n resolve,\n loadAs: me,\n bestEffortResolution: true,\n })) ?? [];\n\n const createdAt = Date.now();\n\n const signPayload = crypto.secureHash({\n contentPieces,\n id: envelope.$jazz.id,\n createdAt,\n signerID,\n });\n\n const authToken = crypto.sign(signerSecret, signPayload);\n\n return {\n contentPieces,\n id: envelope.$jazz.id,\n createdAt,\n authToken,\n signerID,\n };\n}\n\nconst requestSchema = z.object({\n contentPieces: z.array(z.json()),\n id: z.custom<`co_z${string}`>(isCoValueId),\n createdAt: z.number(),\n authToken: z.custom<`signature_z${string}`>(\n (value) => typeof value === \"string\" && value.startsWith(\"signature_z\"),\n ),\n signerID: z.custom<`signer_z${string}`>(\n (value) => typeof value === \"string\" && value.startsWith(\"signer_z\"),\n ),\n});\n\n/**\n * Function that parses the message payload, verifies the identity of the sender and loads the data.\n *\n * @returns The data from the message.\n */\nasync function handleMessagePayload({\n type,\n schema,\n resolve,\n request,\n loadAs,\n}: {\n type: \"request\" | \"response\";\n // Skipping type validation here to avoid excessive type complexity that affects the typecheck performance\n schema: CoreCoMapSchema;\n resolve: any;\n request: unknown;\n loadAs: Account;\n}) {\n const node = loadAs.$jazz.localNode;\n const crypto = node.crypto;\n\n const requestParsed = requestSchema.safeParse(request);\n\n if (!requestParsed.success) {\n throw new JazzRequestError(\n \"Request payload is not valid\",\n 400,\n requestParsed.error,\n );\n }\n\n const requestData = requestParsed.data;\n\n if (type === \"request\") {\n const core = await node.loadCoValueCore(requestData.id, undefined, true);\n\n // Check if the message has already been handled to prevent replay attacks\n if (core.isAvailable()) {\n const content = core.getCurrentContent() as RawCoMap;\n\n if (content.get(\"$handled\") === loadAs.$jazz.id) {\n throw new JazzRequestError(\"Request payload is already handled\", 400);\n }\n }\n\n // Check if the message is expired as extra protection\n if (requestData.createdAt + 1000 * 60 < Date.now()) {\n throw new JazzRequestError(\"Authentication token is expired\", 401);\n }\n }\n\n // Verify the signature of the message to prevent tampering\n const signPayload = crypto.secureHash({\n contentPieces: requestData.contentPieces,\n id: requestData.id,\n createdAt: requestData.createdAt,\n signerID: requestData.signerID,\n });\n\n if (\n !safeVerifySignature(\n crypto,\n signPayload,\n requestData.signerID,\n requestData.authToken,\n )\n ) {\n throw new JazzRequestError(\"Invalid signature\", 401);\n }\n\n let contentPieces =\n requestData.contentPieces as CojsonInternalTypes.NewContentMessage[];\n\n if (type === \"request\") {\n const coValueContent = contentPieces.find(\n (piece) => piece.id === requestData.id,\n );\n\n if (coValueContent && coValueContent.header) {\n const validValues = cojsonInternals.getDependedOnCoValues(\n coValueContent.header,\n coValueContent,\n );\n validValues.add(requestData.id);\n contentPieces = contentPieces.filter((piece) =>\n validValues.has(piece.id),\n );\n } else {\n contentPieces = [];\n }\n }\n\n importContentPieces(contentPieces, loadAs);\n\n const coValue = await node.loadCoValueCore(requestData.id);\n const accountId = getCoValueCreatorAccountId(coValue);\n\n const madeBy = await Account.load(accountId, {\n loadAs,\n });\n\n if (!madeBy) {\n throw new JazzRequestError(\"Creator account not found\", 400);\n }\n\n const coSchema = coValueClassFromCoValueClassOrSchema(\n schema,\n ) as CoValueClass<CoMap>;\n const value = await loadCoValue<CoMap, true>(coSchema, requestData.id, {\n resolve,\n loadAs,\n });\n\n if (!value) {\n throw new JazzRequestError(\"Value not found\", 400);\n }\n\n if (type === \"request\") {\n value.$jazz.raw.set(\"$handled\", loadAs.$jazz.id);\n }\n\n return {\n value: value as unknown,\n madeBy,\n };\n}\n\nfunction parseSchemaAndResolve<\n S extends MessageShape,\n R extends ResolveQuery<CoMapSchema<S>>,\n>(options: RequestSchemaDefinition<S, R>) {\n if (\"schema\" in options) {\n return {\n // Using a type cast to reduce the type complexity\n schema: coMapDefiner(options.schema) as CoreCoMapSchema,\n resolve: options.resolve as any,\n };\n }\n\n return {\n schema: coMapDefiner(options) as CoreCoMapSchema,\n resolve: true as any,\n };\n}\n\nexport class HttpRoute<\n RequestShape extends MessageShape = z.core.$ZodLooseShape,\n RequestResolve extends ResolveQuery<CoMapSchema<RequestShape>> = any,\n ResponseShape extends MessageShape = z.core.$ZodLooseShape,\n ResponseResolve extends ResolveQuery<CoMapSchema<ResponseShape>> = any,\n> {\n private requestDefinition: {\n schema: CoreCoMapSchema;\n resolve: any;\n };\n private responseDefinition: {\n schema: CoreCoMapSchema;\n resolve: any;\n };\n private url: string;\n private workerId: string;\n\n constructor(\n params: RequestOptions<\n RequestShape,\n RequestResolve,\n ResponseShape,\n ResponseResolve\n >,\n ) {\n this.requestDefinition = parseSchemaAndResolve(params.request);\n this.responseDefinition = parseSchemaAndResolve(params.response);\n this.url = params.url;\n this.workerId = params.workerId;\n\n if (params.workerId === undefined) {\n throw new TypeError(\"Worker ID is required\");\n }\n }\n\n async send(\n values: MessageValuePayload<RequestShape>,\n options?: { owner?: Account },\n ): Promise<Loaded<CoMapSchema<ResponseShape>, ResponseResolve>> {\n const as = options?.owner ?? Account.getMe();\n\n const target = await loadWorkerAccountOrGroup(this.workerId, as);\n if (!target) {\n throw new JazzRequestError(\"Worker account not found\", 400);\n }\n\n const response = await fetch(this.url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(\n await serializeMessagePayload({\n type: \"request\",\n schema: this.requestDefinition.schema,\n resolve: true, // export only the envelope\n value: values,\n owner: as,\n target,\n }),\n ),\n });\n\n if (!response.ok) {\n if (response.headers.has(\"X-Jazz-Request-Error\")) {\n const error = await response.json();\n throw new JazzRequestError(error.message, error.code, error.details);\n }\n\n throw new JazzRequestError(\"Request failed\", response.status);\n }\n\n const responseBody = await response.json();\n\n const responseParsed = z\n .object({\n type: z.literal(\"success\"),\n payload: z.any(),\n })\n .safeParse(responseBody);\n\n if (!responseParsed.success) {\n throw new JazzRequestError(\n \"Response payload is not valid\",\n 400,\n responseParsed.error,\n );\n }\n\n const data = await handleMessagePayload({\n type: \"response\",\n schema: this.responseDefinition.schema,\n resolve: this.responseDefinition.resolve,\n request: responseParsed.data.payload,\n loadAs: as,\n });\n\n return data.value as Loaded<CoMapSchema<ResponseShape>, ResponseResolve>;\n }\n\n handle = async (\n request: Request,\n as: Account,\n callback: (\n value: Loaded<CoMapSchema<RequestShape>, RequestResolve>,\n madeBy: Account,\n ) =>\n | Promise<MessageValuePayload<ResponseShape>>\n | MessageValuePayload<ResponseShape>,\n ): Promise<Response> => {\n try {\n const response = await this.executeHandleRequest(request, as, callback);\n return response;\n } catch (error) {\n // Serialize the error to make it possible to handle it on the client side\n if (isJazzRequestError(error)) {\n return new Response(JSON.stringify(error.toJSON()), {\n status: error.code,\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-Jazz-Request-Error\": \"true\",\n },\n });\n }\n\n throw error;\n }\n };\n\n executeHandleRequest = async (\n request: Request,\n as: Account,\n callback: (\n value: Loaded<CoMapSchema<RequestShape>, RequestResolve>,\n madeBy: Account,\n ) =>\n | Promise<MessageValuePayload<ResponseShape>>\n | MessageValuePayload<ResponseShape>,\n ): Promise<Response> => {\n const node = as.$jazz.localNode;\n const body = await request.json();\n const data = await handleMessagePayload({\n type: \"request\",\n schema: this.requestDefinition.schema,\n resolve: this.requestDefinition.resolve,\n request: body,\n loadAs: as,\n });\n\n const tracking = node.syncManager.trackDirtyCoValues();\n\n const responseValue = await callback(\n data.value as Loaded<CoMapSchema<RequestShape>, RequestResolve>,\n data.madeBy,\n );\n\n const responsePayload = await serializeMessagePayload({\n type: \"response\",\n schema: this.responseDefinition.schema,\n resolve: this.responseDefinition.resolve,\n value: responseValue,\n owner: as,\n target: data.madeBy,\n });\n\n const responseBody = JSON.stringify({\n type: \"success\",\n payload: responsePayload,\n });\n\n // TODO: Detect the defer support from the environment\n await Promise.all(\n Array.from(tracking.done(), (id) => node.syncManager.waitForSync(id)),\n );\n\n return new Response(responseBody, {\n status: 200,\n headers: {\n \"Content-Type\": \"application/json\",\n },\n });\n };\n\n get requestSchema(): CoMapSchema<RequestShape> {\n return this.requestDefinition.schema as CoMapSchema<RequestShape>;\n }\n\n get responseSchema() {\n return this.responseDefinition.schema as CoMapSchema<ResponseShape>;\n }\n}\n\n/**\n * Define a request route.\n *\n * @param params - The parameters for the request route.\n * @returns The request route.\n *\n * @see {@link https://jazz.tools/docs/react/server-side/http-requests}\n */\nexport function experimental_defineRequest<\n RequestShape extends MessageShape,\n RequestResolve extends ResolveQuery<CoMapSchema<RequestShape>>,\n ResponseShape extends MessageShape,\n ResponseResolve extends ResolveQuery<CoMapSchema<ResponseShape>>,\n>(\n params: RequestOptions<\n RequestShape,\n RequestResolve,\n ResponseShape,\n ResponseResolve\n >,\n) {\n return new HttpRoute(params);\n}\n\nfunction getCoValueCreatorAccountId(coValue: CoValueCore) {\n if (!coValue.isAvailable()) {\n throw new Error(\"Unable to load the request payload\");\n }\n\n const creatorSessionId = coValue.getValidSortedTransactions().at(0)\n ?.txID.sessionID;\n\n if (!creatorSessionId) {\n throw new JazzRequestError(\n \"Request payload is not valid, creator session ID not found\",\n 400,\n );\n }\n\n const accountId =\n cojsonInternals.accountOrAgentIDfromSessionID(creatorSessionId);\n\n if (!isCoValueId(accountId)) {\n throw new JazzRequestError(\n \"Request payload is not valid, the creator is not a valid account\",\n 400,\n );\n }\n\n return accountId;\n}\n\nexport class JazzRequestError {\n public readonly isJazzRequestError = true;\n\n constructor(\n public readonly message: string,\n public readonly code: number,\n public readonly details?: unknown,\n ) {}\n\n toJSON() {\n return { message: this.message, code: this.code, details: this.details };\n }\n}\n\nexport function isJazzRequestError(error: unknown): error is JazzRequestError {\n return (\n error instanceof JazzRequestError ||\n (typeof error === \"object\" &&\n error !== null &&\n \"isJazzRequestError\" in error &&\n Boolean(error.isJazzRequestError))\n );\n}\n\nfunction safeVerifySignature(\n crypto: CryptoProvider,\n signPayload: `hash_z${string}`,\n signerID: `signer_z${string}`,\n authToken: `signature_z${string}`,\n) {\n try {\n return crypto.verify(authToken, signPayload, signerID);\n } catch (error) {\n return false;\n }\n}\n\nasync function loadWorkerAccountOrGroup(id: string, loadAs: Account) {\n const node = loadAs.$jazz.localNode;\n const coValue = await node.loadCoValueCore(id as `co_z${string}`);\n\n if (!coValue.isAvailable()) {\n return null;\n }\n\n const content = coValue.getCurrentContent();\n\n if (content instanceof RawAccount) {\n return Account.load(content.id, {\n loadAs,\n });\n }\n\n return Group.load(content.id, {\n loadAs,\n });\n}\n","export * from \"./exports.js\";\n\nexport {\n cojsonInternals,\n logger,\n LogLevel,\n} from \"cojson\";\n"],"mappings":"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","names":["Account","AuthSecretStorage","Account","AuthSecretStorage","cojsonInternals","cojsonInternals","cojsonInternals","cojsonInternals","cojsonInternals"]}
@@ -33900,8 +33900,8 @@ var JazzInspectorElement = class extends HTMLElement {
33900
33900
  /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
33901
33901
  JazzInspectorInternal,
33902
33902
  {
33903
- localNode: this.account._raw.core.node,
33904
- accountId: this.account._raw.id
33903
+ localNode: this.account.$jazz.localNode,
33904
+ accountId: this.account.$jazz.raw.id
33905
33905
  }
33906
33906
  )
33907
33907
  );
@@ -34023,4 +34023,4 @@ react/cjs/react-jsx-runtime.development.js:
34023
34023
  * LICENSE file in the root directory of this source tree.
34024
34024
  *)
34025
34025
  */
34026
- //# sourceMappingURL=custom-element-ZSNTCECD.js.map
34026
+ //# sourceMappingURL=custom-element-WCY6D3QJ.js.map