jazz-tools 0.7.0-alpha.0
Sign up to get free protection for your applications and to get access to all the features.
- package/.eslintrc.cjs +24 -0
- package/.turbo/turbo-build.log +24 -0
- package/CHANGELOG.md +42 -0
- package/LICENSE.txt +19 -0
- package/README.md +3 -0
- package/dist/coValueInterfaces.js +8 -0
- package/dist/coValueInterfaces.js.map +1 -0
- package/dist/coValues/account/account.js +11 -0
- package/dist/coValues/account/account.js.map +1 -0
- package/dist/coValues/account/accountOf.js +150 -0
- package/dist/coValues/account/accountOf.js.map +1 -0
- package/dist/coValues/account/migration.js +4 -0
- package/dist/coValues/account/migration.js.map +1 -0
- package/dist/coValues/coList/coList.js +2 -0
- package/dist/coValues/coList/coList.js.map +1 -0
- package/dist/coValues/coList/coListOf.js +235 -0
- package/dist/coValues/coList/coListOf.js.map +1 -0
- package/dist/coValues/coList/internalDocs.js +2 -0
- package/dist/coValues/coList/internalDocs.js.map +1 -0
- package/dist/coValues/coMap/coMap.js +2 -0
- package/dist/coValues/coMap/coMap.js.map +1 -0
- package/dist/coValues/coMap/coMapOf.js +262 -0
- package/dist/coValues/coMap/coMapOf.js.map +1 -0
- package/dist/coValues/coMap/internalDocs.js +2 -0
- package/dist/coValues/coMap/internalDocs.js.map +1 -0
- package/dist/coValues/coStream/coStream.js +2 -0
- package/dist/coValues/coStream/coStream.js.map +1 -0
- package/dist/coValues/coStream/coStreamOf.js +244 -0
- package/dist/coValues/coStream/coStreamOf.js.map +1 -0
- package/dist/coValues/construction.js +34 -0
- package/dist/coValues/construction.js.map +1 -0
- package/dist/coValues/extensions/imageDef.js +36 -0
- package/dist/coValues/extensions/imageDef.js.map +1 -0
- package/dist/coValues/group/group.js +2 -0
- package/dist/coValues/group/group.js.map +1 -0
- package/dist/coValues/group/groupOf.js +109 -0
- package/dist/coValues/group/groupOf.js.map +1 -0
- package/dist/coValues/resolution.js +66 -0
- package/dist/coValues/resolution.js.map +1 -0
- package/dist/errors.js +2 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/refs.js +95 -0
- package/dist/refs.js.map +1 -0
- package/dist/schemaHelpers.js +14 -0
- package/dist/schemaHelpers.js.map +1 -0
- package/dist/subscriptionScope.js +81 -0
- package/dist/subscriptionScope.js.map +1 -0
- package/dist/tests/coList.test.js +207 -0
- package/dist/tests/coList.test.js.map +1 -0
- package/dist/tests/coMap.test.js +238 -0
- package/dist/tests/coMap.test.js.map +1 -0
- package/dist/tests/coStream.test.js +263 -0
- package/dist/tests/coStream.test.js.map +1 -0
- package/dist/tests/types.test.js +33 -0
- package/dist/tests/types.test.js.map +1 -0
- package/package.json +23 -0
- package/src/coValueInterfaces.ts +105 -0
- package/src/coValues/account/account.ts +106 -0
- package/src/coValues/account/accountOf.ts +284 -0
- package/src/coValues/account/migration.ts +12 -0
- package/src/coValues/coList/coList.ts +57 -0
- package/src/coValues/coList/coListOf.ts +377 -0
- package/src/coValues/coList/internalDocs.ts +1 -0
- package/src/coValues/coMap/coMap.ts +110 -0
- package/src/coValues/coMap/coMapOf.ts +451 -0
- package/src/coValues/coMap/internalDocs.ts +1 -0
- package/src/coValues/coStream/coStream.ts +63 -0
- package/src/coValues/coStream/coStreamOf.ts +404 -0
- package/src/coValues/construction.ts +110 -0
- package/src/coValues/extensions/imageDef.ts +51 -0
- package/src/coValues/group/group.ts +27 -0
- package/src/coValues/group/groupOf.ts +183 -0
- package/src/coValues/resolution.ts +111 -0
- package/src/errors.ts +1 -0
- package/src/index.ts +68 -0
- package/src/refs.ts +128 -0
- package/src/schemaHelpers.ts +72 -0
- package/src/subscriptionScope.ts +118 -0
- package/src/tests/coList.test.ts +283 -0
- package/src/tests/coMap.test.ts +357 -0
- package/src/tests/coStream.test.ts +415 -0
- package/src/tests/types.test.ts +37 -0
- package/tsconfig.json +15 -0
@@ -0,0 +1,109 @@
|
|
1
|
+
import { inspect, isCoValueSchema, } from "../../coValueInterfaces.js";
|
2
|
+
import * as S from "@effect/schema/Schema";
|
3
|
+
import { isControlledAccount, } from "../account/account.js";
|
4
|
+
import { AST, Schema } from "@effect/schema";
|
5
|
+
import { constructorOfSchemaSym } from "../resolution.js";
|
6
|
+
import { pipeArguments } from "effect/Pipeable";
|
7
|
+
import { ValueRef } from "../../refs.js";
|
8
|
+
import { controlledAccountFromNode } from "../account/accountOf.js";
|
9
|
+
import { SharedCoValueConstructor } from "../construction.js";
|
10
|
+
export function GroupOf(fields) {
|
11
|
+
class GroupOfProfileAndRoot extends SharedCoValueConstructor {
|
12
|
+
static get ast() {
|
13
|
+
return AST.setAnnotation(Schema.instanceOf(this).ast, constructorOfSchemaSym, this);
|
14
|
+
}
|
15
|
+
static pipe() {
|
16
|
+
// eslint-disable-next-line prefer-rest-params
|
17
|
+
return pipeArguments(this, arguments);
|
18
|
+
}
|
19
|
+
constructor(init, options) {
|
20
|
+
super();
|
21
|
+
let raw;
|
22
|
+
if (options && "fromRaw" in options) {
|
23
|
+
raw = options.fromRaw;
|
24
|
+
}
|
25
|
+
else {
|
26
|
+
const initOwner = options?.owner || init?.owner;
|
27
|
+
if (!initOwner)
|
28
|
+
throw new Error("No owner provided");
|
29
|
+
if (isControlledAccount(initOwner)) {
|
30
|
+
const rawOwner = initOwner._raw;
|
31
|
+
raw = rawOwner.createGroup();
|
32
|
+
}
|
33
|
+
else {
|
34
|
+
throw new Error("Can only construct group as a controlled account");
|
35
|
+
}
|
36
|
+
}
|
37
|
+
const refs = {
|
38
|
+
get profile() {
|
39
|
+
if (isCoValueSchema(fields.profile)) {
|
40
|
+
const profileID = raw.get("profile");
|
41
|
+
return (profileID &&
|
42
|
+
new ValueRef(profileID, controlledAccountFromNode(raw.core.node), fields.profile));
|
43
|
+
}
|
44
|
+
},
|
45
|
+
get root() {
|
46
|
+
if (isCoValueSchema(fields.root)) {
|
47
|
+
const rootID = raw.get("root");
|
48
|
+
return (rootID &&
|
49
|
+
new ValueRef(rootID, controlledAccountFromNode(raw.core.node), fields.root));
|
50
|
+
}
|
51
|
+
},
|
52
|
+
};
|
53
|
+
Object.defineProperties(this, {
|
54
|
+
id: { value: raw.id, enumerable: false },
|
55
|
+
_type: { value: "Group", enumerable: false },
|
56
|
+
_owner: { value: this, enumerable: false },
|
57
|
+
_refs: { value: refs, enumerable: false },
|
58
|
+
_raw: { value: raw, enumerable: false },
|
59
|
+
_loadedAs: {
|
60
|
+
get: () => controlledAccountFromNode(raw.core.node),
|
61
|
+
enumerable: false,
|
62
|
+
},
|
63
|
+
_schema: { value: GroupOfProfileAndRoot, enumerable: false },
|
64
|
+
});
|
65
|
+
}
|
66
|
+
static fromRaw(raw) {
|
67
|
+
return new GroupOfProfileAndRoot(undefined, {
|
68
|
+
fromRaw: raw,
|
69
|
+
});
|
70
|
+
}
|
71
|
+
get profile() {
|
72
|
+
return this._refs.profile.accessFrom(this);
|
73
|
+
}
|
74
|
+
get root() {
|
75
|
+
return this._refs.root.accessFrom(this);
|
76
|
+
}
|
77
|
+
addMember(member, role) {
|
78
|
+
this._raw.addMember(typeof member === "string" ? member : member._raw, role);
|
79
|
+
return this;
|
80
|
+
}
|
81
|
+
myRole() {
|
82
|
+
return this._raw.myRole();
|
83
|
+
}
|
84
|
+
toJSON() {
|
85
|
+
return {
|
86
|
+
co: {
|
87
|
+
id: this.id,
|
88
|
+
type: this._type,
|
89
|
+
},
|
90
|
+
profile: this.profile?.toJSON(),
|
91
|
+
root: this.root?.toJSON(),
|
92
|
+
};
|
93
|
+
}
|
94
|
+
[(Schema.TypeId, inspect)]() {
|
95
|
+
return this.toJSON();
|
96
|
+
}
|
97
|
+
static as() {
|
98
|
+
return this;
|
99
|
+
}
|
100
|
+
}
|
101
|
+
GroupOfProfileAndRoot.type = "Group";
|
102
|
+
return GroupOfProfileAndRoot;
|
103
|
+
}
|
104
|
+
export class Group extends GroupOf({
|
105
|
+
profile: S.null,
|
106
|
+
root: S.null,
|
107
|
+
}).as() {
|
108
|
+
}
|
109
|
+
//# sourceMappingURL=groupOf.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"groupOf.js","sourceRoot":"","sources":["../../../src/coValues/group/groupOf.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
// TODO: can we get rid of this because effect schema already has an annotation for the constructor?
|
2
|
+
export const constructorOfSchemaSym = Symbol.for("@jazz/constructorOfSymbol");
|
3
|
+
export function propertyIsCoValueSchema(prop) {
|
4
|
+
if ("propertySignatureAST" in prop) {
|
5
|
+
return astIsCoValueSchema(prop.propertySignatureAST.from);
|
6
|
+
}
|
7
|
+
else {
|
8
|
+
return astIsCoValueSchema(prop.ast);
|
9
|
+
}
|
10
|
+
}
|
11
|
+
function astIsCoValueSchema(ast) {
|
12
|
+
if ((ast._tag === "Declaration") &&
|
13
|
+
ast.annotations[constructorOfSchemaSym]) {
|
14
|
+
return true;
|
15
|
+
}
|
16
|
+
else if (ast._tag === "Union") {
|
17
|
+
return ast.types.every((member) => member._tag === "UndefinedKeyword" || astIsCoValueSchema(member));
|
18
|
+
}
|
19
|
+
else if (ast._tag === "BooleanKeyword" ||
|
20
|
+
ast._tag === "NumberKeyword" ||
|
21
|
+
ast._tag === "StringKeyword" ||
|
22
|
+
ast._tag === "Literal" ||
|
23
|
+
ast._tag === "Tuple") {
|
24
|
+
return false;
|
25
|
+
}
|
26
|
+
else if (ast._tag === "Refinement") {
|
27
|
+
return astIsCoValueSchema(ast.from);
|
28
|
+
}
|
29
|
+
else if (ast._tag === "Transform") {
|
30
|
+
return astIsCoValueSchema(ast.from);
|
31
|
+
}
|
32
|
+
else {
|
33
|
+
throw new Error(`astIsCoValueSchema can't yet handle ${ast._tag}: ${JSON.stringify(ast)}`);
|
34
|
+
}
|
35
|
+
}
|
36
|
+
export function getCoValueConstructorInProperty(prop, rawValue) {
|
37
|
+
if ("propertySignatureAST" in prop) {
|
38
|
+
return getCoValueConstructorInAST(prop.propertySignatureAST.from, rawValue);
|
39
|
+
}
|
40
|
+
else {
|
41
|
+
return getCoValueConstructorInAST(prop.ast, rawValue);
|
42
|
+
}
|
43
|
+
}
|
44
|
+
// TODO (optimization): make this meta, so this creates a tailor-made function that will take a RawCoValue at call time
|
45
|
+
function getCoValueConstructorInAST(ast, rawValue) {
|
46
|
+
if ((ast._tag === "Declaration") &&
|
47
|
+
ast.annotations[constructorOfSchemaSym]) {
|
48
|
+
return ast.annotations[constructorOfSchemaSym];
|
49
|
+
}
|
50
|
+
else if (ast._tag === "Union" && ast.types.length === 2) {
|
51
|
+
const [a, b] = ast.types;
|
52
|
+
if (a._tag === "UndefinedKeyword") {
|
53
|
+
return getCoValueConstructorInAST(b, rawValue);
|
54
|
+
}
|
55
|
+
else if (b._tag === "UndefinedKeyword") {
|
56
|
+
return getCoValueConstructorInAST(a, rawValue);
|
57
|
+
}
|
58
|
+
else {
|
59
|
+
throw new Error(`getCoValueConstructorInAST can't yet handle Union of: ${JSON.stringify(ast.types)}`);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
else {
|
63
|
+
throw new Error(`getCoValueConstructorInAST can't yet handle ${ast._tag}: ${JSON.stringify(ast)}`);
|
64
|
+
}
|
65
|
+
}
|
66
|
+
//# sourceMappingURL=resolution.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"resolution.js","sourceRoot":"","sources":["../../src/coValues/resolution.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
import { AccountOf } from "./coValues/account/accountOf.js";
|
2
|
+
import { CoListOf } from "./coValues/coList/coListOf.js";
|
3
|
+
import { CoMapOf } from "./coValues/coMap/coMapOf.js";
|
4
|
+
import { BinaryCoStreamImpl, CoStreamOf, } from "./coValues/coStream/coStreamOf.js";
|
5
|
+
import { ImageDefinition } from "./coValues/extensions/imageDef.js";
|
6
|
+
import { GroupOf } from "./coValues/group/groupOf.js";
|
7
|
+
/** @hidden */
|
8
|
+
export * as S from "@effect/schema/Schema";
|
9
|
+
/** @category Schemas & CoValues - Schema definers */
|
10
|
+
export const Co = {
|
11
|
+
map: CoMapOf,
|
12
|
+
list: CoListOf,
|
13
|
+
stream: CoStreamOf,
|
14
|
+
binaryStream: BinaryCoStreamImpl,
|
15
|
+
account: AccountOf,
|
16
|
+
group: GroupOf,
|
17
|
+
media: {
|
18
|
+
imageDef: ImageDefinition
|
19
|
+
}
|
20
|
+
};
|
21
|
+
/** @category Internal types */
|
22
|
+
export { cojsonReady as jazzReady, cojsonInternals, MAX_RECOMMENDED_TX_SIZE, } from "cojson";
|
23
|
+
/** @category Schemas & CoValues - CoMap */
|
24
|
+
export * as CoMapInternals from "./coValues/coMap/internalDocs.js";
|
25
|
+
/** @category Schemas & CoValues - CoList */
|
26
|
+
export * as CoListInternals from "./coValues/coList/internalDocs.js";
|
27
|
+
export { controlledAccountSym, } from "./coValues/account/account.js";
|
28
|
+
export { Account, BaseProfile } from "./coValues/account/accountOf.js";
|
29
|
+
export { Group } from "./coValues/group/groupOf.js";
|
30
|
+
export { ImageDefinition } from "./coValues/extensions/imageDef.js";
|
31
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACtD,OAAO,EACH,kBAAkB,EAClB,UAAU,GACb,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAEtD,cAAc;AACd,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AAE3C,qDAAqD;AACrD,MAAM,CAAC,MAAM,EAAE,GAAG;IACd,GAAG,EAAE,OAAO;IACZ,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,UAAU;IAClB,YAAY,EAAE,kBAAkB;IAChC,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE;QACH,QAAQ,EAAE,eAAe;KAC5B;CACJ,CAAC;AAEF,+BAA+B;AAC/B,OAAO,EACH,WAAW,IAAI,SAAS,EAMxB,eAAe,EACf,uBAAuB,GAC1B,MAAM,QAAQ,CAAC;AAMhB,2CAA2C;AAC3C,OAAO,KAAK,cAAc,MAAM,kCAAkC,CAAC;AAGnE,4CAA4C;AAC5C,OAAO,KAAK,eAAe,MAAM,mCAAmC,CAAC;AAQrE,OAAO,EAIH,oBAAoB,GACvB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAEvE,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAEpD,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC"}
|
package/dist/refs.js
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
import { Effect } from "effect";
|
2
|
+
import { getCoValueConstructorInProperty } from "./coValues/resolution.js";
|
3
|
+
import { subscriptionsScopes } from "./subscriptionScope.js";
|
4
|
+
export class ValueRef {
|
5
|
+
constructor(id, controlledAccount, propDef) {
|
6
|
+
this.id = id;
|
7
|
+
this.controlledAccount = controlledAccount;
|
8
|
+
this.propDef = propDef;
|
9
|
+
}
|
10
|
+
get value() {
|
11
|
+
if (this.cachedValue)
|
12
|
+
return this.cachedValue;
|
13
|
+
// TODO: cache it for object identity!!!
|
14
|
+
const raw = this.controlledAccount._raw.core.node.getLoaded(this.id);
|
15
|
+
if (raw) {
|
16
|
+
const Constructor = getCoValueConstructorInProperty(this.propDef, raw);
|
17
|
+
if (!Constructor) {
|
18
|
+
throw new Error("Couldn't extract CoValue constructor from property definition");
|
19
|
+
}
|
20
|
+
const value = new Constructor(undefined, { fromRaw: raw });
|
21
|
+
this.cachedValue = value;
|
22
|
+
return value;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
loadEf() {
|
26
|
+
return Effect.async((fulfill) => {
|
27
|
+
this.loadHelper()
|
28
|
+
.then((value) => {
|
29
|
+
if (value === "unavailable") {
|
30
|
+
fulfill(Effect.fail("unavailable"));
|
31
|
+
}
|
32
|
+
else {
|
33
|
+
fulfill(Effect.succeed(value));
|
34
|
+
}
|
35
|
+
})
|
36
|
+
.catch((e) => {
|
37
|
+
fulfill(Effect.die(e));
|
38
|
+
});
|
39
|
+
});
|
40
|
+
}
|
41
|
+
async loadHelper(options) {
|
42
|
+
const raw = await this.controlledAccount._raw.core.node.load(this.id, options?.onProgress);
|
43
|
+
if (raw === "unavailable") {
|
44
|
+
return "unavailable";
|
45
|
+
}
|
46
|
+
else {
|
47
|
+
return new ValueRef(this.id, this.controlledAccount, this.propDef)
|
48
|
+
.value;
|
49
|
+
}
|
50
|
+
}
|
51
|
+
async load(options) {
|
52
|
+
const result = await this.loadHelper(options);
|
53
|
+
if (result === "unavailable") {
|
54
|
+
return undefined;
|
55
|
+
}
|
56
|
+
else {
|
57
|
+
return result;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
accessFrom(fromScopeValue) {
|
61
|
+
const subScope = subscriptionsScopes.get(fromScopeValue);
|
62
|
+
subScope?.onRefAccessedOrSet(this.id);
|
63
|
+
if (this.value && subScope) {
|
64
|
+
subscriptionsScopes.set(this.value, subScope);
|
65
|
+
}
|
66
|
+
return this.value;
|
67
|
+
}
|
68
|
+
}
|
69
|
+
export function makeRefs(getIdForKey, getKeysWithIds, controlledAccount, propDefForKey) {
|
70
|
+
const refs = {};
|
71
|
+
return new Proxy(refs, {
|
72
|
+
get(target, key) {
|
73
|
+
if (key === Symbol.iterator) {
|
74
|
+
return function* () {
|
75
|
+
for (const key of getKeysWithIds()) {
|
76
|
+
yield new ValueRef(getIdForKey(key), controlledAccount, propDefForKey(key));
|
77
|
+
}
|
78
|
+
};
|
79
|
+
}
|
80
|
+
if (typeof key === "symbol")
|
81
|
+
return undefined;
|
82
|
+
if (key === "length") {
|
83
|
+
return getKeysWithIds().length;
|
84
|
+
}
|
85
|
+
const id = getIdForKey(key);
|
86
|
+
if (!id)
|
87
|
+
return undefined;
|
88
|
+
return new ValueRef(id, controlledAccount, propDefForKey(key));
|
89
|
+
},
|
90
|
+
ownKeys() {
|
91
|
+
return getKeysWithIds().map((key) => key.toString());
|
92
|
+
},
|
93
|
+
});
|
94
|
+
}
|
95
|
+
//# sourceMappingURL=refs.js.map
|
package/dist/refs.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"refs.js","sourceRoot":"","sources":["../src/refs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAKhC,OAAO,EAAE,+BAA+B,EAAE,MAAM,0BAA0B,CAAC;AAE3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAE7D,MAAM,OAAO,QAAQ;IAGjB,YACa,EAAS,EACT,iBAAoC,EACpC,OAAqB;QAFrB,OAAE,GAAF,EAAE,CAAO;QACT,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,YAAO,GAAP,OAAO,CAAc;IAC/B,CAAC;IAEJ,IAAI,KAAK;QACL,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC,WAAW,CAAC;QAC9C,wCAAwC;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CACvD,IAAI,CAAC,EAAiC,CACzC,CAAC;QACF,IAAI,GAAG,EAAE,CAAC;YACN,MAAM,WAAW,GAAG,+BAA+B,CAC/C,IAAI,CAAC,OAAO,EACZ,GAAG,CACN,CAAC;YACF,IAAI,CAAC,WAAW,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CACX,+DAA+D,CAClE,CAAC;YACN,CAAC;YACD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAM,CAAC;YAChE,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;YACzB,OAAO,KAAK,CAAC;QACjB,CAAC;IACL,CAAC;IAED,MAAM;QACF,OAAO,MAAM,CAAC,KAAK,CAAsB,CAAC,OAAO,EAAE,EAAE;YACjD,IAAI,CAAC,UAAU,EAAE;iBACZ,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;oBAC1B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAmB,aAAa,CAAC,CAAC,CAAC;gBAC1D,CAAC;qBAAM,CAAC;oBACJ,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACnC,CAAC;YACL,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;gBACT,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,OAA2C;QAChE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CACxD,IAAI,CAAC,EAAiC,EACtC,OAAO,EAAE,UAAU,CACtB,CAAC;QACF,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YACxB,OAAO,aAAa,CAAC;QACzB,CAAC;aAAM,CAAC;YACJ,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC;iBAC7D,KAAM,CAAC;QAChB,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAA2C;QAClD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,aAAa,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACrB,CAAC;aAAM,CAAC;YACJ,OAAO,MAAM,CAAC;QAClB,CAAC;IACL,CAAC;IAED,UAAU,CAAC,cAAuB;QAC9B,MAAM,QAAQ,GAAG,mBAAmB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAEzD,QAAQ,EAAE,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEtC,IAAI,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE,CAAC;YACzB,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAClD,CAAC;QAED,OAAO,IAAI,CAAC,KAAK,CAAC;IACtB,CAAC;CACJ;AAED,MAAM,UAAU,QAAQ,CACpB,WAAkE,EAClE,cAAiC,EACjC,iBAAoC,EACpC,aAA2D;IAE3D,MAAM,IAAI,GAAG,EAAwC,CAAC;IACtD,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE;QACnB,GAAG,CAAC,MAAM,EAAE,GAAG;YACX,IAAI,GAAG,KAAK,MAAM,CAAC,QAAQ,EAAE,CAAC;gBAC1B,OAAO,QAAQ,CAAC;oBACZ,KAAK,MAAM,GAAG,IAAI,cAAc,EAAE,EAAE,CAAC;wBACjC,MAAM,IAAI,QAAQ,CACd,WAAW,CAAC,GAAG,CAAE,EACjB,iBAAiB,EACjB,aAAa,CAAC,GAAG,CAAC,CACrB,CAAC;oBACN,CAAC;gBACL,CAAC,CAAC;YACN,CAAC;YACD,IAAI,OAAO,GAAG,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC;YAC9C,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACnB,OAAO,cAAc,EAAE,CAAC,MAAM,CAAC;YACnC,CAAC;YACD,MAAM,EAAE,GAAG,WAAW,CAAC,GAAc,CAAC,CAAC;YACvC,IAAI,CAAC,EAAE;gBAAE,OAAO,SAAS,CAAC;YAC1B,OAAO,IAAI,QAAQ,CACf,EAAuB,EACvB,iBAAiB,EACjB,aAAa,CAAC,GAAc,CAAC,CAChC,CAAC;QACN,CAAC;QACD,OAAO;YACH,OAAO,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzD,CAAC;KACJ,CAAC,CAAC;AACP,CAAC"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import * as S from "@effect/schema/Schema";
|
2
|
+
export function CoSchema(raw) {
|
3
|
+
return raw;
|
4
|
+
}
|
5
|
+
export function propSigToSchema(propSig) {
|
6
|
+
if ("ast" in propSig) {
|
7
|
+
return propSig;
|
8
|
+
}
|
9
|
+
else {
|
10
|
+
const ast = propSig.propertySignatureAST;
|
11
|
+
return S.make(ast.from);
|
12
|
+
}
|
13
|
+
}
|
14
|
+
//# sourceMappingURL=schemaHelpers.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"schemaHelpers.js","sourceRoot":"","sources":["../src/schemaHelpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,uBAAuB,CAAC;AA4C3C,MAAM,UAAU,QAAQ,CACpB,GAAQ;IAER,OAAO,GAAU,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe,CAG3B,OAAU;IAMV,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QACnB,OAAO,OAAc,CAAC;IAC1B,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,GACL,OAGH,CAAC,oBAAoB,CAAC;QACvB,OAAO,CAAC,CAAC,IAAI,CAAsB,GAAG,CAAC,IAAI,CAAQ,CAAC;IACxD,CAAC;AACL,CAAC"}
|
@@ -0,0 +1,81 @@
|
|
1
|
+
export const subscriptionsScopes = new WeakMap();
|
2
|
+
export class SubscriptionScope {
|
3
|
+
constructor(root, rootSchema, onUpdate) {
|
4
|
+
this.scopeID = `scope-${Math.random().toString(36).slice(2)}`;
|
5
|
+
this.entries = new Map();
|
6
|
+
this.scheduledUpdate = false;
|
7
|
+
this.rootEntry = {
|
8
|
+
state: "loaded",
|
9
|
+
value: root,
|
10
|
+
rawUnsub: () => { }, // placeholder
|
11
|
+
};
|
12
|
+
this.entries.set(root.id, this.rootEntry);
|
13
|
+
subscriptionsScopes.set(root, this);
|
14
|
+
this.subscriber = root._loadedAs;
|
15
|
+
this.onUpdate = onUpdate;
|
16
|
+
this.rootEntry.rawUnsub = root._raw.core.subscribe((rawUpdate) => {
|
17
|
+
if (!rawUpdate)
|
18
|
+
return;
|
19
|
+
this.rootEntry.value = rootSchema.fromRaw(rawUpdate);
|
20
|
+
// console.log("root update", this.rootEntry.value.toJSON());
|
21
|
+
subscriptionsScopes.set(this.rootEntry.value, this);
|
22
|
+
this.scheduleUpdate();
|
23
|
+
});
|
24
|
+
}
|
25
|
+
scheduleUpdate() {
|
26
|
+
if (!this.scheduledUpdate) {
|
27
|
+
this.scheduledUpdate = true;
|
28
|
+
queueMicrotask(() => {
|
29
|
+
this.scheduledUpdate = false;
|
30
|
+
this.onUpdate(this.rootEntry.value);
|
31
|
+
});
|
32
|
+
}
|
33
|
+
}
|
34
|
+
onRefAccessedOrSet(accessedOrSetId) {
|
35
|
+
// console.log("onRefAccessedOrSet", this.scopeID, accessedOrSetId);
|
36
|
+
if (!accessedOrSetId) {
|
37
|
+
return;
|
38
|
+
}
|
39
|
+
if (!this.entries.has(accessedOrSetId)) {
|
40
|
+
const loadingEntry = {
|
41
|
+
state: "loading",
|
42
|
+
immediatelyUnsub: false,
|
43
|
+
};
|
44
|
+
this.entries.set(accessedOrSetId, loadingEntry);
|
45
|
+
this.subscriber._raw.core.node
|
46
|
+
.loadCoValueCore(accessedOrSetId)
|
47
|
+
.then((core) => {
|
48
|
+
if (loadingEntry.state === "loading" &&
|
49
|
+
loadingEntry.immediatelyUnsub) {
|
50
|
+
return;
|
51
|
+
}
|
52
|
+
if (core !== "unavailable") {
|
53
|
+
const entry = {
|
54
|
+
state: "loaded",
|
55
|
+
rawUnsub: () => { }, // placeholder
|
56
|
+
};
|
57
|
+
this.entries.set(accessedOrSetId, entry);
|
58
|
+
const rawUnsub = core.subscribe((rawUpdate) => {
|
59
|
+
// console.log("ref update", this.scopeID, accessedOrSetId, JSON.stringify(rawUpdate))
|
60
|
+
if (!rawUpdate)
|
61
|
+
return;
|
62
|
+
this.scheduleUpdate();
|
63
|
+
});
|
64
|
+
entry.rawUnsub = rawUnsub;
|
65
|
+
}
|
66
|
+
});
|
67
|
+
}
|
68
|
+
}
|
69
|
+
unsubscribeAll() {
|
70
|
+
for (const entry of this.entries.values()) {
|
71
|
+
if (entry.state === "loaded") {
|
72
|
+
entry.rawUnsub();
|
73
|
+
}
|
74
|
+
else {
|
75
|
+
entry.immediatelyUnsub = true;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
this.entries.clear();
|
79
|
+
}
|
80
|
+
}
|
81
|
+
//# sourceMappingURL=subscriptionScope.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"subscriptionScope.js","sourceRoot":"","sources":["../src/subscriptionScope.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,207 @@
|
|
1
|
+
import { expect, describe, test, beforeEach } from "vitest";
|
2
|
+
import { webcrypto } from "node:crypto";
|
3
|
+
import { connectedPeers } from "cojson/src/streamUtils.js";
|
4
|
+
import { newRandomSessionID } from "cojson/src/coValueCore.js";
|
5
|
+
import { Effect, Queue } from "effect";
|
6
|
+
import { Co, S, Account, jazzReady } from "..";
|
7
|
+
if (!("crypto" in globalThis)) {
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
9
|
+
globalThis.crypto = webcrypto;
|
10
|
+
}
|
11
|
+
beforeEach(async () => {
|
12
|
+
await jazzReady;
|
13
|
+
});
|
14
|
+
describe("Simple CoList operations", async () => {
|
15
|
+
const me = await Account.create({
|
16
|
+
name: "Hermes Puggington",
|
17
|
+
});
|
18
|
+
class TestList extends Co.list(S.string).as() {
|
19
|
+
}
|
20
|
+
const list = new TestList(["bread", "butter", "onion"], { owner: me });
|
21
|
+
test("Construction", () => {
|
22
|
+
expect(list[0]).toBe("bread");
|
23
|
+
expect(list[1]).toBe("butter");
|
24
|
+
expect(list[2]).toBe("onion");
|
25
|
+
expect(list._raw.asArray()).toEqual(["bread", "butter", "onion"]);
|
26
|
+
expect(list.length).toBe(3);
|
27
|
+
expect(list.map((item) => item.toUpperCase())).toEqual([
|
28
|
+
"BREAD",
|
29
|
+
"BUTTER",
|
30
|
+
"ONION",
|
31
|
+
]);
|
32
|
+
});
|
33
|
+
describe("Mutation", () => {
|
34
|
+
test("assignment", () => {
|
35
|
+
const list = new TestList(["bread", "butter", "onion"], {
|
36
|
+
owner: me,
|
37
|
+
});
|
38
|
+
list[1] = "margarine";
|
39
|
+
expect(list._raw.asArray()).toEqual([
|
40
|
+
"bread",
|
41
|
+
"margarine",
|
42
|
+
"onion",
|
43
|
+
]);
|
44
|
+
expect(list[1]).toBe("margarine");
|
45
|
+
});
|
46
|
+
test("push", () => {
|
47
|
+
const list = new TestList(["bread", "butter", "onion"], {
|
48
|
+
owner: me,
|
49
|
+
});
|
50
|
+
list.push("cheese");
|
51
|
+
expect(list[3]).toBe("cheese");
|
52
|
+
expect(list._raw.asArray()).toEqual([
|
53
|
+
"bread",
|
54
|
+
"butter",
|
55
|
+
"onion",
|
56
|
+
"cheese",
|
57
|
+
]);
|
58
|
+
});
|
59
|
+
test("unshift", () => {
|
60
|
+
const list = new TestList(["bread", "butter", "onion"], {
|
61
|
+
owner: me,
|
62
|
+
});
|
63
|
+
list.unshift("lettuce");
|
64
|
+
expect(list[0]).toBe("lettuce");
|
65
|
+
expect(list._raw.asArray()).toEqual([
|
66
|
+
"lettuce",
|
67
|
+
"bread",
|
68
|
+
"butter",
|
69
|
+
"onion",
|
70
|
+
]);
|
71
|
+
});
|
72
|
+
test("pop", () => {
|
73
|
+
const list = new TestList(["bread", "butter", "onion"], {
|
74
|
+
owner: me,
|
75
|
+
});
|
76
|
+
expect(list.pop()).toBe("onion");
|
77
|
+
expect(list.length).toBe(2);
|
78
|
+
expect(list._raw.asArray()).toEqual(["bread", "butter"]);
|
79
|
+
});
|
80
|
+
test("shift", () => {
|
81
|
+
const list = new TestList(["bread", "butter", "onion"], {
|
82
|
+
owner: me,
|
83
|
+
});
|
84
|
+
expect(list.shift()).toBe("bread");
|
85
|
+
expect(list.length).toBe(2);
|
86
|
+
expect(list._raw.asArray()).toEqual(["butter", "onion"]);
|
87
|
+
});
|
88
|
+
test("splice", () => {
|
89
|
+
const list = new TestList(["bread", "butter", "onion"], {
|
90
|
+
owner: me,
|
91
|
+
});
|
92
|
+
list.splice(1, 1, "salt", "pepper");
|
93
|
+
expect(list.length).toBe(4);
|
94
|
+
expect(list._raw.asArray()).toEqual([
|
95
|
+
"bread",
|
96
|
+
"salt",
|
97
|
+
"pepper",
|
98
|
+
"onion",
|
99
|
+
]);
|
100
|
+
});
|
101
|
+
});
|
102
|
+
});
|
103
|
+
describe("CoList resolution", async () => {
|
104
|
+
class TwiceNestedList extends Co.list(S.string).as() {
|
105
|
+
joined() {
|
106
|
+
return this.join(",");
|
107
|
+
}
|
108
|
+
}
|
109
|
+
class NestedList extends Co.list(TwiceNestedList).as() {
|
110
|
+
}
|
111
|
+
class TestList extends Co.list(NestedList).as() {
|
112
|
+
}
|
113
|
+
const initNodeAndList = async () => {
|
114
|
+
const me = await Account.create({
|
115
|
+
name: "Hermes Puggington",
|
116
|
+
});
|
117
|
+
const list = new TestList([
|
118
|
+
new NestedList([new TwiceNestedList(["a", "b"], { owner: me })], { owner: me }),
|
119
|
+
new NestedList([new TwiceNestedList(["c", "d"], { owner: me })], { owner: me }),
|
120
|
+
], { owner: me });
|
121
|
+
return { me, list };
|
122
|
+
};
|
123
|
+
test("Construction", async () => {
|
124
|
+
const { list } = await initNodeAndList();
|
125
|
+
expect(list[0]?.[0]?.[0]).toBe("a");
|
126
|
+
expect(list[0]?.[0]?.joined()).toBe("a,b");
|
127
|
+
expect(list[0]?.[0]?.id).toBeDefined();
|
128
|
+
expect(list[1]?.[0]?.[0]).toBe("c");
|
129
|
+
});
|
130
|
+
test("Loading and availability", async () => {
|
131
|
+
const { me, list } = await initNodeAndList();
|
132
|
+
const [initialAsPeer, secondPeer] = connectedPeers("initial", "second", { peer1role: "server", peer2role: "client" });
|
133
|
+
me._raw.core.node.syncManager.addPeer(secondPeer);
|
134
|
+
const meOnSecondPeer = await Account.become({
|
135
|
+
accountID: me.id,
|
136
|
+
accountSecret: me._raw.agentSecret,
|
137
|
+
peersToLoadFrom: [initialAsPeer],
|
138
|
+
sessionID: newRandomSessionID(me.id),
|
139
|
+
});
|
140
|
+
const loadedList = await TestList.load(list.id, { as: meOnSecondPeer });
|
141
|
+
expect(loadedList?.[0]).toBe(undefined);
|
142
|
+
expect(loadedList?._refs[0]?.id).toEqual(list[0].id);
|
143
|
+
const loadedNestedList = await NestedList.load(list[0].id, {
|
144
|
+
as: meOnSecondPeer,
|
145
|
+
});
|
146
|
+
expect(loadedList?.[0]).toBeDefined();
|
147
|
+
expect(loadedList?.[0]?.[0]).toBeUndefined();
|
148
|
+
expect(loadedList?.[0]?._refs[0]?.id).toEqual(list[0][0].id);
|
149
|
+
expect(loadedList?._refs[0]?.value).toEqual(loadedNestedList);
|
150
|
+
const loadedTwiceNestedList = await TwiceNestedList.load(list[0][0].id, { as: meOnSecondPeer });
|
151
|
+
expect(loadedList?.[0]?.[0]).toBeDefined();
|
152
|
+
expect(loadedList?.[0]?.[0]?.[0]).toBe("a");
|
153
|
+
expect(loadedList?.[0]?.[0]?.joined()).toBe("a,b");
|
154
|
+
expect(loadedList?.[0]?._refs[0]?.id).toEqual(list[0]?.[0]?.id);
|
155
|
+
expect(loadedList?.[0]?._refs[0]?.value).toEqual(loadedTwiceNestedList);
|
156
|
+
const otherNestedList = new NestedList([new TwiceNestedList(["e", "f"], { owner: meOnSecondPeer })], { owner: meOnSecondPeer });
|
157
|
+
loadedList[0] = otherNestedList;
|
158
|
+
expect(loadedList?.[0]).toEqual(otherNestedList);
|
159
|
+
expect(loadedList?._refs[0]?.id).toEqual(otherNestedList.id);
|
160
|
+
});
|
161
|
+
test("Subscription & auto-resolution", async () => {
|
162
|
+
const { me, list } = await initNodeAndList();
|
163
|
+
const [initialAsPeer, secondPeer] = connectedPeers("initial", "second", { peer1role: "server", peer2role: "client" });
|
164
|
+
me._raw.core.node.syncManager.addPeer(secondPeer);
|
165
|
+
const meOnSecondPeer = await Account.become({
|
166
|
+
accountID: me.id,
|
167
|
+
accountSecret: me._raw.agentSecret,
|
168
|
+
peersToLoadFrom: [initialAsPeer],
|
169
|
+
sessionID: newRandomSessionID(me.id),
|
170
|
+
});
|
171
|
+
await Effect.runPromise(Effect.gen(function* ($) {
|
172
|
+
const queue = yield* $(Queue.unbounded());
|
173
|
+
TestList.subscribe(list.id, { as: meOnSecondPeer }, (subscribedList) => {
|
174
|
+
console.log("subscribedList?.[0]?.[0]?.[0]", subscribedList?.[0]?.[0]?.[0]);
|
175
|
+
Effect.runPromise(Queue.offer(queue, subscribedList));
|
176
|
+
});
|
177
|
+
const update1 = yield* $(Queue.take(queue));
|
178
|
+
expect(update1?.[0]).toEqual(undefined);
|
179
|
+
const update2 = yield* $(Queue.take(queue));
|
180
|
+
expect(update2?.[0]).toBeDefined();
|
181
|
+
expect(update2?.[0]?.[0]).toBeUndefined();
|
182
|
+
const update3 = yield* $(Queue.take(queue));
|
183
|
+
expect(update3?.[0]?.[0]).toBeDefined();
|
184
|
+
expect(update3?.[0]?.[0]?.[0]).toBe("a");
|
185
|
+
expect(update3?.[0]?.[0]?.joined()).toBe("a,b");
|
186
|
+
update3[0][0][0] = "x";
|
187
|
+
const update4 = yield* $(Queue.take(queue));
|
188
|
+
expect(update4?.[0]?.[0]?.[0]).toBe("x");
|
189
|
+
// When assigning a new nested value, we get an update
|
190
|
+
const newTwiceNestedList = new TwiceNestedList(["y", "z"], {
|
191
|
+
owner: meOnSecondPeer,
|
192
|
+
});
|
193
|
+
const newNestedList = new NestedList([newTwiceNestedList], {
|
194
|
+
owner: meOnSecondPeer,
|
195
|
+
});
|
196
|
+
update4[0] = newNestedList;
|
197
|
+
const update5 = yield* $(Queue.take(queue));
|
198
|
+
expect(update5?.[0]?.[0]?.[0]).toBe("y");
|
199
|
+
expect(update5?.[0]?.[0]?.joined()).toBe("y,z");
|
200
|
+
// we get updates when the new nested value changes
|
201
|
+
newTwiceNestedList[0] = "w";
|
202
|
+
const update6 = yield* $(Queue.take(queue));
|
203
|
+
expect(update6?.[0]?.[0]?.[0]).toBe("w");
|
204
|
+
}));
|
205
|
+
});
|
206
|
+
});
|
207
|
+
//# sourceMappingURL=coList.test.js.map
|