cojson 0.1.8 → 0.1.10
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/account.d.ts +6 -3
- package/dist/account.js +4 -2
- package/dist/account.js.map +1 -1
- package/dist/coValue.d.ts +44 -80
- package/dist/coValue.js +4 -348
- package/dist/coValue.js.map +1 -1
- package/dist/coValueCore.d.ts +84 -0
- package/dist/coValueCore.js +356 -0
- package/dist/coValueCore.js.map +1 -0
- package/dist/coValues/coList.d.ts +114 -0
- package/dist/{contentTypes → coValues}/coList.js +59 -19
- package/dist/coValues/coList.js.map +1 -0
- package/dist/{contentTypes → coValues}/coMap.d.ts +25 -7
- package/dist/{contentTypes → coValues}/coMap.js +34 -15
- package/dist/coValues/coMap.js.map +1 -0
- package/dist/coValues/coStream.d.ts +69 -0
- package/dist/coValues/coStream.js +131 -0
- package/dist/coValues/coStream.js.map +1 -0
- package/dist/coValues/static.d.ts +14 -0
- package/dist/coValues/static.js +20 -0
- package/dist/coValues/static.js.map +1 -0
- package/dist/group.d.ts +57 -9
- package/dist/group.js +94 -28
- package/dist/group.js.map +1 -1
- package/dist/index.d.ts +19 -10
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +59 -5
- package/dist/node.js +36 -15
- package/dist/node.js.map +1 -1
- package/dist/permissions.d.ts +2 -2
- package/dist/permissions.js +1 -1
- package/dist/permissions.js.map +1 -1
- package/dist/sync.d.ts +3 -3
- package/dist/sync.js +2 -2
- package/dist/sync.js.map +1 -1
- package/dist/testUtils.d.ts +2 -2
- package/dist/testUtils.js +1 -1
- package/dist/testUtils.js.map +1 -1
- package/package.json +2 -2
- package/src/account.test.ts +1 -1
- package/src/account.ts +8 -5
- package/src/coValue.test.ts +335 -129
- package/src/coValue.ts +52 -576
- package/src/coValueCore.test.ts +180 -0
- package/src/coValueCore.ts +592 -0
- package/src/{contentTypes → coValues}/coList.ts +91 -42
- package/src/{contentTypes → coValues}/coMap.ts +40 -20
- package/src/coValues/coStream.ts +249 -0
- package/src/coValues/static.ts +31 -0
- package/src/group.test.ts +47 -0
- package/src/group.ts +120 -50
- package/src/index.ts +43 -28
- package/src/node.ts +48 -27
- package/src/permissions.test.ts +32 -32
- package/src/permissions.ts +5 -5
- package/src/sync.test.ts +77 -77
- package/src/sync.ts +5 -5
- package/src/testUtils.ts +1 -1
- package/tsconfig.json +1 -2
- package/dist/contentType.d.ts +0 -15
- package/dist/contentType.js +0 -7
- package/dist/contentType.js.map +0 -1
- package/dist/contentTypes/coList.d.ts +0 -77
- package/dist/contentTypes/coList.js.map +0 -1
- package/dist/contentTypes/coMap.js.map +0 -1
- package/dist/contentTypes/coStream.d.ts +0 -11
- package/dist/contentTypes/coStream.js +0 -16
- package/dist/contentTypes/coStream.js.map +0 -1
- package/dist/contentTypes/static.d.ts +0 -11
- package/dist/contentTypes/static.js +0 -14
- package/dist/contentTypes/static.js.map +0 -1
- package/src/contentType.test.ts +0 -284
- package/src/contentType.ts +0 -26
- package/src/contentTypes/coStream.ts +0 -24
- package/src/contentTypes/static.ts +0 -22
package/dist/account.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { CoValueHeader } from "./
|
|
2
|
-
import { CoID } from "./
|
|
1
|
+
import { CoValueHeader } from "./coValueCore.js";
|
|
2
|
+
import { CoID } from "./coValue.js";
|
|
3
3
|
import { AgentSecret, SealerID, SealerSecret, SignerID, SignerSecret } from "./crypto.js";
|
|
4
4
|
import { AgentID } from "./ids.js";
|
|
5
|
-
import { CoMap
|
|
5
|
+
import { CoMap } from "./coValues/coMap.js";
|
|
6
|
+
import { LocalNode } from "./node.js";
|
|
6
7
|
import { Group, GroupContent } from "./group.js";
|
|
7
8
|
export declare function accountHeaderForInitialAgentSecret(agentSecret: AgentSecret): CoValueHeader;
|
|
8
9
|
export declare class Account extends Group {
|
|
@@ -18,6 +19,7 @@ export interface GeneralizedControlledAccount {
|
|
|
18
19
|
currentSealerID: () => SealerID;
|
|
19
20
|
currentSealerSecret: () => SealerSecret;
|
|
20
21
|
}
|
|
22
|
+
/** @hidden */
|
|
21
23
|
export declare class ControlledAccount extends Account implements GeneralizedControlledAccount {
|
|
22
24
|
agentSecret: AgentSecret;
|
|
23
25
|
constructor(agentSecret: AgentSecret, groupMap: CoMap<AccountContent, AccountMeta>, node: LocalNode);
|
|
@@ -27,6 +29,7 @@ export declare class ControlledAccount extends Account implements GeneralizedCon
|
|
|
27
29
|
currentSealerID(): SealerID;
|
|
28
30
|
currentSealerSecret(): SealerSecret;
|
|
29
31
|
}
|
|
32
|
+
/** @hidden */
|
|
30
33
|
export declare class AnonymousControlledAccount implements GeneralizedControlledAccount {
|
|
31
34
|
agentSecret: AgentSecret;
|
|
32
35
|
constructor(agentSecret: AgentSecret);
|
package/dist/account.js
CHANGED
|
@@ -14,10 +14,10 @@ export function accountHeaderForInitialAgentSecret(agentSecret) {
|
|
|
14
14
|
}
|
|
15
15
|
export class Account extends Group {
|
|
16
16
|
get id() {
|
|
17
|
-
return this.
|
|
17
|
+
return this.underlyingMap.id;
|
|
18
18
|
}
|
|
19
19
|
getCurrentAgentID() {
|
|
20
|
-
const agents = this.
|
|
20
|
+
const agents = this.underlyingMap
|
|
21
21
|
.keys()
|
|
22
22
|
.filter((k) => k.startsWith("sealer_"));
|
|
23
23
|
if (agents.length !== 1) {
|
|
@@ -26,6 +26,7 @@ export class Account extends Group {
|
|
|
26
26
|
return agents[0];
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
+
/** @hidden */
|
|
29
30
|
export class ControlledAccount extends Account {
|
|
30
31
|
constructor(agentSecret, groupMap, node) {
|
|
31
32
|
super(groupMap, node);
|
|
@@ -47,6 +48,7 @@ export class ControlledAccount extends Account {
|
|
|
47
48
|
return getAgentSealerSecret(this.agentSecret);
|
|
48
49
|
}
|
|
49
50
|
}
|
|
51
|
+
/** @hidden */
|
|
50
52
|
export class AnonymousControlledAccount {
|
|
51
53
|
constructor(agentSecret) {
|
|
52
54
|
this.agentSecret = agentSecret;
|
package/dist/account.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AAEA,OAAO,EAMH,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,GACvB,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AAEA,OAAO,EAMH,UAAU,EACV,gBAAgB,EAChB,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,GACvB,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,KAAK,EAAgB,MAAM,YAAY,CAAC;AAEjD,MAAM,UAAU,kCAAkC,CAC9C,WAAwB;IAExB,MAAM,KAAK,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;IACtC,OAAO;QACH,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE;QAC/C,IAAI,EAAE;YACF,IAAI,EAAE,SAAS;SAClB;QACD,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,IAAI;KACnB,CAAC;AACN,CAAC;AAED,MAAM,OAAO,OAAQ,SAAQ,KAAK;IAC9B,IAAI,EAAE;QACF,OAAO,IAAI,CAAC,aAAa,CAAC,EAAe,CAAC;IAC9C,CAAC;IAED,iBAAiB;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa;aAC5B,IAAI,EAAE;aACN,MAAM,CAAC,CAAC,CAAC,EAAgB,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC;QAE1D,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,MAAM,IAAI,KAAK,CACX,6CAA6C,GAAG,MAAM,CAAC,MAAM,CAChE,CAAC;SACL;QAED,OAAO,MAAM,CAAC,CAAC,CAAE,CAAC;IACtB,CAAC;CACJ;AAaD,cAAc;AACd,MAAM,OAAO,iBACT,SAAQ,OAAO;IAKf,YACI,WAAwB,EACxB,QAA4C,EAC5C,IAAe;QAEf,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAEtB,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,cAAc;QACV,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,eAAe;QACX,OAAO,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,mBAAmB;QACf,OAAO,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,eAAe;QACX,OAAO,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,mBAAmB;QACf,OAAO,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACJ;AAED,cAAc;AACd,MAAM,OAAO,0BAA0B;IAKnC,YAAY,WAAwB;QAChC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,IAAI,EAAE;QACF,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,cAAc;QACV,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,eAAe;QACX,OAAO,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,mBAAmB;QACf,OAAO,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;IAED,eAAe;QACX,OAAO,gBAAgB,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,mBAAmB;QACf,OAAO,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAClD,CAAC;CACJ;AAOD,MAAM,UAAU,WAAW,CAAC,EAAuB;IAC/C,OAAO,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC"}
|
package/dist/coValue.d.ts
CHANGED
|
@@ -1,84 +1,48 @@
|
|
|
1
|
-
import { ContentType } from "./contentType.js";
|
|
2
|
-
import { Encrypted, Hash, KeySecret, Signature, StreamingHash, KeyID } from "./crypto.js";
|
|
3
1
|
import { JsonObject, JsonValue } from "./jsonValue.js";
|
|
4
|
-
import {
|
|
2
|
+
import { RawCoID } from "./ids.js";
|
|
3
|
+
import { CoMap } from "./coValues/coMap.js";
|
|
4
|
+
import { BinaryCoStream, BinaryCoStreamMeta, CoStream } from "./coValues/coStream.js";
|
|
5
|
+
import { Static } from "./coValues/static.js";
|
|
6
|
+
import { CoList } from "./coValues/coList.js";
|
|
7
|
+
import { CoValueCore } from "./coValueCore.js";
|
|
5
8
|
import { Group } from "./group.js";
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { AgentID, RawCoID, SessionID, TransactionID } from "./ids.js";
|
|
9
|
-
import { AccountID, GeneralizedControlledAccount } from "./account.js";
|
|
10
|
-
export type CoValueHeader = {
|
|
11
|
-
type: ContentType["type"];
|
|
12
|
-
ruleset: RulesetDef;
|
|
13
|
-
meta: JsonObject | null;
|
|
14
|
-
createdAt: `2${string}` | null;
|
|
15
|
-
uniqueness: `z${string}` | null;
|
|
16
|
-
};
|
|
17
|
-
export declare function idforHeader(header: CoValueHeader): RawCoID;
|
|
18
|
-
export declare function accountOrAgentIDfromSessionID(sessionID: SessionID): AccountID | AgentID;
|
|
19
|
-
export declare function newRandomSessionID(accountID: AccountID | AgentID): SessionID;
|
|
20
|
-
type SessionLog = {
|
|
21
|
-
transactions: Transaction[];
|
|
22
|
-
lastHash?: Hash;
|
|
23
|
-
streamingHash: StreamingHash;
|
|
24
|
-
lastSignature: Signature;
|
|
25
|
-
};
|
|
26
|
-
export type PrivateTransaction = {
|
|
27
|
-
privacy: "private";
|
|
28
|
-
madeAt: number;
|
|
29
|
-
keyUsed: KeyID;
|
|
30
|
-
encryptedChanges: Encrypted<JsonValue[], {
|
|
31
|
-
in: RawCoID;
|
|
32
|
-
tx: TransactionID;
|
|
33
|
-
}>;
|
|
34
|
-
};
|
|
35
|
-
export type TrustingTransaction = {
|
|
36
|
-
privacy: "trusting";
|
|
37
|
-
madeAt: number;
|
|
38
|
-
changes: JsonValue[];
|
|
9
|
+
export type CoID<T extends CoValueImpl> = RawCoID & {
|
|
10
|
+
readonly __type: T;
|
|
39
11
|
};
|
|
40
|
-
export
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
};
|
|
71
|
-
makeTransaction(changes: JsonValue[], privacy: "private" | "trusting"): boolean;
|
|
72
|
-
getCurrentContent(): ContentType;
|
|
73
|
-
getValidSortedTransactions(): DecryptedTransaction[];
|
|
74
|
-
getCurrentReadKey(): {
|
|
75
|
-
secret: KeySecret | undefined;
|
|
76
|
-
id: KeyID;
|
|
77
|
-
};
|
|
78
|
-
getReadKey(keyID: KeyID): KeySecret | undefined;
|
|
79
|
-
getGroup(): Group;
|
|
80
|
-
getTx(txID: TransactionID): Transaction | undefined;
|
|
81
|
-
newContentSince(knownState: CoValueKnownState | undefined): NewContentMessage | undefined;
|
|
82
|
-
getDependedOnCoValues(): RawCoID[];
|
|
12
|
+
export interface ReadableCoValue extends CoValue {
|
|
13
|
+
/** Lets you subscribe to future updates to this CoValue (whether made locally or by other users).
|
|
14
|
+
*
|
|
15
|
+
* Takes a listener function that will be called with the current state for each update.
|
|
16
|
+
*
|
|
17
|
+
* Returns an unsubscribe function.
|
|
18
|
+
*
|
|
19
|
+
* Used internally by `useTelepathicData()` for reactive updates on changes to a `CoValue`. */
|
|
20
|
+
subscribe(listener: (coValue: CoValueImpl) => void): () => void;
|
|
21
|
+
/** Lets you apply edits to a `CoValue`, inside the changer callback, which receives a `WriteableCoValue`.
|
|
22
|
+
*
|
|
23
|
+
* A `WritableCoValue` has all the same methods as a `CoValue`, but all edits made to it (with its additional mutator methods)
|
|
24
|
+
* are reflected in it immediately - so it behaves mutably, whereas a `CoValue` is always immutable
|
|
25
|
+
* (you need to use `subscribe` to receive new versions of it). */
|
|
26
|
+
edit?: ((changer: (editable: WriteableCoValue) => void) => CoValueImpl) | undefined;
|
|
27
|
+
}
|
|
28
|
+
export interface CoValue {
|
|
29
|
+
/** The `CoValue`'s (precisely typed) `CoID` */
|
|
30
|
+
id: CoID<CoValueImpl>;
|
|
31
|
+
core: CoValueCore;
|
|
32
|
+
/** Specifies which kind of `CoValue` this is */
|
|
33
|
+
type: CoValueImpl["type"];
|
|
34
|
+
/** The `CoValue`'s (precisely typed) static metadata */
|
|
35
|
+
meta: JsonObject | null;
|
|
36
|
+
/** The `Group` this `CoValue` belongs to (determining permissions) */
|
|
37
|
+
group: Group;
|
|
38
|
+
/** Returns an immutable JSON presentation of this `CoValue` */
|
|
39
|
+
toJSON(): JsonValue;
|
|
40
|
+
}
|
|
41
|
+
export interface WriteableCoValue extends CoValue {
|
|
83
42
|
}
|
|
84
|
-
export {
|
|
43
|
+
export type CoValueImpl = CoMap<{
|
|
44
|
+
[key: string]: JsonValue;
|
|
45
|
+
}, JsonObject | null> | CoList<JsonValue, JsonObject | null> | CoStream<JsonValue, JsonObject | null> | BinaryCoStream<BinaryCoStreamMeta> | Static<JsonObject>;
|
|
46
|
+
export declare function expectMap(content: CoValueImpl): CoMap<{
|
|
47
|
+
[key: string]: string;
|
|
48
|
+
}, JsonObject | null>;
|
package/dist/coValue.js
CHANGED
|
@@ -1,351 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import { CoMap } from "./contentTypes/coMap.js";
|
|
5
|
-
import { StreamingHash, unseal, shortHash, sign, verify, encryptForTransaction, decryptForTransaction, decryptKeySecret, getAgentSignerID, getAgentSealerID, } from "./crypto.js";
|
|
6
|
-
import { base58 } from "@scure/base";
|
|
7
|
-
import { determineValidTransactions, isKeyForKeyField, } from "./permissions.js";
|
|
8
|
-
import { Group, expectGroupContent } from "./group.js";
|
|
9
|
-
import { CoList } from "./contentTypes/coList.js";
|
|
10
|
-
export function idforHeader(header) {
|
|
11
|
-
const hash = shortHash(header);
|
|
12
|
-
return `co_z${hash.slice("shortHash_z".length)}`;
|
|
13
|
-
}
|
|
14
|
-
export function accountOrAgentIDfromSessionID(sessionID) {
|
|
15
|
-
return sessionID.split("_session")[0];
|
|
16
|
-
}
|
|
17
|
-
export function newRandomSessionID(accountID) {
|
|
18
|
-
return `${accountID}_session_z${base58.encode(randomBytes(8))}`;
|
|
19
|
-
}
|
|
20
|
-
const readKeyCache = new WeakMap();
|
|
21
|
-
export class CoValue {
|
|
22
|
-
constructor(header, node, internalInitSessions = {}) {
|
|
23
|
-
this.listeners = new Set();
|
|
24
|
-
this.id = idforHeader(header);
|
|
25
|
-
this.header = header;
|
|
26
|
-
this._sessions = internalInitSessions;
|
|
27
|
-
this.node = node;
|
|
28
|
-
if (header.ruleset.type == "ownedByGroup") {
|
|
29
|
-
this.node
|
|
30
|
-
.expectCoValueLoaded(header.ruleset.group)
|
|
31
|
-
.subscribe((_groupUpdate) => {
|
|
32
|
-
this._cachedContent = undefined;
|
|
33
|
-
const newContent = this.getCurrentContent();
|
|
34
|
-
for (const listener of this.listeners) {
|
|
35
|
-
listener(newContent);
|
|
36
|
-
}
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
get sessions() {
|
|
41
|
-
return this._sessions;
|
|
42
|
-
}
|
|
43
|
-
testWithDifferentAccount(account, currentSessionID) {
|
|
44
|
-
const newNode = this.node.testWithDifferentAccount(account, currentSessionID);
|
|
45
|
-
return newNode.expectCoValueLoaded(this.id);
|
|
46
|
-
}
|
|
47
|
-
knownState() {
|
|
48
|
-
return {
|
|
49
|
-
id: this.id,
|
|
50
|
-
header: true,
|
|
51
|
-
sessions: Object.fromEntries(Object.entries(this.sessions).map(([k, v]) => [
|
|
52
|
-
k,
|
|
53
|
-
v.transactions.length,
|
|
54
|
-
])),
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
get meta() {
|
|
58
|
-
return this.header?.meta ?? null;
|
|
59
|
-
}
|
|
60
|
-
nextTransactionID() {
|
|
61
|
-
const sessionID = this.node.currentSessionID;
|
|
62
|
-
return {
|
|
63
|
-
sessionID,
|
|
64
|
-
txIndex: this.sessions[sessionID]?.transactions.length || 0,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
tryAddTransactions(sessionID, newTransactions, givenExpectedNewHash, newSignature) {
|
|
68
|
-
const signerID = getAgentSignerID(this.node.resolveAccountAgent(accountOrAgentIDfromSessionID(sessionID), "Expected to know signer of transaction"));
|
|
69
|
-
if (!signerID) {
|
|
70
|
-
console.warn("Unknown agent", accountOrAgentIDfromSessionID(sessionID));
|
|
71
|
-
return false;
|
|
72
|
-
}
|
|
73
|
-
const { expectedNewHash, newStreamingHash } = this.expectedNewHashAfter(sessionID, newTransactions);
|
|
74
|
-
if (givenExpectedNewHash && givenExpectedNewHash !== expectedNewHash) {
|
|
75
|
-
console.warn("Invalid hash", {
|
|
76
|
-
expectedNewHash,
|
|
77
|
-
givenExpectedNewHash,
|
|
78
|
-
});
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
if (!verify(newSignature, expectedNewHash, signerID)) {
|
|
82
|
-
console.warn("Invalid signature", newSignature, expectedNewHash, signerID);
|
|
83
|
-
return false;
|
|
84
|
-
}
|
|
85
|
-
const transactions = this.sessions[sessionID]?.transactions ?? [];
|
|
86
|
-
transactions.push(...newTransactions);
|
|
87
|
-
this._sessions[sessionID] = {
|
|
88
|
-
transactions,
|
|
89
|
-
lastHash: expectedNewHash,
|
|
90
|
-
streamingHash: newStreamingHash,
|
|
91
|
-
lastSignature: newSignature,
|
|
92
|
-
};
|
|
93
|
-
this._cachedContent = undefined;
|
|
94
|
-
const content = this.getCurrentContent();
|
|
95
|
-
for (const listener of this.listeners) {
|
|
96
|
-
listener(content);
|
|
97
|
-
}
|
|
98
|
-
return true;
|
|
99
|
-
}
|
|
100
|
-
subscribe(listener) {
|
|
101
|
-
this.listeners.add(listener);
|
|
102
|
-
listener(this.getCurrentContent());
|
|
103
|
-
return () => {
|
|
104
|
-
this.listeners.delete(listener);
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
expectedNewHashAfter(sessionID, newTransactions) {
|
|
108
|
-
const streamingHash = this.sessions[sessionID]?.streamingHash.clone() ??
|
|
109
|
-
new StreamingHash();
|
|
110
|
-
for (const transaction of newTransactions) {
|
|
111
|
-
streamingHash.update(transaction);
|
|
112
|
-
}
|
|
113
|
-
const newStreamingHash = streamingHash.clone();
|
|
114
|
-
return {
|
|
115
|
-
expectedNewHash: streamingHash.digest(),
|
|
116
|
-
newStreamingHash,
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
makeTransaction(changes, privacy) {
|
|
120
|
-
const madeAt = Date.now();
|
|
121
|
-
let transaction;
|
|
122
|
-
if (privacy === "private") {
|
|
123
|
-
const { secret: keySecret, id: keyID } = this.getCurrentReadKey();
|
|
124
|
-
if (!keySecret) {
|
|
125
|
-
throw new Error("Can't make transaction without read key secret");
|
|
126
|
-
}
|
|
127
|
-
transaction = {
|
|
128
|
-
privacy: "private",
|
|
129
|
-
madeAt,
|
|
130
|
-
keyUsed: keyID,
|
|
131
|
-
encryptedChanges: encryptForTransaction(changes, keySecret, {
|
|
132
|
-
in: this.id,
|
|
133
|
-
tx: this.nextTransactionID(),
|
|
134
|
-
}),
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
transaction = {
|
|
139
|
-
privacy: "trusting",
|
|
140
|
-
madeAt,
|
|
141
|
-
changes,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
const sessionID = this.node.currentSessionID;
|
|
145
|
-
const { expectedNewHash } = this.expectedNewHashAfter(sessionID, [
|
|
146
|
-
transaction,
|
|
147
|
-
]);
|
|
148
|
-
const signature = sign(this.node.account.currentSignerSecret(), expectedNewHash);
|
|
149
|
-
const success = this.tryAddTransactions(sessionID, [transaction], expectedNewHash, signature);
|
|
150
|
-
if (success) {
|
|
151
|
-
void this.node.sync.syncCoValue(this);
|
|
152
|
-
}
|
|
153
|
-
return success;
|
|
154
|
-
}
|
|
155
|
-
getCurrentContent() {
|
|
156
|
-
if (this._cachedContent) {
|
|
157
|
-
return this._cachedContent;
|
|
158
|
-
}
|
|
159
|
-
if (this.header.type === "comap") {
|
|
160
|
-
this._cachedContent = new CoMap(this);
|
|
161
|
-
}
|
|
162
|
-
else if (this.header.type === "colist") {
|
|
163
|
-
this._cachedContent = new CoList(this);
|
|
164
|
-
}
|
|
165
|
-
else if (this.header.type === "costream") {
|
|
166
|
-
this._cachedContent = new CoStream(this);
|
|
167
|
-
}
|
|
168
|
-
else if (this.header.type === "static") {
|
|
169
|
-
this._cachedContent = new Static(this);
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
throw new Error(`Unknown coValue type ${this.header.type}`);
|
|
173
|
-
}
|
|
174
|
-
return this._cachedContent;
|
|
175
|
-
}
|
|
176
|
-
getValidSortedTransactions() {
|
|
177
|
-
const validTransactions = determineValidTransactions(this);
|
|
178
|
-
const allTransactions = validTransactions
|
|
179
|
-
.map(({ txID, tx }) => {
|
|
180
|
-
if (tx.privacy === "trusting") {
|
|
181
|
-
return {
|
|
182
|
-
txID,
|
|
183
|
-
madeAt: tx.madeAt,
|
|
184
|
-
changes: tx.changes,
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
else {
|
|
188
|
-
const readKey = this.getReadKey(tx.keyUsed);
|
|
189
|
-
if (!readKey) {
|
|
190
|
-
return undefined;
|
|
191
|
-
}
|
|
192
|
-
else {
|
|
193
|
-
const decrytedChanges = decryptForTransaction(tx.encryptedChanges, readKey, {
|
|
194
|
-
in: this.id,
|
|
195
|
-
tx: txID,
|
|
196
|
-
});
|
|
197
|
-
if (!decrytedChanges) {
|
|
198
|
-
console.error("Failed to decrypt transaction despite having key");
|
|
199
|
-
return undefined;
|
|
200
|
-
}
|
|
201
|
-
return {
|
|
202
|
-
txID,
|
|
203
|
-
madeAt: tx.madeAt,
|
|
204
|
-
changes: decrytedChanges,
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
})
|
|
209
|
-
.filter((x) => !!x);
|
|
210
|
-
allTransactions.sort((a, b) => a.madeAt - b.madeAt ||
|
|
211
|
-
(a.txID.sessionID < b.txID.sessionID ? -1 : 1) ||
|
|
212
|
-
a.txID.txIndex - b.txID.txIndex);
|
|
213
|
-
return allTransactions;
|
|
214
|
-
}
|
|
215
|
-
getCurrentReadKey() {
|
|
216
|
-
if (this.header.ruleset.type === "group") {
|
|
217
|
-
const content = expectGroupContent(this.getCurrentContent());
|
|
218
|
-
const currentKeyId = content.get("readKey");
|
|
219
|
-
if (!currentKeyId) {
|
|
220
|
-
throw new Error("No readKey set");
|
|
221
|
-
}
|
|
222
|
-
const secret = this.getReadKey(currentKeyId);
|
|
223
|
-
return {
|
|
224
|
-
secret: secret,
|
|
225
|
-
id: currentKeyId,
|
|
226
|
-
};
|
|
227
|
-
}
|
|
228
|
-
else if (this.header.ruleset.type === "ownedByGroup") {
|
|
229
|
-
return this.node
|
|
230
|
-
.expectCoValueLoaded(this.header.ruleset.group)
|
|
231
|
-
.getCurrentReadKey();
|
|
232
|
-
}
|
|
233
|
-
else {
|
|
234
|
-
throw new Error("Only groups or values owned by groups have read secrets");
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
getReadKey(keyID) {
|
|
238
|
-
if (readKeyCache.get(this)?.[keyID]) {
|
|
239
|
-
return readKeyCache.get(this)?.[keyID];
|
|
240
|
-
}
|
|
241
|
-
if (this.header.ruleset.type === "group") {
|
|
242
|
-
const content = expectGroupContent(this.getCurrentContent());
|
|
243
|
-
// Try to find key revelation for us
|
|
244
|
-
const readKeyEntry = content.getLastEntry(`${keyID}_for_${this.node.account.id}`);
|
|
245
|
-
if (readKeyEntry) {
|
|
246
|
-
const revealer = accountOrAgentIDfromSessionID(readKeyEntry.txID.sessionID);
|
|
247
|
-
const revealerAgent = this.node.resolveAccountAgent(revealer, "Expected to know revealer");
|
|
248
|
-
const secret = unseal(readKeyEntry.value, this.node.account.currentSealerSecret(), getAgentSealerID(revealerAgent), {
|
|
249
|
-
in: this.id,
|
|
250
|
-
tx: readKeyEntry.txID,
|
|
251
|
-
});
|
|
252
|
-
if (secret) {
|
|
253
|
-
let cache = readKeyCache.get(this);
|
|
254
|
-
if (!cache) {
|
|
255
|
-
cache = {};
|
|
256
|
-
readKeyCache.set(this, cache);
|
|
257
|
-
}
|
|
258
|
-
cache[keyID] = secret;
|
|
259
|
-
return secret;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
// Try to find indirect revelation through previousKeys
|
|
263
|
-
for (const field of content.keys()) {
|
|
264
|
-
if (isKeyForKeyField(field) && field.startsWith(keyID)) {
|
|
265
|
-
const encryptingKeyID = field.split("_for_")[1];
|
|
266
|
-
const encryptingKeySecret = this.getReadKey(encryptingKeyID);
|
|
267
|
-
if (!encryptingKeySecret) {
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
const encryptedPreviousKey = content.get(field);
|
|
271
|
-
const secret = decryptKeySecret({
|
|
272
|
-
encryptedID: keyID,
|
|
273
|
-
encryptingID: encryptingKeyID,
|
|
274
|
-
encrypted: encryptedPreviousKey,
|
|
275
|
-
}, encryptingKeySecret);
|
|
276
|
-
if (secret) {
|
|
277
|
-
let cache = readKeyCache.get(this);
|
|
278
|
-
if (!cache) {
|
|
279
|
-
cache = {};
|
|
280
|
-
readKeyCache.set(this, cache);
|
|
281
|
-
}
|
|
282
|
-
cache[keyID] = secret;
|
|
283
|
-
return secret;
|
|
284
|
-
}
|
|
285
|
-
else {
|
|
286
|
-
console.error(`Encrypting ${encryptingKeyID} key didn't decrypt ${keyID}`);
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
return undefined;
|
|
291
|
-
}
|
|
292
|
-
else if (this.header.ruleset.type === "ownedByGroup") {
|
|
293
|
-
return this.node
|
|
294
|
-
.expectCoValueLoaded(this.header.ruleset.group)
|
|
295
|
-
.getReadKey(keyID);
|
|
296
|
-
}
|
|
297
|
-
else {
|
|
298
|
-
throw new Error("Only groups or values owned by groups have read secrets");
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
getGroup() {
|
|
302
|
-
if (this.header.ruleset.type !== "ownedByGroup") {
|
|
303
|
-
throw new Error("Only values owned by groups have groups");
|
|
304
|
-
}
|
|
305
|
-
return new Group(expectGroupContent(this.node
|
|
306
|
-
.expectCoValueLoaded(this.header.ruleset.group)
|
|
307
|
-
.getCurrentContent()), this.node);
|
|
308
|
-
}
|
|
309
|
-
getTx(txID) {
|
|
310
|
-
return this.sessions[txID.sessionID]?.transactions[txID.txIndex];
|
|
311
|
-
}
|
|
312
|
-
newContentSince(knownState) {
|
|
313
|
-
const newContent = {
|
|
314
|
-
action: "content",
|
|
315
|
-
id: this.id,
|
|
316
|
-
header: knownState?.header ? undefined : this.header,
|
|
317
|
-
new: Object.fromEntries(Object.entries(this.sessions)
|
|
318
|
-
.map(([sessionID, log]) => {
|
|
319
|
-
const newTransactions = log.transactions.slice(knownState?.sessions[sessionID] || 0);
|
|
320
|
-
if (newTransactions.length === 0 ||
|
|
321
|
-
!log.lastHash ||
|
|
322
|
-
!log.lastSignature) {
|
|
323
|
-
return undefined;
|
|
324
|
-
}
|
|
325
|
-
return [
|
|
326
|
-
sessionID,
|
|
327
|
-
{
|
|
328
|
-
after: knownState?.sessions[sessionID] || 0,
|
|
329
|
-
newTransactions,
|
|
330
|
-
lastSignature: log.lastSignature,
|
|
331
|
-
},
|
|
332
|
-
];
|
|
333
|
-
})
|
|
334
|
-
.filter((x) => !!x)),
|
|
335
|
-
};
|
|
336
|
-
if (!newContent.header && Object.keys(newContent.new).length === 0) {
|
|
337
|
-
return undefined;
|
|
338
|
-
}
|
|
339
|
-
return newContent;
|
|
340
|
-
}
|
|
341
|
-
getDependedOnCoValues() {
|
|
342
|
-
return this.header.ruleset.type === "group"
|
|
343
|
-
? expectGroupContent(this.getCurrentContent())
|
|
344
|
-
.keys()
|
|
345
|
-
.filter((k) => k.startsWith("co_"))
|
|
346
|
-
: this.header.ruleset.type === "ownedByGroup"
|
|
347
|
-
? [this.header.ruleset.group]
|
|
348
|
-
: [];
|
|
1
|
+
export function expectMap(content) {
|
|
2
|
+
if (content.type !== "comap") {
|
|
3
|
+
throw new Error("Expected map");
|
|
349
4
|
}
|
|
5
|
+
return content;
|
|
350
6
|
}
|
|
351
7
|
//# sourceMappingURL=coValue.js.map
|
package/dist/coValue.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coValue.js","sourceRoot":"","sources":["../src/coValue.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"coValue.js","sourceRoot":"","sources":["../src/coValue.ts"],"names":[],"mappings":"AAuDA,MAAM,UAAU,SAAS,CACrB,OAAoB;IAEpB,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE;QAC1B,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;KACnC;IAED,OAAO,OAA8D,CAAC;AAC1E,CAAC"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { CoValueImpl } from "./coValue.js";
|
|
2
|
+
import { Encrypted, Hash, KeySecret, Signature, StreamingHash, KeyID } from "./crypto.js";
|
|
3
|
+
import { JsonObject, JsonValue } from "./jsonValue.js";
|
|
4
|
+
import { PermissionsDef as RulesetDef } from "./permissions.js";
|
|
5
|
+
import { Group } from "./group.js";
|
|
6
|
+
import { LocalNode } from "./node.js";
|
|
7
|
+
import { CoValueKnownState, NewContentMessage } from "./sync.js";
|
|
8
|
+
import { AgentID, RawCoID, SessionID, TransactionID } from "./ids.js";
|
|
9
|
+
import { AccountID, GeneralizedControlledAccount } from "./account.js";
|
|
10
|
+
export type CoValueHeader = {
|
|
11
|
+
type: CoValueImpl["type"];
|
|
12
|
+
ruleset: RulesetDef;
|
|
13
|
+
meta: JsonObject | null;
|
|
14
|
+
createdAt: `2${string}` | null;
|
|
15
|
+
uniqueness: `z${string}` | null;
|
|
16
|
+
};
|
|
17
|
+
export declare function idforHeader(header: CoValueHeader): RawCoID;
|
|
18
|
+
export declare function accountOrAgentIDfromSessionID(sessionID: SessionID): AccountID | AgentID;
|
|
19
|
+
export declare function newRandomSessionID(accountID: AccountID | AgentID): SessionID;
|
|
20
|
+
type SessionLog = {
|
|
21
|
+
transactions: Transaction[];
|
|
22
|
+
lastHash?: Hash;
|
|
23
|
+
streamingHash: StreamingHash;
|
|
24
|
+
lastSignature: Signature;
|
|
25
|
+
};
|
|
26
|
+
export type PrivateTransaction = {
|
|
27
|
+
privacy: "private";
|
|
28
|
+
madeAt: number;
|
|
29
|
+
keyUsed: KeyID;
|
|
30
|
+
encryptedChanges: Encrypted<JsonValue[], {
|
|
31
|
+
in: RawCoID;
|
|
32
|
+
tx: TransactionID;
|
|
33
|
+
}>;
|
|
34
|
+
};
|
|
35
|
+
export type TrustingTransaction = {
|
|
36
|
+
privacy: "trusting";
|
|
37
|
+
madeAt: number;
|
|
38
|
+
changes: JsonValue[];
|
|
39
|
+
};
|
|
40
|
+
export type Transaction = PrivateTransaction | TrustingTransaction;
|
|
41
|
+
export type DecryptedTransaction = {
|
|
42
|
+
txID: TransactionID;
|
|
43
|
+
changes: JsonValue[];
|
|
44
|
+
madeAt: number;
|
|
45
|
+
};
|
|
46
|
+
export declare class CoValueCore {
|
|
47
|
+
id: RawCoID;
|
|
48
|
+
node: LocalNode;
|
|
49
|
+
header: CoValueHeader;
|
|
50
|
+
_sessions: {
|
|
51
|
+
[key: SessionID]: SessionLog;
|
|
52
|
+
};
|
|
53
|
+
_cachedContent?: CoValueImpl;
|
|
54
|
+
listeners: Set<(content?: CoValueImpl) => void>;
|
|
55
|
+
constructor(header: CoValueHeader, node: LocalNode, internalInitSessions?: {
|
|
56
|
+
[key: SessionID]: SessionLog;
|
|
57
|
+
});
|
|
58
|
+
get sessions(): Readonly<{
|
|
59
|
+
[key: SessionID]: SessionLog;
|
|
60
|
+
}>;
|
|
61
|
+
testWithDifferentAccount(account: GeneralizedControlledAccount, currentSessionID: SessionID): CoValueCore;
|
|
62
|
+
knownState(): CoValueKnownState;
|
|
63
|
+
get meta(): JsonValue;
|
|
64
|
+
nextTransactionID(): TransactionID;
|
|
65
|
+
tryAddTransactions(sessionID: SessionID, newTransactions: Transaction[], givenExpectedNewHash: Hash | undefined, newSignature: Signature): boolean;
|
|
66
|
+
subscribe(listener: (content?: CoValueImpl) => void): () => void;
|
|
67
|
+
expectedNewHashAfter(sessionID: SessionID, newTransactions: Transaction[]): {
|
|
68
|
+
expectedNewHash: Hash;
|
|
69
|
+
newStreamingHash: StreamingHash;
|
|
70
|
+
};
|
|
71
|
+
makeTransaction(changes: JsonValue[], privacy: "private" | "trusting"): boolean;
|
|
72
|
+
getCurrentContent(): CoValueImpl;
|
|
73
|
+
getValidSortedTransactions(): DecryptedTransaction[];
|
|
74
|
+
getCurrentReadKey(): {
|
|
75
|
+
secret: KeySecret | undefined;
|
|
76
|
+
id: KeyID;
|
|
77
|
+
};
|
|
78
|
+
getReadKey(keyID: KeyID): KeySecret | undefined;
|
|
79
|
+
getGroup(): Group;
|
|
80
|
+
getTx(txID: TransactionID): Transaction | undefined;
|
|
81
|
+
newContentSince(knownState: CoValueKnownState | undefined): NewContentMessage | undefined;
|
|
82
|
+
getDependedOnCoValues(): RawCoID[];
|
|
83
|
+
}
|
|
84
|
+
export {};
|