cojson 0.3.7 → 0.4.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/dist/coValue.d.ts +7 -12
- package/dist/coValue.js.map +1 -1
- package/dist/coValueCore.d.ts +9 -4
- package/dist/coValueCore.js +69 -33
- package/dist/coValueCore.js.map +1 -1
- package/dist/coValues/account.d.ts +62 -0
- package/dist/{account.js → coValues/account.js} +19 -11
- package/dist/coValues/account.js.map +1 -0
- package/dist/coValues/coList.d.ts +19 -19
- package/dist/coValues/coList.js.map +1 -1
- package/dist/coValues/coMap.d.ts +31 -23
- package/dist/coValues/coMap.js +4 -6
- package/dist/coValues/coMap.js.map +1 -1
- package/dist/coValues/coStream.d.ts +20 -20
- package/dist/coValues/coStream.js +2 -1
- package/dist/coValues/coStream.js.map +1 -1
- package/dist/{group.d.ts → coValues/group.d.ts} +27 -38
- package/dist/{group.js → coValues/group.js} +69 -73
- package/dist/coValues/group.js.map +1 -0
- package/dist/ids.d.ts +1 -1
- package/dist/index.d.ts +15 -11
- package/dist/index.js +10 -5
- package/dist/index.js.map +1 -1
- package/dist/localNode.d.ts +20 -7
- package/dist/localNode.js +74 -39
- package/dist/localNode.js.map +1 -1
- package/dist/media.d.ts +1 -1
- package/dist/permissions.d.ts +1 -1
- package/dist/permissions.js +43 -22
- package/dist/permissions.js.map +1 -1
- package/dist/queriedCoValues/queriedAccount.d.ts +13 -0
- package/dist/queriedCoValues/queriedAccount.js +24 -0
- package/dist/queriedCoValues/queriedAccount.js.map +1 -0
- package/dist/queriedCoValues/queriedCoList.d.ts +10 -10
- package/dist/queriedCoValues/queriedCoList.js +11 -15
- package/dist/queriedCoValues/queriedCoList.js.map +1 -1
- package/dist/queriedCoValues/queriedCoMap.d.ts +14 -21
- package/dist/queriedCoValues/queriedCoMap.js +27 -28
- package/dist/queriedCoValues/queriedCoMap.js.map +1 -1
- package/dist/queriedCoValues/queriedCoStream.d.ts +13 -17
- package/dist/queriedCoValues/queriedCoStream.js +57 -32
- package/dist/queriedCoValues/queriedCoStream.js.map +1 -1
- package/dist/queriedCoValues/queriedGroup.d.ts +29 -0
- package/dist/queriedCoValues/queriedGroup.js +54 -0
- package/dist/queriedCoValues/queriedGroup.js.map +1 -0
- package/dist/queries.d.ts +40 -9
- package/dist/queries.js +104 -39
- package/dist/queries.js.map +1 -1
- package/dist/tests/testUtils.d.ts +15 -7
- package/dist/tests/testUtils.js +16 -17
- package/dist/tests/testUtils.js.map +1 -1
- package/package.json +2 -2
- package/src/coValue.ts +12 -31
- package/src/coValueCore.ts +100 -40
- package/src/{account.ts → coValues/account.ts} +46 -27
- package/src/coValues/coList.ts +24 -28
- package/src/coValues/coMap.ts +42 -68
- package/src/coValues/coStream.ts +22 -28
- package/src/{group.ts → coValues/group.ts} +121 -141
- package/src/ids.ts +1 -1
- package/src/index.ts +25 -10
- package/src/localNode.ts +180 -77
- package/src/media.ts +1 -1
- package/src/permissions.ts +67 -36
- package/src/queriedCoValues/queriedAccount.ts +40 -0
- package/src/queriedCoValues/queriedCoList.ts +22 -30
- package/src/queriedCoValues/queriedCoMap.ts +60 -72
- package/src/queriedCoValues/queriedCoStream.ts +105 -79
- package/src/queriedCoValues/queriedGroup.ts +90 -0
- package/src/queries.ts +181 -60
- package/src/tests/account.test.ts +14 -9
- package/src/tests/coValueCore.test.ts +2 -2
- package/src/tests/permissions.test.ts +351 -242
- package/src/tests/queries.test.ts +162 -82
- package/src/tests/sync.test.ts +11 -11
- package/src/tests/testUtils.ts +16 -18
- package/dist/account.d.ts +0 -58
- package/dist/account.js.map +0 -1
- package/dist/group.js.map +0 -1
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
import { CoList, MutableCoList } from "../coValues/coList.js";
|
|
2
2
|
import { CoValueCore } from "../coValueCore.js";
|
|
3
|
-
import { Group } from "../group.js";
|
|
4
|
-
import {
|
|
5
|
-
import { AnyCoList, CoID, CoValue } from "../coValue.js";
|
|
3
|
+
import { Group } from "../coValues/group.js";
|
|
4
|
+
import { CoID, CoValue } from "../coValue.js";
|
|
6
5
|
import { TransactionID } from "../ids.js";
|
|
7
|
-
import { QueriedAccountAndProfile } from "./queriedCoMap.js";
|
|
8
6
|
import { ValueOrSubQueried, QueryContext } from "../queries.js";
|
|
7
|
+
import { QueriedAccount } from "./queriedAccount.js";
|
|
9
8
|
|
|
10
|
-
export class QueriedCoList<L extends
|
|
9
|
+
export class QueriedCoList<L extends CoList> extends Array<
|
|
11
10
|
ValueOrSubQueried<L["_item"]>
|
|
12
11
|
> {
|
|
13
12
|
coList!: L;
|
|
@@ -27,40 +26,37 @@ export class QueriedCoList<L extends AnyCoList> extends Array<
|
|
|
27
26
|
.asArray()
|
|
28
27
|
.map(
|
|
29
28
|
(item) =>
|
|
30
|
-
queryContext.
|
|
29
|
+
queryContext.queryIfCoID(item, [coList.id]) as ValueOrSubQueried<
|
|
31
30
|
L["_item"]
|
|
32
31
|
>
|
|
33
32
|
)
|
|
34
33
|
);
|
|
35
34
|
|
|
36
35
|
Object.defineProperties(this, {
|
|
37
|
-
coList: {
|
|
36
|
+
coList: { get() {return coList} },
|
|
38
37
|
id: { value: coList.id },
|
|
39
38
|
type: { value: "colist" },
|
|
40
39
|
edits: {
|
|
41
40
|
value: [...this.keys()].map((i) => {
|
|
42
41
|
const edit = coList.editAt(i)!;
|
|
43
|
-
return {
|
|
44
|
-
|
|
45
|
-
edit.by && isAccountID(edit.by)
|
|
46
|
-
? queryContext.resolveAccount(edit.by)
|
|
47
|
-
: undefined,
|
|
42
|
+
return queryContext.defineSubqueryPropertiesIn({
|
|
43
|
+
|
|
48
44
|
tx: edit.tx,
|
|
49
45
|
at: new Date(edit.at),
|
|
50
|
-
|
|
51
|
-
value:
|
|
52
|
-
|
|
46
|
+
}, {
|
|
47
|
+
by: {value: edit.by, enumerable: true},
|
|
48
|
+
value: {value: edit.value, enumerable: true},
|
|
49
|
+
}, [coList.id]);
|
|
53
50
|
}),
|
|
54
51
|
},
|
|
55
52
|
deletions: {
|
|
56
|
-
value: coList.deletionEdits().map((deletion) => ({
|
|
57
|
-
|
|
58
|
-
deletion.by && isAccountID(deletion.by)
|
|
59
|
-
? queryContext.resolveAccount(deletion.by)
|
|
60
|
-
: undefined,
|
|
53
|
+
value: coList.deletionEdits().map((deletion) => queryContext.defineSubqueryPropertiesIn({
|
|
54
|
+
|
|
61
55
|
tx: deletion.tx,
|
|
62
56
|
at: new Date(deletion.at),
|
|
63
|
-
}
|
|
57
|
+
}, {
|
|
58
|
+
by: {value: deletion.by, enumerable: true},
|
|
59
|
+
}, [coList.id])),
|
|
64
60
|
},
|
|
65
61
|
});
|
|
66
62
|
}
|
|
@@ -78,9 +74,7 @@ export class QueriedCoList<L extends AnyCoList> extends Array<
|
|
|
78
74
|
}
|
|
79
75
|
|
|
80
76
|
append(
|
|
81
|
-
item: L["_item"]
|
|
82
|
-
? L["_item"] | CoID<L["_item"]>
|
|
83
|
-
: L["_item"],
|
|
77
|
+
item: L["_item"],
|
|
84
78
|
after?: number,
|
|
85
79
|
privacy?: "private" | "trusting"
|
|
86
80
|
): L {
|
|
@@ -88,16 +82,14 @@ export class QueriedCoList<L extends AnyCoList> extends Array<
|
|
|
88
82
|
}
|
|
89
83
|
|
|
90
84
|
prepend(
|
|
91
|
-
item: L["_item"]
|
|
92
|
-
? L["_item"] | CoID<L["_item"]>
|
|
93
|
-
: L["_item"],
|
|
85
|
+
item: L["_item"],
|
|
94
86
|
before?: number,
|
|
95
87
|
privacy?: "private" | "trusting"
|
|
96
88
|
): L {
|
|
97
89
|
return this.coList.prepend(item, before, privacy);
|
|
98
90
|
}
|
|
99
91
|
|
|
100
|
-
delete(at: number, privacy
|
|
92
|
+
delete(at: number, privacy?: "private" | "trusting"): L {
|
|
101
93
|
return this.coList.delete(at, privacy);
|
|
102
94
|
}
|
|
103
95
|
|
|
@@ -108,7 +100,7 @@ export class QueriedCoList<L extends AnyCoList> extends Array<
|
|
|
108
100
|
}
|
|
109
101
|
|
|
110
102
|
edits!: {
|
|
111
|
-
by?:
|
|
103
|
+
by?: QueriedAccount;
|
|
112
104
|
tx: TransactionID;
|
|
113
105
|
at: Date;
|
|
114
106
|
value: L["_item"] extends CoValue
|
|
@@ -117,7 +109,7 @@ export class QueriedCoList<L extends AnyCoList> extends Array<
|
|
|
117
109
|
}[];
|
|
118
110
|
|
|
119
111
|
deletions!: {
|
|
120
|
-
by?:
|
|
112
|
+
by?: QueriedAccount;
|
|
121
113
|
tx: TransactionID;
|
|
122
114
|
at: Date;
|
|
123
115
|
}[];
|
|
@@ -1,34 +1,29 @@
|
|
|
1
|
-
import { MutableCoMap } from "../coValues/coMap.js";
|
|
1
|
+
import { CoMap, MutableCoMap } from "../coValues/coMap.js";
|
|
2
2
|
import { CoValueCore } from "../coValueCore.js";
|
|
3
|
-
import { Group } from "../group.js";
|
|
4
|
-
import {
|
|
5
|
-
import { AnyCoMap, CoID, CoValue } from "../coValue.js";
|
|
3
|
+
import { Group } from "../coValues/group.js";
|
|
4
|
+
import { CoID } from "../coValue.js";
|
|
6
5
|
import { TransactionID } from "../ids.js";
|
|
7
|
-
import { ValueOrSubQueried, QueryContext } from "../queries.js";
|
|
6
|
+
import { ValueOrSubQueried, QueryContext, QueryExtension } from "../queries.js";
|
|
7
|
+
import { QueriedAccount } from "./queriedAccount.js";
|
|
8
8
|
|
|
9
|
-
export type QueriedCoMap<M extends
|
|
9
|
+
export type QueriedCoMap<M extends CoMap> = {
|
|
10
10
|
[K in keyof M["_shape"] & string]: ValueOrSubQueried<M["_shape"][K]>;
|
|
11
11
|
} & QueriedCoMapBase<M>;
|
|
12
12
|
|
|
13
|
-
export type QueriedCoMapEdit<
|
|
14
|
-
|
|
15
|
-
K extends keyof M["_shape"]
|
|
16
|
-
> = {
|
|
17
|
-
by?: QueriedAccountAndProfile;
|
|
13
|
+
export type QueriedCoMapEdit<M extends CoMap, K extends keyof M["_shape"]> = {
|
|
14
|
+
by?: QueriedAccount;
|
|
18
15
|
tx: TransactionID;
|
|
19
16
|
at: Date;
|
|
20
|
-
value: M["_shape"][K]
|
|
21
|
-
? CoID<M["_shape"][K]>
|
|
22
|
-
: Exclude<M["_shape"][K], CoValue>;
|
|
17
|
+
value: M["_shape"][K];
|
|
23
18
|
};
|
|
24
19
|
|
|
25
|
-
export class QueriedCoMapBase<M extends
|
|
20
|
+
export class QueriedCoMapBase<M extends CoMap> {
|
|
26
21
|
coMap!: M;
|
|
27
22
|
id!: CoID<M>;
|
|
28
23
|
type!: "comap";
|
|
29
24
|
|
|
30
25
|
/** @internal */
|
|
31
|
-
static newWithKVPairs<M extends
|
|
26
|
+
static newWithKVPairs<M extends CoMap>(
|
|
32
27
|
coMap: M,
|
|
33
28
|
queryContext: QueryContext
|
|
34
29
|
): QueriedCoMap<M> {
|
|
@@ -37,27 +32,18 @@ export class QueriedCoMapBase<M extends AnyCoMap> {
|
|
|
37
32
|
M["_shape"][K]
|
|
38
33
|
>;
|
|
39
34
|
};
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const value = coMap.get(key);
|
|
53
|
-
|
|
54
|
-
if (value === undefined) continue;
|
|
55
|
-
|
|
56
|
-
kv[key as keyof typeof kv] = queryContext.resolveValue(
|
|
57
|
-
value
|
|
58
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
59
|
-
) as any;
|
|
60
|
-
}
|
|
35
|
+
for (const key of coMap.keys()) {
|
|
36
|
+
const value = coMap.get(key);
|
|
37
|
+
|
|
38
|
+
if (value === undefined) continue;
|
|
39
|
+
|
|
40
|
+
queryContext.defineSubqueryPropertiesIn(
|
|
41
|
+
kv,
|
|
42
|
+
{
|
|
43
|
+
[key]: { value, enumerable: true },
|
|
44
|
+
},
|
|
45
|
+
[coMap.id]
|
|
46
|
+
);
|
|
61
47
|
}
|
|
62
48
|
|
|
63
49
|
return Object.assign(new QueriedCoMapBase(coMap, queryContext), kv);
|
|
@@ -66,23 +52,33 @@ export class QueriedCoMapBase<M extends AnyCoMap> {
|
|
|
66
52
|
/** @internal */
|
|
67
53
|
constructor(coMap: M, queryContext: QueryContext) {
|
|
68
54
|
Object.defineProperties(this, {
|
|
69
|
-
coMap: {
|
|
55
|
+
coMap: {
|
|
56
|
+
get() {
|
|
57
|
+
return coMap;
|
|
58
|
+
},
|
|
59
|
+
enumerable: false,
|
|
60
|
+
},
|
|
70
61
|
id: { value: coMap.id, enumerable: false },
|
|
71
62
|
type: { value: "comap", enumerable: false },
|
|
72
63
|
edits: {
|
|
73
64
|
value: Object.fromEntries(
|
|
74
65
|
coMap.keys().flatMap((key) => {
|
|
75
|
-
const edits = [...coMap.editsAt(key)].map((edit) =>
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
:
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
66
|
+
const edits = [...coMap.editsAt(key)].map((edit) =>
|
|
67
|
+
queryContext.defineSubqueryPropertiesIn(
|
|
68
|
+
{
|
|
69
|
+
tx: edit.tx,
|
|
70
|
+
at: new Date(edit.at),
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
by: { value: edit.by, enumerable: true },
|
|
74
|
+
value: {
|
|
75
|
+
value: edit.value,
|
|
76
|
+
enumerable: true,
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
[coMap.id]
|
|
80
|
+
)
|
|
81
|
+
);
|
|
86
82
|
const lastEdit = edits[edits.length - 1];
|
|
87
83
|
if (!lastEdit) return [];
|
|
88
84
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -100,6 +96,15 @@ export class QueriedCoMapBase<M extends AnyCoMap> {
|
|
|
100
96
|
),
|
|
101
97
|
enumerable: false,
|
|
102
98
|
},
|
|
99
|
+
as: {
|
|
100
|
+
value: <O>(extension: QueryExtension<M, O>) => {
|
|
101
|
+
return queryContext.getOrCreateExtension(
|
|
102
|
+
coMap.id,
|
|
103
|
+
extension
|
|
104
|
+
);
|
|
105
|
+
},
|
|
106
|
+
enumerable: false,
|
|
107
|
+
},
|
|
103
108
|
});
|
|
104
109
|
}
|
|
105
110
|
|
|
@@ -125,16 +130,12 @@ export class QueriedCoMapBase<M extends AnyCoMap> {
|
|
|
125
130
|
|
|
126
131
|
set<K extends keyof M["_shape"] & string>(
|
|
127
132
|
key: K,
|
|
128
|
-
value: M["_shape"][K]
|
|
129
|
-
? M["_shape"][K] | CoID<M["_shape"][K]>
|
|
130
|
-
: M["_shape"][K],
|
|
133
|
+
value: M["_shape"][K],
|
|
131
134
|
privacy?: "private" | "trusting"
|
|
132
135
|
): M;
|
|
133
136
|
set(
|
|
134
137
|
kv: {
|
|
135
|
-
[K in keyof M["_shape"] & string]?: M["_shape"][K]
|
|
136
|
-
? M["_shape"][K] | CoID<M["_shape"][K]>
|
|
137
|
-
: M["_shape"][K];
|
|
138
|
+
[K in keyof M["_shape"] & string]?: M["_shape"][K];
|
|
138
139
|
},
|
|
139
140
|
privacy?: "private" | "trusting"
|
|
140
141
|
): M;
|
|
@@ -142,20 +143,11 @@ export class QueriedCoMapBase<M extends AnyCoMap> {
|
|
|
142
143
|
...args:
|
|
143
144
|
| [
|
|
144
145
|
{
|
|
145
|
-
[K in keyof M["_shape"] &
|
|
146
|
-
string]?: M["_shape"][K] extends CoValue
|
|
147
|
-
? M["_shape"][K] | CoID<M["_shape"][K]>
|
|
148
|
-
: M["_shape"][K];
|
|
146
|
+
[K in keyof M["_shape"] & string]?: M["_shape"][K];
|
|
149
147
|
},
|
|
150
148
|
("private" | "trusting")?
|
|
151
149
|
]
|
|
152
|
-
| [
|
|
153
|
-
K,
|
|
154
|
-
M["_shape"][K] extends CoValue
|
|
155
|
-
? M["_shape"][K] | CoID<M["_shape"][K]>
|
|
156
|
-
: M["_shape"][K],
|
|
157
|
-
("private" | "trusting")?
|
|
158
|
-
]
|
|
150
|
+
| [K, M["_shape"][K], ("private" | "trusting")?]
|
|
159
151
|
): M {
|
|
160
152
|
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
161
153
|
return (this.coMap.set as Function)(...args);
|
|
@@ -171,10 +163,6 @@ export class QueriedCoMapBase<M extends AnyCoMap> {
|
|
|
171
163
|
): M {
|
|
172
164
|
return this.coMap.mutate(mutator);
|
|
173
165
|
}
|
|
174
|
-
}
|
|
175
166
|
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
isMe?: boolean;
|
|
179
|
-
id: AccountID;
|
|
180
|
-
};
|
|
167
|
+
as!: <O>(extension: QueryExtension<M, O>) => O | undefined;
|
|
168
|
+
}
|
|
@@ -1,94 +1,127 @@
|
|
|
1
1
|
import { JsonValue } from "../jsonValue.js";
|
|
2
|
-
import { MutableCoStream } from "../coValues/coStream.js";
|
|
2
|
+
import { CoStream, MutableCoStream } from "../coValues/coStream.js";
|
|
3
3
|
import { CoValueCore } from "../coValueCore.js";
|
|
4
|
-
import { Group } from "../group.js";
|
|
5
|
-
import { AccountID, isAccountID } from "../account.js";
|
|
6
|
-
import {
|
|
4
|
+
import { Group } from "../coValues/group.js";
|
|
5
|
+
import { AccountID, isAccountID } from "../coValues/account.js";
|
|
6
|
+
import { CoID, CoValue } from "../coValue.js";
|
|
7
7
|
import { SessionID, TransactionID } from "../ids.js";
|
|
8
|
-
import { QueriedAccountAndProfile } from "./queriedCoMap.js";
|
|
9
8
|
import { ValueOrSubQueried, QueryContext } from "../queries.js";
|
|
9
|
+
import { QueriedAccount } from "./queriedAccount.js";
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
export type QueriedCoStreamItems<Item extends JsonValue | CoValue> = {
|
|
11
|
+
export type QueriedCoStreamEntry<Item extends JsonValue | CoValue> = {
|
|
13
12
|
last?: ValueOrSubQueried<Item>;
|
|
14
|
-
by?:
|
|
13
|
+
by?: QueriedAccount;
|
|
15
14
|
tx?: TransactionID;
|
|
16
15
|
at?: Date;
|
|
17
16
|
all: {
|
|
18
17
|
value: ValueOrSubQueried<Item>;
|
|
19
|
-
by?:
|
|
18
|
+
by?: QueriedAccount;
|
|
20
19
|
tx: TransactionID;
|
|
21
20
|
at: Date;
|
|
22
21
|
}[];
|
|
23
22
|
};
|
|
24
23
|
|
|
25
|
-
export class QueriedCoStream<S extends
|
|
26
|
-
coStream
|
|
24
|
+
export class QueriedCoStream<S extends CoStream> {
|
|
25
|
+
coStream!: S;
|
|
27
26
|
id: CoID<S>;
|
|
28
27
|
type = "costream" as const;
|
|
29
28
|
|
|
30
29
|
/** @internal */
|
|
31
30
|
constructor(coStream: S, queryContext: QueryContext) {
|
|
32
|
-
this
|
|
31
|
+
Object.defineProperty(this, "coStream", {
|
|
32
|
+
get() {
|
|
33
|
+
return coStream;
|
|
34
|
+
},
|
|
35
|
+
});
|
|
33
36
|
this.id = coStream.id;
|
|
34
37
|
|
|
35
|
-
this.perSession =
|
|
36
|
-
coStream.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
38
|
+
this.perSession = coStream.sessions().map((sessionID) => {
|
|
39
|
+
const items = [...coStream.itemsIn(sessionID)].map((item) =>
|
|
40
|
+
queryContext.defineSubqueryPropertiesIn(
|
|
41
|
+
{
|
|
42
|
+
tx: item.tx,
|
|
43
|
+
at: new Date(item.at),
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
by: {
|
|
47
|
+
value: isAccountID(item.by)
|
|
48
|
+
? item.by
|
|
49
|
+
: (undefined as never),
|
|
50
|
+
enumerable: true,
|
|
51
|
+
},
|
|
52
|
+
value: {
|
|
53
|
+
value: item.value as S["_item"],
|
|
54
|
+
enumerable: true,
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
[coStream.id]
|
|
58
|
+
)
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
const lastItem = items[items.length - 1];
|
|
62
|
+
|
|
63
|
+
return [
|
|
64
|
+
sessionID,
|
|
65
|
+
{
|
|
66
|
+
get last() {
|
|
67
|
+
return lastItem?.value;
|
|
68
|
+
},
|
|
69
|
+
get by() {
|
|
70
|
+
return lastItem?.by;
|
|
71
|
+
},
|
|
72
|
+
tx: lastItem?.tx,
|
|
73
|
+
at: lastItem?.at,
|
|
74
|
+
all: items,
|
|
75
|
+
} satisfies QueriedCoStreamEntry<S["_item"]>,
|
|
76
|
+
];
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
this.perAccount = [...coStream.accounts()].map((accountID) => {
|
|
80
|
+
const items = [...coStream.itemsBy(accountID)].map((item) =>
|
|
81
|
+
queryContext.defineSubqueryPropertiesIn(
|
|
51
82
|
{
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
at: lastItem?.at,
|
|
56
|
-
all: items,
|
|
57
|
-
} satisfies QueriedCoStreamItems<S["_item"]>,
|
|
58
|
-
];
|
|
59
|
-
})
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
this.perAccount = Object.fromEntries(
|
|
63
|
-
[...coStream.accounts()].map((accountID) => {
|
|
64
|
-
const items = [...coStream.itemsBy(accountID)].map((item) => ({
|
|
65
|
-
by: item.by && isAccountID(item.by)
|
|
66
|
-
? queryContext.resolveAccount(item.by)
|
|
67
|
-
: undefined,
|
|
68
|
-
tx: item.tx,
|
|
69
|
-
at: new Date(item.at),
|
|
70
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
71
|
-
value: queryContext.resolveValue(item.value) as any,
|
|
72
|
-
}));
|
|
73
|
-
|
|
74
|
-
const lastItem = items[items.length - 1];
|
|
75
|
-
|
|
76
|
-
return [
|
|
77
|
-
accountID,
|
|
83
|
+
tx: item.tx,
|
|
84
|
+
at: new Date(item.at),
|
|
85
|
+
},
|
|
78
86
|
{
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
87
|
+
by: {
|
|
88
|
+
value: isAccountID(item.by)
|
|
89
|
+
? item.by
|
|
90
|
+
: (undefined as never),
|
|
91
|
+
enumerable: true,
|
|
92
|
+
},
|
|
93
|
+
value: {
|
|
94
|
+
value: item.value as S["_item"],
|
|
95
|
+
enumerable: true,
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
[coStream.id]
|
|
99
|
+
)
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const lastItem = items[items.length - 1];
|
|
103
|
+
|
|
104
|
+
const entry = {
|
|
105
|
+
get last() {
|
|
106
|
+
return lastItem?.value;
|
|
107
|
+
},
|
|
108
|
+
get by() {
|
|
109
|
+
return lastItem?.by;
|
|
110
|
+
},
|
|
111
|
+
tx: lastItem?.tx,
|
|
112
|
+
at: lastItem?.at,
|
|
113
|
+
all: items,
|
|
114
|
+
} satisfies QueriedCoStreamEntry<S["_item"]>;
|
|
115
|
+
|
|
116
|
+
if (accountID === queryContext.node.account.id) {
|
|
117
|
+
this.me = entry;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return [
|
|
121
|
+
accountID,
|
|
122
|
+
entry
|
|
123
|
+
];
|
|
124
|
+
});
|
|
92
125
|
}
|
|
93
126
|
|
|
94
127
|
get meta(): S["meta"] {
|
|
@@ -103,18 +136,11 @@ export class QueriedCoStream<S extends AnyCoStream> {
|
|
|
103
136
|
return this.coStream.core;
|
|
104
137
|
}
|
|
105
138
|
|
|
106
|
-
me?:
|
|
107
|
-
perAccount:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
[session: SessionID]: QueriedCoStreamItems<S["_item"]>;
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
push(
|
|
115
|
-
item: S["_item"] extends CoValue ? S["_item"] | CoID<S["_item"]> : S["_item"],
|
|
116
|
-
privacy?: "private" | "trusting"
|
|
117
|
-
): S {
|
|
139
|
+
me?: QueriedCoStreamEntry<S["_item"]>;
|
|
140
|
+
perAccount: [account: AccountID, items: QueriedCoStreamEntry<S["_item"]>][];
|
|
141
|
+
perSession: [session: SessionID, items: QueriedCoStreamEntry<S["_item"]>][];
|
|
142
|
+
|
|
143
|
+
push(item: S["_item"], privacy?: "private" | "trusting"): S {
|
|
118
144
|
return this.coStream.push(item, privacy);
|
|
119
145
|
}
|
|
120
146
|
mutate(
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Everyone, Group, InviteSecret } from "../coValues/group.js";
|
|
2
|
+
import { CoID } from "../coValue.js";
|
|
3
|
+
import { QueryContext, ValueOrSubQueried } from "../queries.js";
|
|
4
|
+
import { CoValueCore } from "../coValueCore.js";
|
|
5
|
+
import { Role } from "../permissions.js";
|
|
6
|
+
import { AccountID } from "../coValues/account.js";
|
|
7
|
+
import { CoMap } from "../coValues/coMap.js";
|
|
8
|
+
import { CoList } from "../coValues/coList.js";
|
|
9
|
+
import { CoStream } from "../coValues/coStream.js";
|
|
10
|
+
import { BinaryCoStream } from "../coValues/coStream.js";
|
|
11
|
+
|
|
12
|
+
export class QueriedGroup<G extends Group = Group> {
|
|
13
|
+
group!: G;
|
|
14
|
+
id!: CoID<G>;
|
|
15
|
+
type = "group" as const;
|
|
16
|
+
profile?: ValueOrSubQueried<G["_shape"]["profile"]>;
|
|
17
|
+
root?: ValueOrSubQueried<G["_shape"]["root"]>;
|
|
18
|
+
|
|
19
|
+
constructor(group: G, queryContext: QueryContext) {
|
|
20
|
+
const profileID = group.get("profile");
|
|
21
|
+
const rootID = group.get("root");
|
|
22
|
+
queryContext.defineSubqueryPropertiesIn(Object.defineProperties(this, {
|
|
23
|
+
group: {
|
|
24
|
+
get() {
|
|
25
|
+
return group;
|
|
26
|
+
},
|
|
27
|
+
enumerable: false,
|
|
28
|
+
},
|
|
29
|
+
id: { value: group.id, enumerable: false },
|
|
30
|
+
type: { value: "group", enumerable: false },
|
|
31
|
+
}), {
|
|
32
|
+
profile: {
|
|
33
|
+
value: profileID,
|
|
34
|
+
enumerable: false,
|
|
35
|
+
},
|
|
36
|
+
root: {
|
|
37
|
+
value: rootID,
|
|
38
|
+
enumerable: false,
|
|
39
|
+
},
|
|
40
|
+
}, [group.id]);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
get meta(): G["meta"] {
|
|
44
|
+
return this.group.meta;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
get core(): CoValueCore {
|
|
48
|
+
return this.group.core;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
addMember(accountID: AccountID | Everyone, role: Role): G {
|
|
52
|
+
return this.group.addMember(accountID, role);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
removeMember(accountID: AccountID): G {
|
|
56
|
+
return this.group.removeMember(accountID);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
createInvite(role: "reader" | "writer" | "admin"): InviteSecret {
|
|
60
|
+
return this.group.createInvite(role);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
createMap<M extends CoMap>(
|
|
64
|
+
init?: {
|
|
65
|
+
[K in keyof M["_shape"]]: M["_shape"][K];
|
|
66
|
+
},
|
|
67
|
+
meta?: M["meta"],
|
|
68
|
+
initPrivacy: "trusting" | "private" = "private"
|
|
69
|
+
): M {
|
|
70
|
+
return this.group.createMap(init, meta, initPrivacy);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
createList<L extends CoList>(
|
|
74
|
+
init?: L["_item"][],
|
|
75
|
+
meta?: L["meta"],
|
|
76
|
+
initPrivacy: "trusting" | "private" = "private"
|
|
77
|
+
): L {
|
|
78
|
+
return this.group.createList(init, meta, initPrivacy);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
createStream<C extends CoStream>(meta?: C["meta"]): C {
|
|
82
|
+
return this.group.createStream(meta);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
createBinaryStream<C extends BinaryCoStream>(
|
|
86
|
+
meta: C["meta"] = { type: "binary" }
|
|
87
|
+
): C {
|
|
88
|
+
return this.group.createBinaryStream(meta);
|
|
89
|
+
}
|
|
90
|
+
}
|