jazz-tools 0.7.1 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.turbo/turbo-build.log +15 -0
  2. package/.turbo/turbo-lint.log +1 -1
  3. package/.turbo/turbo-test.log +33 -33
  4. package/CHANGELOG.md +171 -165
  5. package/LICENSE.txt +1 -1
  6. package/dist/coValues/account.js +30 -3
  7. package/dist/coValues/account.js.map +1 -1
  8. package/dist/coValues/coList.js +29 -5
  9. package/dist/coValues/coList.js.map +1 -1
  10. package/dist/coValues/coMap.js +25 -1
  11. package/dist/coValues/coMap.js.map +1 -1
  12. package/dist/coValues/coStream.js +49 -1
  13. package/dist/coValues/coStream.js.map +1 -1
  14. package/dist/coValues/group.js +25 -1
  15. package/dist/coValues/group.js.map +1 -1
  16. package/dist/coValues/interfaces.js +32 -48
  17. package/dist/coValues/interfaces.js.map +1 -1
  18. package/dist/implementation/schema.js.map +1 -1
  19. package/dist/implementation/subscriptionScope.js.map +1 -1
  20. package/dist/index.js +1 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/tests/deepLoading.test.js +2 -2
  23. package/dist/tests/deepLoading.test.js.map +1 -1
  24. package/dist/tests/groupsAndAccounts.test.js +3 -3
  25. package/dist/tests/groupsAndAccounts.test.js.map +1 -1
  26. package/package.json +1 -1
  27. package/src/coValues/account.ts +82 -12
  28. package/src/coValues/coList.ts +78 -13
  29. package/src/coValues/coMap.ts +78 -7
  30. package/src/coValues/coStream.ts +128 -11
  31. package/src/coValues/group.ts +77 -4
  32. package/src/coValues/interfaces.ts +140 -211
  33. package/src/implementation/schema.ts +7 -4
  34. package/src/implementation/subscriptionScope.ts +3 -3
  35. package/src/index.ts +7 -0
  36. package/src/tests/deepLoading.test.ts +6 -3
  37. package/src/tests/groupsAndAccounts.test.ts +4 -4
@@ -52,7 +52,7 @@ describe("Custom accounts and groups", async () => {
52
52
  ]);
53
53
  expect(group.nMembers).toBe(2);
54
54
  await new Promise((resolve) => {
55
- CustomGroup.subscribe(group, {}, (update) => {
55
+ group.subscribe({}, (update) => {
56
56
  const meAsMember = update.members.find((member) => {
57
57
  return member.id === me.id && member.account?.profile;
58
58
  });
@@ -71,13 +71,13 @@ describe("Custom accounts and groups", async () => {
71
71
  }
72
72
  const map = MyMap.create({ name: "test" }, { owner: group });
73
73
  const meAsCastMember = map._owner
74
- .as(CustomGroup)
74
+ .castAs(CustomGroup)
75
75
  .members.find((member) => member.id === me.id);
76
76
  expect(meAsCastMember?.account?.profile?.name).toBe("Hermes Puggington");
77
77
  expect(meAsCastMember?.account?.profile?.color).toBe("blue");
78
78
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
79
  expect(map._owner.nMembers).toBeUndefined();
80
- expect(map._owner.as(CustomGroup).nMembers).toBe(2);
80
+ expect(map._owner.castAs(CustomGroup).nMembers).toBe(2);
81
81
  });
82
82
  });
83
83
  //# sourceMappingURL=groupsAndAccounts.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"groupsAndAccounts.test.js","sourceRoot":"","sources":["../../src/tests/groupsAndAccounts.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"groupsAndAccounts.test.js","sourceRoot":"","sources":["../../src/tests/groupsAndAccounts.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,EAAE,CAAC;AAEzC,QAAQ,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;;IAC9C,MAAM,aAAc,SAAQ,KAAK;QAAjC;;YACI,SAAI,GAAG,EAAE,CAAC,MAAM,CAAC;YACjB,UAAK,GAAG,EAAE,CAAC,MAAM,CAAC;QACtB,CAAC;KAAA;IAED,MAAM,aAAc,SAAQ,OAAO;QAAnC;;YACI,YAAO,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAChC,SAAI,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAYzB,CAAC;QAVG,OAAO,CAAsB,aAAgC;YACzD,IAAI,aAAa,EAAE,CAAC;gBAChB,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACnD,YAAY,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;gBAC7C,IAAI,CAAC,OAAO,GAAG,aAAa,CAAC,MAAM,CAC/B,EAAE,IAAI,EAAE,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAC3C,EAAE,KAAK,EAAE,IAAI,EAAE,CAClB,CAAC;YACN,CAAC;QACL,CAAC;KACJ;IAED,MAAM,WAAY,SAAQ,KAAK;QAA/B;;YACI,YAAO,GAAG,EAAE,CAAC,IAAI,CAAC;YAClB,SAAI,GAAG,EAAE,CAAC,IAAI,CAAC;YACf,QAAY,GAAG,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QAKzC,CAAC;QAHG,IAAI,QAAQ;YACR,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;KACJ;SALI,EAAE,CAAC,OAAO;IAOf,IAAI,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC;YAClC,aAAa,EAAE,EAAE,IAAI,EAAE,mBAAmB,EAAE;YAC5C,MAAM,EAAE,MAAM;SACjB,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACnD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAEvC,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAEtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC;YAChC,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;YAC5B,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;SACrC,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChC,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE;gBAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;oBAC9C,OAAO,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC1D,CAAC,CAAC,CAAC;gBACH,IAAI,UAAU,EAAE,CAAC;oBACb,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAC1C,mBAAmB,CACtB,CAAC;oBACF,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;oBACxD,OAAO,EAAE,CAAC;gBACd,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;QAEH,MAAM,KAAM,SAAQ,KAAK;YAAzB;;gBACI,SAAI,GAAG,EAAE,CAAC,MAAM,CAAC;YACrB,CAAC;SAAA;QAED,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAE7D,MAAM,cAAc,GAAG,GAAG,CAAC,MAAM;aAC5B,MAAM,CAAC,WAAW,CAAC;aACnB,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAC/C,mBAAmB,CACtB,CAAC;QACF,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE7D,8DAA8D;QAC9D,MAAM,CAAE,GAAG,CAAC,MAAc,CAAC,QAAQ,CAAC,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "types": "./src/index.ts",
6
6
  "type": "module",
7
7
  "license": "MIT",
8
- "version": "0.7.1",
8
+ "version": "0.7.3",
9
9
  "dependencies": {
10
10
  "@effect/schema": "^0.66.16",
11
11
  "effect": "^3.1.5",
@@ -11,7 +11,7 @@ import type {
11
11
  RawControlledAccount,
12
12
  SessionID,
13
13
  } from "cojson";
14
- import { Context } from "effect";
14
+ import { Context, Effect, Stream } from "effect";
15
15
  import type {
16
16
  CoMap,
17
17
  CoValue,
@@ -19,8 +19,10 @@ import type {
19
19
  Schema,
20
20
  ID,
21
21
  RefEncoded,
22
- ClassOf,
23
22
  RefIfCoValue,
23
+ DeeplyLoaded,
24
+ DepthsIn,
25
+ UnavailableError,
24
26
  } from "../internal.js";
25
27
  import {
26
28
  Group,
@@ -31,13 +33,16 @@ import {
31
33
  SchemaInit,
32
34
  inspect,
33
35
  subscriptionsScopes,
36
+ loadCoValue,
37
+ loadCoValueEf,
38
+ subscribeToCoValue,
39
+ subscribeToCoValueEf,
40
+ ensureCoValueLoaded,
41
+ subscribeToExistingCoValue,
34
42
  } from "../internal.js";
35
43
 
36
44
  /** @category Identity & Permissions */
37
- export class Account
38
- extends CoValueBase
39
- implements CoValue<"Account", RawAccount | RawControlledAccount>
40
- {
45
+ export class Account extends CoValueBase implements CoValue {
41
46
  declare id: ID<this>;
42
47
  declare _type: "Account";
43
48
  declare _raw: RawAccount | RawControlledAccount;
@@ -52,7 +57,10 @@ export class Account
52
57
  }
53
58
  static {
54
59
  this._schema = {
55
- profile: { ref: () => Profile, optional: false } satisfies Schema,
60
+ profile: {
61
+ ref: () => Profile,
62
+ optional: false,
63
+ } satisfies RefEncoded<Profile>,
56
64
  root: "json" satisfies Schema,
57
65
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
58
66
  } as any;
@@ -151,12 +159,12 @@ export class Account
151
159
  inviteSecret,
152
160
  );
153
161
 
154
- return coValueClass.load(valueID, this as Account, []);
162
+ return loadCoValue(coValueClass, valueID, this as Account, []);
155
163
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
156
164
  }
157
165
 
158
166
  static async create<A extends Account>(
159
- this: ClassOf<A> & typeof Account,
167
+ this: CoValueClass<A> & typeof Account,
160
168
  options: {
161
169
  creationProps: { name: string };
162
170
  initialAgentSecret?: AgentSecret;
@@ -179,7 +187,7 @@ export class Account
179
187
  }
180
188
 
181
189
  static async become<A extends Account>(
182
- this: ClassOf<A> & typeof Account,
190
+ this: CoValueClass<A> & typeof Account,
183
191
  options: {
184
192
  accountID: ID<Account>;
185
193
  accountSecret: AgentSecret;
@@ -206,7 +214,10 @@ export class Account
206
214
  return this.fromNode(node) as A;
207
215
  }
208
216
 
209
- static fromNode<A extends Account>(this: ClassOf<A>, node: LocalNode): A {
217
+ static fromNode<A extends Account>(
218
+ this: CoValueClass<A>,
219
+ node: LocalNode,
220
+ ): A {
210
221
  return new this({
211
222
  fromRaw: node.account as RawControlledAccount,
212
223
  }) as A;
@@ -224,7 +235,10 @@ export class Account
224
235
  return this.toJSON();
225
236
  }
226
237
 
227
- migrate(creationProps?: { name: string }): void | Promise<void> {
238
+ migrate(
239
+ this: Account,
240
+ creationProps?: { name: string },
241
+ ): void | Promise<void> {
228
242
  if (creationProps) {
229
243
  const profileGroup = Group.create({ owner: this });
230
244
  profileGroup.addMember("everyone", "reader");
@@ -234,6 +248,62 @@ export class Account
234
248
  );
235
249
  }
236
250
  }
251
+
252
+ /** @category Subscription & Loading */
253
+ static load<A extends Account, Depth>(
254
+ this: CoValueClass<A>,
255
+ id: ID<A>,
256
+ as: Account,
257
+ depth: Depth & DepthsIn<A>,
258
+ ): Promise<DeeplyLoaded<A, Depth> | undefined> {
259
+ return loadCoValue(this, id, as, depth);
260
+ }
261
+
262
+ /** @category Subscription & Loading */
263
+ static loadEf<A extends Account, Depth>(
264
+ this: CoValueClass<A>,
265
+ id: ID<A>,
266
+ depth: Depth & DepthsIn<A>,
267
+ ): Effect.Effect<DeeplyLoaded<A, Depth>, UnavailableError, AccountCtx> {
268
+ return loadCoValueEf<A, Depth>(this, id, depth);
269
+ }
270
+
271
+ /** @category Subscription & Loading */
272
+ static subscribe<A extends Account, Depth>(
273
+ this: CoValueClass<A>,
274
+ id: ID<A>,
275
+ as: Account,
276
+ depth: Depth & DepthsIn<A>,
277
+ listener: (value: DeeplyLoaded<A, Depth>) => void,
278
+ ): () => void {
279
+ return subscribeToCoValue<A, Depth>(this, id, as, depth, listener);
280
+ }
281
+
282
+ /** @category Subscription & Loading */
283
+ static subscribeEf<A extends Account, Depth>(
284
+ this: CoValueClass<A>,
285
+ id: ID<A>,
286
+ depth: Depth & DepthsIn<A>,
287
+ ): Stream.Stream<DeeplyLoaded<A, Depth>, UnavailableError, AccountCtx> {
288
+ return subscribeToCoValueEf<A, Depth>(this, id, depth);
289
+ }
290
+
291
+ /** @category Subscription & Loading */
292
+ ensureLoaded<A extends Account, Depth>(
293
+ this: A,
294
+ depth: Depth & DepthsIn<A>,
295
+ ): Promise<DeeplyLoaded<A, Depth> | undefined> {
296
+ return ensureCoValueLoaded(this, depth);
297
+ }
298
+
299
+ /** @category Subscription & Loading */
300
+ subscribe<A extends Account, Depth>(
301
+ this: A,
302
+ depth: Depth & DepthsIn<A>,
303
+ listener: (value: DeeplyLoaded<A, Depth>) => void,
304
+ ): () => void {
305
+ return subscribeToExistingCoValue(this, depth, listener);
306
+ }
237
307
  }
238
308
 
239
309
  export const AccountAndGroupProxyHandler: ProxyHandler<Account | Group> = {
@@ -6,31 +6,38 @@ import type {
6
6
  SchemaFor,
7
7
  ID,
8
8
  RefEncoded,
9
- ClassOf,
10
9
  UnCo,
11
10
  CoValueClass,
11
+ DepthsIn,
12
+ DeeplyLoaded,
13
+ UnavailableError,
14
+ AccountCtx,
15
+ CoValueFromRaw,
12
16
  } from "../internal.js";
13
17
  import {
14
18
  Account,
15
- CoValueBase,
16
19
  Group,
17
20
  InitValues,
18
21
  ItemsSym,
19
22
  Ref,
20
23
  SchemaInit,
21
24
  co,
25
+ ensureCoValueLoaded,
22
26
  inspect,
23
27
  isRefEncoded,
28
+ loadCoValue,
29
+ loadCoValueEf,
24
30
  makeRefs,
31
+ subscribeToCoValue,
32
+ subscribeToCoValueEf,
33
+ subscribeToExistingCoValue,
25
34
  } from "../internal.js";
26
35
  import { encodeSync, decodeSync } from "@effect/schema/Schema";
36
+ import { Effect, Stream } from "effect";
27
37
 
28
38
  /** @category CoValues */
29
39
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
30
- export class CoList<Item = any>
31
- extends Array<Item>
32
- implements CoValue<"CoList", RawCoList>
33
- {
40
+ export class CoList<Item = any> extends Array<Item> implements CoValue {
34
41
  static Of<Item>(item: Item): typeof CoList<Item> {
35
42
  // TODO: cache superclass for item class
36
43
  return class CoListOf extends CoList<Item> {
@@ -146,7 +153,7 @@ export class CoList<Item = any>
146
153
  }
147
154
 
148
155
  static create<L extends CoList>(
149
- this: ClassOf<L>,
156
+ this: CoValueClass<L>,
150
157
  items: UnCo<L[number]>[],
151
158
  options: { owner: Account | Group },
152
159
  ) {
@@ -241,17 +248,12 @@ export class CoList<Item = any>
241
248
  }
242
249
 
243
250
  static fromRaw<V extends CoList>(
244
- this: ClassOf<V> & typeof CoList,
251
+ this: CoValueClass<V> & typeof CoList,
245
252
  raw: RawCoList,
246
253
  ) {
247
254
  return new this({ fromRaw: raw });
248
255
  }
249
256
 
250
- static load = CoValueBase.load as CoValueClass["load"];
251
- static loadEf = CoValueBase.loadEf as CoValueClass["loadEf"];
252
- static subscribe = CoValueBase.subscribe as CoValueClass["subscribe"];
253
- static subscribeEf = CoValueBase.subscribeEf as CoValueClass["subscribeEf"];
254
-
255
257
  static schema<V extends CoList>(
256
258
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
257
259
  this: { new (...args: any): V } & typeof CoList,
@@ -260,6 +262,69 @@ export class CoList<Item = any>
260
262
  this._schema ||= {};
261
263
  Object.assign(this._schema, def);
262
264
  }
265
+
266
+ /** @category Subscription & Loading */
267
+ static load<L extends CoList, Depth>(
268
+ this: CoValueClass<L>,
269
+ id: ID<L>,
270
+ as: Account,
271
+ depth: Depth & DepthsIn<L>,
272
+ ): Promise<DeeplyLoaded<L, Depth> | undefined> {
273
+ return loadCoValue(this, id, as, depth);
274
+ }
275
+
276
+ /** @category Subscription & Loading */
277
+ static loadEf<L extends CoList, Depth>(
278
+ this: CoValueClass<L>,
279
+ id: ID<L>,
280
+ depth: Depth & DepthsIn<L>,
281
+ ): Effect.Effect<DeeplyLoaded<L, Depth>, UnavailableError, AccountCtx> {
282
+ return loadCoValueEf<L, Depth>(this, id, depth);
283
+ }
284
+
285
+ /** @category Subscription & Loading */
286
+ static subscribe<L extends CoList, Depth>(
287
+ this: CoValueClass<L>,
288
+ id: ID<L>,
289
+ as: Account,
290
+ depth: Depth & DepthsIn<L>,
291
+ listener: (value: DeeplyLoaded<L, Depth>) => void,
292
+ ): () => void {
293
+ return subscribeToCoValue<L, Depth>(this, id, as, depth, listener);
294
+ }
295
+
296
+ /** @category Subscription & Loading */
297
+ static subscribeEf<L extends CoList, Depth>(
298
+ this: CoValueClass<L>,
299
+ id: ID<L>,
300
+ depth: Depth & DepthsIn<L>,
301
+ ): Stream.Stream<DeeplyLoaded<L, Depth>, UnavailableError, AccountCtx> {
302
+ return subscribeToCoValueEf<L, Depth>(this, id, depth);
303
+ }
304
+
305
+ /** @category Subscription & Loading */
306
+ ensureLoaded<L extends CoList, Depth>(
307
+ this: L,
308
+ depth: Depth & DepthsIn<L>,
309
+ ): Promise<DeeplyLoaded<L, Depth> | undefined> {
310
+ return ensureCoValueLoaded(this, depth);
311
+ }
312
+
313
+ /** @category Subscription & Loading */
314
+ subscribe<L extends CoList, Depth>(
315
+ this: L,
316
+ depth: Depth & DepthsIn<L>,
317
+ listener: (value: DeeplyLoaded<L, Depth>) => void,
318
+ ): () => void {
319
+ return subscribeToExistingCoValue(this, depth, listener);
320
+ }
321
+
322
+ /** @category Type Helpers */
323
+ castAs<Cl extends CoValueClass & CoValueFromRaw<CoValue>>(
324
+ cl: Cl,
325
+ ): InstanceType<Cl> {
326
+ return cl.fromRaw(this._raw) as InstanceType<Cl>;
327
+ }
263
328
  }
264
329
 
265
330
  function toRawItems<Item>(items: Item[], itemDescriptor: Schema) {
@@ -9,7 +9,11 @@ import type {
9
9
  RefEncoded,
10
10
  IfCo,
11
11
  RefIfCoValue,
12
- ClassOf,
12
+ DepthsIn,
13
+ DeeplyLoaded,
14
+ UnavailableError,
15
+ AccountCtx,
16
+ CoValueClass,
13
17
  } from "../internal.js";
14
18
  import {
15
19
  Account,
@@ -22,7 +26,14 @@ import {
22
26
  ItemsSym,
23
27
  InitValues,
24
28
  isRefEncoded,
29
+ loadCoValue,
30
+ loadCoValueEf,
31
+ subscribeToCoValue,
32
+ subscribeToCoValueEf,
33
+ ensureCoValueLoaded,
34
+ subscribeToExistingCoValue,
25
35
  } from "../internal.js";
36
+ import { Effect, Stream } from "effect";
26
37
 
27
38
  type CoMapEdit<V> = {
28
39
  value?: V;
@@ -66,7 +77,7 @@ type InitValuesFor<C extends CoMap> = {
66
77
  *
67
78
  * @category CoValues
68
79
  * */
69
- export class CoMap extends CoValueBase implements CoValue<"CoMap", RawCoMap> {
80
+ export class CoMap extends CoValueBase implements CoValue {
70
81
  /**
71
82
  * The ID of this `CoMap`
72
83
  * @category Content */
@@ -161,10 +172,14 @@ export class CoMap extends CoValueBase implements CoValue<"CoMap", RawCoMap> {
161
172
  : undefined,
162
173
  by:
163
174
  rawEdit.by &&
164
- new Ref(rawEdit.by as ID<Account>, target._loadedAs, {
165
- ref: Account,
166
- optional: false,
167
- }).accessFrom(
175
+ new Ref<Account>(
176
+ rawEdit.by as ID<Account>,
177
+ target._loadedAs,
178
+ {
179
+ ref: Account,
180
+ optional: false,
181
+ },
182
+ ).accessFrom(
168
183
  target,
169
184
  "_edits." + key.toString() + ".by",
170
185
  ),
@@ -214,7 +229,7 @@ export class CoMap extends CoValueBase implements CoValue<"CoMap", RawCoMap> {
214
229
 
215
230
  /** @category Creation */
216
231
  static create<M extends CoMap>(
217
- this: ClassOf<M>,
232
+ this: CoValueClass<M>,
218
233
  init: Simplify<CoMapInit<M>>,
219
234
  options: { owner: Account | Group },
220
235
  ) {
@@ -297,6 +312,62 @@ export class CoMap extends CoValueBase implements CoValue<"CoMap", RawCoMap> {
297
312
 
298
313
  return RecordLikeCoMap;
299
314
  }
315
+
316
+ /** @category Subscription & Loading */
317
+ static load<M extends CoMap, Depth>(
318
+ this: CoValueClass<M>,
319
+ id: ID<M>,
320
+ as: Account,
321
+ depth: Depth & DepthsIn<M>,
322
+ ): Promise<DeeplyLoaded<M, Depth> | undefined> {
323
+ return loadCoValue(this, id, as, depth);
324
+ }
325
+
326
+ /** @category Subscription & Loading */
327
+ static loadEf<M extends CoMap, Depth>(
328
+ this: CoValueClass<M>,
329
+ id: ID<M>,
330
+ depth: Depth & DepthsIn<M>,
331
+ ): Effect.Effect<DeeplyLoaded<M, Depth>, UnavailableError, AccountCtx> {
332
+ return loadCoValueEf<M, Depth>(this, id, depth);
333
+ }
334
+
335
+ /** @category Subscription & Loading */
336
+ static subscribe<M extends CoMap, Depth>(
337
+ this: CoValueClass<M>,
338
+ id: ID<M>,
339
+ as: Account,
340
+ depth: Depth & DepthsIn<M>,
341
+ listener: (value: DeeplyLoaded<M, Depth>) => void,
342
+ ): () => void {
343
+ return subscribeToCoValue<M, Depth>(this, id, as, depth, listener);
344
+ }
345
+
346
+ /** @category Subscription & Loading */
347
+ static subscribeEf<M extends CoMap, Depth>(
348
+ this: CoValueClass<M>,
349
+ id: ID<M>,
350
+ depth: Depth & DepthsIn<M>,
351
+ ): Stream.Stream<DeeplyLoaded<M, Depth>, UnavailableError, AccountCtx> {
352
+ return subscribeToCoValueEf<M, Depth>(this, id, depth);
353
+ }
354
+
355
+ /** @category Subscription & Loading */
356
+ ensureLoaded<M extends CoMap, Depth>(
357
+ this: M,
358
+ depth: Depth & DepthsIn<M>,
359
+ ): Promise<DeeplyLoaded<M, Depth> | undefined> {
360
+ return ensureCoValueLoaded(this, depth);
361
+ }
362
+
363
+ /** @category Subscription & Loading */
364
+ subscribe<M extends CoMap, Depth>(
365
+ this: M,
366
+ depth: Depth & DepthsIn<M>,
367
+ listener: (value: DeeplyLoaded<M, Depth>) => void,
368
+ ): () => void {
369
+ return subscribeToExistingCoValue(this, depth, listener);
370
+ }
300
371
  }
301
372
 
302
373
  export type CoKeys<Map extends object> = Exclude<
@@ -16,8 +16,12 @@ import type {
16
16
  Group,
17
17
  ID,
18
18
  IfCo,
19
- ClassOf,
20
19
  UnCo,
20
+ AccountCtx,
21
+ CoValueClass,
22
+ DeeplyLoaded,
23
+ DepthsIn,
24
+ UnavailableError,
21
25
  } from "../internal.js";
22
26
  import {
23
27
  ItemsSym,
@@ -29,8 +33,15 @@ import {
29
33
  InitValues,
30
34
  SchemaInit,
31
35
  isRefEncoded,
36
+ loadCoValue,
37
+ loadCoValueEf,
38
+ subscribeToCoValue,
39
+ subscribeToCoValueEf,
40
+ ensureCoValueLoaded,
41
+ subscribeToExistingCoValue,
32
42
  } from "../internal.js";
33
43
  import { encodeSync, decodeSync } from "@effect/schema/Schema";
44
+ import { Effect, Stream } from "effect";
34
45
 
35
46
  export type CoStreamEntry<Item> = SingleCoStreamEntry<Item> & {
36
47
  all: IterableIterator<SingleCoStreamEntry<Item>>;
@@ -46,10 +57,7 @@ export type SingleCoStreamEntry<Item> = {
46
57
 
47
58
  /** @category CoValues */
48
59
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
49
- export class CoStream<Item = any>
50
- extends CoValueBase
51
- implements CoValue<"CoStream", RawCoStream>
52
- {
60
+ export class CoStream<Item = any> extends CoValueBase implements CoValue {
53
61
  static Of<Item>(item: IfCo<Item, Item>): typeof CoStream<Item> {
54
62
  return class CoStreamOf extends CoStream<Item> {
55
63
  [co.items] = item;
@@ -114,7 +122,7 @@ export class CoStream<Item = any>
114
122
  }
115
123
 
116
124
  static create<S extends CoStream>(
117
- this: ClassOf<S>,
125
+ this: CoValueClass<S>,
118
126
  init: S extends CoStream<infer Item> ? UnCo<Item>[] : never,
119
127
  options: { owner: Account | Group },
120
128
  ) {
@@ -178,6 +186,62 @@ export class CoStream<Item = any>
178
186
  this._schema ||= {};
179
187
  Object.assign(this._schema, def);
180
188
  }
189
+
190
+ /** @category Subscription & Loading */
191
+ static load<S extends CoStream, Depth>(
192
+ this: CoValueClass<S>,
193
+ id: ID<S>,
194
+ as: Account,
195
+ depth: Depth & DepthsIn<S>,
196
+ ): Promise<DeeplyLoaded<S, Depth> | undefined> {
197
+ return loadCoValue(this, id, as, depth);
198
+ }
199
+
200
+ /** @category Subscription & Loading */
201
+ static loadEf<S extends CoStream, Depth>(
202
+ this: CoValueClass<S>,
203
+ id: ID<S>,
204
+ depth: Depth & DepthsIn<S>,
205
+ ): Effect.Effect<DeeplyLoaded<S, Depth>, UnavailableError, AccountCtx> {
206
+ return loadCoValueEf<S, Depth>(this, id, depth);
207
+ }
208
+
209
+ /** @category Subscription & Loading */
210
+ static subscribe<S extends CoStream, Depth>(
211
+ this: CoValueClass<S>,
212
+ id: ID<S>,
213
+ as: Account,
214
+ depth: Depth & DepthsIn<S>,
215
+ listener: (value: DeeplyLoaded<S, Depth>) => void,
216
+ ): () => void {
217
+ return subscribeToCoValue<S, Depth>(this, id, as, depth, listener);
218
+ }
219
+
220
+ /** @category Subscription & Loading */
221
+ static subscribeEf<S extends CoStream, Depth>(
222
+ this: CoValueClass<S>,
223
+ id: ID<S>,
224
+ depth: Depth & DepthsIn<S>,
225
+ ): Stream.Stream<DeeplyLoaded<S, Depth>, UnavailableError, AccountCtx> {
226
+ return subscribeToCoValueEf<S, Depth>(this, id, depth);
227
+ }
228
+
229
+ /** @category Subscription & Loading */
230
+ ensureLoaded<S extends CoStream, Depth>(
231
+ this: S,
232
+ depth: Depth & DepthsIn<S>,
233
+ ): Promise<DeeplyLoaded<S, Depth> | undefined> {
234
+ return ensureCoValueLoaded(this, depth);
235
+ }
236
+
237
+ /** @category Subscription & Loading */
238
+ subscribe<S extends CoStream, Depth>(
239
+ this: S,
240
+ depth: Depth & DepthsIn<S>,
241
+ listener: (value: DeeplyLoaded<S, Depth>) => void,
242
+ ): () => void {
243
+ return subscribeToExistingCoValue(this, depth, listener);
244
+ }
181
245
  }
182
246
 
183
247
  function entryFromRawEntry<Item>(
@@ -437,10 +501,7 @@ const CoStreamPerSessionProxyHandler = (
437
501
  });
438
502
 
439
503
  /** @category CoValues */
440
- export class BinaryCoStream
441
- extends CoValueBase
442
- implements CoValue<"BinaryCoStream", RawBinaryCoStream>
443
- {
504
+ export class BinaryCoStream extends CoValueBase implements CoValue {
444
505
  declare id: ID<this>;
445
506
  declare _type: "BinaryCoStream";
446
507
  declare _raw: RawBinaryCoStream;
@@ -476,7 +537,7 @@ export class BinaryCoStream
476
537
  }
477
538
 
478
539
  static create<S extends BinaryCoStream>(
479
- this: ClassOf<S>,
540
+ this: CoValueClass<S>,
480
541
  options: { owner: Account | Group },
481
542
  ) {
482
543
  return new this(options);
@@ -584,4 +645,60 @@ export class BinaryCoStream
584
645
  [inspect]() {
585
646
  return this.toJSON();
586
647
  }
648
+
649
+ /** @category Subscription & Loading */
650
+ static load<B extends BinaryCoStream, Depth>(
651
+ this: CoValueClass<B>,
652
+ id: ID<B>,
653
+ as: Account,
654
+ depth: Depth & DepthsIn<B>,
655
+ ): Promise<DeeplyLoaded<B, Depth> | undefined> {
656
+ return loadCoValue(this, id, as, depth);
657
+ }
658
+
659
+ /** @category Subscription & Loading */
660
+ static loadEf<B extends BinaryCoStream, Depth>(
661
+ this: CoValueClass<B>,
662
+ id: ID<B>,
663
+ depth: Depth & DepthsIn<B>,
664
+ ): Effect.Effect<DeeplyLoaded<B, Depth>, UnavailableError, AccountCtx> {
665
+ return loadCoValueEf<B, Depth>(this, id, depth);
666
+ }
667
+
668
+ /** @category Subscription & Loading */
669
+ static subscribe<B extends BinaryCoStream, Depth>(
670
+ this: CoValueClass<B>,
671
+ id: ID<B>,
672
+ as: Account,
673
+ depth: Depth & DepthsIn<B>,
674
+ listener: (value: DeeplyLoaded<B, Depth>) => void,
675
+ ): () => void {
676
+ return subscribeToCoValue<B, Depth>(this, id, as, depth, listener);
677
+ }
678
+
679
+ /** @category Subscription & Loading */
680
+ static subscribeEf<B extends BinaryCoStream, Depth>(
681
+ this: CoValueClass<B>,
682
+ id: ID<B>,
683
+ depth: Depth & DepthsIn<B>,
684
+ ): Stream.Stream<DeeplyLoaded<B, Depth>, UnavailableError, AccountCtx> {
685
+ return subscribeToCoValueEf<B, Depth>(this, id, depth);
686
+ }
687
+
688
+ /** @category Subscription & Loading */
689
+ ensureLoaded<B extends BinaryCoStream, Depth>(
690
+ this: B,
691
+ depth: Depth & DepthsIn<B>,
692
+ ): Promise<DeeplyLoaded<B, Depth> | undefined> {
693
+ return ensureCoValueLoaded(this, depth);
694
+ }
695
+
696
+ /** @category Subscription & Loading */
697
+ subscribe<B extends BinaryCoStream, Depth>(
698
+ this: B,
699
+ depth: Depth & DepthsIn<B>,
700
+ listener: (value: DeeplyLoaded<B, Depth>) => void,
701
+ ): () => void {
702
+ return subscribeToExistingCoValue(this, depth, listener);
703
+ }
587
704
  }