jazz-tools 0.18.17 → 0.18.19
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__/jazz.class.svelte.d.ts +14 -0
- package/.svelte-kit/__package__/jazz.class.svelte.d.ts.map +1 -1
- package/.svelte-kit/__package__/jazz.class.svelte.js +37 -0
- package/.svelte-kit/__package__/testing.d.ts +1 -1
- package/.svelte-kit/__package__/testing.d.ts.map +1 -1
- package/.svelte-kit/__package__/testing.js +1 -1
- package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte +8 -0
- package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte.d.ts +27 -0
- package/.svelte-kit/__package__/tests/TestConnectionStatus.svelte.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.d.ts +2 -0
- package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/sync-connection-status.svelte.test.js +47 -0
- package/.turbo/turbo-build.log +57 -57
- package/CHANGELOG.md +27 -0
- package/dist/better-auth/auth/client.d.ts.map +1 -1
- package/dist/better-auth/auth/client.js +3 -2
- package/dist/better-auth/auth/client.js.map +1 -1
- package/dist/browser/BrowserContextManager.d.ts +4 -0
- package/dist/browser/BrowserContextManager.d.ts.map +1 -1
- package/dist/browser/createBrowserContext.d.ts +4 -0
- package/dist/browser/createBrowserContext.d.ts.map +1 -1
- package/dist/browser/index.js +36 -4
- package/dist/browser/index.js.map +1 -1
- package/dist/{chunk-OTWWOZMB.js → chunk-RN3Y24WX.js} +9 -4
- package/dist/chunk-RN3Y24WX.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/react/hooks.d.ts +1 -1
- package/dist/react/hooks.d.ts.map +1 -1
- package/dist/react/index.d.ts +1 -1
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +4 -2
- package/dist/react/index.js.map +1 -1
- package/dist/react-core/hooks.d.ts +26 -0
- package/dist/react-core/hooks.d.ts.map +1 -1
- package/dist/react-core/index.js +16 -1
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-core/testing.d.ts +1 -1
- package/dist/react-core/testing.d.ts.map +1 -1
- package/dist/react-core/testing.js +3 -1
- package/dist/react-core/testing.js.map +1 -1
- package/dist/react-core/tests/useSyncConnectionStatus.test.d.ts +2 -0
- package/dist/react-core/tests/useSyncConnectionStatus.test.d.ts.map +1 -0
- package/dist/react-native-core/ReactNativeContextManager.d.ts +4 -0
- package/dist/react-native-core/ReactNativeContextManager.d.ts.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 +38 -6
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/platform.d.ts +4 -0
- package/dist/react-native-core/platform.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.d.ts +14 -0
- package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.js +37 -0
- package/dist/svelte/testing.d.ts +1 -1
- package/dist/svelte/testing.d.ts.map +1 -1
- package/dist/svelte/testing.js +1 -1
- package/dist/svelte/tests/TestConnectionStatus.svelte +8 -0
- package/dist/svelte/tests/TestConnectionStatus.svelte.d.ts +27 -0
- package/dist/svelte/tests/TestConnectionStatus.svelte.d.ts.map +1 -0
- package/dist/svelte/tests/sync-connection-status.svelte.test.d.ts +2 -0
- package/dist/svelte/tests/sync-connection-status.svelte.test.d.ts.map +1 -0
- package/dist/svelte/tests/sync-connection-status.svelte.test.js +47 -0
- package/dist/testing.js +34 -4
- package/dist/testing.js.map +1 -1
- package/dist/tools/coValues/coMap.d.ts +2 -2
- package/dist/tools/coValues/coMap.d.ts.map +1 -1
- package/dist/tools/implementation/ContextManager.d.ts +4 -0
- package/dist/tools/implementation/ContextManager.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/dist/tools/testing.d.ts +8 -0
- package/dist/tools/testing.d.ts.map +1 -1
- package/dist/tools/types.d.ts +4 -0
- package/dist/tools/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/better-auth/auth/client.ts +3 -2
- package/src/better-auth/auth/tests/client.test.ts +22 -0
- package/src/browser/createBrowserContext.ts +34 -4
- package/src/react/hooks.tsx +1 -0
- package/src/react/index.ts +1 -0
- package/src/react-core/hooks.ts +42 -0
- package/src/react-core/testing.tsx +1 -0
- package/src/react-core/tests/useAccountWithSelector.test.ts +98 -2
- package/src/react-core/tests/useSyncConnectionStatus.test.ts +48 -0
- package/src/react-native-core/hooks.tsx +1 -0
- package/src/react-native-core/platform.ts +32 -4
- package/src/svelte/jazz.class.svelte.ts +44 -0
- package/src/svelte/testing.ts +1 -0
- package/src/svelte/tests/TestConnectionStatus.svelte +8 -0
- package/src/svelte/tests/sync-connection-status.svelte.test.ts +61 -0
- package/src/tools/coValues/coMap.ts +5 -5
- package/src/tools/implementation/ContextManager.ts +8 -0
- package/src/tools/subscribe/SubscriptionScope.ts +5 -1
- package/src/tools/subscribe/index.ts +1 -1
- package/src/tools/testing.ts +29 -0
- package/src/tools/tests/ContextManager.test.ts +2 -2
- package/src/tools/tests/coMap.test.ts +68 -2
- package/src/tools/tests/subscribe.test.ts +42 -4
- package/src/tools/types.ts +4 -0
- package/dist/chunk-OTWWOZMB.js.map +0 -1
@@ -34,5 +34,19 @@ export declare class AccountCoState<A extends (AccountClass<Account> & CoValueFr
|
|
34
34
|
get agent(): import("jazz-tools").AnonymousJazzAgent | InstanceOfSchema<A>;
|
35
35
|
get isAuthenticated(): boolean;
|
36
36
|
}
|
37
|
+
/**
|
38
|
+
* Class that provides the current connection status to the Jazz sync server.
|
39
|
+
*
|
40
|
+
* @returns `true` when connected to the server, `false` when disconnected
|
41
|
+
*
|
42
|
+
* @remarks
|
43
|
+
* On connection drop, this will return `false` only when Jazz detects the disconnection
|
44
|
+
* after 5 seconds of not receiving a ping from the server.
|
45
|
+
*/
|
46
|
+
export declare class SyncConnectionStatus {
|
47
|
+
#private;
|
48
|
+
constructor();
|
49
|
+
get current(): boolean;
|
50
|
+
}
|
37
51
|
export {};
|
38
52
|
//# sourceMappingURL=jazz.class.svelte.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"jazz.class.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.class.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAUpB,KAAK,cAAc,CAAC,CAAC,SAAS,oBAAoB,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,IAAI;IAC/E,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC;;;;;;;;;;;;;;MAcE;IACF,eAAe,CAAC,EAAE,gBAAgB,CAAA;CACnC,CAAC;AAEF,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAE3C,qBAAa,OAAO,CAClB,CAAC,SAAS,oBAAoB,EAC9B,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAU9B,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,EACjC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAgD/D,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,IAAI,OAAO,oCAGV;CACF;AAED,qBAAa,cAAc,CACzB,CAAC,SACC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EAClB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAQpB,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IA8CpF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,MAAM,aAEJ;IAEF,IAAI,OAAO,oCAIV;IAED,IAAI,KAAK,kEAQR;IAID,IAAI,eAAe,YAElB;CACF"}
|
1
|
+
{"version":3,"file":"jazz.class.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/jazz.class.svelte.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,MAAM,EACN,YAAY,EACZ,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAUpB,KAAK,cAAc,CAAC,CAAC,SAAS,oBAAoB,EAAE,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,IAAI;IAC/E,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC;;;;;;;;;;;;;;MAcE;IACF,eAAe,CAAC,EAAE,gBAAgB,CAAA;CACnC,CAAC;AAEF,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;AAE3C,qBAAa,OAAO,CAClB,CAAC,SAAS,oBAAoB,EAC9B,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAU9B,MAAM,EAAE,CAAC,EACT,EAAE,EAAE,SAAS,GAAG,CAAC,MAAM,SAAS,CAAC,EACjC,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAgD/D,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,IAAI,OAAO,oCAGV;CACF;AAED,qBAAa,cAAc,CACzB,CAAC,SACC,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EAClB,CAAC,SAAS,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI;;gBAQpB,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IA8CpF,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,SAAS,GAAG,IAAI;IAM7C,MAAM,aAEJ;IAEF,IAAI,OAAO,oCAIV;IAED,IAAI,KAAK,kEAQR;IAID,IAAI,eAAe,YAElB;CACF;AAED;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;;;IA6B/B,IAAI,OAAO,YAGV;CACF"}
|
@@ -123,3 +123,40 @@ export class AccountCoState {
|
|
123
123
|
return this.#isAuthenticated.current;
|
124
124
|
}
|
125
125
|
}
|
126
|
+
/**
|
127
|
+
* Class that provides the current connection status to the Jazz sync server.
|
128
|
+
*
|
129
|
+
* @returns `true` when connected to the server, `false` when disconnected
|
130
|
+
*
|
131
|
+
* @remarks
|
132
|
+
* On connection drop, this will return `false` only when Jazz detects the disconnection
|
133
|
+
* after 5 seconds of not receiving a ping from the server.
|
134
|
+
*/
|
135
|
+
export class SyncConnectionStatus {
|
136
|
+
#ctx = getJazzContext();
|
137
|
+
#subscribe;
|
138
|
+
#update = () => { };
|
139
|
+
constructor() {
|
140
|
+
this.#subscribe = createSubscriber((update) => {
|
141
|
+
this.#update = update;
|
142
|
+
});
|
143
|
+
$effect.pre(() => {
|
144
|
+
const ctx = this.#ctx.current;
|
145
|
+
return untrack(() => {
|
146
|
+
if (!ctx) {
|
147
|
+
return;
|
148
|
+
}
|
149
|
+
const unsubscribe = ctx.addConnectionListener(() => {
|
150
|
+
this.#update();
|
151
|
+
});
|
152
|
+
return () => {
|
153
|
+
unsubscribe();
|
154
|
+
};
|
155
|
+
});
|
156
|
+
});
|
157
|
+
}
|
158
|
+
get current() {
|
159
|
+
this.#subscribe();
|
160
|
+
return this.#ctx.current?.connected() ?? false;
|
161
|
+
}
|
162
|
+
}
|
@@ -6,5 +6,5 @@ export declare function createJazzTestContext<Acc extends Account>(opts?: {
|
|
6
6
|
};
|
7
7
|
isAuthenticated?: boolean;
|
8
8
|
}): Map<{} | {}, AuthSecretStorage | JazzContext<Acc>>;
|
9
|
-
export { createJazzTestAccount, createJazzTestGuest, linkAccounts, setActiveAccount, setupJazzTestSync, } from "jazz-tools/testing";
|
9
|
+
export { createJazzTestAccount, createJazzTestGuest, linkAccounts, setActiveAccount, setupJazzTestSync, MockConnectionStatus, } from "jazz-tools/testing";
|
10
10
|
//# sourceMappingURL=testing.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/svelte/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE7E,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,OAAO,EACvD,IAAI,GAAE;IACJ,OAAO,CAAC,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,sDAyBP;AAED,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/svelte/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE5E,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE7E,wBAAgB,qBAAqB,CAAC,GAAG,SAAS,OAAO,EACvD,IAAI,GAAE;IACJ,OAAO,CAAC,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,CAAC;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;CACtB,sDAyBP;AAED,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC"}
|
@@ -20,4 +20,4 @@ export function createJazzTestContext(opts = {}) {
|
|
20
20
|
}
|
21
21
|
return ctx;
|
22
22
|
}
|
23
|
-
export { createJazzTestAccount, createJazzTestGuest, linkAccounts, setActiveAccount, setupJazzTestSync, } from "jazz-tools/testing";
|
23
|
+
export { createJazzTestAccount, createJazzTestGuest, linkAccounts, setActiveAccount, setupJazzTestSync, MockConnectionStatus, } from "jazz-tools/testing";
|
@@ -0,0 +1,27 @@
|
|
1
|
+
export default TestConnectionStatus;
|
2
|
+
type TestConnectionStatus = SvelteComponent<{
|
3
|
+
[x: string]: never;
|
4
|
+
}, {
|
5
|
+
[evt: string]: CustomEvent<any>;
|
6
|
+
}, {}> & {
|
7
|
+
$$bindings?: string | undefined;
|
8
|
+
};
|
9
|
+
declare const TestConnectionStatus: $$__sveltets_2_IsomorphicComponent<{
|
10
|
+
[x: string]: never;
|
11
|
+
}, {
|
12
|
+
[evt: string]: CustomEvent<any>;
|
13
|
+
}, {}, {}, string>;
|
14
|
+
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
15
|
+
new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & {
|
16
|
+
$$bindings?: Bindings;
|
17
|
+
} & Exports;
|
18
|
+
(internal: unknown, props: {
|
19
|
+
$$events?: Events;
|
20
|
+
$$slots?: Slots;
|
21
|
+
}): Exports & {
|
22
|
+
$set?: any;
|
23
|
+
$on?: any;
|
24
|
+
};
|
25
|
+
z_$$bindings?: Bindings;
|
26
|
+
}
|
27
|
+
//# sourceMappingURL=TestConnectionStatus.svelte.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"TestConnectionStatus.svelte.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/TestConnectionStatus.svelte.js"],"names":[],"mappings":";;;;;;;;AAyBA;;;;mBAA8H;6CATjF,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,OAAO,OAAO,QAAQ;IAC3L,cAAc,OAAO,QAAQ,EAAE,2BAA2B,CAAC,KAAK,CAAC,GAAG,OAAO,QAAQ,EAAE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG;QAAE,UAAU,CAAC,EAAE,QAAQ,CAAA;KAAE,GAAG,OAAO,CAAC;IACjK,WAAW,OAAO,SAAS;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,KAAK,CAAA;KAAC,GAAG,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,GAAG,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IACtG,eAAe,QAAQ,CAAC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"sync-connection-status.svelte.test.d.ts","sourceRoot":"","sources":["../../../../src/svelte/tests/sync-connection-status.svelte.test.ts"],"names":[],"mappings":""}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
// @vitest-environment happy-dom
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
3
|
+
import { createJazzTestAccount, setupJazzTestSync, MockConnectionStatus, } from "../testing";
|
4
|
+
import { render, screen, waitFor } from "./testUtils";
|
5
|
+
import TestConnectionStatus from "./TestConnectionStatus.svelte";
|
6
|
+
describe("SyncConnectionStatus", () => {
|
7
|
+
beforeEach(async () => {
|
8
|
+
await setupJazzTestSync();
|
9
|
+
await createJazzTestAccount({
|
10
|
+
isCurrentActiveAccount: true,
|
11
|
+
});
|
12
|
+
});
|
13
|
+
afterEach(() => {
|
14
|
+
vi.clearAllMocks();
|
15
|
+
});
|
16
|
+
it("should return true by default in the test environment", async () => {
|
17
|
+
const { container } = render(TestConnectionStatus, {}, {
|
18
|
+
account: await createJazzTestAccount({
|
19
|
+
isCurrentActiveAccount: true,
|
20
|
+
}),
|
21
|
+
});
|
22
|
+
await waitFor(() => {
|
23
|
+
expect(screen.getByTestId("connected").textContent).toBe("true");
|
24
|
+
});
|
25
|
+
});
|
26
|
+
it("should handle updates", async () => {
|
27
|
+
const { container } = render(TestConnectionStatus, {}, {
|
28
|
+
account: await createJazzTestAccount({
|
29
|
+
isCurrentActiveAccount: true,
|
30
|
+
}),
|
31
|
+
});
|
32
|
+
// Initially should be connected
|
33
|
+
await waitFor(() => {
|
34
|
+
expect(screen.getByTestId("connected").textContent).toBe("true");
|
35
|
+
});
|
36
|
+
// Simulate disconnection
|
37
|
+
MockConnectionStatus.setIsConnected(false);
|
38
|
+
await waitFor(() => {
|
39
|
+
expect(screen.getByTestId("connected").textContent).toBe("false");
|
40
|
+
});
|
41
|
+
// Simulate reconnection
|
42
|
+
MockConnectionStatus.setIsConnected(true);
|
43
|
+
await waitFor(() => {
|
44
|
+
expect(screen.getByTestId("connected").textContent).toBe("true");
|
45
|
+
});
|
46
|
+
});
|
47
|
+
});
|
package/.turbo/turbo-build.log
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
|
2
|
-
> jazz-tools@0.18.
|
2
|
+
> jazz-tools@0.18.19 build /home/runner/_work/jazz/jazz/packages/jazz-tools
|
3
3
|
> tsup && pnpm types && pnpm build:svelte
|
4
4
|
|
5
5
|
[34mCLI[39m Building entry: {"index":"src/index.ts","testing":"src/testing.ts"}
|
@@ -114,17 +114,31 @@
|
|
114
114
|
[34mESM[39m Build start
|
115
115
|
[34mCLI[39m Cleaning output folder
|
116
116
|
[34mESM[39m Build start
|
117
|
-
[32mESM[39m [1mdist/react/ssr.js [22m[32m688.00 B[39m
|
118
|
-
[32mESM[39m [1mdist/react/ssr.js.map [22m[32m1.12 KB[39m
|
119
|
-
[32mESM[39m ⚡️ Build success in 20ms
|
120
117
|
[32mESM[39m [1mdist/tiptap/index.js [22m[32m564.00 B[39m
|
121
118
|
[32mESM[39m [1mdist/tiptap/index.js.map [22m[32m1.21 KB[39m
|
122
|
-
[32mESM[39m ⚡️ Build success in
|
119
|
+
[32mESM[39m ⚡️ Build success in 20ms
|
120
|
+
[32mESM[39m [1mdist/react/ssr.js [22m[32m688.00 B[39m
|
121
|
+
[32mESM[39m [1mdist/react/ssr.js.map [22m[32m1.12 KB[39m
|
122
|
+
[32mESM[39m ⚡️ Build success in 24ms
|
123
123
|
[32mESM[39m [1mdist/worker/index.js [22m[32m3.19 KB[39m
|
124
124
|
[32mESM[39m [1mdist/worker/edge-wasm.js [22m[32m215.00 B[39m
|
125
125
|
[32mESM[39m [1mdist/worker/index.js.map [22m[32m6.17 KB[39m
|
126
126
|
[32mESM[39m [1mdist/worker/edge-wasm.js.map [22m[32m434.00 B[39m
|
127
|
-
[32mESM[39m ⚡️ Build success in
|
127
|
+
[32mESM[39m ⚡️ Build success in 21ms
|
128
|
+
[32mESM[39m [1mdist/react-native/index.js [22m[32m2.53 KB[39m
|
129
|
+
[32mESM[39m [1mdist/react-native/crypto.js [22m[32m161.00 B[39m
|
130
|
+
[32mESM[39m [1mdist/react-native/testing.js [22m[32m120.00 B[39m
|
131
|
+
[32mESM[39m [1mdist/react-native/index.js.map [22m[32m5.68 KB[39m
|
132
|
+
[32mESM[39m [1mdist/react-native/crypto.js.map [22m[32m197.00 B[39m
|
133
|
+
[32mESM[39m [1mdist/react-native/testing.js.map [22m[32m176.00 B[39m
|
134
|
+
[32mESM[39m ⚡️ Build success in 24ms
|
135
|
+
[32mESM[39m [1mdist/better-auth/auth/client.js [22m[32m4.50 KB[39m
|
136
|
+
[32mESM[39m [1mdist/better-auth/auth/react.js [22m[32m799.00 B[39m
|
137
|
+
[32mESM[39m [1mdist/better-auth/auth/server.js [22m[32m8.36 KB[39m
|
138
|
+
[32mESM[39m [1mdist/better-auth/auth/client.js.map [22m[32m8.32 KB[39m
|
139
|
+
[32mESM[39m [1mdist/better-auth/auth/react.js.map [22m[32m2.04 KB[39m
|
140
|
+
[32mESM[39m [1mdist/better-auth/auth/server.js.map [22m[32m15.29 KB[39m
|
141
|
+
[32mESM[39m ⚡️ Build success in 23ms
|
128
142
|
[32mESM[39m [1mdist/media/index.js [22m[32m236.00 B[39m
|
129
143
|
[32mESM[39m [1mdist/media/index.browser.js [22m[32m2.79 KB[39m
|
130
144
|
[32mESM[39m [1mdist/media/index.native.js [22m[32m2.90 KB[39m
|
@@ -135,77 +149,63 @@
|
|
135
149
|
[32mESM[39m [1mdist/media/index.native.js.map [22m[32m6.09 KB[39m
|
136
150
|
[32mESM[39m [1mdist/media/index.server.js.map [22m[32m6.37 KB[39m
|
137
151
|
[32mESM[39m [1mdist/media/chunk-W3S526L3.js.map [22m[32m16.57 KB[39m
|
138
|
-
[32mESM[39m ⚡️ Build success in
|
139
|
-
[32mESM[39m [1mdist/better-auth/
|
140
|
-
[32mESM[39m [1mdist/better-auth/
|
141
|
-
[32mESM[39m
|
142
|
-
[32mESM[39m [1mdist/better-auth/auth/client.js.map [22m[32m8.24 KB[39m
|
143
|
-
[32mESM[39m [1mdist/better-auth/auth/react.js.map [22m[32m2.04 KB[39m
|
144
|
-
[32mESM[39m [1mdist/better-auth/auth/server.js.map [22m[32m15.29 KB[39m
|
145
|
-
[32mESM[39m ⚡️ Build success in 27ms
|
146
|
-
[32mESM[39m [1mdist/react-native/index.js [22m[32m2.53 KB[39m
|
147
|
-
[32mESM[39m [1mdist/react-native/crypto.js [22m[32m161.00 B[39m
|
148
|
-
[32mESM[39m [1mdist/react-native/testing.js [22m[32m120.00 B[39m
|
149
|
-
[32mESM[39m [1mdist/react-native/index.js.map [22m[32m5.68 KB[39m
|
150
|
-
[32mESM[39m [1mdist/react-native/crypto.js.map [22m[32m197.00 B[39m
|
151
|
-
[32mESM[39m [1mdist/react-native/testing.js.map [22m[32m176.00 B[39m
|
152
|
-
[32mESM[39m ⚡️ Build success in 35ms
|
153
|
-
[32mESM[39m [1mdist/react-core/index.js [22m[32m10.72 KB[39m
|
154
|
-
[32mESM[39m [1mdist/react-core/testing.js [22m[32m1.17 KB[39m
|
155
|
-
[32mESM[39m [1mdist/react-core/chunk-7DYMJ74I.js [22m[32m279.00 B[39m
|
156
|
-
[32mESM[39m [1mdist/react-core/index.js.map [22m[32m33.90 KB[39m
|
157
|
-
[32mESM[39m [1mdist/react-core/testing.js.map [22m[32m1.82 KB[39m
|
158
|
-
[32mESM[39m [1mdist/react-core/chunk-7DYMJ74I.js.map [22m[32m533.00 B[39m
|
159
|
-
[32mESM[39m ⚡️ Build success in 32ms
|
152
|
+
[32mESM[39m ⚡️ Build success in 29ms
|
153
|
+
[32mESM[39m [1mdist/better-auth/database-adapter/index.js [22m[32m26.34 KB[39m
|
154
|
+
[32mESM[39m [1mdist/better-auth/database-adapter/index.js.map [22m[32m57.62 KB[39m
|
155
|
+
[32mESM[39m ⚡️ Build success in 24ms
|
160
156
|
[32mESM[39m [1mdist/expo/index.js [22m[32m4.68 KB[39m
|
161
|
-
[32mESM[39m [1mdist/expo/testing.js [22m[32m112.00 B[39m
|
162
157
|
[32mESM[39m [1mdist/expo/crypto.js [22m[32m153.00 B[39m
|
158
|
+
[32mESM[39m [1mdist/expo/testing.js [22m[32m112.00 B[39m
|
163
159
|
[32mESM[39m [1mdist/expo/index.js.map [22m[32m10.23 KB[39m
|
164
|
-
[32mESM[39m [1mdist/expo/testing.js.map [22m[32m168.00 B[39m
|
165
160
|
[32mESM[39m [1mdist/expo/crypto.js.map [22m[32m189.00 B[39m
|
166
|
-
[32mESM[39m
|
167
|
-
[32mESM[39m
|
168
|
-
[32mESM[39m [1mdist/
|
169
|
-
[32mESM[39m ⚡️ Build success in 46ms
|
170
|
-
[32mESM[39m [1mdist/better-auth/database-adapter/index.js [22m[32m26.34 KB[39m
|
171
|
-
[32mESM[39m [1mdist/better-auth/database-adapter/index.js.map [22m[32m57.62 KB[39m
|
172
|
-
[32mESM[39m ⚡️ Build success in 39ms
|
173
|
-
[32mESM[39m [1mdist/react-native-core/index.js [22m[32m18.13 KB[39m
|
174
|
-
[32mESM[39m [1mdist/react-native-core/crypto.js [22m[32m2.10 KB[39m
|
175
|
-
[32mESM[39m [1mdist/react-native-core/testing.js [22m[32m119.00 B[39m
|
176
|
-
[32mESM[39m [1mdist/react-native-core/index.js.map [22m[32m36.96 KB[39m
|
177
|
-
[32mESM[39m [1mdist/react-native-core/crypto.js.map [22m[32m4.25 KB[39m
|
178
|
-
[32mESM[39m [1mdist/react-native-core/testing.js.map [22m[32m175.00 B[39m
|
179
|
-
[32mESM[39m ⚡️ Build success in 51ms
|
180
|
-
[32mESM[39m [1mdist/react/index.js [22m[32m24.88 KB[39m
|
161
|
+
[32mESM[39m [1mdist/expo/testing.js.map [22m[32m168.00 B[39m
|
162
|
+
[32mESM[39m ⚡️ Build success in 36ms
|
163
|
+
[32mESM[39m [1mdist/react/index.js [22m[32m24.93 KB[39m
|
181
164
|
[32mESM[39m [1mdist/react/testing.js [22m[32m122.00 B[39m
|
165
|
+
[32mESM[39m [1mdist/react/index.js.map [22m[32m53.78 KB[39m
|
182
166
|
[32mESM[39m [1mdist/react/testing.js.map [22m[32m165.00 B[39m
|
183
|
-
[32mESM[39m
|
184
|
-
[32mESM[39m
|
167
|
+
[32mESM[39m ⚡️ Build success in 34ms
|
168
|
+
[32mESM[39m [1mdist/browser/index.js [22m[32m14.13 KB[39m
|
169
|
+
[32mESM[39m [1mdist/browser/index.js.map [22m[32m30.00 KB[39m
|
170
|
+
[32mESM[39m ⚡️ Build success in 43ms
|
171
|
+
[32mESM[39m [1mdist/react-core/index.js [22m[32m11.07 KB[39m
|
172
|
+
[32mESM[39m [1mdist/react-core/testing.js [22m[32m1.22 KB[39m
|
173
|
+
[32mESM[39m [1mdist/react-core/chunk-7DYMJ74I.js [22m[32m279.00 B[39m
|
174
|
+
[32mESM[39m [1mdist/react-core/index.js.map [22m[32m35.67 KB[39m
|
175
|
+
[32mESM[39m [1mdist/react-core/testing.js.map [22m[32m1.86 KB[39m
|
176
|
+
[32mESM[39m [1mdist/react-core/chunk-7DYMJ74I.js.map [22m[32m533.00 B[39m
|
177
|
+
[32mESM[39m ⚡️ Build success in 38ms
|
178
|
+
[32mESM[39m [1mdist/react-native-core/index.js [22m[32m18.65 KB[39m
|
179
|
+
[32mESM[39m [1mdist/react-native-core/testing.js [22m[32m119.00 B[39m
|
180
|
+
[32mESM[39m [1mdist/react-native-core/crypto.js [22m[32m2.10 KB[39m
|
181
|
+
[32mESM[39m [1mdist/react-native-core/index.js.map [22m[32m37.83 KB[39m
|
182
|
+
[32mESM[39m [1mdist/react-native-core/testing.js.map [22m[32m175.00 B[39m
|
183
|
+
[32mESM[39m [1mdist/react-native-core/crypto.js.map [22m[32m4.25 KB[39m
|
184
|
+
[32mESM[39m ⚡️ Build success in 39ms
|
185
185
|
[32mESM[39m [1mdist/prosemirror/index.js [22m[32m77.76 KB[39m
|
186
186
|
[32mESM[39m [1mdist/prosemirror/index.js.map [22m[32m307.20 KB[39m
|
187
|
-
[32mESM[39m ⚡️ Build success in
|
187
|
+
[32mESM[39m ⚡️ Build success in 43ms
|
188
188
|
[32mESM[39m [1mdist/inspector/index.js [22m[32m69.71 KB[39m
|
189
189
|
[32mESM[39m [1mdist/inspector/index.js.map [22m[32m121.38 KB[39m
|
190
|
-
[32mESM[39m ⚡️ Build success in
|
191
|
-
[32mESM[39m [1mdist/chunk-OTWWOZMB.js [22m[32m176.08 KB[39m
|
192
|
-
[32mESM[39m [1mdist/testing.js [22m[32m7.17 KB[39m
|
190
|
+
[32mESM[39m ⚡️ Build success in 52ms
|
193
191
|
[32mESM[39m [1mdist/index.js [22m[32m26.13 KB[39m
|
194
|
-
[32mESM[39m [1mdist/chunk-
|
195
|
-
[32mESM[39m [1mdist/testing.js
|
192
|
+
[32mESM[39m [1mdist/chunk-RN3Y24WX.js [22m[32m176.29 KB[39m
|
193
|
+
[32mESM[39m [1mdist/testing.js [22m[32m8.33 KB[39m
|
196
194
|
[32mESM[39m [1mdist/index.js.map [22m[32m52.92 KB[39m
|
197
|
-
[32mESM[39m
|
195
|
+
[32mESM[39m [1mdist/chunk-RN3Y24WX.js.map [22m[32m420.21 KB[39m
|
196
|
+
[32mESM[39m [1mdist/testing.js.map [22m[32m15.87 KB[39m
|
197
|
+
[32mESM[39m ⚡️ Build success in 70ms
|
198
198
|
[32mESM[39m [1mdist/inspector/register-custom-element.js [22m[32m218.00 B[39m
|
199
199
|
[32mESM[39m [1mdist/inspector/register-custom-element.js.map [22m[32m314.00 B[39m
|
200
200
|
[32mESM[39m [1mdist/inspector/custom-element-G6SPZEBR.js [22m[32m1.54 MB[39m
|
201
201
|
[32mESM[39m [1mdist/inspector/custom-element-G6SPZEBR.js.map [22m[32m2.36 MB[39m
|
202
|
-
[32mESM[39m ⚡️ Build success in
|
202
|
+
[32mESM[39m ⚡️ Build success in 113ms
|
203
203
|
|
204
|
-
> jazz-tools@0.18.
|
204
|
+
> jazz-tools@0.18.19 types /home/runner/_work/jazz/jazz/packages/jazz-tools
|
205
205
|
> tsc --outDir dist
|
206
206
|
|
207
207
|
|
208
|
-
> jazz-tools@0.18.
|
208
|
+
> jazz-tools@0.18.19 build:svelte /home/runner/_work/jazz/jazz/packages/jazz-tools
|
209
209
|
> rm -rf dist/svelte && svelte-package -i src/svelte -o dist/svelte --tsconfig tsconfig.svelte.json
|
210
210
|
|
211
211
|
src/svelte -> dist/svelte
|
package/CHANGELOG.md
CHANGED
@@ -1,5 +1,32 @@
|
|
1
1
|
# jazz-tools
|
2
2
|
|
3
|
+
## 0.18.19
|
4
|
+
|
5
|
+
### Patch Changes
|
6
|
+
|
7
|
+
- f88db5f: Ensure subscription scope is cached for each CoValue
|
8
|
+
- 8eac2fc: Fix refs in partially loaded CoMaps being incorrectly marked as optional
|
9
|
+
- 08b6c03: fix: keep sync between Better Auth's session and Jazz's
|
10
|
+
- cojson@0.18.19
|
11
|
+
- cojson-storage-indexeddb@0.18.19
|
12
|
+
- cojson-transport-ws@0.18.19
|
13
|
+
|
14
|
+
## 0.18.18
|
15
|
+
|
16
|
+
### Patch Changes
|
17
|
+
|
18
|
+
- f2f478a: Add connection status API for React and Svelte
|
19
|
+
|
20
|
+
- **React**: Added `useSyncConnectionStatus()` hook that returns the current connection status to the Jazz sync server
|
21
|
+
- **Svelte**: Added `SyncConnectionStatus` class that provides reactive connection status monitoring
|
22
|
+
|
23
|
+
- ed7e353: Bugfix: wait for full streaming before triggering migrations on comap
|
24
|
+
- 1698d41: Add `unstable_branch` option to useAccountWithSelector
|
25
|
+
- Updated dependencies [ed7e353]
|
26
|
+
- cojson@0.18.18
|
27
|
+
- cojson-storage-indexeddb@0.18.18
|
28
|
+
- cojson-transport-ws@0.18.18
|
29
|
+
|
3
30
|
## 0.18.17
|
4
31
|
|
5
32
|
### Patch Changes
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAmBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/better-auth/auth/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,OAAO,EACP,iBAAiB,EAEjB,eAAe,EAChB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAS9C;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB;;wBAmBC,UAAU,CAAC,OAAO,UAAU,CAAC;;;sCAIvB,eAAe,CAAC,OAAO,CAAC;4CAGlB,iBAAiB;;;;;;;;;;;CA6H1D,CAAC"}
|
@@ -84,9 +84,10 @@ var jazzPluginClient = () => {
|
|
84
84
|
if (context.request.url.toString().includes("/get-session")) {
|
85
85
|
if (context.data === null) {
|
86
86
|
if (authSecretStorage.isAuthenticated === true) {
|
87
|
-
console.
|
88
|
-
"Jazz is authenticated, but the session is null"
|
87
|
+
console.info(
|
88
|
+
"Jazz is authenticated, but the session is null. Logging out"
|
89
89
|
);
|
90
|
+
await jazzContext.logOut();
|
90
91
|
}
|
91
92
|
return;
|
92
93
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../../../src/better-auth/auth/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type {\n Account,\n AuthSecretStorage,\n AuthSetPayload,\n JazzContextType,\n} from \"jazz-tools\";\nimport type { jazzPlugin } from \"./server.js\";\n\nconst SIGNUP_URLS = [\n \"/sign-up\",\n \"/sign-in/social\",\n \"/sign-in/oauth2\",\n \"/email-otp/send-verification-otp\",\n];\n\n/**\n * @example\n * ```ts\n * const auth = betterAuth({\n * plugins: [jazzPluginClient()],\n * });\n * ```\n */\nexport const jazzPluginClient = () => {\n let jazzContext: JazzContextType<Account>;\n let authSecretStorage: AuthSecretStorage;\n let signOutUnsubscription: () => void;\n\n const authenticateOnJazz = async (jazzAuth: AuthSetPayload) => {\n const parsedJazzAuth = {\n ...jazzAuth,\n secretSeed: jazzAuth.secretSeed\n ? Uint8Array.from(jazzAuth.secretSeed)\n : undefined,\n };\n\n await jazzContext.authenticate(parsedJazzAuth);\n await authSecretStorage.set(parsedJazzAuth);\n };\n\n return {\n id: \"jazz-plugin\",\n $InferServerPlugin: {} as ReturnType<typeof jazzPlugin>,\n getActions: ($fetch, $store) => {\n return {\n jazz: {\n setJazzContext: (context: JazzContextType<Account>) => {\n jazzContext = context;\n },\n setAuthSecretStorage: (storage: AuthSecretStorage) => {\n authSecretStorage = storage;\n if (signOutUnsubscription) signOutUnsubscription();\n\n // This is a workaround to logout from Better Auth when user logs out directly from Jazz\n signOutUnsubscription = authSecretStorage.onUpdate(\n (isAuthenticated) => {\n if (isAuthenticated === false) {\n const session = $store.atoms.session?.get();\n if (!session) return;\n\n // if the user logs out from Better Auth, the get session is immediately called\n // so we must wait the next fetched session to understand if we need to call sign-out\n if (session.isPending || session.isRefetching) {\n // listen once for next session's data\n const unsub = $store.atoms.session?.listen((session) => {\n unsub?.();\n // if the session is null, user has been already logged out from Better Auth\n if (session.data !== null) {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n });\n }\n // if the session is not pending, it means user logged out from Jazz only\n // so we call the sign-out api\n else {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n }\n },\n );\n },\n },\n };\n },\n fetchPlugins: [\n {\n id: \"jazz-plugin\",\n name: \"jazz-plugin\",\n hooks: {\n async onRequest(context) {\n if (\n SIGNUP_URLS.some((url) => context.url.toString().includes(url))\n ) {\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n context.headers.set(\n \"x-jazz-auth\",\n JSON.stringify({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n }),\n );\n }\n },\n async onSuccess(context) {\n if (context.request.url.toString().includes(\"/sign-up\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-in/email\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/get-session\")) {\n if (context.data === null) {\n if (authSecretStorage.isAuthenticated === true) {\n console.
|
1
|
+
{"version":3,"sources":["../../../src/better-auth/auth/client.ts"],"sourcesContent":["import type { BetterAuthClientPlugin } from \"better-auth\";\nimport type {\n Account,\n AuthSecretStorage,\n AuthSetPayload,\n JazzContextType,\n} from \"jazz-tools\";\nimport type { jazzPlugin } from \"./server.js\";\n\nconst SIGNUP_URLS = [\n \"/sign-up\",\n \"/sign-in/social\",\n \"/sign-in/oauth2\",\n \"/email-otp/send-verification-otp\",\n];\n\n/**\n * @example\n * ```ts\n * const auth = betterAuth({\n * plugins: [jazzPluginClient()],\n * });\n * ```\n */\nexport const jazzPluginClient = () => {\n let jazzContext: JazzContextType<Account>;\n let authSecretStorage: AuthSecretStorage;\n let signOutUnsubscription: () => void;\n\n const authenticateOnJazz = async (jazzAuth: AuthSetPayload) => {\n const parsedJazzAuth = {\n ...jazzAuth,\n secretSeed: jazzAuth.secretSeed\n ? Uint8Array.from(jazzAuth.secretSeed)\n : undefined,\n };\n\n await jazzContext.authenticate(parsedJazzAuth);\n await authSecretStorage.set(parsedJazzAuth);\n };\n\n return {\n id: \"jazz-plugin\",\n $InferServerPlugin: {} as ReturnType<typeof jazzPlugin>,\n getActions: ($fetch, $store) => {\n return {\n jazz: {\n setJazzContext: (context: JazzContextType<Account>) => {\n jazzContext = context;\n },\n setAuthSecretStorage: (storage: AuthSecretStorage) => {\n authSecretStorage = storage;\n if (signOutUnsubscription) signOutUnsubscription();\n\n // This is a workaround to logout from Better Auth when user logs out directly from Jazz\n signOutUnsubscription = authSecretStorage.onUpdate(\n (isAuthenticated) => {\n if (isAuthenticated === false) {\n const session = $store.atoms.session?.get();\n if (!session) return;\n\n // if the user logs out from Better Auth, the get session is immediately called\n // so we must wait the next fetched session to understand if we need to call sign-out\n if (session.isPending || session.isRefetching) {\n // listen once for next session's data\n const unsub = $store.atoms.session?.listen((session) => {\n unsub?.();\n // if the session is null, user has been already logged out from Better Auth\n if (session.data !== null) {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n });\n }\n // if the session is not pending, it means user logged out from Jazz only\n // so we call the sign-out api\n else {\n $fetch(\"/sign-out\", { method: \"POST\" });\n }\n }\n },\n );\n },\n },\n };\n },\n fetchPlugins: [\n {\n id: \"jazz-plugin\",\n name: \"jazz-plugin\",\n hooks: {\n async onRequest(context) {\n if (\n SIGNUP_URLS.some((url) => context.url.toString().includes(url))\n ) {\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n context.headers.set(\n \"x-jazz-auth\",\n JSON.stringify({\n accountID: credentials.accountID,\n secretSeed: credentials.secretSeed,\n accountSecret: credentials.accountSecret,\n }),\n );\n }\n },\n async onSuccess(context) {\n if (context.request.url.toString().includes(\"/sign-up\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-in/email\")) {\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n if (context.request.url.toString().includes(\"/get-session\")) {\n if (context.data === null) {\n if (authSecretStorage.isAuthenticated === true) {\n console.info(\n \"Jazz is authenticated, but the session is null. Logging out\",\n );\n await jazzContext.logOut();\n }\n return;\n }\n\n if (!context.data?.user) {\n return;\n }\n\n if (authSecretStorage.isAuthenticated === false) {\n console.info(\n \"Jazz is not authenticated, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n return;\n }\n\n const sessionAccountID = context.data.user.accountID;\n\n const credentials = await authSecretStorage.get();\n\n if (!credentials) {\n throw new Error(\"Jazz credentials not found\");\n }\n\n if (credentials.accountID !== sessionAccountID) {\n console.info(\n \"Jazz credentials mismatch, using Better Auth stored credentials\",\n );\n await authenticateOnJazz(context.data.jazzAuth);\n }\n return;\n }\n\n if (context.request.url.toString().includes(\"/sign-out\")) {\n await jazzContext.logOut();\n return;\n }\n\n if (context.request.url.toString().includes(\"/delete-user\")) {\n await jazzContext.logOut();\n return;\n }\n },\n },\n },\n ],\n } satisfies BetterAuthClientPlugin;\n};\n"],"mappings":"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","names":["session"]}
|
@@ -19,12 +19,16 @@ export declare class JazzBrowserContextManager<S extends (AccountClass<Account>
|
|
19
19
|
node: import("cojson").LocalNode;
|
20
20
|
done: () => void;
|
21
21
|
logOut: () => Promise<void>;
|
22
|
+
addConnectionListener: (listener: (connected: boolean) => void) => () => void;
|
23
|
+
connected: () => boolean;
|
22
24
|
} | {
|
23
25
|
me: InstanceOfSchema<S>;
|
24
26
|
node: import("cojson").LocalNode;
|
25
27
|
authSecretStorage: import("jazz-tools").AuthSecretStorage;
|
26
28
|
done: () => void;
|
27
29
|
logOut: () => Promise<void>;
|
30
|
+
addConnectionListener: (listener: (connected: boolean) => void) => () => void;
|
31
|
+
connected: () => boolean;
|
28
32
|
}>;
|
29
33
|
propsChanged(props: JazzContextManagerProps<S>): boolean;
|
30
34
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"BrowserContextManager.d.ts","sourceRoot":"","sources":["../../src/browser/BrowserContextManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,yBAAyB,EAG1B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,uBAAuB,CACjC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,2BAA2B,CAAC,EAAE,CAC5B,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,qBAAa,yBAAyB,CACpC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,CACpB,SAAQ,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAE3E,UAAU;IASJ,aAAa,CACjB,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,EACjC,SAAS,CAAC,EAAE,2BAA2B
|
1
|
+
{"version":3,"file":"BrowserContextManager.d.ts","sourceRoot":"","sources":["../../src/browser/BrowserContextManager.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,OAAO,EACP,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,UAAU,EACX,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AACpE,OAAO,EACL,yBAAyB,EAG1B,MAAM,2BAA2B,CAAC;AAEnC,MAAM,MAAM,uBAAuB,CACjC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,IAAI,CAAC;IAC/B,2BAA2B,CAAC,EAAE,CAC5B,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAClC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,OAAO,CAAC,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC;IAC/C,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAEF,qBAAa,yBAAyB,CACpC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,CACpB,SAAQ,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAE3E,UAAU;IASJ,aAAa,CACjB,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC,EACjC,SAAS,CAAC,EAAE,2BAA2B;;;;;;;;;;;;;;;;IAqBzC,YAAY,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC,CAAC;CAW/C"}
|
@@ -13,6 +13,8 @@ export declare function createJazzBrowserGuestContext(options: BaseBrowserContex
|
|
13
13
|
node: LocalNode;
|
14
14
|
done: () => void;
|
15
15
|
logOut: () => Promise<void>;
|
16
|
+
addConnectionListener: (listener: (connected: boolean) => void) => () => void;
|
17
|
+
connected: () => boolean;
|
16
18
|
}>;
|
17
19
|
export type BrowserContextOptions<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema> = {
|
18
20
|
credentials?: AuthCredentials;
|
@@ -26,6 +28,8 @@ export declare function createJazzBrowserContext<S extends (AccountClass<Account
|
|
26
28
|
authSecretStorage: AuthSecretStorage;
|
27
29
|
done: () => void;
|
28
30
|
logOut: () => Promise<void>;
|
31
|
+
addConnectionListener: (listener: (connected: boolean) => void) => () => void;
|
32
|
+
connected: () => boolean;
|
29
33
|
}>;
|
30
34
|
/** @category Auth Providers */
|
31
35
|
export type SessionProvider = (accountID: ID<Account> | AgentID) => Promise<SessionID>;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createBrowserContext.d.ts","sourceRoot":"","sources":["../../src/browser/createBrowserContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,YAAY,EAAE,MAAM,QAAQ,CAAC;AAIvD,OAAO,EACL,OAAO,EACP,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,cAAc,EACd,EAAE,EACF,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EAGX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAKvE,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;
|
1
|
+
{"version":3,"file":"createBrowserContext.d.ts","sourceRoot":"","sources":["../../src/browser/createBrowserContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAQ,YAAY,EAAE,MAAM,QAAQ,CAAC;AAIvD,OAAO,EACL,OAAO,EACP,YAAY,EACZ,OAAO,EACP,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,OAAO,EACP,cAAc,EACd,cAAc,EACd,EAAE,EACF,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EAGX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,aAAa,EAAqB,MAAM,qBAAqB,CAAC;AAKvE,MAAM,MAAM,yBAAyB,GAAG;IACtC,IAAI,EAAE,UAAU,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,iBAAiB,EAAE,iBAAiB,CAAC;CACtC,CAAC;AAuFF,wBAAsB,6BAA6B,CACjD,OAAO,EAAE,yBAAyB;;;;;sCAlBA,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GAsD/D;AAED,MAAM,MAAM,qBAAqB,CAC/B,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,IAClB;IACF,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,GAAG,yBAAyB,CAAC;AAE9B,wBAAsB,wBAAwB,CAC5C,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE,qBAAqB,CAAC,CAAC,CAAC;;;;;;sCAvEC,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI;;GAmI/D;AAED,+BAA+B;AAC/B,MAAM,MAAM,eAAe,GAAG,CAC5B,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,KAC7B,OAAO,CAAC,SAAS,CAAC,CAAC;AAExB,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,OAAO,EAChC,MAAM,EAAE,cAAc;;;GAwDvB;AAED,6BAA6B;AAC7B,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,OAAO,EAChD,KAAK,EAAE,CAAC,EACR,IAAI,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,WAAW,EAEjD,EACE,OAAkD,EAClD,SAAS,GACV,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/C,MAAM,CAoBR;AAED,6BAA6B;AAC7B,wBAAgB,eAAe,CAAC,CAAC,SAAS,OAAO,EAC/C,SAAS,EAAE,MAAM,GAEf;IACE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;CAC5B,GACD,SAAS,CAuBZ"}
|
package/dist/browser/index.js
CHANGED
@@ -219,6 +219,9 @@ async function setupPeers(options) {
|
|
219
219
|
const storage = useIndexedDB ? await getIndexedDBStorage() : void 0;
|
220
220
|
if (options.sync.when === "never") {
|
221
221
|
return {
|
222
|
+
addConnectionListener: () => () => {
|
223
|
+
},
|
224
|
+
connected: () => false,
|
222
225
|
toggleNetwork: () => {
|
223
226
|
},
|
224
227
|
peersToLoadFrom,
|
@@ -257,6 +260,15 @@ async function setupPeers(options) {
|
|
257
260
|
}
|
258
261
|
return {
|
259
262
|
toggleNetwork,
|
263
|
+
addConnectionListener(listener) {
|
264
|
+
wsPeer.subscribe(listener);
|
265
|
+
return () => {
|
266
|
+
wsPeer.unsubscribe(listener);
|
267
|
+
};
|
268
|
+
},
|
269
|
+
connected() {
|
270
|
+
return wsPeer.connected;
|
271
|
+
},
|
260
272
|
peersToLoadFrom,
|
261
273
|
storage,
|
262
274
|
setNode,
|
@@ -264,7 +276,15 @@ async function setupPeers(options) {
|
|
264
276
|
};
|
265
277
|
}
|
266
278
|
async function createJazzBrowserGuestContext(options) {
|
267
|
-
const {
|
279
|
+
const {
|
280
|
+
toggleNetwork,
|
281
|
+
peersToLoadFrom,
|
282
|
+
setNode,
|
283
|
+
crypto,
|
284
|
+
storage,
|
285
|
+
addConnectionListener,
|
286
|
+
connected
|
287
|
+
} = await setupPeers(options);
|
268
288
|
const context = await createAnonymousJazzContext({
|
269
289
|
crypto,
|
270
290
|
peersToLoadFrom,
|
@@ -281,11 +301,21 @@ async function createJazzBrowserGuestContext(options) {
|
|
281
301
|
},
|
282
302
|
logOut: () => {
|
283
303
|
return context.logOut();
|
284
|
-
}
|
304
|
+
},
|
305
|
+
addConnectionListener,
|
306
|
+
connected
|
285
307
|
};
|
286
308
|
}
|
287
309
|
async function createJazzBrowserContext(options) {
|
288
|
-
const {
|
310
|
+
const {
|
311
|
+
toggleNetwork,
|
312
|
+
peersToLoadFrom,
|
313
|
+
setNode,
|
314
|
+
crypto,
|
315
|
+
storage,
|
316
|
+
addConnectionListener,
|
317
|
+
connected
|
318
|
+
} = await setupPeers(options);
|
289
319
|
let unsubscribeAuthUpdate = () => {
|
290
320
|
};
|
291
321
|
if (options.sync.when === "signedUp") {
|
@@ -326,7 +356,9 @@ async function createJazzBrowserContext(options) {
|
|
326
356
|
logOut: () => {
|
327
357
|
unsubscribeAuthUpdate();
|
328
358
|
return context.logOut();
|
329
|
-
}
|
359
|
+
},
|
360
|
+
addConnectionListener,
|
361
|
+
connected
|
330
362
|
};
|
331
363
|
}
|
332
364
|
function provideBrowserLockSession(accountID, crypto) {
|