jazz-tools 0.18.38 → 0.19.1
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 +8 -8
- package/.svelte-kit/__package__/jazz.class.svelte.d.ts.map +1 -1
- package/.svelte-kit/__package__/jazz.class.svelte.js +39 -14
- package/.svelte-kit/__package__/media/image.svelte +6 -5
- package/.svelte-kit/__package__/media/image.svelte.d.ts.map +1 -1
- package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.d.ts +2 -0
- package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/AccountCoState.svelte.test-d.js +19 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test-d.d.ts +2 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test-d.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test-d.js +16 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test.d.ts +2 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test.d.ts.map +1 -0
- package/.svelte-kit/__package__/tests/CoState.svelte.test.js +42 -0
- package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte +23 -0
- package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte.d.ts +12 -0
- package/.svelte-kit/__package__/tests/TestCoStateWrapper.svelte.d.ts.map +1 -0
- package/.turbo/turbo-build.log +62 -62
- package/CHANGELOG.md +32 -0
- package/dist/better-auth/database-adapter/index.js +14 -11
- package/dist/better-auth/database-adapter/index.js.map +1 -1
- package/dist/better-auth/database-adapter/repository/generic.d.ts +1 -1
- package/dist/better-auth/database-adapter/repository/generic.d.ts.map +1 -1
- package/dist/better-auth/database-adapter/repository/user.d.ts.map +1 -1
- package/dist/{chunk-OSQ7S47Q.js → chunk-NCNM6UDZ.js} +563 -252
- package/dist/chunk-NCNM6UDZ.js.map +1 -0
- package/dist/index.js +14 -6
- package/dist/index.js.map +1 -1
- package/dist/media/{chunk-K6GCHLQU.js → chunk-3LKBM3G3.js} +23 -15
- package/dist/media/chunk-3LKBM3G3.js.map +1 -0
- package/dist/media/create-image/browser.d.ts +2 -2
- package/dist/media/create-image/react-native.d.ts +2 -2
- package/dist/media/create-image/server.d.ts +2 -2
- package/dist/media/create-image-factory.d.ts +2 -2
- package/dist/media/index.browser.js +1 -1
- package/dist/media/index.js +1 -1
- package/dist/media/index.native.js +1 -1
- package/dist/media/index.server.js +1 -1
- package/dist/media/utils.d.ts.map +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 +31 -15
- package/dist/react/index.js.map +1 -1
- package/dist/react/media/image.d.ts.map +1 -1
- package/dist/react-core/hooks.d.ts +126 -224
- package/dist/react-core/hooks.d.ts.map +1 -1
- package/dist/react-core/index.js +65 -63
- package/dist/react-core/index.js.map +1 -1
- package/dist/react-core/subscription-provider.d.ts.map +1 -1
- package/dist/react-core/tests/createCoValueSubscriptionContext.test.d.ts +2 -0
- package/dist/react-core/tests/createCoValueSubscriptionContext.test.d.ts.map +1 -0
- package/dist/react-core/tests/useAccount.selector.test.d.ts +2 -0
- package/dist/react-core/tests/useAccount.selector.test.d.ts.map +1 -0
- package/dist/react-core/tests/useCoState.selector.test.d.ts +2 -0
- package/dist/react-core/tests/useCoState.selector.test.d.ts.map +1 -0
- 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 +7 -5
- package/dist/react-native-core/index.js.map +1 -1
- package/dist/react-native-core/media/image.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.d.ts +8 -8
- package/dist/svelte/jazz.class.svelte.d.ts.map +1 -1
- package/dist/svelte/jazz.class.svelte.js +39 -14
- package/dist/svelte/media/image.svelte +6 -5
- package/dist/svelte/media/image.svelte.d.ts.map +1 -1
- package/dist/svelte/tests/AccountCoState.svelte.test-d.d.ts +2 -0
- package/dist/svelte/tests/AccountCoState.svelte.test-d.d.ts.map +1 -0
- package/dist/svelte/tests/AccountCoState.svelte.test-d.js +19 -0
- package/dist/svelte/tests/CoState.svelte.test-d.d.ts +2 -0
- package/dist/svelte/tests/CoState.svelte.test-d.d.ts.map +1 -0
- package/dist/svelte/tests/CoState.svelte.test-d.js +16 -0
- package/dist/svelte/tests/CoState.svelte.test.d.ts +2 -0
- package/dist/svelte/tests/CoState.svelte.test.d.ts.map +1 -0
- package/dist/svelte/tests/CoState.svelte.test.js +42 -0
- package/dist/svelte/tests/TestCoStateWrapper.svelte +23 -0
- package/dist/svelte/tests/TestCoStateWrapper.svelte.d.ts +12 -0
- package/dist/svelte/tests/TestCoStateWrapper.svelte.d.ts.map +1 -0
- package/dist/testing.js +3 -1
- package/dist/testing.js.map +1 -1
- package/dist/tools/coValues/CoValueBase.d.ts +4 -1
- package/dist/tools/coValues/CoValueBase.d.ts.map +1 -1
- package/dist/tools/coValues/account.d.ts +6 -6
- package/dist/tools/coValues/account.d.ts.map +1 -1
- package/dist/tools/coValues/coFeed.d.ts +5 -5
- package/dist/tools/coValues/coFeed.d.ts.map +1 -1
- package/dist/tools/coValues/coList.d.ts +9 -8
- package/dist/tools/coValues/coList.d.ts.map +1 -1
- package/dist/tools/coValues/coMap.d.ts +17 -17
- package/dist/tools/coValues/coMap.d.ts.map +1 -1
- package/dist/tools/coValues/coPlainText.d.ts +3 -3
- package/dist/tools/coValues/coPlainText.d.ts.map +1 -1
- package/dist/tools/coValues/coVector.d.ts +3 -3
- package/dist/tools/coValues/coVector.d.ts.map +1 -1
- package/dist/tools/coValues/deepLoading.d.ts +71 -40
- package/dist/tools/coValues/deepLoading.d.ts.map +1 -1
- package/dist/tools/coValues/extensions/imageDef.d.ts +1 -1
- package/dist/tools/coValues/extensions/imageDef.d.ts.map +1 -1
- package/dist/tools/coValues/group.d.ts +2 -2
- package/dist/tools/coValues/group.d.ts.map +1 -1
- package/dist/tools/coValues/inbox.d.ts.map +1 -1
- package/dist/tools/coValues/interfaces.d.ts +17 -9
- package/dist/tools/coValues/interfaces.d.ts.map +1 -1
- package/dist/tools/coValues/request.d.ts.map +1 -1
- package/dist/tools/coValues/schemaUnion.d.ts +6 -9
- package/dist/tools/coValues/schemaUnion.d.ts.map +1 -1
- package/dist/tools/exports.d.ts +3 -3
- package/dist/tools/exports.d.ts.map +1 -1
- package/dist/tools/implementation/refs.d.ts +3 -3
- package/dist/tools/implementation/refs.d.ts.map +1 -1
- package/dist/tools/implementation/schema.d.ts +2 -2
- package/dist/tools/implementation/schema.d.ts.map +1 -1
- package/dist/tools/implementation/schemaUtils.d.ts +8 -0
- package/dist/tools/implementation/schemaUtils.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts +33 -18
- package/dist/tools/implementation/zodSchema/schemaTypes/AccountSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts +19 -7
- package/dist/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts +23 -12
- package/dist/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts +29 -18
- package/dist/tools/implementation/zodSchema/schemaTypes/CoListSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts +39 -22
- package/dist/tools/implementation/zodSchema/schemaTypes/CoMapSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts +1 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts +30 -19
- package/dist/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoValueSchema.d.ts +5 -0
- package/dist/tools/implementation/zodSchema/schemaTypes/CoValueSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts +6 -5
- package/dist/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/schemaTypes/GroupSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts +3 -2
- package/dist/tools/implementation/zodSchema/schemaTypes/RichTextSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts +3 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts +22 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts +4 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.d.ts +9 -0
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.d.ts.map +1 -0
- package/dist/tools/implementation/zodSchema/unionUtils.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodCo.d.ts.map +1 -1
- package/dist/tools/implementation/zodSchema/zodSchema.d.ts +7 -6
- package/dist/tools/implementation/zodSchema/zodSchema.d.ts.map +1 -1
- package/dist/tools/internal.d.ts +3 -3
- package/dist/tools/internal.d.ts.map +1 -1
- package/dist/tools/lib/utils.d.ts +14 -0
- package/dist/tools/lib/utils.d.ts.map +1 -0
- package/dist/tools/lib/utils.test.d.ts +2 -0
- package/dist/tools/lib/utils.test.d.ts.map +1 -0
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts +3 -2
- package/dist/tools/subscribe/CoValueCoreSubscription.d.ts.map +1 -1
- package/dist/tools/subscribe/JazzError.d.ts +4 -3
- package/dist/tools/subscribe/JazzError.d.ts.map +1 -1
- package/dist/tools/subscribe/SubscriptionScope.d.ts +7 -5
- package/dist/tools/subscribe/SubscriptionScope.d.ts.map +1 -1
- package/dist/tools/subscribe/index.d.ts.map +1 -1
- package/dist/tools/subscribe/types.d.ts +23 -3
- package/dist/tools/subscribe/types.d.ts.map +1 -1
- package/dist/tools/subscribe/utils.d.ts.map +1 -1
- package/dist/tools/testing.d.ts +3 -2
- package/dist/tools/testing.d.ts.map +1 -1
- package/dist/tools/tests/schema.resolved.test.d.ts +2 -0
- package/dist/tools/tests/schema.resolved.test.d.ts.map +1 -0
- package/dist/tools/tests/utils.d.ts +2 -1
- package/dist/tools/tests/utils.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/better-auth/database-adapter/index.ts +2 -2
- package/src/better-auth/database-adapter/repository/account.ts +3 -3
- package/src/better-auth/database-adapter/repository/generic.ts +9 -6
- package/src/better-auth/database-adapter/repository/user.ts +6 -2
- package/src/better-auth/database-adapter/schema.ts +1 -1
- package/src/better-auth/database-adapter/tests/index.test.ts +3 -4
- package/src/inspector/tests/viewer/history-view.test.tsx +6 -2
- package/src/media/utils.test.ts +5 -0
- package/src/media/utils.ts +25 -16
- package/src/react/hooks.tsx +2 -2
- package/src/react/index.ts +2 -2
- package/src/react/media/image.tsx +10 -2
- package/src/react/tests/useAcceptInvite.test.ts +3 -1
- package/src/react-core/hooks.ts +226 -304
- package/src/react-core/subscription-provider.tsx +14 -7
- package/src/react-core/tests/createCoValueSubscriptionContext.test.tsx +233 -0
- package/src/react-core/tests/subscription.bench.tsx +32 -15
- package/src/react-core/tests/{useAccountWithSelector.test.ts → useAccount.selector.test.ts} +72 -24
- package/src/react-core/tests/useAccount.test.ts +92 -106
- package/src/react-core/tests/{useCoStateWithSelector.test.ts → useCoState.selector.test.ts} +23 -8
- package/src/react-core/tests/useCoState.test.ts +173 -49
- package/src/react-core/tests/useInboxSender.test.ts +3 -1
- package/src/react-core/tests/usePassPhraseAuth.test.ts +11 -82
- package/src/react-core/tests/useSubscriptionSelector.test.ts +48 -14
- package/src/react-native-core/hooks.tsx +2 -2
- package/src/react-native-core/media/image.tsx +3 -1
- package/src/svelte/jazz.class.svelte.ts +103 -27
- package/src/svelte/media/image.svelte +6 -5
- package/src/svelte/tests/AccountCoState.svelte.test-d.ts +23 -0
- package/src/svelte/tests/CoState.svelte.test-d.ts +20 -0
- package/src/svelte/tests/CoState.svelte.test.ts +57 -0
- package/src/svelte/tests/TestCoStateWrapper.svelte +23 -0
- package/src/tools/coValues/CoValueBase.ts +12 -0
- package/src/tools/coValues/account.ts +17 -12
- package/src/tools/coValues/coFeed.ts +38 -15
- package/src/tools/coValues/coList.ts +17 -12
- package/src/tools/coValues/coMap.ts +15 -14
- package/src/tools/coValues/coPlainText.ts +6 -3
- package/src/tools/coValues/coVector.ts +6 -5
- package/src/tools/coValues/deepLoading.ts +147 -86
- package/src/tools/coValues/group.ts +3 -2
- package/src/tools/coValues/inbox.ts +11 -10
- package/src/tools/coValues/interfaces.ts +52 -30
- package/src/tools/coValues/request.ts +8 -6
- package/src/tools/coValues/schemaUnion.ts +20 -14
- package/src/tools/exports.ts +11 -1
- package/src/tools/implementation/refs.ts +19 -13
- package/src/tools/implementation/schema.ts +5 -4
- package/src/tools/implementation/schemaUtils.ts +15 -0
- package/src/tools/implementation/zodSchema/runtimeConverters/coValueSchemaTransformation.ts +4 -4
- package/src/tools/implementation/zodSchema/schemaTypes/AccountSchema.ts +131 -95
- package/src/tools/implementation/zodSchema/schemaTypes/CoDiscriminatedUnionSchema.ts +86 -16
- package/src/tools/implementation/zodSchema/schemaTypes/CoFeedSchema.ts +73 -22
- package/src/tools/implementation/zodSchema/schemaTypes/CoListSchema.ts +86 -28
- package/src/tools/implementation/zodSchema/schemaTypes/CoMapSchema.ts +204 -148
- package/src/tools/implementation/zodSchema/schemaTypes/CoOptionalSchema.ts +1 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoRecordSchema.ts +71 -27
- package/src/tools/implementation/zodSchema/schemaTypes/CoValueSchema.ts +7 -0
- package/src/tools/implementation/zodSchema/schemaTypes/CoVectorSchema.ts +8 -6
- package/src/tools/implementation/zodSchema/schemaTypes/FileStreamSchema.ts +4 -1
- package/src/tools/implementation/zodSchema/schemaTypes/GroupSchema.ts +4 -1
- package/src/tools/implementation/zodSchema/schemaTypes/PlainTextSchema.ts +4 -1
- package/src/tools/implementation/zodSchema/schemaTypes/RichTextSchema.ts +4 -1
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOfSchema.ts +3 -0
- package/src/tools/implementation/zodSchema/typeConverters/{InstanceOfSchemaCoValuesNullable.ts → InstanceOfSchemaCoValuesMaybeLoaded.ts} +47 -39
- package/src/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchema.ts +4 -0
- package/src/tools/implementation/zodSchema/typeConverters/{InstanceOrPrimitiveOfSchemaCoValuesNullable.ts → InstanceOrPrimitiveOfSchemaCoValuesMaybeLoaded.ts} +7 -3
- package/src/tools/implementation/zodSchema/unionUtils.ts +35 -4
- package/src/tools/implementation/zodSchema/zodSchema.ts +15 -7
- package/src/tools/internal.ts +3 -3
- package/src/tools/lib/utils.test.ts +56 -0
- package/src/tools/lib/utils.ts +32 -0
- package/src/tools/subscribe/CoValueCoreSubscription.ts +13 -8
- package/src/tools/subscribe/JazzError.ts +8 -2
- package/src/tools/subscribe/SubscriptionScope.ts +57 -57
- package/src/tools/subscribe/index.ts +12 -4
- package/src/tools/subscribe/types.ts +36 -2
- package/src/tools/subscribe/utils.ts +2 -1
- package/src/tools/testing.ts +5 -0
- package/src/tools/tests/CoValueCoreSubscription.test.ts +10 -4
- package/src/tools/tests/ContextManager.test.ts +12 -5
- package/src/tools/tests/account.test.ts +22 -12
- package/src/tools/tests/coDiscriminatedUnion.test.ts +354 -8
- package/src/tools/tests/coFeed.branch.test.ts +48 -32
- package/src/tools/tests/coFeed.test-d.ts +17 -10
- package/src/tools/tests/coFeed.test.ts +52 -30
- package/src/tools/tests/coList.branch.test.ts +21 -21
- package/src/tools/tests/coList.test-d.ts +39 -23
- package/src/tools/tests/coList.test.ts +51 -25
- package/src/tools/tests/coList.unique.test.ts +34 -29
- package/src/tools/tests/coMap.branch.test.ts +20 -21
- package/src/tools/tests/coMap.record.test-d.ts +28 -26
- package/src/tools/tests/coMap.record.test.ts +30 -20
- package/src/tools/tests/coMap.test-d.ts +31 -29
- package/src/tools/tests/coMap.test.ts +67 -40
- package/src/tools/tests/coMap.unique.test.ts +25 -24
- package/src/tools/tests/coVector.test.ts +29 -15
- package/src/tools/tests/createContext.test.ts +5 -3
- package/src/tools/tests/deepLoading.test.ts +369 -176
- package/src/tools/tests/exportImport.test.ts +16 -15
- package/src/tools/tests/groupsAndAccounts.test.ts +39 -16
- package/src/tools/tests/inbox.test.ts +3 -1
- package/src/tools/tests/load.test.ts +29 -23
- package/src/tools/tests/patterns/quest.test.ts +3 -2
- package/src/tools/tests/patterns/requestToJoin.test.ts +17 -17
- package/src/tools/tests/request.test.ts +12 -2
- package/src/tools/tests/schema.resolved.test.ts +792 -0
- package/src/tools/tests/schemaUnion.test.ts +7 -3
- package/src/tools/tests/subscribe.test.ts +39 -21
- package/src/tools/tests/testing.test.ts +3 -2
- package/src/tools/tests/utils.ts +15 -2
- package/dist/chunk-OSQ7S47Q.js.map +0 -1
- package/dist/media/chunk-K6GCHLQU.js.map +0 -1
- package/dist/react-core/tests/useAccountWithSelector.test.d.ts +0 -2
- package/dist/react-core/tests/useAccountWithSelector.test.d.ts.map +0 -1
- package/dist/react-core/tests/useCoStateWithSelector.test.d.ts +0 -2
- package/dist/react-core/tests/useCoStateWithSelector.test.d.ts.map +0 -1
- package/dist/tools/implementation/errors.d.ts +0 -2
- package/dist/tools/implementation/errors.d.ts.map +0 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts +0 -19
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOfSchemaCoValuesNullable.d.ts.map +0 -1
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts +0 -5
- package/dist/tools/implementation/zodSchema/typeConverters/InstanceOrPrimitiveOfSchemaCoValuesNullable.d.ts.map +0 -1
- package/dist/tools/lib/id.d.ts +0 -2
- package/dist/tools/lib/id.d.ts.map +0 -1
- package/src/tools/implementation/errors.ts +0 -1
- package/src/tools/lib/id.ts +0 -3
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
RawCoValue,
|
|
7
7
|
} from "cojson";
|
|
8
8
|
import type { BranchDefinition } from "./types.js";
|
|
9
|
+
import { CoValueLoadingState } from "./types.js";
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Manages subscriptions to CoValue cores, handling both direct subscriptions
|
|
@@ -21,13 +22,17 @@ export class CoValueCoreSubscription {
|
|
|
21
22
|
private branchName?: string;
|
|
22
23
|
private source: CoValueCore;
|
|
23
24
|
private localNode: LocalNode;
|
|
24
|
-
private listener: (
|
|
25
|
+
private listener: (
|
|
26
|
+
value: RawCoValue | typeof CoValueLoadingState.UNAVAILABLE,
|
|
27
|
+
) => void;
|
|
25
28
|
private skipRetry?: boolean;
|
|
26
29
|
|
|
27
30
|
constructor(
|
|
28
31
|
localNode: LocalNode,
|
|
29
32
|
id: string,
|
|
30
|
-
listener: (
|
|
33
|
+
listener: (
|
|
34
|
+
value: RawCoValue | typeof CoValueLoadingState.UNAVAILABLE,
|
|
35
|
+
) => void,
|
|
31
36
|
skipRetry?: boolean,
|
|
32
37
|
branch?: BranchDefinition,
|
|
33
38
|
) {
|
|
@@ -115,7 +120,7 @@ export class CoValueCoreSubscription {
|
|
|
115
120
|
.then((value) => {
|
|
116
121
|
if (this.unsubscribed) return;
|
|
117
122
|
|
|
118
|
-
if (value !==
|
|
123
|
+
if (value !== CoValueLoadingState.UNAVAILABLE) {
|
|
119
124
|
// Branch checkout successful, subscribe to it
|
|
120
125
|
this.subscribe(value);
|
|
121
126
|
} else {
|
|
@@ -126,7 +131,7 @@ export class CoValueCoreSubscription {
|
|
|
126
131
|
.catch((error) => {
|
|
127
132
|
// Handle unexpected errors during branch checkout
|
|
128
133
|
console.error(error);
|
|
129
|
-
this.emit(
|
|
134
|
+
this.emit(CoValueLoadingState.UNAVAILABLE);
|
|
130
135
|
});
|
|
131
136
|
}
|
|
132
137
|
|
|
@@ -143,7 +148,7 @@ export class CoValueCoreSubscription {
|
|
|
143
148
|
|
|
144
149
|
// Source isn't available either, subscribe to state changes and report unavailability
|
|
145
150
|
this.subscribeToUnavailableSource();
|
|
146
|
-
this.emit(
|
|
151
|
+
this.emit(CoValueLoadingState.UNAVAILABLE);
|
|
147
152
|
}
|
|
148
153
|
|
|
149
154
|
/**
|
|
@@ -162,13 +167,13 @@ export class CoValueCoreSubscription {
|
|
|
162
167
|
} else {
|
|
163
168
|
// Loading failed, subscribe to state changes and report unavailability
|
|
164
169
|
this.subscribeToUnavailableSource();
|
|
165
|
-
this.emit(
|
|
170
|
+
this.emit(CoValueLoadingState.UNAVAILABLE);
|
|
166
171
|
}
|
|
167
172
|
})
|
|
168
173
|
.catch((error) => {
|
|
169
174
|
// Handle unexpected errors during loading
|
|
170
175
|
console.error(error);
|
|
171
|
-
this.emit(
|
|
176
|
+
this.emit(CoValueLoadingState.UNAVAILABLE);
|
|
172
177
|
});
|
|
173
178
|
}
|
|
174
179
|
|
|
@@ -218,7 +223,7 @@ export class CoValueCoreSubscription {
|
|
|
218
223
|
});
|
|
219
224
|
}
|
|
220
225
|
|
|
221
|
-
emit(value: RawCoValue |
|
|
226
|
+
emit(value: RawCoValue | typeof CoValueLoadingState.UNAVAILABLE): void {
|
|
222
227
|
if (this.unsubscribed) return;
|
|
223
228
|
if (!isReadyForEmit(value)) {
|
|
224
229
|
return;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import type { CoValue, ID } from "../internal.js";
|
|
2
|
+
import { CoValueLoadingState } from "./types.js";
|
|
2
3
|
|
|
3
4
|
export class JazzError {
|
|
4
5
|
constructor(
|
|
5
6
|
public id: ID<CoValue> | undefined,
|
|
6
|
-
public type:
|
|
7
|
+
public type:
|
|
8
|
+
| typeof CoValueLoadingState.UNAVAILABLE
|
|
9
|
+
| typeof CoValueLoadingState.UNAUTHORIZED,
|
|
7
10
|
public issues: JazzErrorIssue[],
|
|
8
11
|
) {}
|
|
9
12
|
|
|
@@ -41,7 +44,10 @@ export class JazzError {
|
|
|
41
44
|
}
|
|
42
45
|
}
|
|
43
46
|
export type JazzErrorIssue = {
|
|
44
|
-
code:
|
|
47
|
+
code:
|
|
48
|
+
| typeof CoValueLoadingState.UNAVAILABLE
|
|
49
|
+
| typeof CoValueLoadingState.UNAUTHORIZED
|
|
50
|
+
| "validationError";
|
|
45
51
|
message: string;
|
|
46
52
|
params: Record<string, any>;
|
|
47
53
|
path: string[];
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
CoMap,
|
|
6
6
|
type CoValue,
|
|
7
7
|
type ID,
|
|
8
|
+
MaybeLoaded,
|
|
8
9
|
type RefEncoded,
|
|
9
10
|
type RefsToResolve,
|
|
10
11
|
TypeSym,
|
|
@@ -14,7 +15,12 @@ import {
|
|
|
14
15
|
import { applyCoValueMigrations } from "../lib/migration.js";
|
|
15
16
|
import { CoValueCoreSubscription } from "./CoValueCoreSubscription.js";
|
|
16
17
|
import { JazzError, type JazzErrorIssue } from "./JazzError.js";
|
|
17
|
-
import type {
|
|
18
|
+
import type {
|
|
19
|
+
BranchDefinition,
|
|
20
|
+
SubscriptionValue,
|
|
21
|
+
SubscriptionValueLoading,
|
|
22
|
+
} from "./types.js";
|
|
23
|
+
import { CoValueLoadingState, NotLoadedCoValueState } from "./types.js";
|
|
18
24
|
import { createCoValue, myRoleForRawValue } from "./utils.js";
|
|
19
25
|
|
|
20
26
|
export class SubscriptionScope<D extends CoValue> {
|
|
@@ -31,7 +37,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
31
37
|
* Autoloaded child ids that are unloaded
|
|
32
38
|
*/
|
|
33
39
|
pendingAutoloadedChildren: Set<string> = new Set();
|
|
34
|
-
value: SubscriptionValue<D, any> |
|
|
40
|
+
value: SubscriptionValue<D, any> | SubscriptionValueLoading;
|
|
35
41
|
childErrors: Map<string, JazzError> = new Map();
|
|
36
42
|
validationErrors: Map<string, JazzError> = new Map();
|
|
37
43
|
errorFromChildren: JazzError | undefined;
|
|
@@ -43,6 +49,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
43
49
|
autoloadedKeys = new Set<string>();
|
|
44
50
|
skipInvalidKeys = new Set<string>();
|
|
45
51
|
totalValidTransactions = 0;
|
|
52
|
+
version = 0;
|
|
46
53
|
migrated = false;
|
|
47
54
|
migrating = false;
|
|
48
55
|
closed = false;
|
|
@@ -59,16 +66,19 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
59
66
|
public unstable_branch?: BranchDefinition,
|
|
60
67
|
) {
|
|
61
68
|
this.resolve = resolve;
|
|
62
|
-
this.value = { type:
|
|
69
|
+
this.value = { type: CoValueLoadingState.LOADING, id };
|
|
63
70
|
|
|
64
|
-
let lastUpdate:
|
|
71
|
+
let lastUpdate:
|
|
72
|
+
| RawCoValue
|
|
73
|
+
| typeof CoValueLoadingState.UNAVAILABLE
|
|
74
|
+
| undefined;
|
|
65
75
|
this.subscription = new CoValueCoreSubscription(
|
|
66
76
|
node,
|
|
67
77
|
id,
|
|
68
78
|
(value) => {
|
|
69
79
|
lastUpdate = value;
|
|
70
80
|
|
|
71
|
-
if (skipRetry && value ===
|
|
81
|
+
if (skipRetry && value === CoValueLoadingState.UNAVAILABLE) {
|
|
72
82
|
this.handleUpdate(value);
|
|
73
83
|
return;
|
|
74
84
|
}
|
|
@@ -79,7 +89,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
79
89
|
// - Run the migration only once
|
|
80
90
|
// - Skip all the updates until the migration is done
|
|
81
91
|
// - Trigger handleUpdate only with the final value
|
|
82
|
-
if (!this.migrated && value !==
|
|
92
|
+
if (!this.migrated && value !== CoValueLoadingState.UNAVAILABLE) {
|
|
83
93
|
if (this.migrating) {
|
|
84
94
|
return;
|
|
85
95
|
}
|
|
@@ -107,13 +117,13 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
107
117
|
this.dirty = true;
|
|
108
118
|
}
|
|
109
119
|
|
|
110
|
-
handleUpdate(update: RawCoValue |
|
|
111
|
-
if (update ===
|
|
112
|
-
if (this.value.type ===
|
|
120
|
+
handleUpdate(update: RawCoValue | typeof CoValueLoadingState.UNAVAILABLE) {
|
|
121
|
+
if (update === CoValueLoadingState.UNAVAILABLE) {
|
|
122
|
+
if (this.value.type === CoValueLoadingState.LOADING) {
|
|
113
123
|
this.updateValue(
|
|
114
|
-
new JazzError(this.id,
|
|
124
|
+
new JazzError(this.id, CoValueLoadingState.UNAVAILABLE, [
|
|
115
125
|
{
|
|
116
|
-
code:
|
|
126
|
+
code: CoValueLoadingState.UNAVAILABLE,
|
|
117
127
|
message: "The value is unavailable",
|
|
118
128
|
params: {
|
|
119
129
|
id: this.id,
|
|
@@ -135,11 +145,11 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
135
145
|
myRoleForRawValue(update) !== undefined;
|
|
136
146
|
|
|
137
147
|
if (!hasAccess) {
|
|
138
|
-
if (this.value.type !==
|
|
148
|
+
if (this.value.type !== CoValueLoadingState.UNAUTHORIZED) {
|
|
139
149
|
this.updateValue(
|
|
140
|
-
new JazzError(this.id,
|
|
150
|
+
new JazzError(this.id, CoValueLoadingState.UNAUTHORIZED, [
|
|
141
151
|
{
|
|
142
|
-
code:
|
|
152
|
+
code: CoValueLoadingState.UNAUTHORIZED,
|
|
143
153
|
message: `The current user (${this.node.getCurrentAgent().id}) is not authorized to access this value`,
|
|
144
154
|
params: {
|
|
145
155
|
id: this.id,
|
|
@@ -157,15 +167,13 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
157
167
|
// after loading all the children, not one per children
|
|
158
168
|
this.silenceUpdates = true;
|
|
159
169
|
|
|
160
|
-
if (this.value.type !==
|
|
170
|
+
if (this.value.type !== CoValueLoadingState.LOADED) {
|
|
161
171
|
this.updateValue(createCoValue(this.schema, update, this));
|
|
162
172
|
this.loadChildren();
|
|
163
173
|
} else {
|
|
164
174
|
const hasChanged =
|
|
165
175
|
update.totalValidTransactions !== this.totalValidTransactions ||
|
|
166
|
-
|
|
167
|
-
// has been updated and the coValues that don't update the totalValidTransactions value (e.g. FileStream)
|
|
168
|
-
this.value.value.$jazz.raw !== update;
|
|
176
|
+
update.version !== this.version;
|
|
169
177
|
|
|
170
178
|
if (this.loadChildren()) {
|
|
171
179
|
this.updateValue(createCoValue(this.schema, update, this));
|
|
@@ -175,6 +183,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
175
183
|
}
|
|
176
184
|
|
|
177
185
|
this.totalValidTransactions = update.totalValidTransactions;
|
|
186
|
+
this.version = update.version;
|
|
178
187
|
|
|
179
188
|
this.silenceUpdates = false;
|
|
180
189
|
this.triggerUpdate();
|
|
@@ -182,7 +191,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
182
191
|
|
|
183
192
|
computeChildErrors() {
|
|
184
193
|
let issues: JazzErrorIssue[] = [];
|
|
185
|
-
let errorType: JazzError["type"] =
|
|
194
|
+
let errorType: JazzError["type"] = CoValueLoadingState.UNAVAILABLE;
|
|
186
195
|
|
|
187
196
|
if (this.childErrors.size === 0 && this.validationErrors.size === 0) {
|
|
188
197
|
return undefined;
|
|
@@ -228,10 +237,10 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
228
237
|
|
|
229
238
|
handleChildUpdate = (
|
|
230
239
|
id: string,
|
|
231
|
-
value: SubscriptionValue<any, any> |
|
|
240
|
+
value: SubscriptionValue<any, any> | SubscriptionValueLoading,
|
|
232
241
|
key?: string,
|
|
233
242
|
) => {
|
|
234
|
-
if (value.type ===
|
|
243
|
+
if (value.type === CoValueLoadingState.LOADING) {
|
|
235
244
|
return;
|
|
236
245
|
}
|
|
237
246
|
|
|
@@ -239,7 +248,10 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
239
248
|
this.pendingAutoloadedChildren.delete(id);
|
|
240
249
|
this.childValues.set(id, value);
|
|
241
250
|
|
|
242
|
-
if (
|
|
251
|
+
if (
|
|
252
|
+
value.type === CoValueLoadingState.UNAVAILABLE ||
|
|
253
|
+
value.type === CoValueLoadingState.UNAUTHORIZED
|
|
254
|
+
) {
|
|
243
255
|
this.childErrors.set(id, value.prependPath(key ?? id));
|
|
244
256
|
|
|
245
257
|
this.errorFromChildren = this.computeChildErrors();
|
|
@@ -250,7 +262,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
250
262
|
}
|
|
251
263
|
|
|
252
264
|
if (this.shouldSendUpdates()) {
|
|
253
|
-
if (this.value.type ===
|
|
265
|
+
if (this.value.type === CoValueLoadingState.LOADED) {
|
|
254
266
|
// On child updates, we re-create the value instance to make the updates
|
|
255
267
|
// seamless-immutable and so be compatible with React and the React compiler
|
|
256
268
|
this.updateValue(
|
|
@@ -263,37 +275,37 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
263
275
|
};
|
|
264
276
|
|
|
265
277
|
shouldSendUpdates() {
|
|
266
|
-
if (this.value.type ===
|
|
278
|
+
if (this.value.type === CoValueLoadingState.LOADING) return false;
|
|
267
279
|
|
|
268
280
|
// If the value is in error, we send the update regardless of the children statuses
|
|
269
|
-
if (this.value.type !==
|
|
281
|
+
if (this.value.type !== CoValueLoadingState.LOADED) return true;
|
|
270
282
|
|
|
271
283
|
return this.pendingLoadedChildren.size === 0;
|
|
272
284
|
}
|
|
273
285
|
|
|
274
|
-
getCurrentValue() {
|
|
286
|
+
getCurrentValue(): D | NotLoadedCoValueState {
|
|
275
287
|
if (
|
|
276
|
-
this.value.type ===
|
|
277
|
-
this.value.type ===
|
|
288
|
+
this.value.type === CoValueLoadingState.UNAUTHORIZED ||
|
|
289
|
+
this.value.type === CoValueLoadingState.UNAVAILABLE
|
|
278
290
|
) {
|
|
279
291
|
console.error(this.value.toString());
|
|
280
|
-
return
|
|
292
|
+
return this.value.type;
|
|
281
293
|
}
|
|
282
294
|
|
|
283
295
|
if (!this.shouldSendUpdates()) {
|
|
284
|
-
return
|
|
296
|
+
return CoValueLoadingState.LOADING;
|
|
285
297
|
}
|
|
286
298
|
|
|
287
299
|
if (this.errorFromChildren) {
|
|
288
300
|
console.error(this.errorFromChildren.toString());
|
|
289
|
-
return
|
|
301
|
+
return this.errorFromChildren.type;
|
|
290
302
|
}
|
|
291
303
|
|
|
292
|
-
if (this.value.type ===
|
|
304
|
+
if (this.value.type === CoValueLoadingState.LOADED) {
|
|
293
305
|
return this.value.value;
|
|
294
306
|
}
|
|
295
307
|
|
|
296
|
-
return
|
|
308
|
+
return CoValueLoadingState.LOADING;
|
|
297
309
|
}
|
|
298
310
|
|
|
299
311
|
triggerUpdate() {
|
|
@@ -307,7 +319,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
307
319
|
|
|
308
320
|
if (error) {
|
|
309
321
|
this.subscribers.forEach((listener) => listener(error));
|
|
310
|
-
} else if (value.type !==
|
|
322
|
+
} else if (value.type !== CoValueLoadingState.LOADING) {
|
|
311
323
|
this.subscribers.forEach((listener) => listener(value));
|
|
312
324
|
}
|
|
313
325
|
|
|
@@ -333,16 +345,15 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
333
345
|
this.resolve = {};
|
|
334
346
|
}
|
|
335
347
|
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
348
|
+
const resolve: Record<string, any> = this.resolve;
|
|
349
|
+
if (!resolve.$each && !(key in resolve)) {
|
|
339
350
|
// Adding the key to the resolve object to resolve the key when calling loadChildren
|
|
340
351
|
resolve[key] = true;
|
|
341
352
|
// Track the keys that are autoloaded to flag any id on that key as autoloaded
|
|
342
353
|
this.autoloadedKeys.add(key);
|
|
343
354
|
}
|
|
344
355
|
|
|
345
|
-
if (this.value.type !==
|
|
356
|
+
if (this.value.type !== CoValueLoadingState.LOADED) {
|
|
346
357
|
return;
|
|
347
358
|
}
|
|
348
359
|
|
|
@@ -386,7 +397,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
386
397
|
throw new Error("Cannot pull a non-closed subscription scope");
|
|
387
398
|
}
|
|
388
399
|
|
|
389
|
-
if (this.value.type ===
|
|
400
|
+
if (this.value.type === CoValueLoadingState.LOADED) {
|
|
390
401
|
return;
|
|
391
402
|
}
|
|
392
403
|
|
|
@@ -398,9 +409,9 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
398
409
|
const value = this.getCurrentValue();
|
|
399
410
|
|
|
400
411
|
// If the value is available, trigger the listener
|
|
401
|
-
if (value) {
|
|
412
|
+
if (typeof value !== "string") {
|
|
402
413
|
listener({
|
|
403
|
-
type:
|
|
414
|
+
type: CoValueLoadingState.LOADED,
|
|
404
415
|
value,
|
|
405
416
|
id: this.id,
|
|
406
417
|
});
|
|
@@ -461,7 +472,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
461
472
|
loadChildren() {
|
|
462
473
|
const { resolve } = this;
|
|
463
474
|
|
|
464
|
-
if (this.value.type !==
|
|
475
|
+
if (this.value.type !== CoValueLoadingState.LOADED) {
|
|
465
476
|
return false;
|
|
466
477
|
}
|
|
467
478
|
|
|
@@ -536,7 +547,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
536
547
|
} else if (!descriptor.optional) {
|
|
537
548
|
this.validationErrors.set(
|
|
538
549
|
key,
|
|
539
|
-
new JazzError(undefined,
|
|
550
|
+
new JazzError(undefined, CoValueLoadingState.UNAVAILABLE, [
|
|
540
551
|
{
|
|
541
552
|
code: "validationError",
|
|
542
553
|
message: `The ref on position ${key} requested on ${stream.constructor.name} is missing`,
|
|
@@ -583,17 +594,6 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
583
594
|
const descriptor = map.$jazz.getDescriptor(key);
|
|
584
595
|
|
|
585
596
|
if (!descriptor) {
|
|
586
|
-
this.childErrors.set(
|
|
587
|
-
key,
|
|
588
|
-
new JazzError(undefined, "unavailable", [
|
|
589
|
-
{
|
|
590
|
-
code: "validationError",
|
|
591
|
-
message: `The ref ${key} requested on ${map.constructor.name} is not defined in the schema`,
|
|
592
|
-
params: {},
|
|
593
|
-
path: [key],
|
|
594
|
-
},
|
|
595
|
-
]),
|
|
596
|
-
);
|
|
597
597
|
return undefined;
|
|
598
598
|
}
|
|
599
599
|
|
|
@@ -606,7 +606,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
606
606
|
} else if (!descriptor.optional) {
|
|
607
607
|
this.validationErrors.set(
|
|
608
608
|
key,
|
|
609
|
-
new JazzError(undefined,
|
|
609
|
+
new JazzError(undefined, CoValueLoadingState.UNAVAILABLE, [
|
|
610
610
|
{
|
|
611
611
|
code: "validationError",
|
|
612
612
|
message: `The ref ${key} requested on ${map.constructor.name} is missing`,
|
|
@@ -645,7 +645,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
645
645
|
} else if (!descriptor.optional) {
|
|
646
646
|
this.validationErrors.set(
|
|
647
647
|
key,
|
|
648
|
-
new JazzError(undefined,
|
|
648
|
+
new JazzError(undefined, CoValueLoadingState.UNAVAILABLE, [
|
|
649
649
|
{
|
|
650
650
|
code: "validationError",
|
|
651
651
|
message: `The ref on position ${key} requested on ${list.constructor.name} is missing`,
|
|
@@ -674,7 +674,7 @@ export class SubscriptionScope<D extends CoValue> {
|
|
|
674
674
|
this.autoloaded.add(id);
|
|
675
675
|
}
|
|
676
676
|
|
|
677
|
-
const skipInvalid = typeof query === "object" && query.$onError ===
|
|
677
|
+
const skipInvalid = typeof query === "object" && query.$onError === "catch";
|
|
678
678
|
|
|
679
679
|
if (skipInvalid) {
|
|
680
680
|
if (key) {
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { CoValue, CoValueClass, RefEncoded } from "../internal.js";
|
|
2
|
+
import { createUnloadedCoValue } from "../internal.js";
|
|
2
3
|
import { SubscriptionScope } from "./SubscriptionScope.js";
|
|
4
|
+
import { CoValueLoadingState } from "./types.js";
|
|
3
5
|
|
|
4
6
|
export function getSubscriptionScope<D extends CoValue>(value: D) {
|
|
5
7
|
const subscriptionScope = value.$jazz._subscriptionScope;
|
|
@@ -56,10 +58,13 @@ export function accessChildByKey<D extends CoValue>(
|
|
|
56
58
|
|
|
57
59
|
const value = subscriptionScope.childValues.get(childId);
|
|
58
60
|
|
|
59
|
-
if (value?.type ===
|
|
61
|
+
if (value?.type === CoValueLoadingState.LOADED) {
|
|
60
62
|
return value.value;
|
|
61
63
|
} else {
|
|
62
|
-
return
|
|
64
|
+
return createUnloadedCoValue(
|
|
65
|
+
childId,
|
|
66
|
+
value?.type ?? CoValueLoadingState.LOADING,
|
|
67
|
+
);
|
|
63
68
|
}
|
|
64
69
|
}
|
|
65
70
|
|
|
@@ -82,9 +87,12 @@ export function accessChildById<D extends CoValue>(
|
|
|
82
87
|
|
|
83
88
|
const value = subscriptionScope.childValues.get(childId);
|
|
84
89
|
|
|
85
|
-
if (value?.type ===
|
|
90
|
+
if (value?.type === CoValueLoadingState.LOADED) {
|
|
86
91
|
return value.value;
|
|
87
92
|
} else {
|
|
88
|
-
return
|
|
93
|
+
return createUnloadedCoValue(
|
|
94
|
+
childId,
|
|
95
|
+
value?.type ?? CoValueLoadingState.LOADING,
|
|
96
|
+
);
|
|
89
97
|
}
|
|
90
98
|
}
|
|
@@ -7,9 +7,43 @@ import type {
|
|
|
7
7
|
} from "../internal.js";
|
|
8
8
|
import type { JazzError } from "./JazzError.js";
|
|
9
9
|
|
|
10
|
+
export const CoValueLoadingState = {
|
|
11
|
+
/**
|
|
12
|
+
* The coValue is loaded.
|
|
13
|
+
*/
|
|
14
|
+
LOADED: "loaded",
|
|
15
|
+
/**
|
|
16
|
+
* The coValue is being loaded.
|
|
17
|
+
*/
|
|
18
|
+
LOADING: "loading",
|
|
19
|
+
/**
|
|
20
|
+
* The coValue was loaded but the account is not authorized to access it.
|
|
21
|
+
*/
|
|
22
|
+
UNAUTHORIZED: "unauthorized",
|
|
23
|
+
/**
|
|
24
|
+
* Tried to load the coValue but failed.
|
|
25
|
+
*/
|
|
26
|
+
UNAVAILABLE: "unavailable",
|
|
27
|
+
} as const;
|
|
28
|
+
|
|
29
|
+
export type CoValueLoadingState =
|
|
30
|
+
(typeof CoValueLoadingState)[keyof typeof CoValueLoadingState];
|
|
31
|
+
|
|
32
|
+
export type NotLoadedCoValueState =
|
|
33
|
+
| typeof CoValueLoadingState.LOADING
|
|
34
|
+
| typeof CoValueLoadingState.UNAUTHORIZED
|
|
35
|
+
| typeof CoValueLoadingState.UNAVAILABLE;
|
|
36
|
+
|
|
10
37
|
export type SubscriptionValue<D extends CoValue, R extends RefsToResolve<D>> =
|
|
11
|
-
| {
|
|
38
|
+
| {
|
|
39
|
+
type: typeof CoValueLoadingState.LOADED;
|
|
40
|
+
value: Resolved<D, R>;
|
|
41
|
+
id: string;
|
|
42
|
+
}
|
|
12
43
|
| JazzError;
|
|
13
|
-
export type
|
|
44
|
+
export type SubscriptionValueLoading = {
|
|
45
|
+
type: typeof CoValueLoadingState.LOADING;
|
|
46
|
+
id: string;
|
|
47
|
+
};
|
|
14
48
|
|
|
15
49
|
export type BranchDefinition = { name: string; owner?: Group | Account | null };
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from "../internal.js";
|
|
9
9
|
import { coValuesCache } from "../lib/cache.js";
|
|
10
10
|
import { SubscriptionScope } from "./SubscriptionScope.js";
|
|
11
|
+
import { CoValueLoadingState } from "./types.js";
|
|
11
12
|
|
|
12
13
|
export function myRoleForRawValue(raw: RawCoValue): Role | undefined {
|
|
13
14
|
const rawOwner = raw.group;
|
|
@@ -36,7 +37,7 @@ export function createCoValue<D extends CoValue>(
|
|
|
36
37
|
});
|
|
37
38
|
|
|
38
39
|
return {
|
|
39
|
-
type:
|
|
40
|
+
type: CoValueLoadingState.LOADED,
|
|
40
41
|
value: freshValueInstance,
|
|
41
42
|
id: subscriptionScope.id,
|
|
42
43
|
};
|
package/src/tools/testing.ts
CHANGED
|
@@ -16,9 +16,14 @@ import {
|
|
|
16
16
|
coValueClassFromCoValueClassOrSchema,
|
|
17
17
|
createAnonymousJazzContext,
|
|
18
18
|
createJazzContext,
|
|
19
|
+
CoValue,
|
|
20
|
+
LoadedAndRequired,
|
|
21
|
+
MaybeLoaded,
|
|
19
22
|
randomSessionProvider,
|
|
20
23
|
} from "./internal.js";
|
|
21
24
|
|
|
25
|
+
export { assertLoaded } from "./lib/utils.js";
|
|
26
|
+
|
|
22
27
|
const syncServer: { current: LocalNode | null; asyncPeers: boolean } = {
|
|
23
28
|
current: null,
|
|
24
29
|
asyncPeers: false,
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import { assert, beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
CoValueLoadingState,
|
|
4
|
+
Group,
|
|
5
|
+
co,
|
|
6
|
+
exportCoValue,
|
|
7
|
+
z,
|
|
8
|
+
} from "../exports.js";
|
|
3
9
|
import { CoValueCoreSubscription } from "../subscribe/CoValueCoreSubscription.js";
|
|
4
10
|
import {
|
|
5
11
|
createJazzTestAccount,
|
|
@@ -462,7 +468,7 @@ describe("CoValueCoreSubscription", async () => {
|
|
|
462
468
|
await waitFor(() => expect(listener).toHaveBeenCalled());
|
|
463
469
|
|
|
464
470
|
// Should report unavailable when loading fails
|
|
465
|
-
expect(lastResult).toBe(
|
|
471
|
+
expect(lastResult).toBe(CoValueLoadingState.UNAVAILABLE);
|
|
466
472
|
|
|
467
473
|
subscription.unsubscribe();
|
|
468
474
|
});
|
|
@@ -493,7 +499,7 @@ describe("CoValueCoreSubscription", async () => {
|
|
|
493
499
|
await waitFor(() => expect(listener).toHaveBeenCalled());
|
|
494
500
|
|
|
495
501
|
// Should report unavailable when loading fails
|
|
496
|
-
expect(lastResult).toBe(
|
|
502
|
+
expect(lastResult).toBe(CoValueLoadingState.UNAVAILABLE);
|
|
497
503
|
|
|
498
504
|
subscription.unsubscribe();
|
|
499
505
|
});
|
|
@@ -542,7 +548,7 @@ describe("CoValueCoreSubscription", async () => {
|
|
|
542
548
|
await waitFor(() => expect(listener).toHaveBeenCalled());
|
|
543
549
|
|
|
544
550
|
// Should report unavailable when loading fails
|
|
545
|
-
expect(lastResult).toBe(
|
|
551
|
+
expect(lastResult).toBe(CoValueLoadingState.UNAVAILABLE);
|
|
546
552
|
|
|
547
553
|
subscription.unsubscribe();
|
|
548
554
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { StorageAPI } from "cojson";
|
|
2
2
|
import { WasmCrypto } from "cojson/crypto/WasmCrypto";
|
|
3
|
-
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
3
|
+
import { assert, beforeEach, describe, expect, test, vi } from "vitest";
|
|
4
4
|
import {
|
|
5
5
|
Account,
|
|
6
6
|
AccountClass,
|
|
@@ -28,6 +28,7 @@ import {
|
|
|
28
28
|
coValueClassFromCoValueClassOrSchema,
|
|
29
29
|
} from "../internal";
|
|
30
30
|
import {
|
|
31
|
+
assertLoaded,
|
|
31
32
|
createJazzTestAccount,
|
|
32
33
|
getPeerConnectedToTestSyncServer,
|
|
33
34
|
setupJazzTestSync,
|
|
@@ -101,7 +102,8 @@ describe("ContextManager", () => {
|
|
|
101
102
|
|
|
102
103
|
const context = getCurrentValue();
|
|
103
104
|
|
|
104
|
-
|
|
105
|
+
assertLoaded(context.me.profile);
|
|
106
|
+
expect(context.me.profile.name).toBe("Anonymous user");
|
|
105
107
|
expect(context.node).toBeDefined();
|
|
106
108
|
expect(manager.getCurrentValue()).toBeDefined();
|
|
107
109
|
});
|
|
@@ -113,7 +115,8 @@ describe("ContextManager", () => {
|
|
|
113
115
|
|
|
114
116
|
const context = getCurrentValue();
|
|
115
117
|
|
|
116
|
-
|
|
118
|
+
assertLoaded(context.me.profile);
|
|
119
|
+
expect(context.me.profile.name).toBe("Test User");
|
|
117
120
|
expect(context.node).toBeDefined();
|
|
118
121
|
expect(manager.getCurrentValue()).toBeDefined();
|
|
119
122
|
});
|
|
@@ -489,7 +492,10 @@ describe("ContextManager", () => {
|
|
|
489
492
|
},
|
|
490
493
|
});
|
|
491
494
|
|
|
492
|
-
|
|
495
|
+
const transferredRoot = me.root.transferredRoot;
|
|
496
|
+
assert(transferredRoot);
|
|
497
|
+
assertLoaded(transferredRoot);
|
|
498
|
+
expect(transferredRoot.value).toBe("Hello");
|
|
493
499
|
});
|
|
494
500
|
|
|
495
501
|
test("handles registration of new account", async () => {
|
|
@@ -501,7 +507,8 @@ describe("ContextManager", () => {
|
|
|
501
507
|
|
|
502
508
|
expect(accountId).toBeDefined();
|
|
503
509
|
const context = getCurrentValue();
|
|
504
|
-
|
|
510
|
+
assertLoaded(context.me.profile);
|
|
511
|
+
expect(context.me.profile.name).toBe("Test User");
|
|
505
512
|
expect(context.me.$jazz.id).toBe(accountId);
|
|
506
513
|
});
|
|
507
514
|
|