@towns-protocol/encryption 0.0.253 → 0.0.256
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/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
- package/dist/decryptionExtensions.d.ts +0 -200
- package/dist/decryptionExtensions.d.ts.map +0 -1
- package/dist/decryptionExtensions.js +0 -688
- package/dist/decryptionExtensions.js.map +0 -1
- package/dist/tests/decryptionExtensions.test.d.ts +0 -2
- package/dist/tests/decryptionExtensions.test.d.ts.map +0 -1
- package/dist/tests/decryptionExtensions.test.js +0 -355
- package/dist/tests/decryptionExtensions.test.js.map +0 -1
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;4EAE4E;AAC5E,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;4EAE4E;AAC5E,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;4EAE4E;AAC5E,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;4EAE4E;AAC5E,cAAc,QAAQ,CAAA;AACtB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,eAAe,CAAA;AAC7B,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AACjC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,yBAAyB,CAAA;AACvC,cAAc,UAAU,CAAA;AACxB,cAAc,cAAc,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@towns-protocol/encryption",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.256",
|
|
4
4
|
"packageManager": "yarn@3.8.0",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,10 +22,10 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@bufbuild/protobuf": "^2.2.2",
|
|
25
|
-
"@towns-protocol/dlog": "^0.0.
|
|
25
|
+
"@towns-protocol/dlog": "^0.0.256",
|
|
26
26
|
"@towns-protocol/olm": "3.2.28",
|
|
27
|
-
"@towns-protocol/proto": "^0.0.
|
|
28
|
-
"@towns-protocol/web3": "^0.0.
|
|
27
|
+
"@towns-protocol/proto": "^0.0.256",
|
|
28
|
+
"@towns-protocol/web3": "^0.0.256",
|
|
29
29
|
"debug": "^4.3.4",
|
|
30
30
|
"dexie": "^4.0.7",
|
|
31
31
|
"ethers": "^5.7.2",
|
|
@@ -49,5 +49,5 @@
|
|
|
49
49
|
"files": [
|
|
50
50
|
"dist"
|
|
51
51
|
],
|
|
52
|
-
"gitHead": "
|
|
52
|
+
"gitHead": "3bbbc9aa2748e77c7a1f3c9872111018951e7119"
|
|
53
53
|
}
|
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
import TypedEmitter from 'typed-emitter';
|
|
2
|
-
import { Permission } from '@towns-protocol/web3';
|
|
3
|
-
import { AddEventResponse_Error, EncryptedData, SessionKeys, UserInboxPayload_GroupEncryptionSessions } from '@towns-protocol/proto';
|
|
4
|
-
import { DLogger } from '@towns-protocol/dlog';
|
|
5
|
-
import { GroupEncryptionAlgorithmId, GroupEncryptionSession, UserDevice } from './olmLib';
|
|
6
|
-
import { GroupEncryptionCrypto } from './groupEncryptionCrypto';
|
|
7
|
-
export interface EntitlementsDelegate {
|
|
8
|
-
isEntitled(spaceId: string | undefined, channelId: string | undefined, user: string, permission: Permission): Promise<boolean>;
|
|
9
|
-
}
|
|
10
|
-
export declare enum DecryptionStatus {
|
|
11
|
-
initializing = "initializing",
|
|
12
|
-
updating = "updating",
|
|
13
|
-
working = "working",
|
|
14
|
-
idle = "idle",
|
|
15
|
-
done = "done"
|
|
16
|
-
}
|
|
17
|
-
export type DecryptionEvents = {
|
|
18
|
-
decryptionExtStatusChanged: (status: DecryptionStatus) => void;
|
|
19
|
-
};
|
|
20
|
-
export interface NewGroupSessionItem {
|
|
21
|
-
streamId: string;
|
|
22
|
-
sessions: UserInboxPayload_GroupEncryptionSessions;
|
|
23
|
-
}
|
|
24
|
-
export interface EncryptedContentItem {
|
|
25
|
-
streamId: string;
|
|
26
|
-
eventId: string;
|
|
27
|
-
kind: string;
|
|
28
|
-
encryptedData: EncryptedData;
|
|
29
|
-
}
|
|
30
|
-
export interface KeySolicitationContent {
|
|
31
|
-
deviceKey: string;
|
|
32
|
-
fallbackKey: string;
|
|
33
|
-
isNewDevice: boolean;
|
|
34
|
-
sessionIds: string[];
|
|
35
|
-
}
|
|
36
|
-
export interface EventSignatureBundle {
|
|
37
|
-
hash: Uint8Array;
|
|
38
|
-
signature: Uint8Array | undefined;
|
|
39
|
-
event: {
|
|
40
|
-
creatorAddress: Uint8Array;
|
|
41
|
-
delegateSig: Uint8Array;
|
|
42
|
-
delegateExpiryEpochMs: bigint;
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
export interface KeySolicitationItem {
|
|
46
|
-
streamId: string;
|
|
47
|
-
fromUserId: string;
|
|
48
|
-
fromUserAddress: Uint8Array;
|
|
49
|
-
solicitation: KeySolicitationContent;
|
|
50
|
-
respondAfter: number;
|
|
51
|
-
sigBundle: EventSignatureBundle;
|
|
52
|
-
hashStr: string;
|
|
53
|
-
}
|
|
54
|
-
export interface KeySolicitationData {
|
|
55
|
-
streamId: string;
|
|
56
|
-
isNewDevice: boolean;
|
|
57
|
-
missingSessionIds: string[];
|
|
58
|
-
}
|
|
59
|
-
export interface KeyFulfilmentData {
|
|
60
|
-
streamId: string;
|
|
61
|
-
userAddress: Uint8Array;
|
|
62
|
-
deviceKey: string;
|
|
63
|
-
sessionIds: string[];
|
|
64
|
-
}
|
|
65
|
-
export interface GroupSessionsData {
|
|
66
|
-
streamId: string;
|
|
67
|
-
item: KeySolicitationItem;
|
|
68
|
-
sessions: GroupEncryptionSession[];
|
|
69
|
-
algorithm: GroupEncryptionAlgorithmId;
|
|
70
|
-
}
|
|
71
|
-
export interface DecryptionSessionError {
|
|
72
|
-
missingSession: boolean;
|
|
73
|
-
kind: string;
|
|
74
|
-
encryptedData: EncryptedData;
|
|
75
|
-
error?: unknown;
|
|
76
|
-
}
|
|
77
|
-
/**
|
|
78
|
-
*
|
|
79
|
-
* Responsibilities:
|
|
80
|
-
* 1. Download new to-device messages that happened while we were offline
|
|
81
|
-
* 2. Decrypt new to-device messages
|
|
82
|
-
* 3. Decrypt encrypted content
|
|
83
|
-
* 4. Retry decryption failures, request keys for failed decryption
|
|
84
|
-
* 5. Respond to key solicitations
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
* Notes:
|
|
88
|
-
* If in the future we started snapshotting the eventNum of the last message sent by every user,
|
|
89
|
-
* we could use that to determine the order we send out keys, and the order that we reply to key solicitations.
|
|
90
|
-
*
|
|
91
|
-
* It should be easy to introduce a priority stream, where we decrypt messages from that stream first, before
|
|
92
|
-
* anything else, so the messages show up quicky in the ui that the user is looking at.
|
|
93
|
-
*
|
|
94
|
-
* We need code to purge bad sessions (if someones sends us the wrong key, or a key that doesn't decrypt the message)
|
|
95
|
-
*/
|
|
96
|
-
export declare abstract class BaseDecryptionExtensions {
|
|
97
|
-
private _status;
|
|
98
|
-
private mainQueues;
|
|
99
|
-
private streamQueues;
|
|
100
|
-
private upToDateStreams;
|
|
101
|
-
private highPriorityIds;
|
|
102
|
-
private recentStreamIds;
|
|
103
|
-
private decryptionFailures;
|
|
104
|
-
private inProgressTick?;
|
|
105
|
-
private timeoutId?;
|
|
106
|
-
private delayMs;
|
|
107
|
-
private started;
|
|
108
|
-
private numRecentStreamIds;
|
|
109
|
-
private emitter;
|
|
110
|
-
protected _onStopFn?: () => void;
|
|
111
|
-
protected log: {
|
|
112
|
-
debug: DLogger;
|
|
113
|
-
info: DLogger;
|
|
114
|
-
error: DLogger;
|
|
115
|
-
};
|
|
116
|
-
readonly crypto: GroupEncryptionCrypto;
|
|
117
|
-
readonly entitlementDelegate: EntitlementsDelegate;
|
|
118
|
-
readonly userDevice: UserDevice;
|
|
119
|
-
readonly userId: string;
|
|
120
|
-
constructor(emitter: TypedEmitter<DecryptionEvents>, crypto: GroupEncryptionCrypto, entitlementDelegate: EntitlementsDelegate, userDevice: UserDevice, userId: string, upToDateStreams: Set<string>, inLogId: string);
|
|
121
|
-
abstract ackNewGroupSession(session: UserInboxPayload_GroupEncryptionSessions): Promise<void>;
|
|
122
|
-
abstract decryptGroupEvent(streamId: string, eventId: string, kind: string, encryptedData: EncryptedData): Promise<void>;
|
|
123
|
-
abstract downloadNewMessages(): Promise<void>;
|
|
124
|
-
abstract getKeySolicitations(streamId: string): KeySolicitationContent[];
|
|
125
|
-
abstract hasStream(streamId: string): boolean;
|
|
126
|
-
abstract isUserEntitledToKeyExchange(streamId: string, userId: string, opts?: {
|
|
127
|
-
skipOnChainValidation: boolean;
|
|
128
|
-
}): Promise<boolean>;
|
|
129
|
-
abstract isValidEvent(item: KeySolicitationItem): {
|
|
130
|
-
isValid: boolean;
|
|
131
|
-
reason?: string;
|
|
132
|
-
};
|
|
133
|
-
abstract isUserInboxStreamUpToDate(upToDateStreams: Set<string>): boolean;
|
|
134
|
-
abstract onDecryptionError(item: EncryptedContentItem, err: DecryptionSessionError): void;
|
|
135
|
-
abstract sendKeySolicitation(args: KeySolicitationData): Promise<void>;
|
|
136
|
-
abstract sendKeyFulfillment(args: KeyFulfilmentData): Promise<{
|
|
137
|
-
error?: AddEventResponse_Error;
|
|
138
|
-
}>;
|
|
139
|
-
abstract encryptAndShareGroupSessions(args: GroupSessionsData): Promise<void>;
|
|
140
|
-
abstract shouldPauseTicking(): boolean;
|
|
141
|
-
/**
|
|
142
|
-
* uploadDeviceKeys
|
|
143
|
-
* upload device keys to the server
|
|
144
|
-
*/
|
|
145
|
-
abstract uploadDeviceKeys(): Promise<void>;
|
|
146
|
-
abstract getPriorityForStream(streamId: string, highPriorityIds: Set<string>, recentStreamIds: Set<string>): number;
|
|
147
|
-
enqueueNewGroupSessions(sessions: UserInboxPayload_GroupEncryptionSessions, _senderId: string): void;
|
|
148
|
-
enqueueNewEncryptedContent(streamId: string, eventId: string, kind: string, // kind of encrypted data
|
|
149
|
-
encryptedData: EncryptedData): void;
|
|
150
|
-
enqueueInitKeySolicitations(streamId: string, eventHashStr: string, members: {
|
|
151
|
-
userId: string;
|
|
152
|
-
userAddress: Uint8Array;
|
|
153
|
-
solicitations: KeySolicitationContent[];
|
|
154
|
-
}[], sigBundle: EventSignatureBundle): void;
|
|
155
|
-
enqueueKeySolicitation(streamId: string, eventHashStr: string, fromUserId: string, fromUserAddress: Uint8Array, keySolicitation: KeySolicitationContent, sigBundle: EventSignatureBundle): void;
|
|
156
|
-
setStreamUpToDate(streamId: string): void;
|
|
157
|
-
resetUpToDateStreams(): void;
|
|
158
|
-
retryDecryptionFailures(streamId: string): void;
|
|
159
|
-
start(): void;
|
|
160
|
-
enqueueNewMessageDownload(): void;
|
|
161
|
-
onStart(): void;
|
|
162
|
-
stop(): Promise<void>;
|
|
163
|
-
onStop(): Promise<void>;
|
|
164
|
-
get status(): DecryptionStatus;
|
|
165
|
-
private setStatus;
|
|
166
|
-
private compareStreamIds;
|
|
167
|
-
private lastPrintedAt;
|
|
168
|
-
protected checkStartTicking(): void;
|
|
169
|
-
private stopTicking;
|
|
170
|
-
private getDelayMs;
|
|
171
|
-
private tick;
|
|
172
|
-
/**
|
|
173
|
-
* processNewGroupSession
|
|
174
|
-
* process new group sessions that were sent to our to device stream inbox
|
|
175
|
-
* re-enqueue any decryption failures with matching session id
|
|
176
|
-
*/
|
|
177
|
-
private processNewGroupSession;
|
|
178
|
-
/**
|
|
179
|
-
* processEncryptedContentItem
|
|
180
|
-
* try to decrypt encrytped content
|
|
181
|
-
*/
|
|
182
|
-
private processEncryptedContentItem;
|
|
183
|
-
/**
|
|
184
|
-
* processMissingKeys
|
|
185
|
-
* process missing keys and send key solicitations to streams
|
|
186
|
-
*/
|
|
187
|
-
private processMissingKeys;
|
|
188
|
-
/**
|
|
189
|
-
* processKeySolicitation
|
|
190
|
-
* process incoming key solicitations and send keys and key fulfillments
|
|
191
|
-
*/
|
|
192
|
-
private processKeySolicitation;
|
|
193
|
-
/**
|
|
194
|
-
* can be overridden to add a delay to the key solicitation response
|
|
195
|
-
*/
|
|
196
|
-
getRespondDelayMSForKeySolicitation(_streamId: string, _userId: string): number;
|
|
197
|
-
setHighPriorityStreams(streamIds: string[]): void;
|
|
198
|
-
}
|
|
199
|
-
export declare function makeSessionKeys(sessions: GroupEncryptionSession[]): SessionKeys;
|
|
200
|
-
//# sourceMappingURL=decryptionExtensions.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decryptionExtensions.d.ts","sourceRoot":"","sources":["../src/decryptionExtensions.ts"],"names":[],"mappings":"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"}
|