@vex-chat/libvex 1.1.0 → 2.0.0
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/README.md +103 -41
- package/dist/Client.d.ts +440 -551
- package/dist/Client.d.ts.map +1 -0
- package/dist/Client.js +1566 -1502
- package/dist/Client.js.map +1 -1
- package/dist/Storage.d.ts +111 -0
- package/dist/Storage.d.ts.map +1 -0
- package/dist/Storage.js +2 -0
- package/dist/Storage.js.map +1 -0
- package/dist/__tests__/harness/memory-storage.d.ts +29 -27
- package/dist/__tests__/harness/memory-storage.d.ts.map +1 -0
- package/dist/__tests__/harness/memory-storage.js +120 -109
- package/dist/__tests__/harness/memory-storage.js.map +1 -1
- package/dist/codec.d.ts +44 -0
- package/dist/codec.d.ts.map +1 -0
- package/dist/codec.js +51 -0
- package/dist/codec.js.map +1 -0
- package/dist/codecs.d.ts +201 -0
- package/dist/codecs.d.ts.map +1 -0
- package/dist/codecs.js +67 -0
- package/dist/codecs.js.map +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/keystore/memory.d.ts +5 -4
- package/dist/keystore/memory.d.ts.map +1 -0
- package/dist/keystore/memory.js +9 -7
- package/dist/keystore/memory.js.map +1 -1
- package/dist/keystore/node.d.ts +6 -5
- package/dist/keystore/node.d.ts.map +1 -0
- package/dist/keystore/node.js +38 -19
- package/dist/keystore/node.js.map +1 -1
- package/dist/preset/common.d.ts +9 -0
- package/dist/preset/common.d.ts.map +1 -0
- package/dist/preset/common.js +2 -0
- package/dist/preset/common.js.map +1 -0
- package/dist/preset/node.d.ts +3 -5
- package/dist/preset/node.d.ts.map +1 -0
- package/dist/preset/node.js +5 -8
- package/dist/preset/node.js.map +1 -1
- package/dist/preset/test.d.ts +4 -4
- package/dist/preset/test.d.ts.map +1 -0
- package/dist/preset/test.js +8 -11
- package/dist/preset/test.js.map +1 -1
- package/dist/storage/node.d.ts +4 -3
- package/dist/storage/node.d.ts.map +1 -0
- package/dist/storage/node.js +4 -4
- package/dist/storage/node.js.map +1 -1
- package/dist/storage/schema.d.ts +55 -54
- package/dist/storage/schema.d.ts.map +1 -0
- package/dist/storage/sqlite.d.ts +33 -28
- package/dist/storage/sqlite.d.ts.map +1 -0
- package/dist/storage/sqlite.js +330 -291
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/transport/types.d.ts +23 -16
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/websocket.d.ts +26 -0
- package/dist/transport/websocket.d.ts.map +1 -0
- package/dist/transport/websocket.js +83 -0
- package/dist/transport/websocket.js.map +1 -0
- package/dist/types/crypto.d.ts +35 -0
- package/dist/types/crypto.d.ts.map +1 -0
- package/dist/types/crypto.js +9 -0
- package/dist/types/crypto.js.map +1 -0
- package/dist/types/identity.d.ts +17 -0
- package/dist/types/identity.d.ts.map +1 -0
- package/dist/types/identity.js +6 -0
- package/dist/types/identity.js.map +1 -0
- package/dist/types/index.d.ts +3 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/capitalize.d.ts +1 -0
- package/dist/utils/capitalize.d.ts.map +1 -0
- package/dist/utils/createLogger.d.ts +1 -0
- package/dist/utils/createLogger.d.ts.map +1 -0
- package/dist/utils/createLogger.js +3 -3
- package/dist/utils/createLogger.js.map +1 -1
- package/dist/utils/formatBytes.d.ts +1 -0
- package/dist/utils/formatBytes.d.ts.map +1 -0
- package/dist/utils/formatBytes.js +3 -1
- package/dist/utils/formatBytes.js.map +1 -1
- package/dist/utils/sqlSessionToCrypto.d.ts +4 -2
- package/dist/utils/sqlSessionToCrypto.d.ts.map +1 -0
- package/dist/utils/sqlSessionToCrypto.js +5 -5
- package/dist/utils/sqlSessionToCrypto.js.map +1 -1
- package/dist/utils/uint8uuid.d.ts +1 -4
- package/dist/utils/uint8uuid.d.ts.map +1 -0
- package/dist/utils/uint8uuid.js +1 -7
- package/dist/utils/uint8uuid.js.map +1 -1
- package/package.json +58 -83
- package/src/Client.ts +3304 -0
- package/{dist/IStorage.d.ts → src/Storage.ts} +70 -62
- package/src/__tests__/codec.test.ts +251 -0
- package/src/__tests__/ghost.png +0 -0
- package/src/__tests__/harness/fixtures.ts +22 -0
- package/src/__tests__/harness/memory-storage.ts +254 -0
- package/src/__tests__/harness/platform-transports.ts +17 -0
- package/src/__tests__/harness/poison-node-imports.ts +108 -0
- package/src/__tests__/harness/shared-suite.ts +446 -0
- package/src/__tests__/platform-browser.test.ts +19 -0
- package/src/__tests__/platform-node.test.ts +10 -0
- package/src/__tests__/triggered.png +0 -0
- package/src/codec.ts +68 -0
- package/src/codecs.ts +101 -0
- package/src/index.ts +33 -0
- package/src/keystore/memory.ts +30 -0
- package/src/keystore/node.ts +91 -0
- package/src/preset/common.ts +13 -0
- package/src/preset/node.ts +34 -0
- package/src/preset/test.ts +37 -0
- package/src/storage/node.ts +33 -0
- package/src/storage/schema.ts +94 -0
- package/src/storage/sqlite.ts +676 -0
- package/src/transport/types.ts +29 -0
- package/src/transport/websocket.ts +106 -0
- package/src/types/crypto.ts +39 -0
- package/src/types/identity.ts +18 -0
- package/src/types/index.ts +9 -0
- package/src/utils/capitalize.ts +6 -0
- package/src/utils/createLogger.ts +37 -0
- package/src/utils/formatBytes.ts +15 -0
- package/src/utils/sqlSessionToCrypto.ts +16 -0
- package/src/utils/uint8uuid.ts +7 -0
- package/dist/IStorage.js +0 -2
- package/dist/IStorage.js.map +0 -1
- package/dist/keystore/types.d.ts +0 -4
- package/dist/keystore/types.js +0 -2
- package/dist/keystore/types.js.map +0 -1
- package/dist/preset/expo.d.ts +0 -2
- package/dist/preset/expo.js +0 -39
- package/dist/preset/expo.js.map +0 -1
- package/dist/preset/tauri.d.ts +0 -2
- package/dist/preset/tauri.js +0 -36
- package/dist/preset/tauri.js.map +0 -1
- package/dist/preset/types.d.ts +0 -14
- package/dist/preset/types.js +0 -2
- package/dist/preset/types.js.map +0 -1
- package/dist/storage/expo.d.ts +0 -3
- package/dist/storage/expo.js +0 -18
- package/dist/storage/expo.js.map +0 -1
- package/dist/storage/tauri.d.ts +0 -3
- package/dist/storage/tauri.js +0 -21
- package/dist/storage/tauri.js.map +0 -1
- package/dist/transport/browser.d.ts +0 -17
- package/dist/transport/browser.js +0 -56
- package/dist/transport/browser.js.map +0 -1
- package/dist/utils/constants.d.ts +0 -8
- package/dist/utils/constants.js +0 -9
- package/dist/utils/constants.js.map +0 -1
|
@@ -1,68 +1,145 @@
|
|
|
1
|
+
import { xBoxKeyPairFromSecret, XKeyConvert, xSecretbox, xSecretboxOpen, xSignKeyPairFromSecret, XUtils, } from "@vex-chat/crypto";
|
|
1
2
|
/**
|
|
2
|
-
* Minimal in-memory
|
|
3
|
+
* Minimal in-memory Storage for browser/RN platform tests.
|
|
3
4
|
*
|
|
4
5
|
* Uses eventemitter3 (browser-safe) instead of Node's events module.
|
|
5
6
|
* No persistence — just enough for the register/login/connect/DM test flow.
|
|
6
7
|
*/
|
|
7
8
|
import { EventEmitter } from "eventemitter3";
|
|
8
|
-
import { XKeyConvert, XUtils } from "@vex-chat/crypto";
|
|
9
|
-
import nacl from "tweetnacl";
|
|
10
9
|
export class MemoryStorage extends EventEmitter {
|
|
11
10
|
ready = false;
|
|
12
|
-
messages = [];
|
|
13
|
-
sessions = [];
|
|
14
|
-
preKeys = [];
|
|
15
|
-
oneTimeKeys = [];
|
|
16
11
|
devices = [];
|
|
17
12
|
idKeys;
|
|
18
|
-
|
|
13
|
+
messages = [];
|
|
19
14
|
nextOtkIndex = 1;
|
|
15
|
+
nextPreKeyIndex = 1;
|
|
16
|
+
oneTimeKeys = [];
|
|
17
|
+
preKeys = [];
|
|
18
|
+
sessions = [];
|
|
20
19
|
constructor(SK) {
|
|
21
20
|
super();
|
|
22
|
-
const idKeys = XKeyConvert.convertKeyPair(
|
|
21
|
+
const idKeys = XKeyConvert.convertKeyPair(xSignKeyPairFromSecret(XUtils.decodeHex(SK)));
|
|
23
22
|
if (!idKeys)
|
|
24
23
|
throw new Error("Can't convert SK!");
|
|
25
24
|
this.idKeys = idKeys;
|
|
26
25
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
this.emit("ready");
|
|
26
|
+
close() {
|
|
27
|
+
return Promise.resolve();
|
|
30
28
|
}
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
deleteHistory(channelOrUserID) {
|
|
30
|
+
this.messages = this.messages.filter((m) => m.group !== channelOrUserID &&
|
|
31
|
+
m.authorID !== channelOrUserID &&
|
|
32
|
+
m.readerID !== channelOrUserID);
|
|
33
|
+
return Promise.resolve();
|
|
36
34
|
}
|
|
37
|
-
|
|
35
|
+
deleteMessage(mailID) {
|
|
38
36
|
this.messages = this.messages.filter((m) => m.mailID !== mailID);
|
|
37
|
+
return Promise.resolve();
|
|
39
38
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
s.verified = true;
|
|
39
|
+
deleteOneTimeKey(index) {
|
|
40
|
+
this.oneTimeKeys = this.oneTimeKeys.filter((k) => k.index !== index);
|
|
41
|
+
return Promise.resolve();
|
|
44
42
|
}
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
s.
|
|
43
|
+
getAllSessions() {
|
|
44
|
+
return Promise.resolve(this.sessions.map((s) => ({
|
|
45
|
+
...s,
|
|
46
|
+
verified: s.verified,
|
|
47
|
+
})));
|
|
48
|
+
}
|
|
49
|
+
getDevice(deviceID) {
|
|
50
|
+
return Promise.resolve(this.devices.find((d) => d.deviceID === deviceID) ?? null);
|
|
51
|
+
}
|
|
52
|
+
getGroupHistory(channelID) {
|
|
53
|
+
return Promise.resolve(this.messages
|
|
54
|
+
.filter((m) => m.group === channelID)
|
|
55
|
+
.map((m) => this.decryptMessage(m)));
|
|
49
56
|
}
|
|
50
|
-
|
|
51
|
-
return this.messages
|
|
57
|
+
getMessageHistory(userID) {
|
|
58
|
+
return Promise.resolve(this.messages
|
|
52
59
|
.filter((m) => (m.direction === "incoming" &&
|
|
53
60
|
m.authorID === userID &&
|
|
54
61
|
!m.group) ||
|
|
55
62
|
(m.direction === "outgoing" &&
|
|
56
63
|
m.readerID === userID &&
|
|
57
64
|
!m.group))
|
|
58
|
-
.map((m) => this.decryptMessage(m));
|
|
65
|
+
.map((m) => this.decryptMessage(m)));
|
|
59
66
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
67
|
+
getOneTimeKey(index) {
|
|
68
|
+
const otk = this.oneTimeKeys.find((k) => k.index === index);
|
|
69
|
+
if (!otk || !otk.privateKey)
|
|
70
|
+
return Promise.resolve(null);
|
|
71
|
+
return Promise.resolve({
|
|
72
|
+
index: otk.index,
|
|
73
|
+
keyPair: xBoxKeyPairFromSecret(XUtils.decodeHex(otk.privateKey)),
|
|
74
|
+
signature: XUtils.decodeHex(otk.signature),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
getPreKeys() {
|
|
78
|
+
if (this.preKeys.length === 0)
|
|
79
|
+
return Promise.resolve(null);
|
|
80
|
+
const pk = this.preKeys[0];
|
|
81
|
+
if (!pk.privateKey)
|
|
82
|
+
return Promise.resolve(null);
|
|
83
|
+
return Promise.resolve({
|
|
84
|
+
index: pk.index,
|
|
85
|
+
keyPair: xBoxKeyPairFromSecret(XUtils.decodeHex(pk.privateKey)),
|
|
86
|
+
signature: XUtils.decodeHex(pk.signature),
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
getSessionByDeviceID(deviceID) {
|
|
90
|
+
const s = this.sessions.find((s) => s.deviceID === deviceID);
|
|
91
|
+
if (!s)
|
|
92
|
+
return Promise.resolve(null);
|
|
93
|
+
return Promise.resolve(this.sqlToCrypto(s));
|
|
94
|
+
}
|
|
95
|
+
getSessionByPublicKey(publicKey) {
|
|
96
|
+
const hex = XUtils.encodeHex(publicKey);
|
|
97
|
+
const s = this.sessions.find((s) => s.publicKey === hex);
|
|
98
|
+
if (!s)
|
|
99
|
+
return Promise.resolve(null);
|
|
100
|
+
return Promise.resolve(this.sqlToCrypto(s));
|
|
101
|
+
}
|
|
102
|
+
init() {
|
|
103
|
+
this.ready = true;
|
|
104
|
+
this.emit("ready");
|
|
105
|
+
return Promise.resolve();
|
|
106
|
+
}
|
|
107
|
+
markSessionUsed(sessionID) {
|
|
108
|
+
const s = this.sessions.find((s) => s.sessionID === sessionID);
|
|
109
|
+
if (s)
|
|
110
|
+
s.lastUsed = new Date().toISOString();
|
|
111
|
+
return Promise.resolve();
|
|
64
112
|
}
|
|
65
|
-
|
|
113
|
+
markSessionVerified(sessionID) {
|
|
114
|
+
const s = this.sessions.find((s) => s.sessionID === sessionID);
|
|
115
|
+
if (s)
|
|
116
|
+
s.verified = true;
|
|
117
|
+
return Promise.resolve();
|
|
118
|
+
}
|
|
119
|
+
purgeHistory() {
|
|
120
|
+
this.messages = [];
|
|
121
|
+
return Promise.resolve();
|
|
122
|
+
}
|
|
123
|
+
purgeKeyData() {
|
|
124
|
+
this.sessions = [];
|
|
125
|
+
this.preKeys = [];
|
|
126
|
+
this.oneTimeKeys = [];
|
|
127
|
+
this.messages = [];
|
|
128
|
+
return Promise.resolve();
|
|
129
|
+
}
|
|
130
|
+
saveDevice(device) {
|
|
131
|
+
if (!this.devices.find((d) => d.deviceID === device.deviceID)) {
|
|
132
|
+
this.devices.push(device);
|
|
133
|
+
}
|
|
134
|
+
return Promise.resolve();
|
|
135
|
+
}
|
|
136
|
+
saveMessage(message) {
|
|
137
|
+
const copy = { ...message };
|
|
138
|
+
copy.message = XUtils.encodeHex(xSecretbox(XUtils.decodeUTF8(message.message), XUtils.decodeHex(message.nonce), this.idKeys.secretKey));
|
|
139
|
+
this.messages.push(copy);
|
|
140
|
+
return Promise.resolve();
|
|
141
|
+
}
|
|
142
|
+
savePreKeys(preKeys, oneTime) {
|
|
66
143
|
const added = [];
|
|
67
144
|
for (const pk of preKeys) {
|
|
68
145
|
const idx = oneTime ? this.nextOtkIndex++ : this.nextPreKeyIndex++;
|
|
@@ -83,84 +160,18 @@ export class MemoryStorage extends EventEmitter {
|
|
|
83
160
|
signature: row.signature,
|
|
84
161
|
});
|
|
85
162
|
}
|
|
86
|
-
return added;
|
|
87
|
-
}
|
|
88
|
-
async getPreKeys() {
|
|
89
|
-
if (this.preKeys.length === 0)
|
|
90
|
-
return null;
|
|
91
|
-
const pk = this.preKeys[0];
|
|
92
|
-
if (!pk.privateKey)
|
|
93
|
-
return null;
|
|
94
|
-
return {
|
|
95
|
-
keyPair: nacl.box.keyPair.fromSecretKey(XUtils.decodeHex(pk.privateKey)),
|
|
96
|
-
signature: XUtils.decodeHex(pk.signature),
|
|
97
|
-
};
|
|
98
|
-
}
|
|
99
|
-
async getOneTimeKey(index) {
|
|
100
|
-
const otk = this.oneTimeKeys.find((k) => k.index === index);
|
|
101
|
-
if (!otk || !otk.privateKey)
|
|
102
|
-
return null;
|
|
103
|
-
return {
|
|
104
|
-
keyPair: nacl.box.keyPair.fromSecretKey(XUtils.decodeHex(otk.privateKey)),
|
|
105
|
-
signature: XUtils.decodeHex(otk.signature),
|
|
106
|
-
index: otk.index,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
async deleteOneTimeKey(index) {
|
|
110
|
-
this.oneTimeKeys = this.oneTimeKeys.filter((k) => k.index !== index);
|
|
111
|
-
}
|
|
112
|
-
async getSessionByPublicKey(publicKey) {
|
|
113
|
-
const hex = XUtils.encodeHex(publicKey);
|
|
114
|
-
const s = this.sessions.find((s) => s.publicKey === hex);
|
|
115
|
-
if (!s)
|
|
116
|
-
return null;
|
|
117
|
-
return this.sqlToCrypto(s);
|
|
118
|
-
}
|
|
119
|
-
async getAllSessions() {
|
|
120
|
-
return this.sessions.map((s) => ({
|
|
121
|
-
...s,
|
|
122
|
-
verified: Boolean(s.verified),
|
|
123
|
-
}));
|
|
163
|
+
return Promise.resolve(added);
|
|
124
164
|
}
|
|
125
|
-
|
|
126
|
-
const s = this.sessions.find((s) => s.deviceID === deviceID);
|
|
127
|
-
if (!s)
|
|
128
|
-
return null;
|
|
129
|
-
return this.sqlToCrypto(s);
|
|
130
|
-
}
|
|
131
|
-
async saveSession(session) {
|
|
165
|
+
saveSession(session) {
|
|
132
166
|
if (!this.sessions.find((s) => s.SK === session.SK)) {
|
|
133
167
|
this.sessions.push(session);
|
|
134
168
|
}
|
|
135
|
-
|
|
136
|
-
async getDevice(deviceID) {
|
|
137
|
-
return this.devices.find((d) => d.deviceID === deviceID) ?? null;
|
|
138
|
-
}
|
|
139
|
-
async saveDevice(device) {
|
|
140
|
-
if (!this.devices.find((d) => d.deviceID === device.deviceID)) {
|
|
141
|
-
this.devices.push(device);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
async purgeHistory() {
|
|
145
|
-
this.messages = [];
|
|
146
|
-
}
|
|
147
|
-
async purgeKeyData() {
|
|
148
|
-
this.sessions = [];
|
|
149
|
-
this.preKeys = [];
|
|
150
|
-
this.oneTimeKeys = [];
|
|
151
|
-
this.messages = [];
|
|
152
|
-
}
|
|
153
|
-
async deleteHistory(channelOrUserID) {
|
|
154
|
-
this.messages = this.messages.filter((m) => m.group !== channelOrUserID &&
|
|
155
|
-
m.authorID !== channelOrUserID &&
|
|
156
|
-
m.readerID !== channelOrUserID);
|
|
169
|
+
return Promise.resolve();
|
|
157
170
|
}
|
|
158
171
|
decryptMessage(msg) {
|
|
159
172
|
const copy = { ...msg };
|
|
160
|
-
copy.timestamp = new Date(copy.timestamp);
|
|
161
|
-
copy.decrypted = Boolean(copy.decrypted);
|
|
162
173
|
if (copy.decrypted) {
|
|
163
|
-
const dec =
|
|
174
|
+
const dec = xSecretboxOpen(XUtils.decodeHex(copy.message), XUtils.decodeHex(copy.nonce), this.idKeys.secretKey);
|
|
164
175
|
if (dec)
|
|
165
176
|
copy.message = XUtils.encodeUTF8(dec);
|
|
166
177
|
}
|
|
@@ -168,13 +179,13 @@ export class MemoryStorage extends EventEmitter {
|
|
|
168
179
|
}
|
|
169
180
|
sqlToCrypto(s) {
|
|
170
181
|
return {
|
|
171
|
-
|
|
172
|
-
|
|
182
|
+
fingerprint: XUtils.decodeHex(s.fingerprint),
|
|
183
|
+
lastUsed: s.lastUsed,
|
|
173
184
|
mode: s.mode,
|
|
174
|
-
SK: XUtils.decodeHex(s.SK),
|
|
175
185
|
publicKey: XUtils.decodeHex(s.publicKey),
|
|
176
|
-
|
|
177
|
-
|
|
186
|
+
sessionID: s.sessionID,
|
|
187
|
+
SK: XUtils.decodeHex(s.SK),
|
|
188
|
+
userID: s.userID,
|
|
178
189
|
};
|
|
179
190
|
}
|
|
180
191
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../../src/__tests__/harness/memory-storage.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"memory-storage.js","sourceRoot":"","sources":["../../../src/__tests__/harness/memory-storage.ts"],"names":[],"mappings":"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"}
|
package/dist/codec.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe codec factory for msgpack encode/decode with optional Zod validation.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { MailWSSchema } from "@vex-chat/types";
|
|
6
|
+
* const MailCodec = createCodec(MailWSSchema);
|
|
7
|
+
*
|
|
8
|
+
* // SDK/Apps (trusted internal) — fast, typed, no Zod overhead:
|
|
9
|
+
* const msg = MailCodec.decode(data);
|
|
10
|
+
*
|
|
11
|
+
* // Spire (trust boundary) — validates at runtime:
|
|
12
|
+
* const msg = MailCodec.decodeSafe(data);
|
|
13
|
+
*/
|
|
14
|
+
import type { z } from "zod/v4";
|
|
15
|
+
/**
|
|
16
|
+
* Creates a type-safe codec for msgpack encode/decode.
|
|
17
|
+
*
|
|
18
|
+
* @param schema - A Zod schema to validate against
|
|
19
|
+
* @returns An object with encode, decode, encodeSafe, and decodeSafe methods
|
|
20
|
+
*/
|
|
21
|
+
export declare function createCodec<T extends z.ZodType>(schema: T): {
|
|
22
|
+
/** Decode msgpack data — typed but not validated. Fast path for SDK. */
|
|
23
|
+
decode: (data: Uint8Array) => z.core.output<T>;
|
|
24
|
+
/** Decode + validate with Zod. Safe path for trust boundaries (Spire). */
|
|
25
|
+
decodeSafe: (data: Uint8Array) => z.core.output<T>;
|
|
26
|
+
/** Encode to msgpack — typed but not validated. */
|
|
27
|
+
encode: (msg: z.core.output<T>) => Uint8Array;
|
|
28
|
+
/** Validate + encode. Ensures outgoing messages match the schema. */
|
|
29
|
+
encodeSafe: (msg: z.core.output<T>) => Uint8Array;
|
|
30
|
+
};
|
|
31
|
+
declare function decode(data: Uint8Array): unknown;
|
|
32
|
+
/**
|
|
33
|
+
* Encode a value to msgpack. Returns a fresh Uint8Array copy
|
|
34
|
+
* (not a subarray of the internal pool buffer) to avoid browser
|
|
35
|
+
* XMLHttpRequest.send() corruption (axios issue #4068).
|
|
36
|
+
*/
|
|
37
|
+
declare function encode(value: unknown): Uint8Array;
|
|
38
|
+
/** Raw msgpack encode/decode without schema validation. */
|
|
39
|
+
export declare const msgpack: {
|
|
40
|
+
decode: typeof decode;
|
|
41
|
+
encode: typeof encode;
|
|
42
|
+
};
|
|
43
|
+
export {};
|
|
44
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAMhC;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAGlD,wEAAwE;mBACzD,UAAU;IAEzB,0EAA0E;uBACvD,UAAU;IAG7B,mDAAmD;uCAC/B,UAAU;IAE9B,qEAAqE;2CAC7C,UAAU;EAKzC;AAED,iBAAS,MAAM,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAEzC;AAED;;;;GAIG;AACH,iBAAS,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAQ1C;AAED,2DAA2D;AAC3D,eAAO,MAAM,OAAO;;;CAAqB,CAAC"}
|
package/dist/codec.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe codec factory for msgpack encode/decode with optional Zod validation.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* import { MailWSSchema } from "@vex-chat/types";
|
|
6
|
+
* const MailCodec = createCodec(MailWSSchema);
|
|
7
|
+
*
|
|
8
|
+
* // SDK/Apps (trusted internal) — fast, typed, no Zod overhead:
|
|
9
|
+
* const msg = MailCodec.decode(data);
|
|
10
|
+
*
|
|
11
|
+
* // Spire (trust boundary) — validates at runtime:
|
|
12
|
+
* const msg = MailCodec.decodeSafe(data);
|
|
13
|
+
*/
|
|
14
|
+
import { Packr } from "msgpackr";
|
|
15
|
+
const _packr = new Packr({ moreTypes: false, useRecords: false });
|
|
16
|
+
/**
|
|
17
|
+
* Creates a type-safe codec for msgpack encode/decode.
|
|
18
|
+
*
|
|
19
|
+
* @param schema - A Zod schema to validate against
|
|
20
|
+
* @returns An object with encode, decode, encodeSafe, and decodeSafe methods
|
|
21
|
+
*/
|
|
22
|
+
export function createCodec(schema) {
|
|
23
|
+
return {
|
|
24
|
+
/** Decode msgpack data — typed but not validated. Fast path for SDK. */
|
|
25
|
+
decode: (data) => schema.parse(decode(data)),
|
|
26
|
+
/** Decode + validate with Zod. Safe path for trust boundaries (Spire). */
|
|
27
|
+
decodeSafe: (data) => schema.parse(decode(data)),
|
|
28
|
+
/** Encode to msgpack — typed but not validated. */
|
|
29
|
+
encode: (msg) => encode(msg),
|
|
30
|
+
/** Validate + encode. Ensures outgoing messages match the schema. */
|
|
31
|
+
encodeSafe: (msg) => {
|
|
32
|
+
schema.parse(msg);
|
|
33
|
+
return encode(msg);
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function decode(data) {
|
|
38
|
+
return _packr.decode(data);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Encode a value to msgpack. Returns a fresh Uint8Array copy
|
|
42
|
+
* (not a subarray of the internal pool buffer) to avoid browser
|
|
43
|
+
* XMLHttpRequest.send() corruption (axios issue #4068).
|
|
44
|
+
*/
|
|
45
|
+
function encode(value) {
|
|
46
|
+
const packed = _packr.encode(value);
|
|
47
|
+
return new Uint8Array(packed.buffer.slice(packed.byteOffset, packed.byteOffset + packed.byteLength));
|
|
48
|
+
}
|
|
49
|
+
/** Raw msgpack encode/decode without schema validation. */
|
|
50
|
+
export const msgpack = { decode, encode };
|
|
51
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;AAElE;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAsB,MAAS;IAEtD,OAAO;QACH,wEAAwE;QACxE,MAAM,EAAE,CAAC,IAAgB,EAAO,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAQ;QAEpE,0EAA0E;QAC1E,UAAU,EAAE,CAAC,IAAgB,EAAO,EAAE,CAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAQ;QAErC,mDAAmD;QACnD,MAAM,EAAE,CAAC,GAAQ,EAAc,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;QAE7C,qEAAqE;QACrE,UAAU,EAAE,CAAC,GAAQ,EAAc,EAAE;YACjC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,SAAS,MAAM,CAAC,IAAgB;IAC5B,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAY,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,KAAc;IAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,IAAI,UAAU,CACjB,MAAM,CAAC,MAAM,CAAC,KAAK,CACf,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,GAAG,MAAM,CAAC,UAAU,CACxC,CACJ,CAAC;AACN,CAAC;AAED,2DAA2D;AAC3D,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC"}
|
package/dist/codecs.d.ts
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
export declare const UserCodec: {
|
|
2
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").User;
|
|
3
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").User;
|
|
4
|
+
encode: (msg: import("@vex-chat/types").User) => Uint8Array;
|
|
5
|
+
encodeSafe: (msg: import("@vex-chat/types").User) => Uint8Array;
|
|
6
|
+
};
|
|
7
|
+
export declare const DeviceCodec: {
|
|
8
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Device;
|
|
9
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Device;
|
|
10
|
+
encode: (msg: import("@vex-chat/types").Device) => Uint8Array;
|
|
11
|
+
encodeSafe: (msg: import("@vex-chat/types").Device) => Uint8Array;
|
|
12
|
+
};
|
|
13
|
+
export declare const ServerCodec: {
|
|
14
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Server;
|
|
15
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Server;
|
|
16
|
+
encode: (msg: import("@vex-chat/types").Server) => Uint8Array;
|
|
17
|
+
encodeSafe: (msg: import("@vex-chat/types").Server) => Uint8Array;
|
|
18
|
+
};
|
|
19
|
+
export declare const ChannelCodec: {
|
|
20
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Channel;
|
|
21
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Channel;
|
|
22
|
+
encode: (msg: import("@vex-chat/types").Channel) => Uint8Array;
|
|
23
|
+
encodeSafe: (msg: import("@vex-chat/types").Channel) => Uint8Array;
|
|
24
|
+
};
|
|
25
|
+
export declare const PermissionCodec: {
|
|
26
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Permission;
|
|
27
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Permission;
|
|
28
|
+
encode: (msg: import("@vex-chat/types").Permission) => Uint8Array;
|
|
29
|
+
encodeSafe: (msg: import("@vex-chat/types").Permission) => Uint8Array;
|
|
30
|
+
};
|
|
31
|
+
export declare const InviteCodec: {
|
|
32
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Invite;
|
|
33
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Invite;
|
|
34
|
+
encode: (msg: import("@vex-chat/types").Invite) => Uint8Array;
|
|
35
|
+
encodeSafe: (msg: import("@vex-chat/types").Invite) => Uint8Array;
|
|
36
|
+
};
|
|
37
|
+
export declare const EmojiCodec: {
|
|
38
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Emoji;
|
|
39
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Emoji;
|
|
40
|
+
encode: (msg: import("@vex-chat/types").Emoji) => Uint8Array;
|
|
41
|
+
encodeSafe: (msg: import("@vex-chat/types").Emoji) => Uint8Array;
|
|
42
|
+
};
|
|
43
|
+
export declare const FileSQLCodec: {
|
|
44
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").FileSQL;
|
|
45
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").FileSQL;
|
|
46
|
+
encode: (msg: import("@vex-chat/types").FileSQL) => Uint8Array;
|
|
47
|
+
encodeSafe: (msg: import("@vex-chat/types").FileSQL) => Uint8Array;
|
|
48
|
+
};
|
|
49
|
+
export declare const ActionTokenCodec: {
|
|
50
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").ActionToken;
|
|
51
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").ActionToken;
|
|
52
|
+
encode: (msg: import("@vex-chat/types").ActionToken) => Uint8Array;
|
|
53
|
+
encodeSafe: (msg: import("@vex-chat/types").ActionToken) => Uint8Array;
|
|
54
|
+
};
|
|
55
|
+
export declare const KeyBundleCodec: {
|
|
56
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").KeyBundle;
|
|
57
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").KeyBundle;
|
|
58
|
+
encode: (msg: import("@vex-chat/types").KeyBundle) => Uint8Array;
|
|
59
|
+
encodeSafe: (msg: import("@vex-chat/types").KeyBundle) => Uint8Array;
|
|
60
|
+
};
|
|
61
|
+
export declare const UserArrayCodec: {
|
|
62
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").User[];
|
|
63
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").User[];
|
|
64
|
+
encode: (msg: import("@vex-chat/types").User[]) => Uint8Array;
|
|
65
|
+
encodeSafe: (msg: import("@vex-chat/types").User[]) => Uint8Array;
|
|
66
|
+
};
|
|
67
|
+
export declare const DeviceArrayCodec: {
|
|
68
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Device[];
|
|
69
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Device[];
|
|
70
|
+
encode: (msg: import("@vex-chat/types").Device[]) => Uint8Array;
|
|
71
|
+
encodeSafe: (msg: import("@vex-chat/types").Device[]) => Uint8Array;
|
|
72
|
+
};
|
|
73
|
+
export declare const ServerArrayCodec: {
|
|
74
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Server[];
|
|
75
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Server[];
|
|
76
|
+
encode: (msg: import("@vex-chat/types").Server[]) => Uint8Array;
|
|
77
|
+
encodeSafe: (msg: import("@vex-chat/types").Server[]) => Uint8Array;
|
|
78
|
+
};
|
|
79
|
+
export declare const ChannelArrayCodec: {
|
|
80
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Channel[];
|
|
81
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Channel[];
|
|
82
|
+
encode: (msg: import("@vex-chat/types").Channel[]) => Uint8Array;
|
|
83
|
+
encodeSafe: (msg: import("@vex-chat/types").Channel[]) => Uint8Array;
|
|
84
|
+
};
|
|
85
|
+
export declare const PermissionArrayCodec: {
|
|
86
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Permission[];
|
|
87
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Permission[];
|
|
88
|
+
encode: (msg: import("@vex-chat/types").Permission[]) => Uint8Array;
|
|
89
|
+
encodeSafe: (msg: import("@vex-chat/types").Permission[]) => Uint8Array;
|
|
90
|
+
};
|
|
91
|
+
export declare const InviteArrayCodec: {
|
|
92
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Invite[];
|
|
93
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Invite[];
|
|
94
|
+
encode: (msg: import("@vex-chat/types").Invite[]) => Uint8Array;
|
|
95
|
+
encodeSafe: (msg: import("@vex-chat/types").Invite[]) => Uint8Array;
|
|
96
|
+
};
|
|
97
|
+
export declare const EmojiArrayCodec: {
|
|
98
|
+
decode: (data: Uint8Array) => import("@vex-chat/types").Emoji[];
|
|
99
|
+
decodeSafe: (data: Uint8Array) => import("@vex-chat/types").Emoji[];
|
|
100
|
+
encode: (msg: import("@vex-chat/types").Emoji[]) => Uint8Array;
|
|
101
|
+
encodeSafe: (msg: import("@vex-chat/types").Emoji[]) => Uint8Array;
|
|
102
|
+
};
|
|
103
|
+
export declare const ConnectResponseCodec: {
|
|
104
|
+
decode: (data: Uint8Array) => {
|
|
105
|
+
deviceToken: string;
|
|
106
|
+
};
|
|
107
|
+
decodeSafe: (data: Uint8Array) => {
|
|
108
|
+
deviceToken: string;
|
|
109
|
+
};
|
|
110
|
+
encode: (msg: {
|
|
111
|
+
deviceToken: string;
|
|
112
|
+
}) => Uint8Array;
|
|
113
|
+
encodeSafe: (msg: {
|
|
114
|
+
deviceToken: string;
|
|
115
|
+
}) => Uint8Array;
|
|
116
|
+
};
|
|
117
|
+
export declare const AuthResponseCodec: {
|
|
118
|
+
decode: (data: Uint8Array) => {
|
|
119
|
+
token: string;
|
|
120
|
+
user: import("@vex-chat/types").User;
|
|
121
|
+
};
|
|
122
|
+
decodeSafe: (data: Uint8Array) => {
|
|
123
|
+
token: string;
|
|
124
|
+
user: import("@vex-chat/types").User;
|
|
125
|
+
};
|
|
126
|
+
encode: (msg: {
|
|
127
|
+
token: string;
|
|
128
|
+
user: import("@vex-chat/types").User;
|
|
129
|
+
}) => Uint8Array;
|
|
130
|
+
encodeSafe: (msg: {
|
|
131
|
+
token: string;
|
|
132
|
+
user: import("@vex-chat/types").User;
|
|
133
|
+
}) => Uint8Array;
|
|
134
|
+
};
|
|
135
|
+
export declare const DeviceChallengeCodec: {
|
|
136
|
+
decode: (data: Uint8Array) => {
|
|
137
|
+
challenge: string;
|
|
138
|
+
challengeID: string;
|
|
139
|
+
};
|
|
140
|
+
decodeSafe: (data: Uint8Array) => {
|
|
141
|
+
challenge: string;
|
|
142
|
+
challengeID: string;
|
|
143
|
+
};
|
|
144
|
+
encode: (msg: {
|
|
145
|
+
challenge: string;
|
|
146
|
+
challengeID: string;
|
|
147
|
+
}) => Uint8Array;
|
|
148
|
+
encodeSafe: (msg: {
|
|
149
|
+
challenge: string;
|
|
150
|
+
challengeID: string;
|
|
151
|
+
}) => Uint8Array;
|
|
152
|
+
};
|
|
153
|
+
export declare const WhoamiCodec: {
|
|
154
|
+
decode: (data: Uint8Array) => {
|
|
155
|
+
exp: number;
|
|
156
|
+
token: string;
|
|
157
|
+
user: import("@vex-chat/types").User;
|
|
158
|
+
};
|
|
159
|
+
decodeSafe: (data: Uint8Array) => {
|
|
160
|
+
exp: number;
|
|
161
|
+
token: string;
|
|
162
|
+
user: import("@vex-chat/types").User;
|
|
163
|
+
};
|
|
164
|
+
encode: (msg: {
|
|
165
|
+
exp: number;
|
|
166
|
+
token: string;
|
|
167
|
+
user: import("@vex-chat/types").User;
|
|
168
|
+
}) => Uint8Array;
|
|
169
|
+
encodeSafe: (msg: {
|
|
170
|
+
exp: number;
|
|
171
|
+
token: string;
|
|
172
|
+
user: import("@vex-chat/types").User;
|
|
173
|
+
}) => Uint8Array;
|
|
174
|
+
};
|
|
175
|
+
export declare const OtkCountCodec: {
|
|
176
|
+
decode: (data: Uint8Array) => {
|
|
177
|
+
count: number;
|
|
178
|
+
};
|
|
179
|
+
decodeSafe: (data: Uint8Array) => {
|
|
180
|
+
count: number;
|
|
181
|
+
};
|
|
182
|
+
encode: (msg: {
|
|
183
|
+
count: number;
|
|
184
|
+
}) => Uint8Array;
|
|
185
|
+
encodeSafe: (msg: {
|
|
186
|
+
count: number;
|
|
187
|
+
}) => Uint8Array;
|
|
188
|
+
};
|
|
189
|
+
/**
|
|
190
|
+
* Decode an axios arraybuffer response with a typed codec.
|
|
191
|
+
* Uses decodeSafe (Zod-validated) so schema mismatches surface immediately.
|
|
192
|
+
*/
|
|
193
|
+
export declare function decodeAxios<T>(codec: {
|
|
194
|
+
decodeSafe: (data: Uint8Array) => T;
|
|
195
|
+
},
|
|
196
|
+
/**
|
|
197
|
+
* Accepts `unknown` because axios types its `responseType: 'arraybuffer'`
|
|
198
|
+
* responses as `any`. At runtime this is always an `ArrayBuffer`.
|
|
199
|
+
*/
|
|
200
|
+
data: unknown): T;
|
|
201
|
+
//# sourceMappingURL=codecs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codecs.d.ts","sourceRoot":"","sources":["../src/codecs.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,SAAS;;;;;CAA0B,CAAC;AACjD,eAAO,MAAM,WAAW;;;;;CAA4B,CAAC;AACrD,eAAO,MAAM,WAAW;;;;;CAA4B,CAAC;AACrD,eAAO,MAAM,YAAY;;;;;CAA6B,CAAC;AACvD,eAAO,MAAM,eAAe;;;;;CAAgC,CAAC;AAC7D,eAAO,MAAM,WAAW;;;;;CAA4B,CAAC;AACrD,eAAO,MAAM,UAAU;;;;;CAA2B,CAAC;AACnD,eAAO,MAAM,YAAY;;;;;CAA6B,CAAC;AACvD,eAAO,MAAM,gBAAgB;;;;;CAAiC,CAAC;AAC/D,eAAO,MAAM,cAAc;;;;;CAA+B,CAAC;AAI3D,eAAO,MAAM,cAAc;;;;;CAAmC,CAAC;AAC/D,eAAO,MAAM,gBAAgB;;;;;CAAqC,CAAC;AACnE,eAAO,MAAM,gBAAgB;;;;;CAAqC,CAAC;AACnE,eAAO,MAAM,iBAAiB;;;;;CAAsC,CAAC;AACrE,eAAO,MAAM,oBAAoB;;;;;CAAyC,CAAC;AAC3E,eAAO,MAAM,gBAAgB;;;;;CAAqC,CAAC;AACnE,eAAO,MAAM,eAAe;;;;;CAAoC,CAAC;AAIjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;CAEhC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAK7B,CAAC;AAEF,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;CAKhC,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;CAMvB,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;;;CAA+C,CAAC;AAI1E;;;GAGG;AACH,wBAAgB,WAAW,CAAC,CAAC,EACzB,KAAK,EAAE;IAAE,UAAU,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,CAAC,CAAA;CAAE;AAC9C;;;GAGG;AACH,IAAI,EAAE,OAAO,GACd,CAAC,CAQH"}
|