@garydevenay/emporion 0.0.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/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/src/cli.d.ts +7 -0
- package/dist/src/cli.js +2101 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.js +41 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/demo.d.ts +1 -0
- package/dist/src/demo.js +140 -0
- package/dist/src/demo.js.map +1 -0
- package/dist/src/did.d.ts +13 -0
- package/dist/src/did.js +155 -0
- package/dist/src/did.js.map +1 -0
- package/dist/src/errors.d.ts +23 -0
- package/dist/src/errors.js +25 -0
- package/dist/src/errors.js.map +1 -0
- package/dist/src/handshake.d.ts +9 -0
- package/dist/src/handshake.js +131 -0
- package/dist/src/handshake.js.map +1 -0
- package/dist/src/identity.d.ts +17 -0
- package/dist/src/identity.js +105 -0
- package/dist/src/identity.js.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/logger.d.ts +11 -0
- package/dist/src/logger.js +41 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/persistent-agent.d.ts +2 -0
- package/dist/src/persistent-agent.js +24 -0
- package/dist/src/persistent-agent.js.map +1 -0
- package/dist/src/protocol/company.d.ts +36 -0
- package/dist/src/protocol/company.js +211 -0
- package/dist/src/protocol/company.js.map +1 -0
- package/dist/src/protocol/contracts.d.ts +119 -0
- package/dist/src/protocol/contracts.js +404 -0
- package/dist/src/protocol/contracts.js.map +1 -0
- package/dist/src/protocol/credential-reference.d.ts +71 -0
- package/dist/src/protocol/credential-reference.js +136 -0
- package/dist/src/protocol/credential-reference.js.map +1 -0
- package/dist/src/protocol/dissemination.d.ts +47 -0
- package/dist/src/protocol/dissemination.js +111 -0
- package/dist/src/protocol/dissemination.js.map +1 -0
- package/dist/src/protocol/envelope.d.ts +71 -0
- package/dist/src/protocol/envelope.js +203 -0
- package/dist/src/protocol/envelope.js.map +1 -0
- package/dist/src/protocol/identity.d.ts +18 -0
- package/dist/src/protocol/identity.js +143 -0
- package/dist/src/protocol/identity.js.map +1 -0
- package/dist/src/protocol/index.d.ts +22 -0
- package/dist/src/protocol/index.js +12 -0
- package/dist/src/protocol/index.js.map +1 -0
- package/dist/src/protocol/market.d.ts +96 -0
- package/dist/src/protocol/market.js +293 -0
- package/dist/src/protocol/market.js.map +1 -0
- package/dist/src/protocol/messaging.d.ts +87 -0
- package/dist/src/protocol/messaging.js +296 -0
- package/dist/src/protocol/messaging.js.map +1 -0
- package/dist/src/protocol/repository.d.ts +87 -0
- package/dist/src/protocol/repository.js +651 -0
- package/dist/src/protocol/repository.js.map +1 -0
- package/dist/src/protocol/resolution.d.ts +86 -0
- package/dist/src/protocol/resolution.js +305 -0
- package/dist/src/protocol/resolution.js.map +1 -0
- package/dist/src/protocol/shared.d.ts +14 -0
- package/dist/src/protocol/shared.js +45 -0
- package/dist/src/protocol/shared.js.map +1 -0
- package/dist/src/protocol/versioning.d.ts +21 -0
- package/dist/src/protocol/versioning.js +69 -0
- package/dist/src/protocol/versioning.js.map +1 -0
- package/dist/src/storage.d.ts +36 -0
- package/dist/src/storage.js +156 -0
- package/dist/src/storage.js.map +1 -0
- package/dist/src/topics.d.ts +3 -0
- package/dist/src/topics.js +27 -0
- package/dist/src/topics.js.map +1 -0
- package/dist/src/transport.d.ts +114 -0
- package/dist/src/transport.js +291 -0
- package/dist/src/transport.js.map +1 -0
- package/dist/src/types.d.ts +95 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/test/cli.test.d.ts +1 -0
- package/dist/test/cli.test.js +122 -0
- package/dist/test/cli.test.js.map +1 -0
- package/dist/test/economy.test.d.ts +1 -0
- package/dist/test/economy.test.js +661 -0
- package/dist/test/economy.test.js.map +1 -0
- package/dist/test/helpers.d.ts +12 -0
- package/dist/test/helpers.js +57 -0
- package/dist/test/helpers.js.map +1 -0
- package/dist/test/integration.test.d.ts +1 -0
- package/dist/test/integration.test.js +287 -0
- package/dist/test/integration.test.js.map +1 -0
- package/dist/test/protocol.test.d.ts +1 -0
- package/dist/test/protocol.test.js +448 -0
- package/dist/test/protocol.test.js.map +1 -0
- package/dist/test/unit.test.d.ts +1 -0
- package/dist/test/unit.test.js +87 -0
- package/dist/test/unit.test.js.map +1 -0
- package/package.json +60 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ProtocolEnvelope } from "./envelope.js";
|
|
2
|
+
import { type ProtocolJsonObject } from "./shared.js";
|
|
3
|
+
export type SpaceKind = "direct-inbox" | "contract-thread" | "company-room" | "market-room";
|
|
4
|
+
export interface MembershipPolicy {
|
|
5
|
+
mode: "invite-only" | "owner-controlled" | "public-read";
|
|
6
|
+
ownerMemberDids: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface EncryptionPolicy {
|
|
9
|
+
mode: "none" | "member-sealed-box";
|
|
10
|
+
keyAgreementMethod: "did-keyagreement-v1";
|
|
11
|
+
}
|
|
12
|
+
export interface OwnerRef {
|
|
13
|
+
kind: "agent" | "company" | "marketplace" | "contract" | "dispute";
|
|
14
|
+
id: string;
|
|
15
|
+
}
|
|
16
|
+
export interface SpaceState {
|
|
17
|
+
objectId: string;
|
|
18
|
+
spaceId: string;
|
|
19
|
+
spaceKind: SpaceKind;
|
|
20
|
+
ownerRef: OwnerRef;
|
|
21
|
+
membershipPolicy: MembershipPolicy;
|
|
22
|
+
encryptionPolicy: EncryptionPolicy;
|
|
23
|
+
status: "active" | "archived";
|
|
24
|
+
latestEventId: string;
|
|
25
|
+
eventIds: string[];
|
|
26
|
+
}
|
|
27
|
+
export interface SpaceMembershipState {
|
|
28
|
+
objectId: string;
|
|
29
|
+
spaceId: string;
|
|
30
|
+
memberDid: string;
|
|
31
|
+
role: "owner" | "moderator" | "member";
|
|
32
|
+
status: "active" | "removed" | "muted";
|
|
33
|
+
latestEventId: string;
|
|
34
|
+
eventIds: string[];
|
|
35
|
+
}
|
|
36
|
+
export interface EncryptedRecipientBox {
|
|
37
|
+
recipientDid: string;
|
|
38
|
+
nonce: string;
|
|
39
|
+
ciphertext: string;
|
|
40
|
+
}
|
|
41
|
+
export interface EncryptedMessageBody {
|
|
42
|
+
senderDid: string;
|
|
43
|
+
senderKeyAgreementPublicKey: string;
|
|
44
|
+
recipientBoxes: EncryptedRecipientBox[];
|
|
45
|
+
}
|
|
46
|
+
export interface MessageState {
|
|
47
|
+
objectId: string;
|
|
48
|
+
spaceId: string;
|
|
49
|
+
senderDid: string;
|
|
50
|
+
messageType: string;
|
|
51
|
+
metadata: ProtocolJsonObject;
|
|
52
|
+
encryptedBody: EncryptedMessageBody;
|
|
53
|
+
status: "sent" | "edited" | "deleted";
|
|
54
|
+
reactions: Record<string, string[]>;
|
|
55
|
+
latestEventId: string;
|
|
56
|
+
eventIds: string[];
|
|
57
|
+
}
|
|
58
|
+
export declare function encryptMessageForRecipients(input: {
|
|
59
|
+
plaintext: string;
|
|
60
|
+
senderDid: string;
|
|
61
|
+
senderKeyAgreementPublicKey: string;
|
|
62
|
+
senderKeyAgreementSecretKey: Uint8Array;
|
|
63
|
+
recipientDids: string[];
|
|
64
|
+
}): Promise<EncryptedMessageBody>;
|
|
65
|
+
export declare function decryptEncryptedMessageBody(input: {
|
|
66
|
+
encryptedBody: EncryptedMessageBody;
|
|
67
|
+
recipientDid: string;
|
|
68
|
+
recipientKeyAgreementSecretKey: Uint8Array;
|
|
69
|
+
}): string;
|
|
70
|
+
export declare function applySpaceEvent(currentState: SpaceState | undefined, envelope: ProtocolEnvelope): SpaceState;
|
|
71
|
+
export declare function applySpaceMembershipEvent(currentState: SpaceMembershipState | undefined, envelope: ProtocolEnvelope, refs: {
|
|
72
|
+
spaces: Map<string, SpaceState>;
|
|
73
|
+
memberships: Map<string, SpaceMembershipState>;
|
|
74
|
+
}): SpaceMembershipState;
|
|
75
|
+
export declare function applyMessageEvent(currentState: MessageState | undefined, envelope: ProtocolEnvelope, refs: {
|
|
76
|
+
spaces: Map<string, SpaceState>;
|
|
77
|
+
memberships: Map<string, SpaceMembershipState>;
|
|
78
|
+
}): MessageState;
|
|
79
|
+
export declare function spacePayloadToJson(payload: Omit<SpaceState, "objectId" | "spaceId" | "status" | "latestEventId" | "eventIds">): ProtocolJsonObject;
|
|
80
|
+
export declare function spaceMembershipPayloadToJson(payload: Omit<SpaceMembershipState, "objectId" | "status" | "latestEventId" | "eventIds">): ProtocolJsonObject;
|
|
81
|
+
export declare function messageSentPayloadToJson(payload: {
|
|
82
|
+
spaceId: string;
|
|
83
|
+
messageType: string;
|
|
84
|
+
metadata: ProtocolJsonObject;
|
|
85
|
+
encryptedBody: EncryptedMessageBody;
|
|
86
|
+
sentAt?: string;
|
|
87
|
+
}): ProtocolJsonObject;
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
import { randomBytes } from "node:crypto";
|
|
2
|
+
import bs58 from "bs58";
|
|
3
|
+
import nacl from "tweetnacl";
|
|
4
|
+
import { extractKeyAgreementPublicKeyMultibase, resolveDidDocument } from "../did.js";
|
|
5
|
+
import { ProtocolConflictError, ProtocolValidationError } from "../errors.js";
|
|
6
|
+
import { assertIsoTimestamp, decodeBase64Url, encodeBase64Url } from "./shared.js";
|
|
7
|
+
const X25519_MULTICODEC_PREFIX = Buffer.from([0xec, 0x01]);
|
|
8
|
+
function assertNonEmpty(value, fieldName) {
|
|
9
|
+
if (value.trim().length === 0) {
|
|
10
|
+
throw new ProtocolValidationError(`${fieldName} must not be blank`);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function ensureLatestPredecessor(state, envelope, createEventKind) {
|
|
14
|
+
if (!state) {
|
|
15
|
+
if (envelope.eventKind !== createEventKind) {
|
|
16
|
+
throw new ProtocolConflictError(`The first event must be ${createEventKind}`);
|
|
17
|
+
}
|
|
18
|
+
if (envelope.previousEventIds.length !== 0) {
|
|
19
|
+
throw new ProtocolConflictError(`${createEventKind} must not reference previous events`);
|
|
20
|
+
}
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (envelope.previousEventIds.length === 0 || !envelope.previousEventIds.includes(state.latestEventId)) {
|
|
24
|
+
throw new ProtocolConflictError("Event must reference the latest event");
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function decodeX25519Multibase(publicKeyMultibase) {
|
|
28
|
+
if (!publicKeyMultibase.startsWith("z")) {
|
|
29
|
+
throw new ProtocolValidationError("Messaging keys must use base58-btc multibase");
|
|
30
|
+
}
|
|
31
|
+
const decoded = Buffer.from(bs58.decode(publicKeyMultibase.slice(1)));
|
|
32
|
+
if (decoded.byteLength < 3 || decoded[0] !== X25519_MULTICODEC_PREFIX[0] || decoded[1] !== X25519_MULTICODEC_PREFIX[1]) {
|
|
33
|
+
throw new ProtocolValidationError("Messaging key multibase is not an X25519 multicodec");
|
|
34
|
+
}
|
|
35
|
+
return decoded.subarray(2);
|
|
36
|
+
}
|
|
37
|
+
function activeMembersForSpace(spaceId, memberships) {
|
|
38
|
+
const results = new Map();
|
|
39
|
+
for (const membership of memberships.values()) {
|
|
40
|
+
if (membership.spaceId === spaceId && membership.status !== "removed") {
|
|
41
|
+
results.set(membership.memberDid, membership);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
function assertCanManageMembership(space, actorDid, memberships) {
|
|
47
|
+
if (space.membershipPolicy.ownerMemberDids.includes(actorDid)) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const membership = activeMembersForSpace(space.spaceId, memberships).get(actorDid);
|
|
51
|
+
if (membership?.role === "owner" || membership?.role === "moderator") {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
throw new ProtocolConflictError("Only owners or moderators can manage space membership");
|
|
55
|
+
}
|
|
56
|
+
function assertActiveMember(spaceId, actorDid, memberships) {
|
|
57
|
+
const membership = activeMembersForSpace(spaceId, memberships).get(actorDid);
|
|
58
|
+
if (!membership || membership.status !== "active") {
|
|
59
|
+
throw new ProtocolConflictError("Actor must be an active member of the space");
|
|
60
|
+
}
|
|
61
|
+
return membership;
|
|
62
|
+
}
|
|
63
|
+
export async function encryptMessageForRecipients(input) {
|
|
64
|
+
const recipientBoxes = [];
|
|
65
|
+
const recipientSet = [...new Set([input.senderDid, ...input.recipientDids])].sort();
|
|
66
|
+
for (const recipientDid of recipientSet) {
|
|
67
|
+
const resolved = await resolveDidDocument(recipientDid);
|
|
68
|
+
const publicKeyMultibase = extractKeyAgreementPublicKeyMultibase(resolved.didDocument);
|
|
69
|
+
const recipientPublicKey = decodeX25519Multibase(publicKeyMultibase);
|
|
70
|
+
const nonce = randomBytes(nacl.box.nonceLength);
|
|
71
|
+
const ciphertext = nacl.box(Buffer.from(input.plaintext, "utf8"), nonce, recipientPublicKey, input.senderKeyAgreementSecretKey);
|
|
72
|
+
recipientBoxes.push({
|
|
73
|
+
recipientDid,
|
|
74
|
+
nonce: encodeBase64Url(nonce),
|
|
75
|
+
ciphertext: encodeBase64Url(ciphertext)
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return {
|
|
79
|
+
senderDid: input.senderDid,
|
|
80
|
+
senderKeyAgreementPublicKey: input.senderKeyAgreementPublicKey,
|
|
81
|
+
recipientBoxes
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function decryptEncryptedMessageBody(input) {
|
|
85
|
+
const recipientBox = input.encryptedBody.recipientBoxes.find((entry) => entry.recipientDid === input.recipientDid);
|
|
86
|
+
if (!recipientBox) {
|
|
87
|
+
throw new ProtocolConflictError(`Encrypted message body was not addressed to ${input.recipientDid}`);
|
|
88
|
+
}
|
|
89
|
+
const plaintext = nacl.box.open(decodeBase64Url(recipientBox.ciphertext), decodeBase64Url(recipientBox.nonce), Buffer.from(input.encryptedBody.senderKeyAgreementPublicKey, "hex"), input.recipientKeyAgreementSecretKey);
|
|
90
|
+
if (!plaintext) {
|
|
91
|
+
throw new ProtocolConflictError("Failed to decrypt the message body");
|
|
92
|
+
}
|
|
93
|
+
return Buffer.from(plaintext).toString("utf8");
|
|
94
|
+
}
|
|
95
|
+
export function applySpaceEvent(currentState, envelope) {
|
|
96
|
+
if (envelope.objectKind !== "space") {
|
|
97
|
+
throw new ProtocolValidationError("Envelope is not a space event");
|
|
98
|
+
}
|
|
99
|
+
ensureLatestPredecessor(currentState, envelope, "space.created");
|
|
100
|
+
switch (envelope.eventKind) {
|
|
101
|
+
case "space.created": {
|
|
102
|
+
const payload = envelope.payload;
|
|
103
|
+
if (payload.membershipPolicy.ownerMemberDids.length === 0) {
|
|
104
|
+
throw new ProtocolValidationError("Space membershipPolicy.ownerMemberDids must not be empty");
|
|
105
|
+
}
|
|
106
|
+
return {
|
|
107
|
+
objectId: envelope.objectId,
|
|
108
|
+
spaceId: envelope.objectId,
|
|
109
|
+
spaceKind: payload.spaceKind,
|
|
110
|
+
ownerRef: payload.ownerRef,
|
|
111
|
+
membershipPolicy: payload.membershipPolicy,
|
|
112
|
+
encryptionPolicy: payload.encryptionPolicy,
|
|
113
|
+
status: "active",
|
|
114
|
+
latestEventId: envelope.eventId,
|
|
115
|
+
eventIds: [envelope.eventId]
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
case "space.archived":
|
|
119
|
+
if (!currentState) {
|
|
120
|
+
throw new ProtocolConflictError("Cannot archive a space before it is created");
|
|
121
|
+
}
|
|
122
|
+
return {
|
|
123
|
+
...currentState,
|
|
124
|
+
status: "archived",
|
|
125
|
+
latestEventId: envelope.eventId,
|
|
126
|
+
eventIds: [...currentState.eventIds, envelope.eventId]
|
|
127
|
+
};
|
|
128
|
+
default:
|
|
129
|
+
throw new ProtocolValidationError(`Unsupported space event: ${envelope.eventKind}`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
export function applySpaceMembershipEvent(currentState, envelope, refs) {
|
|
133
|
+
if (envelope.objectKind !== "space-membership") {
|
|
134
|
+
throw new ProtocolValidationError("Envelope is not a space-membership event");
|
|
135
|
+
}
|
|
136
|
+
ensureLatestPredecessor(currentState, envelope, "space-membership.member-added");
|
|
137
|
+
switch (envelope.eventKind) {
|
|
138
|
+
case "space-membership.member-added": {
|
|
139
|
+
const payload = envelope.payload;
|
|
140
|
+
const space = refs.spaces.get(payload.spaceId);
|
|
141
|
+
if (!space) {
|
|
142
|
+
throw new ProtocolConflictError("Space membership target space does not exist");
|
|
143
|
+
}
|
|
144
|
+
if (currentState) {
|
|
145
|
+
throw new ProtocolConflictError("space-membership.member-added cannot be appended twice");
|
|
146
|
+
}
|
|
147
|
+
if (refs.memberships.size > 0 &&
|
|
148
|
+
!space.membershipPolicy.ownerMemberDids.includes(envelope.actorDid) &&
|
|
149
|
+
activeMembersForSpace(payload.spaceId, refs.memberships).size > 0) {
|
|
150
|
+
assertCanManageMembership(space, envelope.actorDid, refs.memberships);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
objectId: envelope.objectId,
|
|
154
|
+
spaceId: payload.spaceId,
|
|
155
|
+
memberDid: payload.memberDid,
|
|
156
|
+
role: payload.role,
|
|
157
|
+
status: "active",
|
|
158
|
+
latestEventId: envelope.eventId,
|
|
159
|
+
eventIds: [envelope.eventId]
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
case "space-membership.member-removed":
|
|
163
|
+
if (!currentState) {
|
|
164
|
+
throw new ProtocolConflictError("Cannot remove a space member before it is added");
|
|
165
|
+
}
|
|
166
|
+
assertCanManageMembership(refs.spaces.get(currentState.spaceId), envelope.actorDid, refs.memberships);
|
|
167
|
+
return {
|
|
168
|
+
...currentState,
|
|
169
|
+
status: "removed",
|
|
170
|
+
latestEventId: envelope.eventId,
|
|
171
|
+
eventIds: [...currentState.eventIds, envelope.eventId]
|
|
172
|
+
};
|
|
173
|
+
case "space-membership.member-muted":
|
|
174
|
+
if (!currentState) {
|
|
175
|
+
throw new ProtocolConflictError("Cannot mute a space member before it is added");
|
|
176
|
+
}
|
|
177
|
+
assertCanManageMembership(refs.spaces.get(currentState.spaceId), envelope.actorDid, refs.memberships);
|
|
178
|
+
return {
|
|
179
|
+
...currentState,
|
|
180
|
+
status: "muted",
|
|
181
|
+
latestEventId: envelope.eventId,
|
|
182
|
+
eventIds: [...currentState.eventIds, envelope.eventId]
|
|
183
|
+
};
|
|
184
|
+
case "space-membership.member-role-updated": {
|
|
185
|
+
if (!currentState) {
|
|
186
|
+
throw new ProtocolConflictError("Cannot update a space member role before it is added");
|
|
187
|
+
}
|
|
188
|
+
assertCanManageMembership(refs.spaces.get(currentState.spaceId), envelope.actorDid, refs.memberships);
|
|
189
|
+
const role = String(envelope.payload.role ?? "");
|
|
190
|
+
return {
|
|
191
|
+
...currentState,
|
|
192
|
+
role,
|
|
193
|
+
latestEventId: envelope.eventId,
|
|
194
|
+
eventIds: [...currentState.eventIds, envelope.eventId]
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
default:
|
|
198
|
+
throw new ProtocolValidationError(`Unsupported space-membership event: ${envelope.eventKind}`);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
export function applyMessageEvent(currentState, envelope, refs) {
|
|
202
|
+
if (envelope.objectKind !== "message") {
|
|
203
|
+
throw new ProtocolValidationError("Envelope is not a message event");
|
|
204
|
+
}
|
|
205
|
+
ensureLatestPredecessor(currentState, envelope, "message.sent");
|
|
206
|
+
switch (envelope.eventKind) {
|
|
207
|
+
case "message.sent": {
|
|
208
|
+
const payload = envelope.payload;
|
|
209
|
+
const space = refs.spaces.get(payload.spaceId);
|
|
210
|
+
if (!space) {
|
|
211
|
+
throw new ProtocolConflictError("Message target space does not exist");
|
|
212
|
+
}
|
|
213
|
+
assertActiveMember(payload.spaceId, envelope.actorDid, refs.memberships);
|
|
214
|
+
if (space.status !== "active") {
|
|
215
|
+
throw new ProtocolConflictError("Messages cannot be sent to an archived space");
|
|
216
|
+
}
|
|
217
|
+
if (payload.encryptedBody.senderDid !== envelope.actorDid) {
|
|
218
|
+
throw new ProtocolConflictError("Encrypted message senderDid must match the actor DID");
|
|
219
|
+
}
|
|
220
|
+
if (payload.sentAt) {
|
|
221
|
+
assertIsoTimestamp(payload.sentAt, "Message.sentAt");
|
|
222
|
+
}
|
|
223
|
+
return {
|
|
224
|
+
objectId: envelope.objectId,
|
|
225
|
+
spaceId: payload.spaceId,
|
|
226
|
+
senderDid: envelope.actorDid,
|
|
227
|
+
messageType: payload.messageType,
|
|
228
|
+
metadata: payload.metadata,
|
|
229
|
+
encryptedBody: payload.encryptedBody,
|
|
230
|
+
status: "sent",
|
|
231
|
+
reactions: {},
|
|
232
|
+
latestEventId: envelope.eventId,
|
|
233
|
+
eventIds: [envelope.eventId]
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
case "message.edited": {
|
|
237
|
+
if (!currentState) {
|
|
238
|
+
throw new ProtocolConflictError("Cannot edit a message before it is sent");
|
|
239
|
+
}
|
|
240
|
+
if (currentState.senderDid !== envelope.actorDid) {
|
|
241
|
+
throw new ProtocolConflictError("Only the sender can edit a message");
|
|
242
|
+
}
|
|
243
|
+
const payload = envelope.payload;
|
|
244
|
+
return {
|
|
245
|
+
...currentState,
|
|
246
|
+
metadata: payload.metadata ?? currentState.metadata,
|
|
247
|
+
encryptedBody: payload.encryptedBody,
|
|
248
|
+
status: "edited",
|
|
249
|
+
latestEventId: envelope.eventId,
|
|
250
|
+
eventIds: [...currentState.eventIds, envelope.eventId]
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
case "message.deleted":
|
|
254
|
+
if (!currentState) {
|
|
255
|
+
throw new ProtocolConflictError("Cannot delete a message before it is sent");
|
|
256
|
+
}
|
|
257
|
+
if (currentState.senderDid !== envelope.actorDid) {
|
|
258
|
+
throw new ProtocolConflictError("Only the sender can delete a message");
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
...currentState,
|
|
262
|
+
status: "deleted",
|
|
263
|
+
latestEventId: envelope.eventId,
|
|
264
|
+
eventIds: [...currentState.eventIds, envelope.eventId]
|
|
265
|
+
};
|
|
266
|
+
case "message.reacted": {
|
|
267
|
+
if (!currentState) {
|
|
268
|
+
throw new ProtocolConflictError("Cannot react to a message before it is sent");
|
|
269
|
+
}
|
|
270
|
+
assertActiveMember(currentState.spaceId, envelope.actorDid, refs.memberships);
|
|
271
|
+
const reaction = String(envelope.payload.reaction ?? "");
|
|
272
|
+
assertNonEmpty(reaction, "Message.reaction");
|
|
273
|
+
return {
|
|
274
|
+
...currentState,
|
|
275
|
+
reactions: {
|
|
276
|
+
...currentState.reactions,
|
|
277
|
+
[reaction]: [...new Set([...(currentState.reactions[reaction] ?? []), envelope.actorDid])].sort()
|
|
278
|
+
},
|
|
279
|
+
latestEventId: envelope.eventId,
|
|
280
|
+
eventIds: [...currentState.eventIds, envelope.eventId]
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
default:
|
|
284
|
+
throw new ProtocolValidationError(`Unsupported message event: ${envelope.eventKind}`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
export function spacePayloadToJson(payload) {
|
|
288
|
+
return payload;
|
|
289
|
+
}
|
|
290
|
+
export function spaceMembershipPayloadToJson(payload) {
|
|
291
|
+
return payload;
|
|
292
|
+
}
|
|
293
|
+
export function messageSentPayloadToJson(payload) {
|
|
294
|
+
return payload;
|
|
295
|
+
}
|
|
296
|
+
//# sourceMappingURL=messaging.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"messaging.js","sourceRoot":"","sources":["../../../src/protocol/messaging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Logger } from "../logger.js";
|
|
2
|
+
import { type CompanyState } from "./company.js";
|
|
3
|
+
import { type ContractState } from "./contracts.js";
|
|
4
|
+
import { type FeedbackCredentialRefState } from "./credential-reference.js";
|
|
5
|
+
import { type ProtocolEnvelope } from "./envelope.js";
|
|
6
|
+
import { type AgentProfileState } from "./identity.js";
|
|
7
|
+
import { type AgreementState, type BidState, type ListingState, type OfferState, type ProductState, type RequestState } from "./market.js";
|
|
8
|
+
import { type DisputeCaseState, type EvidenceBundleState, type OracleAttestationState } from "./resolution.js";
|
|
9
|
+
import { type MessageState, type SpaceMembershipState, type SpaceState } from "./messaging.js";
|
|
10
|
+
type ObjectState = AgentProfileState | CompanyState | ProductState | ListingState | RequestState | OfferState | BidState | AgreementState | FeedbackCredentialRefState | ContractState | EvidenceBundleState | OracleAttestationState | DisputeCaseState | SpaceState | SpaceMembershipState | MessageState;
|
|
11
|
+
interface ObjectCatalogRecord {
|
|
12
|
+
protocol: ProtocolEnvelope["protocol"];
|
|
13
|
+
version: ProtocolEnvelope["version"];
|
|
14
|
+
objectKind: ProtocolEnvelope["objectKind"];
|
|
15
|
+
objectId: string;
|
|
16
|
+
feedName: string;
|
|
17
|
+
feedKey: string;
|
|
18
|
+
headEventId: string;
|
|
19
|
+
subjectId: string;
|
|
20
|
+
actorDid: string;
|
|
21
|
+
marketplaceId: string | undefined;
|
|
22
|
+
companyDid: string | undefined;
|
|
23
|
+
updatedAt: string;
|
|
24
|
+
}
|
|
25
|
+
interface MarketplaceIndexEntry {
|
|
26
|
+
objectKind: ProtocolEnvelope["objectKind"];
|
|
27
|
+
objectId: string;
|
|
28
|
+
marketplaceId: string;
|
|
29
|
+
status: string;
|
|
30
|
+
updatedAt: string;
|
|
31
|
+
}
|
|
32
|
+
interface SpaceIndexEntry {
|
|
33
|
+
objectKind: "space" | "space-membership" | "message";
|
|
34
|
+
objectId: string;
|
|
35
|
+
spaceId: string;
|
|
36
|
+
status: string;
|
|
37
|
+
updatedAt: string;
|
|
38
|
+
}
|
|
39
|
+
interface ProtocolStateSnapshot {
|
|
40
|
+
agentProfiles: Map<string, AgentProfileState>;
|
|
41
|
+
companies: Map<string, CompanyState>;
|
|
42
|
+
products: Map<string, ProductState>;
|
|
43
|
+
listings: Map<string, ListingState>;
|
|
44
|
+
requests: Map<string, RequestState>;
|
|
45
|
+
offers: Map<string, OfferState>;
|
|
46
|
+
bids: Map<string, BidState>;
|
|
47
|
+
agreements: Map<string, AgreementState>;
|
|
48
|
+
feedbackCredentialRefs: Map<string, FeedbackCredentialRefState>;
|
|
49
|
+
contracts: Map<string, ContractState>;
|
|
50
|
+
evidenceBundles: Map<string, EvidenceBundleState>;
|
|
51
|
+
oracleAttestations: Map<string, OracleAttestationState>;
|
|
52
|
+
disputes: Map<string, DisputeCaseState>;
|
|
53
|
+
spaces: Map<string, SpaceState>;
|
|
54
|
+
spaceMemberships: Map<string, SpaceMembershipState>;
|
|
55
|
+
messages: Map<string, MessageState>;
|
|
56
|
+
}
|
|
57
|
+
export declare class ProtocolRepository {
|
|
58
|
+
private readonly store;
|
|
59
|
+
private readonly logger;
|
|
60
|
+
private readonly logs;
|
|
61
|
+
private readonly stateBee;
|
|
62
|
+
private readonly catalogBee;
|
|
63
|
+
private readonly controlBee;
|
|
64
|
+
private readonly marketBee;
|
|
65
|
+
private readonly companyBee;
|
|
66
|
+
private readonly contractBee;
|
|
67
|
+
private readonly spaceBee;
|
|
68
|
+
private readonly snapshot;
|
|
69
|
+
private constructor();
|
|
70
|
+
static create(dataDir: string, options?: {
|
|
71
|
+
logger?: Logger;
|
|
72
|
+
}): Promise<ProtocolRepository>;
|
|
73
|
+
private static openBee;
|
|
74
|
+
appendEnvelope(envelope: ProtocolEnvelope): Promise<void>;
|
|
75
|
+
getSnapshot(): Readonly<ProtocolStateSnapshot>;
|
|
76
|
+
rebuildFromLogs(): Promise<void>;
|
|
77
|
+
listMarketplaceEntries(marketplaceId: string): Promise<MarketplaceIndexEntry[]>;
|
|
78
|
+
listContractEntries(contractId: string): Promise<ObjectCatalogRecord[]>;
|
|
79
|
+
listSpaceEntries(spaceId: string): Promise<SpaceIndexEntry[]>;
|
|
80
|
+
listCatalogRecords(): Promise<ObjectCatalogRecord[]>;
|
|
81
|
+
readObjectState(objectKind: ProtocolEnvelope["objectKind"], objectId: string): Promise<ObjectState | null>;
|
|
82
|
+
close(): Promise<void>;
|
|
83
|
+
private openObjectLog;
|
|
84
|
+
private hydrateSnapshotFromStateIndex;
|
|
85
|
+
private applyToSnapshot;
|
|
86
|
+
}
|
|
87
|
+
export {};
|