jazz-tools 0.15.8 → 0.15.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +45 -45
- package/CHANGELOG.md +11 -0
- package/dist/browser/createBrowserContext.d.ts.map +1 -1
- package/dist/browser/index.js +9 -7
- package/dist/browser/index.js.map +1 -1
- package/dist/{chunk-DGFPP22M.js → chunk-5PFEKHX5.js} +30 -5
- package/dist/chunk-5PFEKHX5.js.map +1 -0
- package/dist/index.js +1 -1
- package/dist/inspector/{custom-element-I7Q6H5E5.js → custom-element-TUXKXSZU.js} +18791 -18806
- package/dist/inspector/custom-element-TUXKXSZU.js.map +1 -0
- package/dist/inspector/register-custom-element.js +1 -1
- package/dist/react/index.js +0 -2
- package/dist/react/index.js.map +1 -1
- package/dist/react/testing.js +0 -2
- package/dist/react/testing.js.map +1 -1
- package/dist/react-native-core/index.d.ts +1 -1
- package/dist/react-native-core/index.d.ts.map +1 -1
- package/dist/react-native-core/index.js +15 -31
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/platform.d.ts +1 -1
- package/dist/react-native-core/platform.d.ts.map +1 -1
- package/dist/testing.js +22 -3
- package/dist/testing.js.map +1 -1
- package/dist/tools/implementation/createContext.d.ts +8 -4
- package/dist/tools/implementation/createContext.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +2 -0
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/dist/tools/testing.d.ts +3 -1
- package/dist/tools/testing.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/browser/createBrowserContext.ts +8 -6
- package/src/react-core/tests/useCoState.test.ts +0 -12
- package/src/react-native-core/index.ts +1 -1
- package/src/react-native-core/platform.ts +13 -12
- package/src/tools/implementation/createContext.ts +16 -0
- package/src/tools/subscribe/SubscriptionScope.ts +20 -0
- package/src/tools/testing.ts +25 -2
- package/src/tools/tests/coFeed.test.ts +190 -239
- package/src/tools/tests/coMap.test.ts +0 -8
- package/src/tools/tests/coPlainText.test.ts +2 -1
- package/src/tools/tests/load.test.ts +65 -30
- package/src/tools/tests/subscribe.test.ts +92 -0
- package/dist/chunk-DGFPP22M.js.map +0 -1
- package/dist/inspector/custom-element-I7Q6H5E5.js.map +0 -1
- package/dist/react-native-core/storage/sqlite-react-native.d.ts +0 -9
- package/dist/react-native-core/storage/sqlite-react-native.d.ts.map +0 -1
- package/src/react-native-core/storage/sqlite-react-native.ts +0 -19
package/dist/testing.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["../src/tools/testing.ts"],"sourcesContent":["import { LocalNode } from \"cojson\";\nimport { cojsonInternals } from \"cojson\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\";\nimport {\n Account,\n AccountClass,\n type AnonymousJazzAgent,\n AnyAccountSchema,\n AuthCredentials,\n CoValueFromRaw,\n InstanceOfSchema,\n JazzContextManager,\n JazzContextManagerAuthProps,\n JazzContextManagerBaseProps,\n activeAccountContext,\n anySchemaToCoSchema,\n createAnonymousJazzContext,\n createJazzContext,\n randomSessionProvider,\n} from \"./internal.js\";\n\nconst syncServer: { current: LocalNode | null } = { current: null };\n\nexport class TestJSCrypto extends PureJSCrypto {\n static async create() {\n if (\"navigator\" in globalThis && navigator.userAgent?.includes(\"jsdom\")) {\n // Mocking crypto seal & encrypt to make it work with JSDom. Getting \"Error: Uint8Array expected\" there\n const crypto = new PureJSCrypto();\n\n crypto.seal = (options) =>\n `sealed_U${cojsonInternals.stableStringify(options.message)}` as any;\n crypto.unseal = (sealed) =>\n JSON.parse(sealed.substring(\"sealed_U\".length));\n crypto.encrypt = (message) =>\n `encrypted_U${cojsonInternals.stableStringify(message)}` as any;\n crypto.decryptRaw = (encrypted) =>\n encrypted.substring(\"encrypted_U\".length) as any;\n\n return crypto;\n }\n\n // For non-jsdom environments, we use the real crypto\n return new PureJSCrypto();\n }\n}\n\nexport function getPeerConnectedToTestSyncServer() {\n if (!syncServer.current) {\n throw new Error(\"Sync server not initialized\");\n }\n\n const [aPeer, bPeer] = cojsonInternals.connectedPeers(\n Math.random().toString(),\n Math.random().toString(),\n {\n peer1role: \"server\",\n peer2role: \"server\",\n },\n );\n syncServer.current.syncManager.addPeer(aPeer);\n\n return bPeer;\n}\n\nconst SecretSeedMap = new Map<string, Uint8Array>();\nlet isMigrationActive = false;\n\nexport async function createJazzTestAccount<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options?: {\n isCurrentActiveAccount?: boolean;\n AccountSchema?: S;\n creationProps?: Record<string, unknown>;\n}): Promise<InstanceOfSchema<S>> {\n const AccountClass = options?.AccountSchema\n ? anySchemaToCoSchema(options.AccountSchema)\n : Account;\n const peers = [];\n if (syncServer.current) {\n peers.push(getPeerConnectedToTestSyncServer());\n }\n\n const crypto = await TestJSCrypto.create();\n const secretSeed = crypto.newRandomSecretSeed();\n\n const { node } = await LocalNode.withNewlyCreatedAccount({\n creationProps: {\n name: \"Test Account\",\n ...options?.creationProps,\n },\n initialAgentSecret: crypto.agentSecretFromSecretSeed(secretSeed),\n crypto,\n peersToLoadFrom: peers,\n migration: async (rawAccount, _node, creationProps) => {\n if (isMigrationActive) {\n throw new Error(\n \"It is not possible to create multiple accounts in parallel inside the test environment.\",\n );\n }\n\n isMigrationActive = true;\n\n // @ts-expect-error - AccountClass doesn't infer the fromRaw static method\n const account = AccountClass.fromRaw(rawAccount) as InstanceOfSchema<S>;\n\n // We need to set the account as current because the migration\n // will probably rely on the global me\n const prevActiveAccount = activeAccountContext.maybeGet();\n activeAccountContext.set(account);\n\n await account.applyMigration?.(creationProps);\n\n if (!options?.isCurrentActiveAccount) {\n activeAccountContext.set(prevActiveAccount);\n }\n\n isMigrationActive = false;\n },\n });\n\n const account = AccountClass.fromNode(node);\n SecretSeedMap.set(account.id, secretSeed);\n\n if (options?.isCurrentActiveAccount) {\n activeAccountContext.set(account);\n }\n\n return account as InstanceOfSchema<S>;\n}\n\nexport function setActiveAccount(account: Account) {\n activeAccountContext.set(account);\n}\n\nexport async function createJazzTestGuest() {\n const ctx = await createAnonymousJazzContext({\n crypto: await PureJSCrypto.create(),\n peersToLoadFrom: [],\n });\n\n return {\n guest: ctx.agent,\n };\n}\n\nexport type TestJazzContextManagerProps<Acc extends Account> =\n JazzContextManagerBaseProps<Acc> & {\n defaultProfileName?: string;\n AccountSchema?: AccountClass<Acc> & CoValueFromRaw<Acc>;\n isAuthenticated?: boolean;\n };\n\nexport class TestJazzContextManager<\n Acc extends Account,\n> extends JazzContextManager<Acc, TestJazzContextManagerProps<Acc>> {\n static fromAccountOrGuest<Acc extends Account>(\n account?: Acc | { guest: AnonymousJazzAgent },\n props?: TestJazzContextManagerProps<Acc>,\n ) {\n if (account && \"guest\" in account) {\n return this.fromGuest<Acc>(account, props);\n }\n\n return this.fromAccount<Acc>(account ?? (Account.getMe() as Acc), props);\n }\n\n static fromAccount<Acc extends Account>(\n account: Acc,\n props?: TestJazzContextManagerProps<Acc>,\n ) {\n const context = new TestJazzContextManager<Acc>();\n\n const provider = props?.isAuthenticated ? \"testProvider\" : \"anonymous\";\n const storage = context.getAuthSecretStorage();\n const node = account._raw.core.node;\n\n const credentials = {\n accountID: account.id,\n accountSecret: node.getCurrentAgent().agentSecret,\n secretSeed: SecretSeedMap.get(account.id),\n provider,\n } satisfies AuthCredentials;\n\n storage.set(credentials);\n\n context.updateContext(\n {\n AccountSchema: account.constructor as AccountClass<Acc> &\n CoValueFromRaw<Acc>,\n ...props,\n },\n {\n me: account,\n node,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: async () => {\n await storage.clear();\n node.gracefulShutdown();\n },\n },\n {\n credentials,\n },\n );\n\n return context;\n }\n\n static fromGuest<Acc extends Account>(\n { guest }: { guest: AnonymousJazzAgent },\n props: TestJazzContextManagerProps<Acc> = {},\n ) {\n const context = new TestJazzContextManager<Acc>();\n const node = guest.node;\n\n context.updateContext(props, {\n guest,\n node,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: async () => {\n node.gracefulShutdown();\n },\n });\n\n return context;\n }\n\n async getNewContext(\n props: TestJazzContextManagerProps<Acc>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (!syncServer.current) {\n throw new Error(\n \"You need to setup a test sync server with setupJazzTestSync to use the Auth functions\",\n );\n }\n\n const context = await createJazzContext({\n credentials: authProps?.credentials,\n defaultProfileName: props.defaultProfileName,\n newAccountProps: authProps?.newAccountProps,\n peersToLoadFrom: [getPeerConnectedToTestSyncServer()],\n crypto: await TestJSCrypto.create(),\n sessionProvider: randomSessionProvider,\n authSecretStorage: this.getAuthSecretStorage(),\n AccountSchema: props.AccountSchema,\n });\n\n return {\n me: context.account,\n node: context.node,\n done: () => {\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n };\n }\n}\n\nexport async function linkAccounts(\n a: Account,\n b: Account,\n aRole: \"server\" | \"client\" = \"server\",\n bRole: \"server\" | \"client\" = \"server\",\n) {\n const [aPeer, bPeer] = cojsonInternals.connectedPeers(b.id, a.id, {\n peer1role: aRole,\n peer2role: bRole,\n });\n\n a._raw.core.node.syncManager.addPeer(aPeer);\n b._raw.core.node.syncManager.addPeer(bPeer);\n\n await a.waitForAllCoValuesSync();\n await b.waitForAllCoValuesSync();\n}\n\nexport async function setupJazzTestSync() {\n if (syncServer.current) {\n syncServer.current.gracefulShutdown();\n }\n\n const account = await Account.create({\n creationProps: {\n name: \"Test Account\",\n },\n crypto: await TestJSCrypto.create(),\n });\n\n syncServer.current = account._raw.core.node;\n\n return account;\n}\n"],"mappings":"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","names":["AccountClass","account"]}
|
1
|
+
{"version":3,"sources":["../src/tools/testing.ts"],"sourcesContent":["import { LocalNode } from \"cojson\";\nimport { cojsonInternals } from \"cojson\";\nimport { PureJSCrypto } from \"cojson/dist/crypto/PureJSCrypto\";\nimport {\n Account,\n AccountClass,\n type AnonymousJazzAgent,\n AnyAccountSchema,\n AuthCredentials,\n CoValueFromRaw,\n InstanceOfSchema,\n JazzContextManager,\n JazzContextManagerAuthProps,\n JazzContextManagerBaseProps,\n activeAccountContext,\n anySchemaToCoSchema,\n createAnonymousJazzContext,\n createJazzContext,\n randomSessionProvider,\n} from \"./internal.js\";\n\nconst syncServer: { current: LocalNode | null; asyncPeers: boolean } = {\n current: null,\n asyncPeers: false,\n};\n\nexport class TestJSCrypto extends PureJSCrypto {\n static async create() {\n if (\"navigator\" in globalThis && navigator.userAgent?.includes(\"jsdom\")) {\n // Mocking crypto seal & encrypt to make it work with JSDom. Getting \"Error: Uint8Array expected\" there\n const crypto = new PureJSCrypto();\n\n crypto.seal = (options) =>\n `sealed_U${cojsonInternals.stableStringify(options.message)}` as any;\n crypto.unseal = (sealed) =>\n JSON.parse(sealed.substring(\"sealed_U\".length));\n crypto.encrypt = (message) =>\n `encrypted_U${cojsonInternals.stableStringify(message)}` as any;\n crypto.decryptRaw = (encrypted) =>\n encrypted.substring(\"encrypted_U\".length) as any;\n\n return crypto;\n }\n\n // For non-jsdom environments, we use the real crypto\n return new PureJSCrypto();\n }\n}\n\nexport function getPeerConnectedToTestSyncServer() {\n if (!syncServer.current) {\n throw new Error(\"Sync server not initialized\");\n }\n\n const [aPeer, bPeer] = cojsonInternals.connectedPeers(\n Math.random().toString(),\n Math.random().toString(),\n {\n peer1role: \"server\",\n peer2role: \"server\",\n },\n );\n\n if (syncServer.asyncPeers) {\n const push = aPeer.outgoing.push;\n\n aPeer.outgoing.push = (message) => {\n setTimeout(() => {\n push.call(aPeer.outgoing, message);\n });\n };\n\n bPeer.outgoing.push = (message) => {\n setTimeout(() => {\n push.call(bPeer.outgoing, message);\n });\n };\n }\n\n syncServer.current.syncManager.addPeer(aPeer);\n\n return bPeer;\n}\n\nconst SecretSeedMap = new Map<string, Uint8Array>();\nlet isMigrationActive = false;\n\nexport async function createJazzTestAccount<\n S extends\n | (AccountClass<Account> & CoValueFromRaw<Account>)\n | AnyAccountSchema,\n>(options?: {\n isCurrentActiveAccount?: boolean;\n AccountSchema?: S;\n creationProps?: Record<string, unknown>;\n}): Promise<InstanceOfSchema<S>> {\n const AccountClass = options?.AccountSchema\n ? anySchemaToCoSchema(options.AccountSchema)\n : Account;\n const peers = [];\n if (syncServer.current) {\n peers.push(getPeerConnectedToTestSyncServer());\n }\n\n const crypto = await TestJSCrypto.create();\n const secretSeed = crypto.newRandomSecretSeed();\n\n const { node } = await LocalNode.withNewlyCreatedAccount({\n creationProps: {\n name: \"Test Account\",\n ...options?.creationProps,\n },\n initialAgentSecret: crypto.agentSecretFromSecretSeed(secretSeed),\n crypto,\n peersToLoadFrom: peers,\n migration: async (rawAccount, _node, creationProps) => {\n if (isMigrationActive) {\n throw new Error(\n \"It is not possible to create multiple accounts in parallel inside the test environment.\",\n );\n }\n\n isMigrationActive = true;\n\n // @ts-expect-error - AccountClass doesn't infer the fromRaw static method\n const account = AccountClass.fromRaw(rawAccount) as InstanceOfSchema<S>;\n\n // We need to set the account as current because the migration\n // will probably rely on the global me\n const prevActiveAccount = activeAccountContext.maybeGet();\n activeAccountContext.set(account);\n\n await account.applyMigration?.(creationProps);\n\n if (!options?.isCurrentActiveAccount) {\n activeAccountContext.set(prevActiveAccount);\n }\n\n isMigrationActive = false;\n },\n });\n\n const account = AccountClass.fromNode(node);\n SecretSeedMap.set(account.id, secretSeed);\n\n if (options?.isCurrentActiveAccount) {\n activeAccountContext.set(account);\n }\n\n return account as InstanceOfSchema<S>;\n}\n\nexport function setActiveAccount(account: Account) {\n activeAccountContext.set(account);\n}\n\nexport async function createJazzTestGuest() {\n const ctx = await createAnonymousJazzContext({\n crypto: await PureJSCrypto.create(),\n peersToLoadFrom: [],\n });\n\n return {\n guest: ctx.agent,\n };\n}\n\nexport type TestJazzContextManagerProps<Acc extends Account> =\n JazzContextManagerBaseProps<Acc> & {\n defaultProfileName?: string;\n AccountSchema?: AccountClass<Acc> & CoValueFromRaw<Acc>;\n isAuthenticated?: boolean;\n };\n\nexport class TestJazzContextManager<\n Acc extends Account,\n> extends JazzContextManager<Acc, TestJazzContextManagerProps<Acc>> {\n static fromAccountOrGuest<Acc extends Account>(\n account?: Acc | { guest: AnonymousJazzAgent },\n props?: TestJazzContextManagerProps<Acc>,\n ) {\n if (account && \"guest\" in account) {\n return this.fromGuest<Acc>(account, props);\n }\n\n return this.fromAccount<Acc>(account ?? (Account.getMe() as Acc), props);\n }\n\n static fromAccount<Acc extends Account>(\n account: Acc,\n props?: TestJazzContextManagerProps<Acc>,\n ) {\n const context = new TestJazzContextManager<Acc>();\n\n const provider = props?.isAuthenticated ? \"testProvider\" : \"anonymous\";\n const storage = context.getAuthSecretStorage();\n const node = account._raw.core.node;\n\n const credentials = {\n accountID: account.id,\n accountSecret: node.getCurrentAgent().agentSecret,\n secretSeed: SecretSeedMap.get(account.id),\n provider,\n } satisfies AuthCredentials;\n\n storage.set(credentials);\n\n context.updateContext(\n {\n AccountSchema: account.constructor as AccountClass<Acc> &\n CoValueFromRaw<Acc>,\n ...props,\n },\n {\n me: account,\n node,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: async () => {\n await storage.clear();\n node.gracefulShutdown();\n },\n },\n {\n credentials,\n },\n );\n\n return context;\n }\n\n static fromGuest<Acc extends Account>(\n { guest }: { guest: AnonymousJazzAgent },\n props: TestJazzContextManagerProps<Acc> = {},\n ) {\n const context = new TestJazzContextManager<Acc>();\n const node = guest.node;\n\n context.updateContext(props, {\n guest,\n node,\n done: () => {\n node.gracefulShutdown();\n },\n logOut: async () => {\n node.gracefulShutdown();\n },\n });\n\n return context;\n }\n\n async getNewContext(\n props: TestJazzContextManagerProps<Acc>,\n authProps?: JazzContextManagerAuthProps,\n ) {\n if (!syncServer.current) {\n throw new Error(\n \"You need to setup a test sync server with setupJazzTestSync to use the Auth functions\",\n );\n }\n\n const context = await createJazzContext({\n credentials: authProps?.credentials,\n defaultProfileName: props.defaultProfileName,\n newAccountProps: authProps?.newAccountProps,\n peersToLoadFrom: [getPeerConnectedToTestSyncServer()],\n crypto: await TestJSCrypto.create(),\n sessionProvider: randomSessionProvider,\n authSecretStorage: this.getAuthSecretStorage(),\n AccountSchema: props.AccountSchema,\n });\n\n return {\n me: context.account,\n node: context.node,\n done: () => {\n context.done();\n },\n logOut: () => {\n return context.logOut();\n },\n };\n }\n}\n\nexport async function linkAccounts(\n a: Account,\n b: Account,\n aRole: \"server\" | \"client\" = \"server\",\n bRole: \"server\" | \"client\" = \"server\",\n) {\n const [aPeer, bPeer] = cojsonInternals.connectedPeers(b.id, a.id, {\n peer1role: aRole,\n peer2role: bRole,\n });\n\n a._raw.core.node.syncManager.addPeer(aPeer);\n b._raw.core.node.syncManager.addPeer(bPeer);\n\n await a.waitForAllCoValuesSync();\n await b.waitForAllCoValuesSync();\n}\n\nexport async function setupJazzTestSync({\n asyncPeers = false,\n}: { asyncPeers?: boolean } = {}) {\n if (syncServer.current) {\n syncServer.current.gracefulShutdown();\n }\n\n const account = await Account.create({\n creationProps: {\n name: \"Test Account\",\n },\n crypto: await TestJSCrypto.create(),\n });\n\n syncServer.current = account._raw.core.node;\n syncServer.asyncPeers = asyncPeers;\n\n return account;\n}\n"],"mappings":"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","names":["AccountClass","account"]}
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import { AgentSecret, CryptoProvider, LocalNode, Peer, RawAccountID, SessionID } from "cojson";
|
1
|
+
import { AgentSecret, CryptoProvider, LocalNode, Peer, RawAccountID, SessionID, StorageAPI } from "cojson";
|
2
2
|
import { AuthSecretStorage } from "../auth/AuthSecretStorage.js";
|
3
3
|
import { type Account, type AccountClass } from "../coValues/account.js";
|
4
4
|
import { type AnyAccountSchema, CoValueFromRaw, type ID, type InstanceOfSchema } from "../internal.js";
|
@@ -49,15 +49,16 @@ export type JazzContextWithAgent = {
|
|
49
49
|
logOut: () => Promise<void>;
|
50
50
|
};
|
51
51
|
export type JazzContext<Acc extends Account> = JazzContextWithAccount<Acc> | JazzContextWithAgent;
|
52
|
-
export declare function createJazzContextFromExistingCredentials<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>({ credentials, peersToLoadFrom, crypto, AccountSchema: PropsAccountSchema, sessionProvider, onLogOut, }: {
|
52
|
+
export declare function createJazzContextFromExistingCredentials<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>({ credentials, peersToLoadFrom, crypto, storage, AccountSchema: PropsAccountSchema, sessionProvider, onLogOut, }: {
|
53
53
|
credentials: Credentials;
|
54
54
|
peersToLoadFrom: Peer[];
|
55
55
|
crypto: CryptoProvider;
|
56
56
|
AccountSchema?: S;
|
57
57
|
sessionProvider: SessionProvider;
|
58
58
|
onLogOut?: () => void;
|
59
|
+
storage?: StorageAPI;
|
59
60
|
}): Promise<JazzContextWithAccount<InstanceOfSchema<S>>>;
|
60
|
-
export declare function createJazzContextForNewAccount<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>({ creationProps, initialAgentSecret, peersToLoadFrom, crypto, AccountSchema: PropsAccountSchema, onLogOut, }: {
|
61
|
+
export declare function createJazzContextForNewAccount<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>({ creationProps, initialAgentSecret, peersToLoadFrom, crypto, AccountSchema: PropsAccountSchema, onLogOut, storage, }: {
|
61
62
|
creationProps: {
|
62
63
|
name: string;
|
63
64
|
};
|
@@ -66,6 +67,7 @@ export declare function createJazzContextForNewAccount<S extends (AccountClass<A
|
|
66
67
|
crypto: CryptoProvider;
|
67
68
|
AccountSchema?: S;
|
68
69
|
onLogOut?: () => Promise<void>;
|
70
|
+
storage?: StorageAPI;
|
69
71
|
}): Promise<JazzContextWithAccount<InstanceOfSchema<S>>>;
|
70
72
|
export declare function createJazzContext<S extends (AccountClass<Account> & CoValueFromRaw<Account>) | AnyAccountSchema>(options: {
|
71
73
|
credentials?: AuthCredentials;
|
@@ -76,6 +78,7 @@ export declare function createJazzContext<S extends (AccountClass<Account> & CoV
|
|
76
78
|
AccountSchema?: S;
|
77
79
|
sessionProvider: SessionProvider;
|
78
80
|
authSecretStorage: AuthSecretStorage;
|
81
|
+
storage?: StorageAPI;
|
79
82
|
}): Promise<{
|
80
83
|
authSecretStorage: AuthSecretStorage;
|
81
84
|
node: LocalNode;
|
@@ -83,9 +86,10 @@ export declare function createJazzContext<S extends (AccountClass<Account> & CoV
|
|
83
86
|
done: () => void;
|
84
87
|
logOut: () => Promise<void>;
|
85
88
|
}>;
|
86
|
-
export declare function createAnonymousJazzContext({ peersToLoadFrom, crypto, }: {
|
89
|
+
export declare function createAnonymousJazzContext({ peersToLoadFrom, crypto, storage, }: {
|
87
90
|
peersToLoadFrom: Peer[];
|
88
91
|
crypto: CryptoProvider;
|
92
|
+
storage?: StorageAPI;
|
89
93
|
}): JazzContextWithAgent;
|
90
94
|
export {};
|
91
95
|
//# sourceMappingURL=createContext.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"createContext.d.ts","sourceRoot":"","sources":["../../../src/tools/implementation/createContext.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,cAAc,EACd,SAAS,EACT,IAAI,EAEJ,YAAY,EACZ,SAAS,
|
1
|
+
{"version":3,"file":"createContext.d.ts","sourceRoot":"","sources":["../../../src/tools/implementation/createContext.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAGX,cAAc,EACd,SAAS,EACT,IAAI,EAEJ,YAAY,EACZ,SAAS,EACT,UAAU,EACX,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEzE,OAAO,EAEL,KAAK,gBAAgB,EACrB,cAAc,EACd,KAAK,EAAE,EACP,KAAK,gBAAgB,EAEtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;IACvB,MAAM,EAAE,WAAW,CAAC;CACrB,CAAC;AAEF,KAAK,eAAe,GAAG,CACrB,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,EACtB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC;IAAE,SAAS,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,MAAM,IAAI,CAAA;CAAE,CAAC,CAAC;AAEhE,MAAM,MAAM,UAAU,GAClB;IACE,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,GACD;IACE,IAAI,EAAE,KAAK,CAAC;IACZ,aAAa,EAAE;QACb,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;IACF,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,eAAe,EAAE,CAAC,WAAW,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,KAAK,IAAI,CAAC;IACzC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEN,wBAAsB,qBAAqB,CACzC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,EACtB,MAAM,EAAE,cAAc;;;GAMvB;AAED,MAAM,MAAM,sBAAsB,CAAC,GAAG,SAAS,OAAO,IAAI;IACxD,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,GAAG,CAAC;IACb,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,OAAO,IACvC,sBAAsB,CAAC,GAAG,CAAC,GAC3B,oBAAoB,CAAC;AAEzB,wBAAsB,wCAAwC,CAC5D,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,EACA,WAAW,EACX,eAAe,EACf,MAAM,EACN,OAAO,EACP,aAAa,EAAE,kBAAkB,EACjC,eAAe,EACf,QAAQ,GACT,EAAE;IACD,WAAW,EAAE,WAAW,CAAC;IACzB,eAAe,EAAE,IAAI,EAAE,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;IACjC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,GAAG,OAAO,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CA0CvD;AAED,wBAAsB,8BAA8B,CAClD,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,EACA,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,MAAM,EACN,aAAa,EAAE,kBAAkB,EACjC,QAAQ,EACR,OAAO,GACR,EAAE;IACD,aAAa,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,kBAAkB,CAAC,EAAE,WAAW,CAAC;IACjC,eAAe,EAAE,IAAI,EAAE,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,GAAG,OAAO,CAAC,sBAAsB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAkCvD;AAED,wBAAsB,iBAAiB,CACrC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,EAAE;IACT,WAAW,CAAC,EAAE,eAAe,CAAC;IAC9B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,eAAe,EAAE,IAAI,EAAE,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,eAAe,EAAE,eAAe,CAAC;IACjC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;;UAtJO,SAAS;;UAET,MAAM,IAAI;YACR,MAAM,OAAO,CAAC,IAAI,CAAC;GAkN5B;AAED,wBAAgB,0BAA0B,CAAC,EACzC,eAAe,EACf,MAAM,EACN,OAAO,GACR,EAAE;IACD,eAAe,EAAE,IAAI,EAAE,CAAC;IACxB,MAAM,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,GAAG,oBAAoB,CAwBvB"}
|
@@ -32,6 +32,8 @@ export declare class SubscriptionScope<D extends CoValue> {
|
|
32
32
|
handleChildUpdate: (id: string, value: SubscriptionValue<any, any> | Unloaded, key?: string) => void;
|
33
33
|
shouldSendUpdates(): boolean;
|
34
34
|
getCurrentValue(): D | null | undefined;
|
35
|
+
isStreaming(): boolean;
|
36
|
+
isFileStream(): boolean;
|
35
37
|
triggerUpdate(): void;
|
36
38
|
subscribers: Set<(value: SubscriptionValue<D, any>) => void>;
|
37
39
|
subscribe(listener: (value: SubscriptionValue<D, any>) => void): () => void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"SubscriptionScope.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/SubscriptionScope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAEL,MAAM,EACN,KAAK,EACL,KAAK,OAAO,EACZ,KAAK,EAAE,EACP,KAAK,UAAU,EACf,KAAK,aAAa,EAGnB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,SAAS,EAAuB,MAAM,gBAAgB,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG9D,qBAAa,iBAAiB,CAAC,CAAC,SAAS,OAAO;IAwBrC,IAAI,EAAE,SAAS;IAEf,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACT,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO;IA3B5B,UAAU,0CAAiD;IAC3D,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,CAG5D;IACJ,KAAK,EAAE,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC;IAC5C,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAa;IAChD,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAa;IACrD,iBAAiB,EAAE,SAAS,GAAG,SAAS,CAAC;IACzC,YAAY,EAAE,uBAAuB,CAAC;IACtC,KAAK,UAAS;IACd,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAC5B,aAAa,cAAqB;IAClC,UAAU,cAAqB;IAC/B,cAAc,cAAqB;IACnC,eAAe,cAAqB;IACpC,sBAAsB,SAAK;IAC3B,QAAQ,UAAS;IACjB,SAAS,UAAS;IAElB,cAAc,UAAS;gBAGd,IAAI,EAAE,SAAS,EACtB,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAClB,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,EACT,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,EACrB,SAAS,CAAC,EAAE,OAAO,YAAA;IA0C5B,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAC,EAAE,GAAG,CAAC;IAO5C,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,aAAa;IA0E/C,kBAAkB;IA0ClB,iBAAiB,OACX,MAAM,SACH,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,QAAQ,QACvC,MAAM,UA6BZ;IAEF,iBAAiB;
|
1
|
+
{"version":3,"file":"SubscriptionScope.d.ts","sourceRoot":"","sources":["../../../src/tools/subscribe/SubscriptionScope.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/testing.d.ts
CHANGED
@@ -39,5 +39,7 @@ export declare class TestJazzContextManager<Acc extends Account> extends JazzCon
|
|
39
39
|
}>;
|
40
40
|
}
|
41
41
|
export declare function linkAccounts(a: Account, b: Account, aRole?: "server" | "client", bRole?: "server" | "client"): Promise<void>;
|
42
|
-
export declare function setupJazzTestSync(
|
42
|
+
export declare function setupJazzTestSync({ asyncPeers, }?: {
|
43
|
+
asyncPeers?: boolean;
|
44
|
+
}): Promise<Account>;
|
43
45
|
//# sourceMappingURL=testing.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/tools/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,kBAAkB,EACvB,gBAAgB,EAEhB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAM5B,MAAM,eAAe,CAAC;
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/tools/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EACL,OAAO,EACP,YAAY,EACZ,KAAK,kBAAkB,EACvB,gBAAgB,EAEhB,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,2BAA2B,EAC3B,2BAA2B,EAM5B,MAAM,eAAe,CAAC;AAOvB,qBAAa,YAAa,SAAQ,YAAY;WAC/B,MAAM;CAoBpB;AAED,wBAAgB,gCAAgC,0BAiC/C;AAKD,wBAAsB,qBAAqB,CACzC,CAAC,SACG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,GACjD,gBAAgB,EACpB,OAAO,CAAC,EAAE;IACV,sBAAsB,CAAC,EAAE,OAAO,CAAC;IACjC,aAAa,CAAC,EAAE,CAAC,CAAC;IAClB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAuD/B;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,QAEhD;AAED,wBAAsB,mBAAmB;;GASxC;AAED,MAAM,MAAM,2BAA2B,CAAC,GAAG,SAAS,OAAO,IACzD,2BAA2B,CAAC,GAAG,CAAC,GAAG;IACjC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEJ,qBAAa,sBAAsB,CACjC,GAAG,SAAS,OAAO,CACnB,SAAQ,kBAAkB,CAAC,GAAG,EAAE,2BAA2B,CAAC,GAAG,CAAC,CAAC;IACjE,MAAM,CAAC,kBAAkB,CAAC,GAAG,SAAS,OAAO,EAC3C,OAAO,CAAC,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,EAC7C,KAAK,CAAC,EAAE,2BAA2B,CAAC,GAAG,CAAC;IAS1C,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,OAAO,EACpC,OAAO,EAAE,GAAG,EACZ,KAAK,CAAC,EAAE,2BAA2B,CAAC,GAAG,CAAC;IA0C1C,MAAM,CAAC,SAAS,CAAC,GAAG,SAAS,OAAO,EAClC,EAAE,KAAK,EAAE,EAAE;QAAE,KAAK,EAAE,kBAAkB,CAAA;KAAE,EACxC,KAAK,GAAE,2BAA2B,CAAC,GAAG,CAAM;IAmBxC,aAAa,CACjB,KAAK,EAAE,2BAA2B,CAAC,GAAG,CAAC,EACvC,SAAS,CAAC,EAAE,2BAA2B;;uBAqEq3K,cAAc;;;;;;;;CAvC76K;AAED,wBAAsB,YAAY,CAChC,CAAC,EAAE,OAAO,EACV,CAAC,EAAE,OAAO,EACV,KAAK,GAAE,QAAQ,GAAG,QAAmB,EACrC,KAAK,GAAE,QAAQ,GAAG,QAAmB,iBAYtC;AAED,wBAAsB,iBAAiB,CAAC,EACtC,UAAkB,GACnB,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,oBAgB/B"}
|
package/package.json
CHANGED
@@ -139,7 +139,7 @@
|
|
139
139
|
},
|
140
140
|
"type": "module",
|
141
141
|
"license": "MIT",
|
142
|
-
"version": "0.15.
|
142
|
+
"version": "0.15.9",
|
143
143
|
"dependencies": {
|
144
144
|
"@manuscripts/prosemirror-recreate-steps": "^0.1.4",
|
145
145
|
"@scure/base": "1.2.1",
|
@@ -158,10 +158,9 @@
|
|
158
158
|
"prosemirror-state": "^1.4.3",
|
159
159
|
"prosemirror-transform": "^1.9.0",
|
160
160
|
"zod": "3.25.28",
|
161
|
-
"cojson": "0.15.
|
162
|
-
"cojson-storage": "0.15.
|
163
|
-
"cojson-
|
164
|
-
"cojson-transport-ws": "0.15.8"
|
161
|
+
"cojson": "0.15.9",
|
162
|
+
"cojson-storage-indexeddb": "0.15.9",
|
163
|
+
"cojson-transport-ws": "0.15.9"
|
165
164
|
},
|
166
165
|
"devDependencies": {
|
167
166
|
"@scure/bip39": "^1.3.0",
|
@@ -169,9 +168,10 @@
|
|
169
168
|
"@testing-library/dom": "^10.4.0",
|
170
169
|
"@testing-library/jest-dom": "^6.6.3",
|
171
170
|
"@testing-library/react": "16.2.0",
|
172
|
-
"@types/react": "19.
|
173
|
-
"@types/react-dom": "19.
|
171
|
+
"@types/react": "19.1.0",
|
172
|
+
"@types/react-dom": "19.1.0",
|
174
173
|
"@vitest/browser": "^3.2.4",
|
174
|
+
"queueueue": "^4.1.2",
|
175
175
|
"playwright": "^1.50.1",
|
176
176
|
"tsup": "8.5.0",
|
177
177
|
"typescript": "5.6.2",
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import { LocalNode, Peer, RawAccountID } from "cojson";
|
2
|
-
import {
|
2
|
+
import { getIndexedDBStorage } from "cojson-storage-indexeddb";
|
3
3
|
import { WebSocketPeerWithReconnection } from "cojson-transport-ws";
|
4
4
|
import { WasmCrypto } from "cojson/crypto/WasmCrypto";
|
5
5
|
import {
|
@@ -55,14 +55,13 @@ async function setupPeers(options: BaseBrowserContextOptions) {
|
|
55
55
|
|
56
56
|
const peersToLoadFrom: Peer[] = [];
|
57
57
|
|
58
|
-
|
59
|
-
peersToLoadFrom.push(await IDBStorage.asPeer());
|
60
|
-
}
|
58
|
+
const storage = useIndexedDB ? await getIndexedDBStorage() : undefined;
|
61
59
|
|
62
60
|
if (options.sync.when === "never") {
|
63
61
|
return {
|
64
62
|
toggleNetwork: () => {},
|
65
63
|
peersToLoadFrom,
|
64
|
+
storage,
|
66
65
|
setNode: () => {},
|
67
66
|
crypto,
|
68
67
|
};
|
@@ -102,6 +101,7 @@ async function setupPeers(options: BaseBrowserContextOptions) {
|
|
102
101
|
return {
|
103
102
|
toggleNetwork,
|
104
103
|
peersToLoadFrom,
|
104
|
+
storage,
|
105
105
|
setNode,
|
106
106
|
crypto,
|
107
107
|
};
|
@@ -110,12 +110,13 @@ async function setupPeers(options: BaseBrowserContextOptions) {
|
|
110
110
|
export async function createJazzBrowserGuestContext(
|
111
111
|
options: BaseBrowserContextOptions,
|
112
112
|
) {
|
113
|
-
const { toggleNetwork, peersToLoadFrom, setNode, crypto } =
|
113
|
+
const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =
|
114
114
|
await setupPeers(options);
|
115
115
|
|
116
116
|
const context = await createAnonymousJazzContext({
|
117
117
|
crypto,
|
118
118
|
peersToLoadFrom,
|
119
|
+
storage,
|
119
120
|
});
|
120
121
|
|
121
122
|
setNode(context.agent.node);
|
@@ -152,7 +153,7 @@ export async function createJazzBrowserContext<
|
|
152
153
|
| (AccountClass<Account> & CoValueFromRaw<Account>)
|
153
154
|
| AnyAccountSchema,
|
154
155
|
>(options: BrowserContextOptions<S>) {
|
155
|
-
const { toggleNetwork, peersToLoadFrom, setNode, crypto } =
|
156
|
+
const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =
|
156
157
|
await setupPeers(options);
|
157
158
|
|
158
159
|
let unsubscribeAuthUpdate = () => {};
|
@@ -177,6 +178,7 @@ export async function createJazzBrowserContext<
|
|
177
178
|
credentials: options.credentials,
|
178
179
|
newAccountProps: options.newAccountProps,
|
179
180
|
peersToLoadFrom,
|
181
|
+
storage,
|
180
182
|
crypto,
|
181
183
|
defaultProfileName: options.defaultProfileName,
|
182
184
|
AccountSchema: options.AccountSchema,
|
@@ -160,8 +160,6 @@ describe("useCoState", () => {
|
|
160
160
|
account,
|
161
161
|
});
|
162
162
|
|
163
|
-
expect(result.current).toBeUndefined();
|
164
|
-
|
165
163
|
await waitFor(() => {
|
166
164
|
expect(result.current).toBeNull();
|
167
165
|
});
|
@@ -191,8 +189,6 @@ describe("useCoState", () => {
|
|
191
189
|
account,
|
192
190
|
});
|
193
191
|
|
194
|
-
expect(result.current).toBeUndefined();
|
195
|
-
|
196
192
|
await waitFor(() => {
|
197
193
|
expect(result.current).toBeNull();
|
198
194
|
});
|
@@ -225,8 +221,6 @@ describe("useCoState", () => {
|
|
225
221
|
account,
|
226
222
|
});
|
227
223
|
|
228
|
-
expect(result.current).toBeUndefined();
|
229
|
-
|
230
224
|
await waitFor(() => {
|
231
225
|
expect(result.current?.value).toBe("123");
|
232
226
|
});
|
@@ -258,8 +252,6 @@ describe("useCoState", () => {
|
|
258
252
|
account,
|
259
253
|
});
|
260
254
|
|
261
|
-
expect(result.current).toBeUndefined();
|
262
|
-
|
263
255
|
await waitFor(() => {
|
264
256
|
expect(result.current).toBeNull();
|
265
257
|
});
|
@@ -303,8 +295,6 @@ describe("useCoState", () => {
|
|
303
295
|
account,
|
304
296
|
});
|
305
297
|
|
306
|
-
expect(result.current).toBeUndefined();
|
307
|
-
|
308
298
|
await waitFor(() => {
|
309
299
|
expect(result.current).not.toBeUndefined();
|
310
300
|
});
|
@@ -371,8 +361,6 @@ describe("useCoState", () => {
|
|
371
361
|
},
|
372
362
|
);
|
373
363
|
|
374
|
-
expect(result.current).toBeUndefined();
|
375
|
-
|
376
364
|
await waitFor(() => {
|
377
365
|
expect(result.current).not.toBeUndefined();
|
378
366
|
});
|
@@ -4,6 +4,6 @@ export * from "./media.js";
|
|
4
4
|
export * from "./provider.js";
|
5
5
|
export * from "./storage/kv-store-context.js";
|
6
6
|
|
7
|
-
export { SQLiteDatabaseDriverAsync } from "cojson
|
7
|
+
export { SQLiteDatabaseDriverAsync } from "cojson";
|
8
8
|
export { parseInviteLink } from "jazz-tools";
|
9
9
|
export { createInviteLink, setupKvStore } from "./platform.js";
|
@@ -1,5 +1,5 @@
|
|
1
1
|
import NetInfo from "@react-native-community/netinfo";
|
2
|
-
import { LocalNode, Peer, RawAccountID } from "cojson";
|
2
|
+
import { LocalNode, Peer, RawAccountID, getSqliteStorageAsync } from "cojson";
|
3
3
|
import { PureJSCrypto } from "cojson/dist/crypto/PureJSCrypto"; // Importing from dist to not rely on the exports field
|
4
4
|
import {
|
5
5
|
Account,
|
@@ -20,9 +20,8 @@ import {
|
|
20
20
|
createJazzContext,
|
21
21
|
} from "jazz-tools";
|
22
22
|
import { KvStore, KvStoreContext } from "./storage/kv-store-context.js";
|
23
|
-
import { SQLiteReactNative } from "./storage/sqlite-react-native.js";
|
24
23
|
|
25
|
-
import { SQLiteDatabaseDriverAsync } from "cojson
|
24
|
+
import { SQLiteDatabaseDriverAsync } from "cojson";
|
26
25
|
import { WebSocketPeerWithReconnection } from "cojson-transport-ws";
|
27
26
|
import type { RNQuickCrypto } from "jazz-tools/react-native-core/crypto";
|
28
27
|
|
@@ -49,12 +48,10 @@ async function setupPeers(options: BaseReactNativeContextOptions) {
|
|
49
48
|
|
50
49
|
const peersToLoadFrom: Peer[] = [];
|
51
50
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
peersToLoadFrom.push(storage);
|
57
|
-
}
|
51
|
+
const storage =
|
52
|
+
options.storage && options.storage !== "disabled"
|
53
|
+
? await getSqliteStorageAsync(options.storage)
|
54
|
+
: undefined;
|
58
55
|
|
59
56
|
if (options.sync.when === "never") {
|
60
57
|
return {
|
@@ -62,6 +59,7 @@ async function setupPeers(options: BaseReactNativeContextOptions) {
|
|
62
59
|
peersToLoadFrom,
|
63
60
|
setNode: () => {},
|
64
61
|
crypto,
|
62
|
+
storage,
|
65
63
|
};
|
66
64
|
}
|
67
65
|
|
@@ -101,18 +99,20 @@ async function setupPeers(options: BaseReactNativeContextOptions) {
|
|
101
99
|
peersToLoadFrom,
|
102
100
|
setNode,
|
103
101
|
crypto,
|
102
|
+
storage,
|
104
103
|
};
|
105
104
|
}
|
106
105
|
|
107
106
|
export async function createJazzReactNativeGuestContext(
|
108
107
|
options: BaseReactNativeContextOptions,
|
109
108
|
) {
|
110
|
-
const { toggleNetwork, peersToLoadFrom, setNode, crypto } =
|
109
|
+
const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =
|
111
110
|
await setupPeers(options);
|
112
111
|
|
113
|
-
const context =
|
112
|
+
const context = createAnonymousJazzContext({
|
114
113
|
crypto,
|
115
114
|
peersToLoadFrom,
|
115
|
+
storage,
|
116
116
|
});
|
117
117
|
|
118
118
|
setNode(context.agent.node);
|
@@ -149,7 +149,7 @@ export async function createJazzReactNativeContext<
|
|
149
149
|
| (AccountClass<Account> & CoValueFromRaw<Account>)
|
150
150
|
| AnyAccountSchema,
|
151
151
|
>(options: ReactNativeContextOptions<S>) {
|
152
|
-
const { toggleNetwork, peersToLoadFrom, setNode, crypto } =
|
152
|
+
const { toggleNetwork, peersToLoadFrom, setNode, crypto, storage } =
|
153
153
|
await setupPeers(options);
|
154
154
|
|
155
155
|
let unsubscribeAuthUpdate = () => {};
|
@@ -182,6 +182,7 @@ export async function createJazzReactNativeContext<
|
|
182
182
|
AccountSchema: options.AccountSchema,
|
183
183
|
sessionProvider: provideLockSession,
|
184
184
|
authSecretStorage: options.authSecretStorage,
|
185
|
+
storage,
|
185
186
|
});
|
186
187
|
|
187
188
|
setNode(context.node);
|
@@ -8,6 +8,7 @@ import {
|
|
8
8
|
RawAccount,
|
9
9
|
RawAccountID,
|
10
10
|
SessionID,
|
11
|
+
StorageAPI,
|
11
12
|
} from "cojson";
|
12
13
|
import { AuthSecretStorage } from "../auth/AuthSecretStorage.js";
|
13
14
|
import { type Account, type AccountClass } from "../coValues/account.js";
|
@@ -93,6 +94,7 @@ export async function createJazzContextFromExistingCredentials<
|
|
93
94
|
credentials,
|
94
95
|
peersToLoadFrom,
|
95
96
|
crypto,
|
97
|
+
storage,
|
96
98
|
AccountSchema: PropsAccountSchema,
|
97
99
|
sessionProvider,
|
98
100
|
onLogOut,
|
@@ -103,6 +105,7 @@ export async function createJazzContextFromExistingCredentials<
|
|
103
105
|
AccountSchema?: S;
|
104
106
|
sessionProvider: SessionProvider;
|
105
107
|
onLogOut?: () => void;
|
108
|
+
storage?: StorageAPI;
|
106
109
|
}): Promise<JazzContextWithAccount<InstanceOfSchema<S>>> {
|
107
110
|
const { sessionID, sessionDone } = await sessionProvider(
|
108
111
|
credentials.accountID,
|
@@ -120,6 +123,7 @@ export async function createJazzContextFromExistingCredentials<
|
|
120
123
|
sessionID: sessionID,
|
121
124
|
peersToLoadFrom: peersToLoadFrom,
|
122
125
|
crypto: crypto,
|
126
|
+
storage,
|
123
127
|
migration: async (rawAccount, _node, creationProps) => {
|
124
128
|
const account = AccountClass.fromRaw(rawAccount) as InstanceOfSchema<S>;
|
125
129
|
activeAccountContext.set(account);
|
@@ -157,6 +161,7 @@ export async function createJazzContextForNewAccount<
|
|
157
161
|
crypto,
|
158
162
|
AccountSchema: PropsAccountSchema,
|
159
163
|
onLogOut,
|
164
|
+
storage,
|
160
165
|
}: {
|
161
166
|
creationProps: { name: string };
|
162
167
|
initialAgentSecret?: AgentSecret;
|
@@ -164,6 +169,7 @@ export async function createJazzContextForNewAccount<
|
|
164
169
|
crypto: CryptoProvider;
|
165
170
|
AccountSchema?: S;
|
166
171
|
onLogOut?: () => Promise<void>;
|
172
|
+
storage?: StorageAPI;
|
167
173
|
}): Promise<JazzContextWithAccount<InstanceOfSchema<S>>> {
|
168
174
|
const CurrentAccountSchema =
|
169
175
|
PropsAccountSchema ?? (RegisteredSchemas["Account"] as unknown as S);
|
@@ -175,6 +181,7 @@ export async function createJazzContextForNewAccount<
|
|
175
181
|
peersToLoadFrom,
|
176
182
|
crypto,
|
177
183
|
initialAgentSecret,
|
184
|
+
storage,
|
178
185
|
migration: async (rawAccount, _node, creationProps) => {
|
179
186
|
const account = AccountClass.fromRaw(rawAccount) as InstanceOfSchema<S>;
|
180
187
|
activeAccountContext.set(account);
|
@@ -212,6 +219,7 @@ export async function createJazzContext<
|
|
212
219
|
AccountSchema?: S;
|
213
220
|
sessionProvider: SessionProvider;
|
214
221
|
authSecretStorage: AuthSecretStorage;
|
222
|
+
storage?: StorageAPI;
|
215
223
|
}) {
|
216
224
|
const crypto = options.crypto;
|
217
225
|
|
@@ -236,6 +244,7 @@ export async function createJazzContext<
|
|
236
244
|
onLogOut: () => {
|
237
245
|
authSecretStorage.clearWithoutNotify();
|
238
246
|
},
|
247
|
+
storage: options.storage,
|
239
248
|
});
|
240
249
|
} else {
|
241
250
|
const secretSeed = options.crypto.newRandomSecretSeed();
|
@@ -257,6 +266,7 @@ export async function createJazzContext<
|
|
257
266
|
onLogOut: async () => {
|
258
267
|
await authSecretStorage.clearWithoutNotify();
|
259
268
|
},
|
269
|
+
storage: options.storage,
|
260
270
|
});
|
261
271
|
|
262
272
|
if (!options.newAccountProps) {
|
@@ -278,9 +288,11 @@ export async function createJazzContext<
|
|
278
288
|
export function createAnonymousJazzContext({
|
279
289
|
peersToLoadFrom,
|
280
290
|
crypto,
|
291
|
+
storage,
|
281
292
|
}: {
|
282
293
|
peersToLoadFrom: Peer[];
|
283
294
|
crypto: CryptoProvider;
|
295
|
+
storage?: StorageAPI;
|
284
296
|
}): JazzContextWithAgent {
|
285
297
|
const agentSecret = crypto.newRandomAgentSecret();
|
286
298
|
|
@@ -294,6 +306,10 @@ export function createAnonymousJazzContext({
|
|
294
306
|
node.syncManager.addPeer(peer);
|
295
307
|
}
|
296
308
|
|
309
|
+
if (storage) {
|
310
|
+
node.setStorage(storage);
|
311
|
+
}
|
312
|
+
|
297
313
|
activeAccountContext.setGuestMode();
|
298
314
|
|
299
315
|
return {
|
@@ -249,6 +249,10 @@ export class SubscriptionScope<D extends CoValue> {
|
|
249
249
|
// If the value is in error, we send the update regardless of the children statuses
|
250
250
|
if (this.value.type !== "loaded") return true;
|
251
251
|
|
252
|
+
if (this.isStreaming() && !this.isFileStream()) {
|
253
|
+
return false;
|
254
|
+
}
|
255
|
+
|
252
256
|
for (const value of this.childValues.values()) {
|
253
257
|
// We don't wait for autoloaded values to be loaded, in order to stream updates
|
254
258
|
// on autoloaded lists or records
|
@@ -285,6 +289,22 @@ export class SubscriptionScope<D extends CoValue> {
|
|
285
289
|
return undefined;
|
286
290
|
}
|
287
291
|
|
292
|
+
isStreaming() {
|
293
|
+
if (this.value.type !== "loaded") {
|
294
|
+
return false;
|
295
|
+
}
|
296
|
+
|
297
|
+
return this.value.value._raw.core.verified.isStreaming();
|
298
|
+
}
|
299
|
+
|
300
|
+
isFileStream() {
|
301
|
+
if (this.value.type !== "loaded") {
|
302
|
+
return false;
|
303
|
+
}
|
304
|
+
|
305
|
+
return this.value.value._raw.core.verified.header.meta?.type === "binary";
|
306
|
+
}
|
307
|
+
|
288
308
|
triggerUpdate() {
|
289
309
|
if (!this.shouldSendUpdates()) return;
|
290
310
|
if (!this.dirty) return;
|
package/src/tools/testing.ts
CHANGED
@@ -19,7 +19,10 @@ import {
|
|
19
19
|
randomSessionProvider,
|
20
20
|
} from "./internal.js";
|
21
21
|
|
22
|
-
const syncServer: { current: LocalNode | null } = {
|
22
|
+
const syncServer: { current: LocalNode | null; asyncPeers: boolean } = {
|
23
|
+
current: null,
|
24
|
+
asyncPeers: false,
|
25
|
+
};
|
23
26
|
|
24
27
|
export class TestJSCrypto extends PureJSCrypto {
|
25
28
|
static async create() {
|
@@ -57,6 +60,23 @@ export function getPeerConnectedToTestSyncServer() {
|
|
57
60
|
peer2role: "server",
|
58
61
|
},
|
59
62
|
);
|
63
|
+
|
64
|
+
if (syncServer.asyncPeers) {
|
65
|
+
const push = aPeer.outgoing.push;
|
66
|
+
|
67
|
+
aPeer.outgoing.push = (message) => {
|
68
|
+
setTimeout(() => {
|
69
|
+
push.call(aPeer.outgoing, message);
|
70
|
+
});
|
71
|
+
};
|
72
|
+
|
73
|
+
bPeer.outgoing.push = (message) => {
|
74
|
+
setTimeout(() => {
|
75
|
+
push.call(bPeer.outgoing, message);
|
76
|
+
});
|
77
|
+
};
|
78
|
+
}
|
79
|
+
|
60
80
|
syncServer.current.syncManager.addPeer(aPeer);
|
61
81
|
|
62
82
|
return bPeer;
|
@@ -283,7 +303,9 @@ export async function linkAccounts(
|
|
283
303
|
await b.waitForAllCoValuesSync();
|
284
304
|
}
|
285
305
|
|
286
|
-
export async function setupJazzTestSync(
|
306
|
+
export async function setupJazzTestSync({
|
307
|
+
asyncPeers = false,
|
308
|
+
}: { asyncPeers?: boolean } = {}) {
|
287
309
|
if (syncServer.current) {
|
288
310
|
syncServer.current.gracefulShutdown();
|
289
311
|
}
|
@@ -296,6 +318,7 @@ export async function setupJazzTestSync() {
|
|
296
318
|
});
|
297
319
|
|
298
320
|
syncServer.current = account._raw.core.node;
|
321
|
+
syncServer.asyncPeers = asyncPeers;
|
299
322
|
|
300
323
|
return account;
|
301
324
|
}
|