jazz-tools 0.19.20 → 0.19.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.svelte-kit/__package__/server.d.ts.map +1 -1
- package/.svelte-kit/__package__/server.js +9 -7
- package/.turbo/turbo-build.log +56 -56
- package/CHANGELOG.md +15 -0
- package/dist/better-auth/auth/server.d.ts.map +1 -1
- package/dist/better-auth/auth/server.js +4 -4
- package/dist/better-auth/auth/server.js.map +1 -1
- package/dist/better-auth/database-adapter/index.js.map +1 -1
- package/dist/better-auth/database-adapter/repository/generic.d.ts +3 -3
- package/dist/better-auth/database-adapter/repository/session.d.ts +2 -2
- package/dist/better-auth/database-adapter/schema.d.ts +3 -3
- package/dist/better-auth/database-adapter/schema.d.ts.map +1 -1
- package/dist/{chunk-MI24YFCY.js → chunk-QCTQH5RS.js} +1 -1
- package/dist/chunk-QCTQH5RS.js.map +1 -0
- package/dist/index.js +36 -1
- package/dist/index.js.map +1 -1
- package/dist/media/{chunk-3LKBM3G3.js → chunk-IRL3KNPO.js} +2 -2
- package/dist/media/{chunk-3LKBM3G3.js.map → chunk-IRL3KNPO.js.map} +1 -1
- package/dist/media/create-image/react-native.d.ts +1 -1
- package/dist/media/create-image/react-native.d.ts.map +1 -1
- package/dist/media/index.browser.js +1 -1
- package/dist/media/index.js +1 -1
- package/dist/media/index.native.js +5 -5
- package/dist/media/index.native.js.map +1 -1
- package/dist/media/index.server.js +1 -1
- package/dist/react/hooks.d.ts +1 -2
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/index.js +7 -2
- package/dist/react/index.js.map +1 -1
- package/dist/react-core/hooks.d.ts +92 -1
- package/dist/react-core/hooks.d.ts.map +1 -1
- package/dist/react-core/index.js +126 -57
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-core/tests/useCoStates.test.d.ts +2 -0
- package/dist/react-core/tests/useCoStates.test.d.ts.map +1 -0
- package/dist/react-native/index.js +4 -0
- package/dist/react-native/index.js.map +1 -1
- package/dist/react-native-core/hooks.d.ts +1 -1
- package/dist/react-native-core/hooks.d.ts.map +1 -1
- package/dist/react-native-core/index.js +4 -0
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/svelte/auth/ClerkAuth.svelte.d.ts +38 -0
- package/dist/svelte/auth/ClerkAuth.svelte.d.ts.map +1 -0
- package/dist/svelte/auth/ClerkAuth.svelte.js +47 -0
- package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte +156 -0
- package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte.d.ts +67 -0
- package/dist/svelte/auth/JazzSvelteProviderWithClerk.svelte.d.ts.map +1 -0
- package/dist/svelte/auth/RegisterClerkAuth.svelte +27 -0
- package/dist/svelte/auth/RegisterClerkAuth.svelte.d.ts +17 -0
- package/dist/svelte/auth/RegisterClerkAuth.svelte.d.ts.map +1 -0
- package/dist/svelte/auth/index.d.ts +2 -0
- package/dist/svelte/auth/index.d.ts.map +1 -1
- package/dist/svelte/auth/index.js +2 -0
- package/dist/svelte/tests/ClerkAuth.svelte.test.d.ts +2 -0
- package/dist/svelte/tests/ClerkAuth.svelte.test.d.ts.map +1 -0
- package/dist/svelte/tests/ClerkAuth.svelte.test.js +202 -0
- package/dist/svelte/tests/TestClerkAuthWrapper.svelte +16 -0
- package/dist/svelte/tests/TestClerkAuthWrapper.svelte.d.ts +8 -0
- package/dist/svelte/tests/TestClerkAuthWrapper.svelte.d.ts.map +1 -0
- package/dist/svelte/tests/testUtils.d.ts +1 -0
- package/dist/svelte/tests/testUtils.d.ts.map +1 -1
- package/dist/svelte/tests/testUtils.js +3 -1
- package/dist/testing.js +1 -1
- package/dist/tools/auth/clerk/index.d.ts +1 -1
- package/dist/tools/auth/clerk/types.d.ts +1 -1
- package/dist/tools/auth/clerk/types.d.ts.map +1 -1
- package/dist/tools/exports.d.ts +1 -0
- package/dist/tools/exports.d.ts.map +1 -1
- package/dist/tools/subscribe/types.d.ts +1 -1
- package/dist/tools/subscribe/types.d.ts.map +1 -1
- package/dist/worker/JazzMessageChannel.d.ts +36 -0
- package/dist/worker/JazzMessageChannel.d.ts.map +1 -0
- package/dist/worker/index.d.ts +7 -1
- package/dist/worker/index.d.ts.map +1 -1
- package/dist/worker/index.js +28 -17
- package/dist/worker/index.js.map +1 -1
- package/package.json +4 -4
- package/src/better-auth/auth/server.ts +9 -7
- package/src/better-auth/database-adapter/repository/generic.ts +3 -3
- package/src/better-auth/database-adapter/repository/session.ts +2 -2
- package/src/better-auth/database-adapter/schema.ts +5 -5
- package/src/media/create-image/react-native.ts +9 -7
- package/src/media/create-image-factory.test.ts +1 -1
- package/src/media/create-image-factory.ts +1 -1
- package/src/react/hooks.tsx +4 -2
- package/src/react-core/hooks.ts +321 -76
- package/src/react-core/tests/testUtils.tsx +2 -2
- package/src/react-core/tests/useCoState.selector.test.ts +309 -22
- package/src/react-core/tests/useCoStates.test.tsx +414 -0
- package/src/react-native-core/hooks.tsx +2 -0
- package/src/svelte/auth/ClerkAuth.svelte.ts +67 -0
- package/src/svelte/auth/JazzSvelteProviderWithClerk.svelte +156 -0
- package/src/svelte/auth/RegisterClerkAuth.svelte +27 -0
- package/src/svelte/auth/index.ts +2 -0
- package/src/svelte/tests/ClerkAuth.svelte.test.ts +305 -0
- package/src/svelte/tests/TestClerkAuthWrapper.svelte +16 -0
- package/src/svelte/tests/testUtils.ts +4 -1
- package/src/tools/auth/clerk/types.ts +1 -1
- package/src/tools/exports.ts +5 -0
- package/src/tools/subscribe/types.ts +1 -1
- package/src/tools/tests/inbox.test.ts +7 -7
- package/src/tools/tests/testStorage.ts +2 -2
- package/src/worker/JazzMessageChannel.ts +73 -0
- package/src/worker/index.ts +36 -17
- package/dist/chunk-MI24YFCY.js.map +0 -1
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Account, type AccountClass, type AnyAccountSchema, type CoValueFromRaw, type InstanceOfSchema, type MinimalClerkClient, type SyncConfig } from "jazz-tools";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
declare class __sveltets_Render<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema> {
|
|
4
|
+
props(): {
|
|
5
|
+
/** The Clerk client instance for authentication (can be null while Clerk is initializing) */
|
|
6
|
+
clerk: MinimalClerkClient | null;
|
|
7
|
+
/** Content to render when provider is initialized */
|
|
8
|
+
children?: Snippet;
|
|
9
|
+
/** Content to render while Clerk auth is loading */
|
|
10
|
+
fallback?: Snippet;
|
|
11
|
+
/** Content to render when authentication initialization fails */
|
|
12
|
+
errorFallback?: Snippet<[Error]>;
|
|
13
|
+
/** Callback when authentication initialization fails */
|
|
14
|
+
onAuthError?: ((error: Error) => void) | undefined;
|
|
15
|
+
/** Enable server-side rendering support with anonymous fallback */
|
|
16
|
+
enableSSR?: boolean;
|
|
17
|
+
/** Custom key for storing auth secrets in KvStore */
|
|
18
|
+
authSecretStorageKey?: string;
|
|
19
|
+
/** Jazz sync configuration (peer URL and key) */
|
|
20
|
+
sync: SyncConfig;
|
|
21
|
+
/** Custom storage implementation for auth secrets */
|
|
22
|
+
storage?: any;
|
|
23
|
+
/** Account schema class for typed account access */
|
|
24
|
+
AccountSchema?: S | undefined;
|
|
25
|
+
/** Default profile name for new accounts */
|
|
26
|
+
defaultProfileName?: string;
|
|
27
|
+
/** Callback when an anonymous account is discarded during sign-in */
|
|
28
|
+
onAnonymousAccountDiscarded?: ((anonymousAccount: InstanceOfSchema<S>) => Promise<void>) | undefined;
|
|
29
|
+
};
|
|
30
|
+
events(): {};
|
|
31
|
+
slots(): {};
|
|
32
|
+
bindings(): "";
|
|
33
|
+
exports(): {};
|
|
34
|
+
}
|
|
35
|
+
interface $$IsomorphicComponent {
|
|
36
|
+
new <S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>(options: import('svelte').ComponentConstructorOptions<ReturnType<__sveltets_Render<S>['props']>>): import('svelte').SvelteComponent<ReturnType<__sveltets_Render<S>['props']>, ReturnType<__sveltets_Render<S>['events']>, ReturnType<__sveltets_Render<S>['slots']>> & {
|
|
37
|
+
$$bindings?: ReturnType<__sveltets_Render<S>['bindings']>;
|
|
38
|
+
} & ReturnType<__sveltets_Render<S>['exports']>;
|
|
39
|
+
<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>(internal: unknown, props: ReturnType<__sveltets_Render<S>['props']> & {}): ReturnType<__sveltets_Render<S>['exports']>;
|
|
40
|
+
z_$$bindings?: ReturnType<__sveltets_Render<any>['bindings']>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* A pre-configured Jazz provider that integrates with Clerk authentication.
|
|
44
|
+
*
|
|
45
|
+
* Use this component instead of `JazzSvelteProvider` when using Clerk for authentication.
|
|
46
|
+
* It handles:
|
|
47
|
+
* - Pre-loading Jazz credentials from Clerk before rendering children
|
|
48
|
+
* - Registering Clerk auth state listeners
|
|
49
|
+
* - Wiring up logout functionality to Clerk's signOut
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```svelte
|
|
53
|
+
* <JazzSvelteProviderWithClerk
|
|
54
|
+
* {clerk}
|
|
55
|
+
* sync={{ peer: "wss://cloud.jazz.tools/?key=your-key" }}
|
|
56
|
+
* AccountSchema={MyAccountSchema}
|
|
57
|
+
* >
|
|
58
|
+
* <App />
|
|
59
|
+
* </JazzSvelteProviderWithClerk>
|
|
60
|
+
* ```
|
|
61
|
+
*
|
|
62
|
+
* @category Auth Providers
|
|
63
|
+
*/
|
|
64
|
+
declare const JazzSvelteProviderWithClerk: $$IsomorphicComponent;
|
|
65
|
+
type JazzSvelteProviderWithClerk<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema> = InstanceType<typeof JazzSvelteProviderWithClerk<S>>;
|
|
66
|
+
export default JazzSvelteProviderWithClerk;
|
|
67
|
+
//# sourceMappingURL=JazzSvelteProviderWithClerk.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JazzSvelteProviderWithClerk.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/auth/JazzSvelteProviderWithClerk.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,OAAO,EACP,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EAEnB,KAAK,gBAAgB,EAGrB,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,YAAY,CAAC;AAKtB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AA4HtC,cAAM,iBAAiB,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,gBAAgB;IAClG,KAAK;QAjHL,6FAA6F;eACtF,kBAAkB,GAAG,IAAI;QAChC,qDAAqD;mBAC1C,OAAO;QAClB,oDAAoD;mBACzC,OAAO;QAClB,iEAAiE;wBACjD,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;QAChC,wDAAwD;+BAClC,KAAK,KAAK,IAAI;QACpC,mEAAmE;oBACvD,OAAO;QACnB,qDAAqD;+BAC9B,MAAM;QAC7B,iDAAiD;cAC3C,UAAU;QAChB,qDAAqD;;QAErD,oDAAoD;;QAEpD,4CAA4C;6BACvB,MAAM;QAC3B,qEAAqE;kFAGhE,OAAO,CAAC,IAAI,CAAC;;IA2FlB,MAAM;IAGN,KAAK;IAGL,QAAQ;IACR,OAAO;CACV;AAED,UAAU,qBAAqB;IAC3B,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,gBAAgB,EAAE,OAAO,EAAE,OAAO,QAAQ,EAAE,2BAA2B,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAA;KAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACzc,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,gBAAgB,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACxM,YAAY,CAAC,EAAE,UAAU,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;CACjE;AACD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,QAAA,MAAM,2BAA2B,EAAE,qBAAmC,CAAC;AACrD,KAAK,2BAA2B,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GAAG,gBAAgB,IAAI,YAAY,CAAC,OAAO,2BAA2B,CAAC,CAAC,CAAC,CAAC,CAAC;AACzK,eAAe,2BAA2B,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
@component
|
|
3
|
+
Internal component that registers the Clerk auth listener.
|
|
4
|
+
|
|
5
|
+
This component exists because `useClerkAuth` requires access to the Jazz context,
|
|
6
|
+
which is only available inside `JazzSvelteProvider`'s children. By placing the
|
|
7
|
+
hook call in this child component, we ensure the context is properly initialized.
|
|
8
|
+
-->
|
|
9
|
+
<script lang="ts">
|
|
10
|
+
import type { MinimalClerkClient } from "jazz-tools";
|
|
11
|
+
import type { Snippet } from "svelte";
|
|
12
|
+
import { useClerkAuth } from "./ClerkAuth.svelte.js";
|
|
13
|
+
|
|
14
|
+
interface Props {
|
|
15
|
+
clerk: MinimalClerkClient;
|
|
16
|
+
children?: Snippet;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let { clerk, children }: Props = $props();
|
|
20
|
+
|
|
21
|
+
// Register the Clerk auth listener after JazzSvelteProvider context is available.
|
|
22
|
+
// The return value (auth state) is intentionally unused here - this component's
|
|
23
|
+
// sole purpose is to register the listener that syncs Clerk and Jazz auth state.
|
|
24
|
+
useClerkAuth(clerk);
|
|
25
|
+
</script>
|
|
26
|
+
|
|
27
|
+
{@render children?.()}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MinimalClerkClient } from "jazz-tools";
|
|
2
|
+
import type { Snippet } from "svelte";
|
|
3
|
+
interface Props {
|
|
4
|
+
clerk: MinimalClerkClient;
|
|
5
|
+
children?: Snippet;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Internal component that registers the Clerk auth listener.
|
|
9
|
+
*
|
|
10
|
+
* This component exists because `useClerkAuth` requires access to the Jazz context,
|
|
11
|
+
* which is only available inside `JazzSvelteProvider`'s children. By placing the
|
|
12
|
+
* hook call in this child component, we ensure the context is properly initialized.
|
|
13
|
+
*/
|
|
14
|
+
declare const RegisterClerkAuth: import("svelte").Component<Props, {}, "">;
|
|
15
|
+
type RegisterClerkAuth = ReturnType<typeof RegisterClerkAuth>;
|
|
16
|
+
export default RegisterClerkAuth;
|
|
17
|
+
//# sourceMappingURL=RegisterClerkAuth.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RegisterClerkAuth.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/auth/RegisterClerkAuth.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAIpC,UAAU,KAAK;IACb,KAAK,EAAE,kBAAkB,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoBH;;;;;;GAMG;AACH,QAAA,MAAM,iBAAiB,2CAAsC,CAAC;AAC9D,KAAK,iBAAiB,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAC9D,eAAe,iBAAiB,CAAC"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export * from "./PasskeyAuth.svelte.js";
|
|
2
2
|
export * from "./PassphraseAuth.svelte.js";
|
|
3
|
+
export * from "./ClerkAuth.svelte.js";
|
|
3
4
|
export { default as PasskeyAuthBasicUI } from "./PasskeyAuthBasicUI.svelte";
|
|
5
|
+
export { default as JazzSvelteProviderWithClerk } from "./JazzSvelteProviderWithClerk.svelte";
|
|
4
6
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/svelte/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/svelte/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,sCAAsC,CAAC"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export * from "./PasskeyAuth.svelte.js";
|
|
2
2
|
export * from "./PassphraseAuth.svelte.js";
|
|
3
|
+
export * from "./ClerkAuth.svelte.js";
|
|
3
4
|
export { default as PasskeyAuthBasicUI } from "./PasskeyAuthBasicUI.svelte";
|
|
5
|
+
export { default as JazzSvelteProviderWithClerk } from "./JazzSvelteProviderWithClerk.svelte";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClerkAuth.svelte.test.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/ClerkAuth.svelte.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
// @vitest-environment happy-dom
|
|
2
|
+
import { InMemoryKVStore, JazzClerkAuth, KvStoreContext, } from "jazz-tools";
|
|
3
|
+
import { render as renderSvelte, waitFor } from "@testing-library/svelte";
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { createJazzTestAccount, createJazzTestGuest, setupJazzTestSync, } from "../testing";
|
|
6
|
+
import { render, screen } from "./testUtils";
|
|
7
|
+
import TestClerkAuthWrapper from "./TestClerkAuthWrapper.svelte";
|
|
8
|
+
import JazzSvelteProviderWithClerk from "../auth/JazzSvelteProviderWithClerk.svelte";
|
|
9
|
+
KvStoreContext.getInstance().initialize(new InMemoryKVStore());
|
|
10
|
+
function createMockClerkClient(user = null) {
|
|
11
|
+
return {
|
|
12
|
+
user,
|
|
13
|
+
signOut: vi.fn(),
|
|
14
|
+
addListener: vi.fn(() => () => { }),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
describe("useClerkAuth", () => {
|
|
18
|
+
let account;
|
|
19
|
+
beforeEach(async () => {
|
|
20
|
+
await setupJazzTestSync();
|
|
21
|
+
account = await createJazzTestAccount({
|
|
22
|
+
isCurrentActiveAccount: true,
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
it("should return anonymous state when not authenticated", async () => {
|
|
26
|
+
const mockClerk = createMockClerkClient();
|
|
27
|
+
render(TestClerkAuthWrapper, { clerk: mockClerk }, { account, isAuthenticated: false });
|
|
28
|
+
expect(screen.getByTestId("auth-state").textContent).toBe("anonymous");
|
|
29
|
+
});
|
|
30
|
+
it("should return signedIn state when authenticated", async () => {
|
|
31
|
+
const mockClerk = createMockClerkClient({
|
|
32
|
+
id: "user_123",
|
|
33
|
+
fullName: "Test User",
|
|
34
|
+
username: "testuser",
|
|
35
|
+
firstName: "Test",
|
|
36
|
+
lastName: "User",
|
|
37
|
+
primaryEmailAddress: { emailAddress: "test@example.com" },
|
|
38
|
+
unsafeMetadata: {
|
|
39
|
+
jazzAccountID: "test123",
|
|
40
|
+
jazzAccountSecret: "secret123",
|
|
41
|
+
},
|
|
42
|
+
update: vi.fn(),
|
|
43
|
+
});
|
|
44
|
+
render(TestClerkAuthWrapper, { clerk: mockClerk }, { account, isAuthenticated: true });
|
|
45
|
+
expect(screen.getByTestId("auth-state").textContent).toBe("signedIn");
|
|
46
|
+
});
|
|
47
|
+
it("should register the clerk listener", async () => {
|
|
48
|
+
const mockClerk = createMockClerkClient();
|
|
49
|
+
render(TestClerkAuthWrapper, { clerk: mockClerk }, { account, isAuthenticated: false });
|
|
50
|
+
expect(mockClerk.addListener).toHaveBeenCalled();
|
|
51
|
+
});
|
|
52
|
+
it("should cleanup listener on unmount", async () => {
|
|
53
|
+
const mockUnsubscribe = vi.fn();
|
|
54
|
+
const mockClerk = createMockClerkClient();
|
|
55
|
+
mockClerk.addListener = vi.fn(() => mockUnsubscribe);
|
|
56
|
+
const { unmount } = render(TestClerkAuthWrapper, { clerk: mockClerk }, { account, isAuthenticated: false });
|
|
57
|
+
expect(mockClerk.addListener).toHaveBeenCalled();
|
|
58
|
+
unmount();
|
|
59
|
+
expect(mockUnsubscribe).toHaveBeenCalled();
|
|
60
|
+
});
|
|
61
|
+
it("should throw error in guest mode", async () => {
|
|
62
|
+
const guest = await createJazzTestGuest();
|
|
63
|
+
const mockClerk = createMockClerkClient();
|
|
64
|
+
expect(() => {
|
|
65
|
+
render(TestClerkAuthWrapper, { clerk: mockClerk }, { account: guest });
|
|
66
|
+
}).toThrow("Clerk auth is not supported in guest mode");
|
|
67
|
+
});
|
|
68
|
+
it("should call listener with clerk client events", async () => {
|
|
69
|
+
const mockClerk = createMockClerkClient();
|
|
70
|
+
let listenerCallback;
|
|
71
|
+
mockClerk.addListener = vi.fn((callback) => {
|
|
72
|
+
listenerCallback = callback;
|
|
73
|
+
return () => { };
|
|
74
|
+
});
|
|
75
|
+
render(TestClerkAuthWrapper, { clerk: mockClerk }, { account, isAuthenticated: false });
|
|
76
|
+
expect(mockClerk.addListener).toHaveBeenCalled();
|
|
77
|
+
expect(listenerCallback).toBeDefined();
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe("JazzClerkAuth.initializeAuth", () => {
|
|
81
|
+
afterEach(() => {
|
|
82
|
+
vi.restoreAllMocks();
|
|
83
|
+
});
|
|
84
|
+
it("should handle initialization errors gracefully", async () => {
|
|
85
|
+
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
86
|
+
const initializeAuthSpy = vi
|
|
87
|
+
.spyOn(JazzClerkAuth, "initializeAuth")
|
|
88
|
+
.mockRejectedValue(new Error("Test error"));
|
|
89
|
+
const mockClerk = createMockClerkClient();
|
|
90
|
+
// The error should be thrown by the mock
|
|
91
|
+
await expect(JazzClerkAuth.initializeAuth(mockClerk)).rejects.toThrow("Test error");
|
|
92
|
+
// Restore using vitest's cleanup
|
|
93
|
+
initializeAuthSpy.mockRestore();
|
|
94
|
+
consoleSpy.mockRestore();
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe("JazzSvelteProviderWithClerk", () => {
|
|
98
|
+
afterEach(() => {
|
|
99
|
+
vi.restoreAllMocks();
|
|
100
|
+
});
|
|
101
|
+
it("should render children after successful initialization", async () => {
|
|
102
|
+
const mockClerk = createMockClerkClient();
|
|
103
|
+
vi.spyOn(JazzClerkAuth, "initializeAuth").mockResolvedValue(undefined);
|
|
104
|
+
const { container } = renderSvelte(JazzSvelteProviderWithClerk, {
|
|
105
|
+
props: {
|
|
106
|
+
clerk: mockClerk,
|
|
107
|
+
sync: { peer: "wss://test.example.com" },
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
await waitFor(() => {
|
|
111
|
+
// After initialization, the provider should render (even without children)
|
|
112
|
+
// The error div should not be present
|
|
113
|
+
expect(container.querySelector('[data-testid="jazz-clerk-auth-error"]')).toBeNull();
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
it("should show default error message when initialization fails", async () => {
|
|
117
|
+
const mockClerk = createMockClerkClient();
|
|
118
|
+
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
119
|
+
vi.spyOn(JazzClerkAuth, "initializeAuth").mockRejectedValue(new Error("Init failed"));
|
|
120
|
+
const { container } = renderSvelte(JazzSvelteProviderWithClerk, {
|
|
121
|
+
props: {
|
|
122
|
+
clerk: mockClerk,
|
|
123
|
+
sync: { peer: "wss://test.example.com" },
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
await waitFor(() => {
|
|
127
|
+
const errorDiv = container.querySelector('[data-testid="jazz-clerk-auth-error"]');
|
|
128
|
+
expect(errorDiv).not.toBeNull();
|
|
129
|
+
expect(errorDiv?.textContent).toContain("Authentication initialization failed");
|
|
130
|
+
});
|
|
131
|
+
consoleSpy.mockRestore();
|
|
132
|
+
});
|
|
133
|
+
it("should call onAuthError callback when initialization fails", async () => {
|
|
134
|
+
const mockClerk = createMockClerkClient();
|
|
135
|
+
const onAuthError = vi.fn();
|
|
136
|
+
const consoleSpy = vi.spyOn(console, "error").mockImplementation(() => { });
|
|
137
|
+
vi.spyOn(JazzClerkAuth, "initializeAuth").mockRejectedValue(new Error("Init failed"));
|
|
138
|
+
renderSvelte(JazzSvelteProviderWithClerk, {
|
|
139
|
+
props: {
|
|
140
|
+
clerk: mockClerk,
|
|
141
|
+
sync: { peer: "wss://test.example.com" },
|
|
142
|
+
onAuthError,
|
|
143
|
+
},
|
|
144
|
+
});
|
|
145
|
+
await waitFor(() => {
|
|
146
|
+
expect(onAuthError).toHaveBeenCalledWith(expect.any(Error));
|
|
147
|
+
expect(onAuthError).toHaveBeenCalledWith(expect.objectContaining({ message: "Init failed" }));
|
|
148
|
+
});
|
|
149
|
+
consoleSpy.mockRestore();
|
|
150
|
+
});
|
|
151
|
+
it("should not update state after unmount (cancellation)", async () => {
|
|
152
|
+
const mockClerk = createMockClerkClient();
|
|
153
|
+
let resolveInit;
|
|
154
|
+
const initPromise = new Promise((resolve) => {
|
|
155
|
+
resolveInit = resolve;
|
|
156
|
+
});
|
|
157
|
+
vi.spyOn(JazzClerkAuth, "initializeAuth").mockReturnValue(initPromise);
|
|
158
|
+
const { unmount } = renderSvelte(JazzSvelteProviderWithClerk, {
|
|
159
|
+
props: {
|
|
160
|
+
clerk: mockClerk,
|
|
161
|
+
sync: { peer: "wss://test.example.com" },
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
// Unmount before initialization completes
|
|
165
|
+
unmount();
|
|
166
|
+
// Resolve the promise after unmount - should not cause errors
|
|
167
|
+
resolveInit();
|
|
168
|
+
// Give time for any potential state updates
|
|
169
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
170
|
+
// If we get here without errors, the cancellation worked
|
|
171
|
+
expect(true).toBe(true);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
describe("useClerkAuth reactive state transitions", () => {
|
|
175
|
+
let account;
|
|
176
|
+
beforeEach(async () => {
|
|
177
|
+
await setupJazzTestSync();
|
|
178
|
+
account = await createJazzTestAccount({
|
|
179
|
+
isCurrentActiveAccount: true,
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
afterEach(() => {
|
|
183
|
+
vi.restoreAllMocks();
|
|
184
|
+
});
|
|
185
|
+
it("should update state reactively when listener callback fires", async () => {
|
|
186
|
+
const mockClerk = createMockClerkClient();
|
|
187
|
+
let listenerCallback;
|
|
188
|
+
mockClerk.addListener = vi.fn((callback) => {
|
|
189
|
+
listenerCallback = callback;
|
|
190
|
+
return () => { };
|
|
191
|
+
});
|
|
192
|
+
const { container } = render(TestClerkAuthWrapper, { clerk: mockClerk }, { account, isAuthenticated: false });
|
|
193
|
+
// Initial state should be anonymous
|
|
194
|
+
expect(screen.getByTestId("auth-state").textContent).toBe("anonymous");
|
|
195
|
+
// Verify listener was registered
|
|
196
|
+
expect(listenerCallback).toBeDefined();
|
|
197
|
+
// Note: Full state transition testing would require more complex setup
|
|
198
|
+
// involving the actual JazzClerkAuth.onClerkUserChange flow.
|
|
199
|
+
// This test verifies the listener registration which is the foundation
|
|
200
|
+
// for reactive updates.
|
|
201
|
+
});
|
|
202
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { MinimalClerkClient } from "jazz-tools";
|
|
3
|
+
import { useClerkAuth } from "../auth/ClerkAuth.svelte.js";
|
|
4
|
+
|
|
5
|
+
type Props = {
|
|
6
|
+
clerk: MinimalClerkClient;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
let { clerk }: Props = $props();
|
|
10
|
+
|
|
11
|
+
const auth = useClerkAuth(clerk);
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<div data-testid="clerk-auth-wrapper">
|
|
15
|
+
<div data-testid="auth-state">{auth.state}</div>
|
|
16
|
+
</div>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { MinimalClerkClient } from "jazz-tools";
|
|
2
|
+
type Props = {
|
|
3
|
+
clerk: MinimalClerkClient;
|
|
4
|
+
};
|
|
5
|
+
declare const TestClerkAuthWrapper: import("svelte").Component<Props, {}, "">;
|
|
6
|
+
type TestClerkAuthWrapper = ReturnType<typeof TestClerkAuthWrapper>;
|
|
7
|
+
export default TestClerkAuthWrapper;
|
|
8
|
+
//# sourceMappingURL=TestClerkAuthWrapper.svelte.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TestClerkAuthWrapper.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/TestClerkAuthWrapper.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAInD,KAAK,KAAK,GAAG;IACX,KAAK,EAAE,kBAAkB,CAAC;CAC3B,CAAC;AAiBJ,QAAA,MAAM,oBAAoB,2CAAsC,CAAC;AACjE,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACpE,eAAe,oBAAoB,CAAC"}
|
|
@@ -4,6 +4,7 @@ type JazzExtendedOptions = {
|
|
|
4
4
|
account: Account | {
|
|
5
5
|
guest: AnonymousJazzAgent;
|
|
6
6
|
};
|
|
7
|
+
isAuthenticated?: boolean;
|
|
7
8
|
};
|
|
8
9
|
declare const render: <T extends Component>(component: T, props: ComponentProps<T>, jazzOptions: JazzExtendedOptions) => import("@testing-library/svelte").RenderResult<T, typeof import("@testing-library/dom/types/queries")>;
|
|
9
10
|
export * from "@testing-library/svelte";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/testUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAGnD,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/testUtils.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAGnD,KAAK,mBAAmB,GAAG;IACzB,OAAO,EAAE,OAAO,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC;IACjD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,QAAA,MAAM,MAAM,GAAI,CAAC,SAAS,SAAS,aACtB,CAAC,SACL,cAAc,CAAC,CAAC,CAAC,eACX,mBAAmB,2GAiBjC,CAAC;AAEF,cAAc,yBAAyB,CAAC;AAExC,OAAO,EAAE,MAAM,EAAE,CAAC"}
|
|
@@ -2,7 +2,9 @@ import { render as renderSvelte } from "@testing-library/svelte";
|
|
|
2
2
|
import { TestJazzContextManager } from "jazz-tools/testing";
|
|
3
3
|
import { JAZZ_AUTH_CTX, JAZZ_CTX } from "../jazz.svelte";
|
|
4
4
|
const render = (component, props, jazzOptions) => {
|
|
5
|
-
const ctx = TestJazzContextManager.fromAccountOrGuest(jazzOptions.account
|
|
5
|
+
const ctx = TestJazzContextManager.fromAccountOrGuest(jazzOptions.account, {
|
|
6
|
+
isAuthenticated: jazzOptions.isAuthenticated,
|
|
7
|
+
});
|
|
6
8
|
return renderSvelte(
|
|
7
9
|
// @ts-expect-error Svelte new Component type is not compatible with @testing-library/svelte
|
|
8
10
|
component, {
|
package/dist/testing.js
CHANGED
|
@@ -14,7 +14,7 @@ export declare class JazzClerkAuth {
|
|
|
14
14
|
static initializeAuth(clerk: MinimalClerkClient): Promise<void>;
|
|
15
15
|
private isFirstCall;
|
|
16
16
|
private previousUser;
|
|
17
|
-
registerListener(clerkClient: MinimalClerkClient): void;
|
|
17
|
+
registerListener(clerkClient: MinimalClerkClient): void | (() => void);
|
|
18
18
|
onClerkUserChange: (clerkUser: ClerkUser | null | undefined) => Promise<void>;
|
|
19
19
|
logIn: (clerkUser: ClerkUser) => Promise<void>;
|
|
20
20
|
signIn: (clerkUser: ClerkUser) => Promise<void>;
|
|
@@ -57,7 +57,7 @@ type PermissiveClerkUser = Omit<ClerkUser, "unsafeMetadata" | "update"> & {
|
|
|
57
57
|
export type MinimalClerkClient = {
|
|
58
58
|
user: PermissiveClerkUser | null | undefined;
|
|
59
59
|
signOut: () => Promise<void>;
|
|
60
|
-
addListener: (listener: (data: unknown) => void) => void;
|
|
60
|
+
addListener: (listener: (data: unknown) => void) => (() => void) | void;
|
|
61
61
|
};
|
|
62
62
|
export type ClerkCredentials = {
|
|
63
63
|
jazzAccountID: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tools/auth/clerk/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAQ3B,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;iBAoBnB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;iBAE3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAGxD,KAAK,mBAAmB,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,QAAQ,CAAC,GAAG;IACxE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,IAAI,EAAE;QACb,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACzC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/tools/auth/clerk/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAQ3B,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;iBAoBnB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;iBAE3B,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAGxD,KAAK,mBAAmB,GAAG,IAAI,CAAC,SAAS,EAAE,gBAAgB,GAAG,QAAQ,CAAC,GAAG;IACxE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,IAAI,EAAE;QACb,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACzC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG;IAC/B,IAAI,EAAE,mBAAmB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,CAAC;CACzE,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,WAAW,CAAC;IAC/B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GACxC,IAAI,IAAI,gBAAgB,CAE1B;AAED,KAAK,2BAA2B,GAC5B,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,GACjC,IAAI,GACJ,SAAS,CAAC;AAEd,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,2BAA2B,EACzC,OAAO,EAAE,2BAA2B,WAkBrC"}
|
package/dist/tools/exports.d.ts
CHANGED
|
@@ -25,4 +25,5 @@ export { experimental_defineRequest, JazzRequestError, isJazzRequestError, authe
|
|
|
25
25
|
export * from "./ssr/index.js";
|
|
26
26
|
export { captureStack } from "./subscribe/errorReporting.js";
|
|
27
27
|
export * as jazzConfig from "./config.js";
|
|
28
|
+
export { JazzMessageChannel as experimental_JazzMessageChannel, type JazzMessageChannelExposeOptions, } from "../worker/JazzMessageChannel.js";
|
|
28
29
|
//# sourceMappingURL=exports.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/tools/exports.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exports.d.ts","sourceRoot":"","sources":["../../src/tools/exports.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,KAAK,EACL,aAAa,EACb,QAAQ,EACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,eAAO,MAAM,mBAAmB;IAC9B;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;CAEK,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAC7B,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GACzB,OAAO,mBAAmB,CAAC,WAAW,GACtC,OAAO,mBAAmB,CAAC,YAAY,CAAC;AAE5C,MAAM,MAAM,qBAAqB,GAC7B,OAAO,mBAAmB,CAAC,OAAO,GAClC,iBAAiB,CAAC;AAEtB,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,IACvE;IACE,IAAI,EAAE,OAAO,mBAAmB,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GACD,SAAS,CAAC;AACd,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,OAAO,mBAAmB,CAAC,OAAO,CAAC;IACzC,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,KAAK,EACL,aAAa,EACb,QAAQ,EACT,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAEhD,eAAO,MAAM,mBAAmB;IAC9B;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;IAEH;;OAEG;;CAEK,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAC7B,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,OAAO,mBAAmB,CAAC,CAAC;AAEjE,MAAM,MAAM,iBAAiB,GACzB,OAAO,mBAAmB,CAAC,WAAW,GACtC,OAAO,mBAAmB,CAAC,YAAY,CAAC;AAE5C,MAAM,MAAM,qBAAqB,GAC7B,OAAO,mBAAmB,CAAC,OAAO,GAClC,iBAAiB,CAAC;AAEtB,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,OAAO,EAAE,CAAC,SAAS,aAAa,CAAC,CAAC,CAAC,IACvE;IACE,IAAI,EAAE,OAAO,mBAAmB,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtB,EAAE,EAAE,MAAM,CAAC;CACZ,GACD,SAAS,CAAC;AACd,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,OAAO,mBAAmB,CAAC,OAAO,CAAC;IACzC,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,GAAG,OAAO,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { type Peer } from "cojson";
|
|
2
|
+
import type { WaitForConnectionOptions, ExposeOptions, PostMessageTarget } from "cojson/src/CojsonMessageChannel/types.js";
|
|
3
|
+
import { Account, AnonymousJazzAgent } from "jazz-tools";
|
|
4
|
+
/**
|
|
5
|
+
* Options for JazzMessageChannel.expose()
|
|
6
|
+
*/
|
|
7
|
+
export interface JazzMessageChannelExposeOptions extends ExposeOptions {
|
|
8
|
+
/**
|
|
9
|
+
* The account or anonymous agent to use for the connection.
|
|
10
|
+
* If not provided, falls back to the active account context.
|
|
11
|
+
*/
|
|
12
|
+
loadAs?: Account | AnonymousJazzAgent;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* JazzMessageChannel provides a high-level API for creating Jazz connections
|
|
16
|
+
* via the MessageChannel API. It wraps cojson's CojsonMessageChannel and
|
|
17
|
+
* automatically manages the node connection.
|
|
18
|
+
*/
|
|
19
|
+
export declare class JazzMessageChannel {
|
|
20
|
+
/**
|
|
21
|
+
* Expose a Jazz connection to a target.
|
|
22
|
+
* This is the host-side API, typically called from the main thread.
|
|
23
|
+
*
|
|
24
|
+
* @param target - Any object with a postMessage method (Worker, Window, etc.)
|
|
25
|
+
* @param opts - Configuration options including the account to use
|
|
26
|
+
* @returns A promise that resolves once the connection is established
|
|
27
|
+
*/
|
|
28
|
+
static expose(target: PostMessageTarget, opts?: JazzMessageChannelExposeOptions): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Accept an incoming Jazz connection.
|
|
31
|
+
* Same as cojson CojsonMessageChannel.waitForConnection().
|
|
32
|
+
*/
|
|
33
|
+
static waitForConnection(opts?: WaitForConnectionOptions): Promise<Peer>;
|
|
34
|
+
}
|
|
35
|
+
export type { WaitForConnectionOptions, AcceptFromPortOptions, } from "cojson/src/CojsonMessageChannel/types.js";
|
|
36
|
+
//# sourceMappingURL=JazzMessageChannel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JazzMessageChannel.d.ts","sourceRoot":"","sources":["../../src/worker/JazzMessageChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EACV,wBAAwB,EACxB,aAAa,EACb,iBAAiB,EAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGzD;;GAEG;AACH,MAAM,WAAW,+BAAgC,SAAQ,aAAa;IACpE;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,GAAG,kBAAkB,CAAC;CACvC;AAED;;;;GAIG;AACH,qBAAa,kBAAkB;IAC7B;;;;;;;OAOG;WACU,MAAM,CACjB,MAAM,EAAE,iBAAiB,EACzB,IAAI,GAAE,+BAAoC,GACzC,OAAO,CAAC,IAAI,CAAC;IAsBhB;;;OAGG;IACH,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzE;AAGD,YAAY,EACV,wBAAwB,EACxB,qBAAqB,GACtB,MAAM,0CAA0C,CAAC"}
|
package/dist/worker/index.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
|
-
import { CryptoProvider, StorageAPI } from "cojson";
|
|
1
|
+
import { CryptoProvider, Peer, StorageAPI } from "cojson";
|
|
2
2
|
import { type AnyWebSocketConstructor } from "cojson-transport-ws";
|
|
3
3
|
import { Account, AccountClass, AnyAccountSchema, CoValueFromRaw, Inbox, Loaded } from "jazz-tools";
|
|
4
4
|
type WorkerOptions<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema> = {
|
|
5
5
|
accountID?: string;
|
|
6
6
|
accountSecret?: string;
|
|
7
|
+
/**
|
|
8
|
+
* A peer to connect to for synchronization.
|
|
9
|
+
* If provided, syncServer is ignored.
|
|
10
|
+
*/
|
|
11
|
+
peer?: Peer;
|
|
7
12
|
syncServer?: string;
|
|
8
13
|
WebSocket?: AnyWebSocketConstructor;
|
|
9
14
|
AccountSchema?: S;
|
|
@@ -40,6 +45,7 @@ export declare function startWorker<S extends (AccountClass<Account> & CoValueFr
|
|
|
40
45
|
* Wait for the connection to the sync server to be established.
|
|
41
46
|
*
|
|
42
47
|
* If already connected, it will resolve immediately.
|
|
48
|
+
* Returns immediately if using a custom peer.
|
|
43
49
|
*/
|
|
44
50
|
waitForConnection(): Promise<void>;
|
|
45
51
|
subscribeToConnectionChange(listener: (connected: boolean) => void): () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worker/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EAEd,IAAI,EACJ,UAAU,EACX,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,KAAK,uBAAuB,EAE7B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,KAAK,EAEL,MAAM,EAGP,MAAM,YAAY,CAAC;AAEpB,KAAK,aAAa,CAChB,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB;;OAEG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,CAAC;AAEF,iCAAiC;AACjC,wBAAsB,WAAW,CAC/B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;IAwFvB;;OAEG;YACwB,MAAM,CAAC,CAAC,CAAC;;QAElC;;;;WAIG;;uBAhByC,KAAK,CAAC,WAAW,CAAC;;;;;IAmBhE;;;;;OAKG;;0CAImC,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;IAalE;;;;;;OAMG;;IAEH;;;;OAIG;;GAKN"}
|
package/dist/worker/index.js
CHANGED
|
@@ -20,21 +20,26 @@ async function startWorker(options) {
|
|
|
20
20
|
} = options;
|
|
21
21
|
let node = void 0;
|
|
22
22
|
const peers = [];
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
23
|
+
let wsPeer;
|
|
24
|
+
if (options.peer) {
|
|
25
|
+
peers.push(options.peer);
|
|
26
|
+
} else {
|
|
27
|
+
wsPeer = new WebSocketPeerWithReconnection({
|
|
28
|
+
peer: syncServer,
|
|
29
|
+
reconnectionTimeout: 100,
|
|
30
|
+
addPeer: (peer) => {
|
|
31
|
+
if (node) {
|
|
32
|
+
node.syncManager.addPeer(peer);
|
|
33
|
+
} else {
|
|
34
|
+
peers.push(peer);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
removePeer: () => {
|
|
38
|
+
},
|
|
39
|
+
WebSocketConstructor: options.WebSocket
|
|
40
|
+
});
|
|
41
|
+
wsPeer.enable();
|
|
42
|
+
}
|
|
38
43
|
if (!accountID) {
|
|
39
44
|
throw new Error("No accountID provided");
|
|
40
45
|
}
|
|
@@ -67,7 +72,7 @@ async function startWorker(options) {
|
|
|
67
72
|
const inbox = skipInboxLoad ? void 0 : await Inbox.load(account);
|
|
68
73
|
async function done() {
|
|
69
74
|
await context.account.$jazz.waitForAllCoValuesSync();
|
|
70
|
-
wsPeer
|
|
75
|
+
wsPeer?.disable();
|
|
71
76
|
context.done();
|
|
72
77
|
}
|
|
73
78
|
const inboxPublicApi = inbox ? {
|
|
@@ -93,11 +98,17 @@ async function startWorker(options) {
|
|
|
93
98
|
* Wait for the connection to the sync server to be established.
|
|
94
99
|
*
|
|
95
100
|
* If already connected, it will resolve immediately.
|
|
101
|
+
* Returns immediately if using a custom peer.
|
|
96
102
|
*/
|
|
97
103
|
waitForConnection() {
|
|
98
|
-
return wsPeer
|
|
104
|
+
return wsPeer?.waitUntilConnected() ?? Promise.resolve();
|
|
99
105
|
},
|
|
100
106
|
subscribeToConnectionChange(listener) {
|
|
107
|
+
if (!wsPeer) {
|
|
108
|
+
listener(true);
|
|
109
|
+
return () => {
|
|
110
|
+
};
|
|
111
|
+
}
|
|
101
112
|
wsPeer.subscribe(listener);
|
|
102
113
|
return () => {
|
|
103
114
|
wsPeer.unsubscribe(listener);
|