@agora-sdk/secure-chat-core 0.6.5 → 0.8.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/dist/cjs/content/builders.d.ts +40 -0
- package/dist/cjs/content/builders.js +85 -0
- package/dist/cjs/content/builders.js.map +1 -0
- package/dist/cjs/content/cbor.d.ts +48 -0
- package/dist/cjs/content/cbor.js +298 -0
- package/dist/cjs/content/cbor.js.map +1 -0
- package/dist/cjs/content/frame.d.ts +24 -0
- package/dist/cjs/content/frame.js +39 -0
- package/dist/cjs/content/frame.js.map +1 -0
- package/dist/cjs/content/mimi-content.d.ts +194 -0
- package/dist/cjs/content/mimi-content.js +289 -0
- package/dist/cjs/content/mimi-content.js.map +1 -0
- package/dist/cjs/context/secure-chat-context.d.ts +19 -3
- package/dist/cjs/context/secure-chat-context.js +53 -13
- package/dist/cjs/context/secure-chat-context.js.map +1 -1
- package/dist/cjs/hooks/message-fold.d.ts +91 -0
- package/dist/cjs/hooks/message-fold.js +218 -0
- package/dist/cjs/hooks/message-fold.js.map +1 -0
- package/dist/cjs/hooks/useSecureConversations.js +11 -0
- package/dist/cjs/hooks/useSecureConversations.js.map +1 -1
- package/dist/cjs/hooks/useSecureDevice.js +15 -1
- package/dist/cjs/hooks/useSecureDevice.js.map +1 -1
- package/dist/cjs/hooks/useSecureHandshakes.js +36 -2
- package/dist/cjs/hooks/useSecureHandshakes.js.map +1 -1
- package/dist/cjs/hooks/useSecureMessages.d.ts +30 -18
- package/dist/cjs/hooks/useSecureMessages.js +197 -130
- package/dist/cjs/hooks/useSecureMessages.js.map +1 -1
- package/dist/cjs/index.d.ts +8 -0
- package/dist/cjs/index.js +30 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/persistence/repository.d.ts +24 -0
- package/dist/cjs/persistence/repository.js +35 -0
- package/dist/cjs/persistence/repository.js.map +1 -1
- package/dist/cjs/persistence/store.js +11 -0
- package/dist/cjs/persistence/store.js.map +1 -1
- package/dist/cjs/transport/rest.d.ts +2 -2
- package/dist/cjs/transport/rest.js +2 -2
- package/dist/cjs/transport/rest.js.map +1 -1
- package/dist/cjs/transport/socket.d.ts +1 -1
- package/dist/cjs/transport/socket.js +17 -1
- package/dist/cjs/transport/socket.js.map +1 -1
- package/dist/cjs/version.d.ts +13 -0
- package/dist/cjs/version.js +19 -0
- package/dist/cjs/version.js.map +1 -0
- package/dist/esm/content/builders.d.ts +40 -0
- package/dist/esm/content/builders.js +77 -0
- package/dist/esm/content/builders.js.map +1 -0
- package/dist/esm/content/cbor.d.ts +48 -0
- package/dist/esm/content/cbor.js +292 -0
- package/dist/esm/content/cbor.js.map +1 -0
- package/dist/esm/content/frame.d.ts +24 -0
- package/dist/esm/content/frame.js +34 -0
- package/dist/esm/content/frame.js.map +1 -0
- package/dist/esm/content/mimi-content.d.ts +194 -0
- package/dist/esm/content/mimi-content.js +283 -0
- package/dist/esm/content/mimi-content.js.map +1 -0
- package/dist/esm/context/secure-chat-context.d.ts +19 -3
- package/dist/esm/context/secure-chat-context.js +53 -13
- package/dist/esm/context/secure-chat-context.js.map +1 -1
- package/dist/esm/hooks/message-fold.d.ts +91 -0
- package/dist/esm/hooks/message-fold.js +214 -0
- package/dist/esm/hooks/message-fold.js.map +1 -0
- package/dist/esm/hooks/useSecureConversations.js +11 -0
- package/dist/esm/hooks/useSecureConversations.js.map +1 -1
- package/dist/esm/hooks/useSecureDevice.js +15 -1
- package/dist/esm/hooks/useSecureDevice.js.map +1 -1
- package/dist/esm/hooks/useSecureHandshakes.js +36 -2
- package/dist/esm/hooks/useSecureHandshakes.js.map +1 -1
- package/dist/esm/hooks/useSecureMessages.d.ts +30 -18
- package/dist/esm/hooks/useSecureMessages.js +199 -132
- package/dist/esm/hooks/useSecureMessages.js.map +1 -1
- package/dist/esm/index.d.ts +8 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/persistence/repository.d.ts +24 -0
- package/dist/esm/persistence/repository.js +35 -0
- package/dist/esm/persistence/repository.js.map +1 -1
- package/dist/esm/persistence/store.js +11 -0
- package/dist/esm/persistence/store.js.map +1 -1
- package/dist/esm/transport/rest.d.ts +2 -2
- package/dist/esm/transport/rest.js +2 -2
- package/dist/esm/transport/rest.js.map +1 -1
- package/dist/esm/transport/socket.d.ts +1 -1
- package/dist/esm/transport/socket.js +17 -1
- package/dist/esm/transport/socket.js.map +1 -1
- package/dist/esm/version.d.ts +13 -0
- package/dist/esm/version.js +16 -0
- package/dist/esm/version.js.map +1 -0
- package/package.json +3 -3
package/dist/cjs/index.js
CHANGED
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
// injection of a `SecureChatCrypto`. Platform packages (@agora-sdk/secure-chat-react-js, etc.)
|
|
6
6
|
// re-export this and add the concrete crypto + persistence.
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.isSecureChatDebugEnabled = exports.setSecureChatDebug = exports.computeSafetyNumber = exports.nextBucket = exports.unpadPlaintext = exports.padPlaintext = exports.bytesToUtf8 = exports.utf8ToBytes = exports.fromBase64 = exports.toBase64 = exports.SecureChatRepository = exports.MemoryStore = exports.SecureChatDecryptError = exports.SecureChatSocketClient = exports.SecureChatRestClient = exports.estimatePassphraseStrength = exports.useSecureSafetyNumber = exports.useSecureBackup = exports.useSecureHandshakes = exports.useSecureMessages = exports.useSecureConversations = exports.useSecureDevice = exports.useSecureChat = exports.SecureChatProvider = void 0;
|
|
8
|
+
exports.isSecureChatDebugEnabled = exports.setSecureChatDebug = exports.CborTag = exports.decodeCbor = exports.encodeCbor = exports.ContentKind = exports.unframe = exports.frameContent = exports.buildUnreact = exports.buildReaction = exports.buildDelete = exports.buildEdit = exports.buildReply = exports.buildPost = exports.MIMI_LIMITS = exports.PartSemantics = exports.HashAlg = exports.Disposition = exports.Cardinality = exports.contentHash = exports.decodeMimiContent = exports.encodeMimiContent = exports.computeSafetyNumber = exports.nextBucket = exports.unpadPlaintext = exports.padPlaintext = exports.bytesToUtf8 = exports.utf8ToBytes = exports.fromBase64 = exports.toBase64 = exports.SecureChatRepository = exports.MemoryStore = exports.SecureChatDecryptError = exports.SecureChatSocketClient = exports.SecureChatRestClient = exports.estimatePassphraseStrength = exports.useSecureSafetyNumber = exports.useSecureBackup = exports.useSecureHandshakes = exports.useSecureMessages = exports.useSecureConversations = exports.useSecureDevice = exports.useSecureChat = exports.SecureChatProvider = exports.VERSION = void 0;
|
|
9
|
+
// ── version (generated from package.json; see scripts/write-version.mjs) ──────
|
|
10
|
+
var version_js_1 = require("./version.js");
|
|
11
|
+
Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_js_1.VERSION; } });
|
|
9
12
|
// ── context / provider ──────────────────────────────────────────────────────
|
|
10
13
|
var secure_chat_context_js_1 = require("./context/secure-chat-context.js");
|
|
11
14
|
Object.defineProperty(exports, "SecureChatProvider", { enumerable: true, get: function () { return secure_chat_context_js_1.SecureChatProvider; } });
|
|
@@ -49,6 +52,32 @@ Object.defineProperty(exports, "unpadPlaintext", { enumerable: true, get: functi
|
|
|
49
52
|
Object.defineProperty(exports, "nextBucket", { enumerable: true, get: function () { return padding_js_1.nextBucket; } });
|
|
50
53
|
var safety_number_js_1 = require("./util/safety-number.js");
|
|
51
54
|
Object.defineProperty(exports, "computeSafetyNumber", { enumerable: true, get: function () { return safety_number_js_1.computeSafetyNumber; } });
|
|
55
|
+
// ── MIMI content (CBOR message content + routing frame + fold) ─────────────────
|
|
56
|
+
var mimi_content_js_1 = require("./content/mimi-content.js");
|
|
57
|
+
Object.defineProperty(exports, "encodeMimiContent", { enumerable: true, get: function () { return mimi_content_js_1.encodeMimiContent; } });
|
|
58
|
+
Object.defineProperty(exports, "decodeMimiContent", { enumerable: true, get: function () { return mimi_content_js_1.decodeMimiContent; } });
|
|
59
|
+
Object.defineProperty(exports, "contentHash", { enumerable: true, get: function () { return mimi_content_js_1.contentHash; } });
|
|
60
|
+
Object.defineProperty(exports, "Cardinality", { enumerable: true, get: function () { return mimi_content_js_1.Cardinality; } });
|
|
61
|
+
Object.defineProperty(exports, "Disposition", { enumerable: true, get: function () { return mimi_content_js_1.Disposition; } });
|
|
62
|
+
Object.defineProperty(exports, "HashAlg", { enumerable: true, get: function () { return mimi_content_js_1.HashAlg; } });
|
|
63
|
+
Object.defineProperty(exports, "PartSemantics", { enumerable: true, get: function () { return mimi_content_js_1.PartSemantics; } });
|
|
64
|
+
Object.defineProperty(exports, "MIMI_LIMITS", { enumerable: true, get: function () { return mimi_content_js_1.MIMI_LIMITS; } });
|
|
65
|
+
var builders_js_1 = require("./content/builders.js");
|
|
66
|
+
Object.defineProperty(exports, "buildPost", { enumerable: true, get: function () { return builders_js_1.buildPost; } });
|
|
67
|
+
Object.defineProperty(exports, "buildReply", { enumerable: true, get: function () { return builders_js_1.buildReply; } });
|
|
68
|
+
Object.defineProperty(exports, "buildEdit", { enumerable: true, get: function () { return builders_js_1.buildEdit; } });
|
|
69
|
+
Object.defineProperty(exports, "buildDelete", { enumerable: true, get: function () { return builders_js_1.buildDelete; } });
|
|
70
|
+
Object.defineProperty(exports, "buildReaction", { enumerable: true, get: function () { return builders_js_1.buildReaction; } });
|
|
71
|
+
Object.defineProperty(exports, "buildUnreact", { enumerable: true, get: function () { return builders_js_1.buildUnreact; } });
|
|
72
|
+
var frame_js_1 = require("./content/frame.js");
|
|
73
|
+
Object.defineProperty(exports, "frameContent", { enumerable: true, get: function () { return frame_js_1.frameContent; } });
|
|
74
|
+
Object.defineProperty(exports, "unframe", { enumerable: true, get: function () { return frame_js_1.unframe; } });
|
|
75
|
+
Object.defineProperty(exports, "ContentKind", { enumerable: true, get: function () { return frame_js_1.ContentKind; } });
|
|
76
|
+
// Low-level CBOR codec (advanced; the IUC control channel reuses it under kind 1).
|
|
77
|
+
var cbor_js_1 = require("./content/cbor.js");
|
|
78
|
+
Object.defineProperty(exports, "encodeCbor", { enumerable: true, get: function () { return cbor_js_1.encode; } });
|
|
79
|
+
Object.defineProperty(exports, "decodeCbor", { enumerable: true, get: function () { return cbor_js_1.decode; } });
|
|
80
|
+
Object.defineProperty(exports, "CborTag", { enumerable: true, get: function () { return cbor_js_1.CborTag; } });
|
|
52
81
|
// ── dev logging (off by default; see util/debug) ──────────────────────────────
|
|
53
82
|
var debug_js_1 = require("./util/debug.js");
|
|
54
83
|
Object.defineProperty(exports, "setSecureChatDebug", { enumerable: true, get: function () { return debug_js_1.setSecureChatDebug; } });
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,8FAA8F;AAC9F,EAAE;AACF,6FAA6F;AAC7F,+FAA+F;AAC/F,4DAA4D;;;AAE5D,+EAA+E;AAC/E,2EAAqF;AAA5E,4HAAA,kBAAkB,OAAA;AAAE,uHAAA,aAAa,OAAA;AAM1C,gFAAgF;AAChF,iEAA6D;AAApD,qHAAA,eAAe,OAAA;AAExB,+EAA2E;AAAlE,mIAAA,sBAAsB,OAAA;AAE/B,qEAAiE;AAAxD,yHAAA,iBAAiB,OAAA;AAM1B,yEAAqE;AAA5D,6HAAA,mBAAmB,OAAA;AAK5B,iEAA6D;AAApD,qHAAA,eAAe,OAAA;AAExB,6EAAyE;AAAhE,iIAAA,qBAAqB,OAAA;AAG9B,iFAAiF;AACjF,0EAA6E;AAApE,oIAAA,0BAA0B,OAAA;AAGnC,gFAAgF;AAChF,+CAA2D;AAAlD,+GAAA,oBAAoB,OAAA;AAE7B,mDAA+D;AAAtD,mHAAA,sBAAsB,OAAA;AAoB/B,oEAAuE;AAA9D,4HAAA,sBAAsB,OAAA;AAO/B,iEAA4D;AAAnD,8GAAA,WAAW,OAAA;AACpB,6DAAmE;AAA1D,qHAAA,oBAAoB,OAAA;AAG7B,gFAAgF;AAChF,8CAAkF;AAAzE,qGAAA,QAAQ,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,wGAAA,WAAW,OAAA;AACvD,gDAA6E;AAApE,0GAAA,YAAY,OAAA;AAAE,4GAAA,cAAc,OAAA;AAAE,wGAAA,UAAU,OAAA;AAEjD,4DAA8D;AAArD,uHAAA,mBAAmB,OAAA;AAG5B,iFAAiF;AACjF,4CAA+E;AAAtE,8GAAA,kBAAkB,OAAA;AAAE,oHAAA,wBAAwB,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,8FAA8F;AAC9F,EAAE;AACF,6FAA6F;AAC7F,+FAA+F;AAC/F,4DAA4D;;;AAE5D,iFAAiF;AACjF,2CAAuC;AAA9B,qGAAA,OAAO,OAAA;AAEhB,+EAA+E;AAC/E,2EAAqF;AAA5E,4HAAA,kBAAkB,OAAA;AAAE,uHAAA,aAAa,OAAA;AAM1C,gFAAgF;AAChF,iEAA6D;AAApD,qHAAA,eAAe,OAAA;AAExB,+EAA2E;AAAlE,mIAAA,sBAAsB,OAAA;AAE/B,qEAAiE;AAAxD,yHAAA,iBAAiB,OAAA;AAM1B,yEAAqE;AAA5D,6HAAA,mBAAmB,OAAA;AAK5B,iEAA6D;AAApD,qHAAA,eAAe,OAAA;AAExB,6EAAyE;AAAhE,iIAAA,qBAAqB,OAAA;AAG9B,iFAAiF;AACjF,0EAA6E;AAApE,oIAAA,0BAA0B,OAAA;AAGnC,gFAAgF;AAChF,+CAA2D;AAAlD,+GAAA,oBAAoB,OAAA;AAE7B,mDAA+D;AAAtD,mHAAA,sBAAsB,OAAA;AAoB/B,oEAAuE;AAA9D,4HAAA,sBAAsB,OAAA;AAO/B,iEAA4D;AAAnD,8GAAA,WAAW,OAAA;AACpB,6DAAmE;AAA1D,qHAAA,oBAAoB,OAAA;AAG7B,gFAAgF;AAChF,8CAAkF;AAAzE,qGAAA,QAAQ,OAAA;AAAE,uGAAA,UAAU,OAAA;AAAE,wGAAA,WAAW,OAAA;AAAE,wGAAA,WAAW,OAAA;AACvD,gDAA6E;AAApE,0GAAA,YAAY,OAAA;AAAE,4GAAA,cAAc,OAAA;AAAE,wGAAA,UAAU,OAAA;AAEjD,4DAA8D;AAArD,uHAAA,mBAAmB,OAAA;AAG5B,kFAAkF;AAClF,6DAGmC;AAFjC,oHAAA,iBAAiB,OAAA;AAAE,oHAAA,iBAAiB,OAAA;AAAE,8GAAA,WAAW,OAAA;AACjD,8GAAA,WAAW,OAAA;AAAE,8GAAA,WAAW,OAAA;AAAE,0GAAA,OAAO,OAAA;AAAE,gHAAA,aAAa,OAAA;AAAE,8GAAA,WAAW,OAAA;AAK/D,qDAE+B;AAD7B,wGAAA,SAAS,OAAA;AAAE,yGAAA,UAAU,OAAA;AAAE,wGAAA,SAAS,OAAA;AAAE,0GAAA,WAAW,OAAA;AAAE,4GAAA,aAAa,OAAA;AAAE,2GAAA,YAAY,OAAA;AAE5E,+CAAwE;AAA/D,wGAAA,YAAY,OAAA;AAAE,mGAAA,OAAO,OAAA;AAAE,uGAAA,WAAW,OAAA;AAE3C,mFAAmF;AACnF,6CAAwF;AAA/E,qGAAA,MAAM,OAAc;AAAE,qGAAA,MAAM,OAAc;AAAE,kGAAA,OAAO,OAAA;AAG5D,iFAAiF;AACjF,4CAA+E;AAAtE,8GAAA,kBAAkB,OAAA;AAAE,oHAAA,wBAAwB,OAAA"}
|
|
@@ -27,6 +27,30 @@ export declare class SecureChatRepository {
|
|
|
27
27
|
deleteGroupState(conversationId: string): Promise<void>;
|
|
28
28
|
/** List the conversation ids that have persisted group state. */
|
|
29
29
|
listGroupConversationIds(): Promise<string[]>;
|
|
30
|
+
/**
|
|
31
|
+
* Persist the decrypted content-frame bytes of a message (local-only, decrypt-once history).
|
|
32
|
+
*
|
|
33
|
+
* Stores the `[kind][payload]` frame exactly as decrypted (raw bytes — NOT text): MLS application
|
|
34
|
+
* keys are single-use (forward secrecy), so a message decrypts exactly once; this stored copy is what
|
|
35
|
+
* the hook re-decodes + re-folds on every later reload. The blind server never receives this; it lives
|
|
36
|
+
* only in the platform store (web: IndexedDB; tests: MemoryStore).
|
|
37
|
+
*
|
|
38
|
+
* @param conversationId - The conversation the message belongs to.
|
|
39
|
+
* @param messageId - The globally-unique server message id.
|
|
40
|
+
* @param content - The decrypted content-frame bytes (`[kind][payload]`, post-unpadding).
|
|
41
|
+
*/
|
|
42
|
+
saveMessageContent(conversationId: string, messageId: string, content: Uint8Array): Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* Load a message's previously-decrypted content-frame bytes, or `null` if never stored.
|
|
45
|
+
*
|
|
46
|
+
* A non-null result lets the decrypt path short-circuit BEFORE touching the MLS ratchet — re-decrypting
|
|
47
|
+
* would throw `"Desired gen in the past"` (the key is gone after first use).
|
|
48
|
+
*
|
|
49
|
+
* @param conversationId - The conversation the message belongs to.
|
|
50
|
+
* @param messageId - The globally-unique server message id.
|
|
51
|
+
* @returns The stored content-frame bytes, or `null` on a miss.
|
|
52
|
+
*/
|
|
53
|
+
loadMessageContent(conversationId: string, messageId: string): Promise<Uint8Array | null>;
|
|
30
54
|
/** Load this device row's persisted handshake delivery cursor (`seq`), or `null`. */
|
|
31
55
|
loadHandshakeCursor(deviceRowId: string): Promise<string | null>;
|
|
32
56
|
/** Persist this device row's handshake delivery cursor (`seq`). */
|
|
@@ -15,6 +15,13 @@ const GROUP_PREFIX = "group:";
|
|
|
15
15
|
// and receives its own Welcome. A global key let a stale cursor outlive its device and mask the
|
|
16
16
|
// Welcome whose `seq` it had already passed (the handshakes query is strictly `seq > since`).
|
|
17
17
|
const CURSOR_PREFIX = "handshake:cursor:";
|
|
18
|
+
// Decrypted content-frame bytes (`[kind][payload]`), keyed `msg:<conversationId>:<messageId>`
|
|
19
|
+
// (messageId is a globally-unique server uuid). This is the durable conversation history: MLS
|
|
20
|
+
// application keys are single-use (forward secrecy), so a message can be decrypted exactly once —
|
|
21
|
+
// we persist these bytes so reload re-decodes + re-folds from the store instead of replaying the
|
|
22
|
+
// (consumed) ratchet. Stored LOCAL ONLY; the blind server never sees it. See store.ts for the
|
|
23
|
+
// at-rest posture.
|
|
24
|
+
const MESSAGE_PREFIX = "msg:";
|
|
18
25
|
/** Typed persistence for device identity, per-conversation group state, and the handshake cursor. */
|
|
19
26
|
class SecureChatRepository {
|
|
20
27
|
constructor(store) {
|
|
@@ -58,6 +65,34 @@ class SecureChatRepository {
|
|
|
58
65
|
const keys = await this.store.list(GROUP_PREFIX);
|
|
59
66
|
return keys.map((k) => k.slice(GROUP_PREFIX.length));
|
|
60
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Persist the decrypted content-frame bytes of a message (local-only, decrypt-once history).
|
|
70
|
+
*
|
|
71
|
+
* Stores the `[kind][payload]` frame exactly as decrypted (raw bytes — NOT text): MLS application
|
|
72
|
+
* keys are single-use (forward secrecy), so a message decrypts exactly once; this stored copy is what
|
|
73
|
+
* the hook re-decodes + re-folds on every later reload. The blind server never receives this; it lives
|
|
74
|
+
* only in the platform store (web: IndexedDB; tests: MemoryStore).
|
|
75
|
+
*
|
|
76
|
+
* @param conversationId - The conversation the message belongs to.
|
|
77
|
+
* @param messageId - The globally-unique server message id.
|
|
78
|
+
* @param content - The decrypted content-frame bytes (`[kind][payload]`, post-unpadding).
|
|
79
|
+
*/
|
|
80
|
+
async saveMessageContent(conversationId, messageId, content) {
|
|
81
|
+
await this.store.set(MESSAGE_PREFIX + conversationId + ":" + messageId, content);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Load a message's previously-decrypted content-frame bytes, or `null` if never stored.
|
|
85
|
+
*
|
|
86
|
+
* A non-null result lets the decrypt path short-circuit BEFORE touching the MLS ratchet — re-decrypting
|
|
87
|
+
* would throw `"Desired gen in the past"` (the key is gone after first use).
|
|
88
|
+
*
|
|
89
|
+
* @param conversationId - The conversation the message belongs to.
|
|
90
|
+
* @param messageId - The globally-unique server message id.
|
|
91
|
+
* @returns The stored content-frame bytes, or `null` on a miss.
|
|
92
|
+
*/
|
|
93
|
+
async loadMessageContent(conversationId, messageId) {
|
|
94
|
+
return this.store.get(MESSAGE_PREFIX + conversationId + ":" + messageId);
|
|
95
|
+
}
|
|
61
96
|
/** Load this device row's persisted handshake delivery cursor (`seq`), or `null`. */
|
|
62
97
|
async loadHandshakeCursor(deviceRowId) {
|
|
63
98
|
const bytes = await this.store.get(CURSOR_PREFIX + deviceRowId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/persistence/repository.ts"],"names":[],"mappings":";AAAA,8DAA8D;AAC9D,EAAE;AACF,0FAA0F;AAC1F,8FAA8F;AAC9F,gFAAgF;;;AAIhF,iDAAmF;AAEnF,MAAM,UAAU,GAAG,QAAQ,CAAC;AAC5B,MAAM,YAAY,GAAG,QAAQ,CAAC;AAC9B,qGAAqG;AACrG,sGAAsG;AACtG,qGAAqG;AACrG,gGAAgG;AAChG,8FAA8F;AAC9F,MAAM,aAAa,GAAG,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../src/persistence/repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,5 +4,16 @@
|
|
|
4
4
|
// This is ALL a platform must implement: web ships an IndexedDB-backed store, native swaps a
|
|
5
5
|
// keystore later. The SDK owns the key schema and (de)serialization on top of this (see
|
|
6
6
|
// ./repository.ts); the store itself never interprets keys or values. Values are opaque bytes.
|
|
7
|
+
//
|
|
8
|
+
// AT-REST POSTURE (honest, per CLAUDE.md §1): besides device identity and MLS group state, this
|
|
9
|
+
// store now also holds DECRYPTED MESSAGE PLAINTEXT (`msg:` keys) — the durable conversation history,
|
|
10
|
+
// because forward-secret MLS keys are single-use and a message can be decrypted only once. This
|
|
11
|
+
// plaintext is LOCAL ONLY; the blind server never sees it. The base implementations store it as a
|
|
12
|
+
// plain blob (web: IndexedDB; tests: MemoryStore), so THEY are unencrypted at rest. Encryption at rest
|
|
13
|
+
// is a drop-in decorator: on web, wrap the base store with `createEncryptedStore(...)` from
|
|
14
|
+
// `@agora-sdk/secure-chat-react-js` — it seals every VALUE with AES-256-GCM under an argon2id-derived,
|
|
15
|
+
// password-wrapped DEK, leaving the repository and hooks untouched (store KEYS still pass through in
|
|
16
|
+
// the clear; see that module's header for the honest values-only / keys-readable scope). The seam is
|
|
17
|
+
// the storage abstraction.
|
|
7
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
19
|
//# sourceMappingURL=store.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/persistence/store.ts"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,EAAE;AACF,6FAA6F;AAC7F,wFAAwF;AACxF,+FAA+F"}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/persistence/store.ts"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,EAAE;AACF,6FAA6F;AAC7F,wFAAwF;AACxF,+FAA+F;AAC/F,EAAE;AACF,gGAAgG;AAChG,qGAAqG;AACrG,gGAAgG;AAChG,kGAAkG;AAClG,uGAAuG;AACvG,4FAA4F;AAC5F,uGAAuG;AACvG,qGAAqG;AACrG,qGAAqG;AACrG,2BAA2B"}
|
|
@@ -5,7 +5,7 @@ import { AddSecureMemberBody, CreateSecureConversationBody, PublishKeyPackagesBo
|
|
|
5
5
|
* effect on the next request without rebuilding the client.
|
|
6
6
|
*/
|
|
7
7
|
export interface SecureChatRestConfig {
|
|
8
|
-
/** Resolve the API base URL (e.g. `
|
|
8
|
+
/** Resolve the API base URL incl. the version prefix (e.g. `() => "https://host/v7"`). */
|
|
9
9
|
getBaseUrl: () => string;
|
|
10
10
|
/** Resolve the current access token, or undefined when signed out. */
|
|
11
11
|
getAccessToken: () => string | undefined;
|
|
@@ -28,7 +28,7 @@ export interface SecureChatRestConfig {
|
|
|
28
28
|
* ```typescript
|
|
29
29
|
* const rest = new SecureChatRestClient({
|
|
30
30
|
* projectId,
|
|
31
|
-
* getBaseUrl: () =>
|
|
31
|
+
* getBaseUrl: () => "https://host/v7",
|
|
32
32
|
* getAccessToken: () => session.accessToken,
|
|
33
33
|
* });
|
|
34
34
|
* const device = await rest.registerDevice(body);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Typed REST client for the secure-chat blind Delivery Service.
|
|
3
3
|
//
|
|
4
4
|
// Covers every endpoint in agora-server `docs/SECURE_CHAT.md` §9. Base URL and access token are
|
|
5
|
-
// resolved **lazily per request**
|
|
5
|
+
// resolved **lazily per request** via caller-supplied resolvers, so a token
|
|
6
6
|
// refresh or a late-set baseUrl always wins. All binary is base64 on the wire; this client never
|
|
7
7
|
// inspects payloads.
|
|
8
8
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
@@ -28,7 +28,7 @@ const debug_js_1 = require("../util/debug.js");
|
|
|
28
28
|
* ```typescript
|
|
29
29
|
* const rest = new SecureChatRestClient({
|
|
30
30
|
* projectId,
|
|
31
|
-
* getBaseUrl: () =>
|
|
31
|
+
* getBaseUrl: () => "https://host/v7",
|
|
32
32
|
* getAccessToken: () => session.accessToken,
|
|
33
33
|
* });
|
|
34
34
|
* const device = await rest.registerDevice(body);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/transport/rest.ts"],"names":[],"mappings":";AAAA,gEAAgE;AAChE,EAAE;AACF,gGAAgG;AAChG,
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/transport/rest.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,7 +50,7 @@ export type SecureSocket = Socket<SecureServerEvents, SecureClientEvents>;
|
|
|
50
50
|
* (not captured once) so a refreshed token is used on the next (re)connect.
|
|
51
51
|
*/
|
|
52
52
|
export interface SecureChatSocketConfig {
|
|
53
|
-
/** Resolve the socket origin (e.g. `
|
|
53
|
+
/** Resolve the socket origin (the client strips any path; e.g. `() => "https://host/v7"`). */
|
|
54
54
|
getSocketUrl: () => string;
|
|
55
55
|
/** Resolve the current access token (sent in the socket `auth` handshake). */
|
|
56
56
|
getAccessToken: () => string | undefined;
|
|
@@ -26,7 +26,17 @@ class SecureChatSocketClient {
|
|
|
26
26
|
* @returns The live socket; idempotent while already connected.
|
|
27
27
|
*/
|
|
28
28
|
connect() {
|
|
29
|
-
|
|
29
|
+
// Reuse an existing socket whether it's already connected OR still mid-handshake. Guarding on
|
|
30
|
+
// `.connected` (instead of existence) re-entered the io() + listener-wiring block on every
|
|
31
|
+
// connect() call made during the async connect window. socket.io multiplexes io(sameUrl) to ONE
|
|
32
|
+
// socket, so this didn't leak sockets — it stacked DUPLICATE lifecycle listeners
|
|
33
|
+
// (connect/disconnect/connect_error), N per mount, because every hook's .on()/joinConversation()
|
|
34
|
+
// calls connect() before the handshake settles. Each stacked listener is a console.debug, so the
|
|
35
|
+
// duplication shows up as N× "connecting /secure namespace" + N× "socket connected" and compounds
|
|
36
|
+
// the main thread's logging cost with DevTools open. Guard on existence so io() + listener wiring
|
|
37
|
+
// runs exactly once per socket lifetime; disconnect() nulls this.socket, so a later reconnect
|
|
38
|
+
// still builds a fresh one.
|
|
39
|
+
if (this.socket)
|
|
30
40
|
return this.socket;
|
|
31
41
|
// socket.io derives the NAMESPACE from the URL's path, so the origin handed to io() must be bare.
|
|
32
42
|
// getSocketUrl() returns the REST base (e.g. `http://host/v7`); `io(`${base}/secure`)` would
|
|
@@ -36,6 +46,12 @@ class SecureChatSocketClient {
|
|
|
36
46
|
const origin = new URL(this.config.getSocketUrl()).origin;
|
|
37
47
|
log.debug("connecting /secure namespace", { origin, projectId: this.config.projectId });
|
|
38
48
|
this.socket = (0, socket_io_client_1.io)(`${origin}/secure`, {
|
|
49
|
+
// The secure-chat DS runs its socket.io server on its OWN engine.io path "/secure-socket/"
|
|
50
|
+
// (NOT the default "/socket.io/"), so a path-routing reverse proxy can split secure realtime
|
|
51
|
+
// onto the standalone @agora/secure-chat process. Without this, the connection lands on the
|
|
52
|
+
// main API's "/socket.io/", which has no "/secure" namespace → endless connect_error. Must stay
|
|
53
|
+
// byte-identical to the server's `new Server(httpServer, { path: "/secure-socket/" })`.
|
|
54
|
+
path: "/secure-socket/",
|
|
39
55
|
auth: { token: this.config.getAccessToken() },
|
|
40
56
|
query: { projectId: this.config.projectId },
|
|
41
57
|
transports: ["websocket"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../src/transport/socket.ts"],"names":[],"mappings":";AAAA,8FAA8F;AAC9F,EAAE;AACF,iGAAiG;AACjG,kGAAkG;AAClG,8FAA8F;AAC9F,kCAAkC;;;AAElC,uDAA8C;AAE9C,+CAAqD;AAErD,MAAM,GAAG,GAAG,IAAA,4BAAiB,EAAC,QAAQ,CAAC,CAAC;AA4CxC;;;;GAIG;AACH,MAAa,sBAAsB;IAGjC,YAA6B,MAA8B;QAA9B,WAAM,GAAN,MAAM,CAAwB;QAFnD,WAAM,GAAwB,IAAI,CAAC;IAEmB,CAAC;IAE/D;;;;OAIG;IACH,OAAO;QACL,IAAI,IAAI,CAAC,MAAM
|
|
1
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../src/transport/socket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The published version of `@agora-sdk/secure-chat-core` as a `major.minor.patch` string,
|
|
3
|
+
* re-exported by the platform packages (`@agora-sdk/secure-chat-react-js`, `…-react-native`,
|
|
4
|
+
* `…-expo`). Useful for diagnostics — e.g. logging which SDK build an app actually loaded when a
|
|
5
|
+
* stale bundle is suspected.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { VERSION } from "@agora-sdk/secure-chat-react-js";
|
|
10
|
+
* console.log(`secure-chat SDK ${VERSION}`);
|
|
11
|
+
* ```
|
|
12
|
+
*/
|
|
13
|
+
export declare const VERSION = "0.8.0";
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// GENERATED by scripts/write-version.mjs from this package's package.json — do not edit by hand.
|
|
3
|
+
// Re-run `pnpm run version:patch` / `version:minor` (which regenerate it) to change the version.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.VERSION = void 0;
|
|
6
|
+
/**
|
|
7
|
+
* The published version of `@agora-sdk/secure-chat-core` as a `major.minor.patch` string,
|
|
8
|
+
* re-exported by the platform packages (`@agora-sdk/secure-chat-react-js`, `…-react-native`,
|
|
9
|
+
* `…-expo`). Useful for diagnostics — e.g. logging which SDK build an app actually loaded when a
|
|
10
|
+
* stale bundle is suspected.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { VERSION } from "@agora-sdk/secure-chat-react-js";
|
|
15
|
+
* console.log(`secure-chat SDK ${VERSION}`);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
exports.VERSION = "0.8.0";
|
|
19
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";AAAA,iGAAiG;AACjG,iGAAiG;;;AAEjG;;;;;;;;;;;GAWG;AACU,QAAA,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type MimiContent } from "./mimi-content.js";
|
|
2
|
+
/**
|
|
3
|
+
* A plain text post.
|
|
4
|
+
* @param body - The markdown message body.
|
|
5
|
+
* @returns A {@link MimiContent} with a SinglePart `text/markdown` Render body and a fresh salt.
|
|
6
|
+
*/
|
|
7
|
+
export declare function buildPost(body: string): MimiContent;
|
|
8
|
+
/**
|
|
9
|
+
* A reply to another message.
|
|
10
|
+
* @param body - The reply body.
|
|
11
|
+
* @param targetHash - The replied-to message's 32-byte content-hash (MessageId).
|
|
12
|
+
* @returns A text {@link MimiContent} with `inReplyTo` set to `targetHash`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function buildReply(body: string, targetHash: Uint8Array): MimiContent;
|
|
15
|
+
/**
|
|
16
|
+
* An edit of an existing message.
|
|
17
|
+
* @param targetHash - The edited message's 32-byte content-hash.
|
|
18
|
+
* @param body - The new body.
|
|
19
|
+
* @returns A text {@link MimiContent} with `replaces` set to `targetHash`.
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildEdit(targetHash: Uint8Array, body: string): MimiContent;
|
|
22
|
+
/**
|
|
23
|
+
* A delete (tombstone) of an existing message.
|
|
24
|
+
* @param targetHash - The deleted message's 32-byte content-hash.
|
|
25
|
+
* @returns A {@link MimiContent} with `replaces` set and a NullPart body.
|
|
26
|
+
*/
|
|
27
|
+
export declare function buildDelete(targetHash: Uint8Array): MimiContent;
|
|
28
|
+
/**
|
|
29
|
+
* A reaction to a message.
|
|
30
|
+
* @param targetHash - The reacted-to message's 32-byte content-hash.
|
|
31
|
+
* @param token - The reaction token (e.g. an emoji).
|
|
32
|
+
* @returns A {@link MimiContent} with `inReplyTo` set and a Reaction-disposition `text/plain` body.
|
|
33
|
+
*/
|
|
34
|
+
export declare function buildReaction(targetHash: Uint8Array, token: string): MimiContent;
|
|
35
|
+
/**
|
|
36
|
+
* An un-react: withdraws one of your own reactions.
|
|
37
|
+
* @param reactionHash - The 32-byte content-hash of YOUR reaction message being withdrawn.
|
|
38
|
+
* @returns A {@link MimiContent} with `replaces` set and a NullPart body.
|
|
39
|
+
*/
|
|
40
|
+
export declare function buildUnreact(reactionHash: Uint8Array): MimiContent;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// Tier-2 MimiContent builders — the six surfaced operations (post/reply/edit/delete/react/un-react).
|
|
2
|
+
//
|
|
3
|
+
// Each mints a fresh CSPRNG salt (crypto.getRandomValues — never Math.random; CLAUDE.md §1) so equal
|
|
4
|
+
// bodies still hash distinctly (unlinkability). The structural details of draft-08 MimiContent
|
|
5
|
+
// (bare-MessageId references, disposition/language on the NestedPart wrapper, NullPart tombstones) stay
|
|
6
|
+
// here so the hook deals only in builders. References (inReplyTo/replaces) are 32-byte content-hashes
|
|
7
|
+
// computed by the caller via contentHash(...).
|
|
8
|
+
import { Cardinality, Disposition, } from "./mimi-content.js";
|
|
9
|
+
const utf8 = (s) => new TextEncoder().encode(s);
|
|
10
|
+
/** 16 bytes of CSPRNG salt. WebCrypto `getRandomValues` is present on web, React Native, and Node ≥ 19. */
|
|
11
|
+
function freshSalt() {
|
|
12
|
+
return crypto.getRandomValues(new Uint8Array(16));
|
|
13
|
+
}
|
|
14
|
+
/** A SinglePart text body with the given disposition + MIME type. */
|
|
15
|
+
function singleText(body, disposition, contentType) {
|
|
16
|
+
return { cardinality: Cardinality.Single, disposition, language: "", contentType, content: utf8(body) };
|
|
17
|
+
}
|
|
18
|
+
/** A NullPart tombstone (delete / un-react). The wrapper still carries disposition + language. */
|
|
19
|
+
function nullPart() {
|
|
20
|
+
return { cardinality: Cardinality.Null, disposition: Disposition.Render, language: "" };
|
|
21
|
+
}
|
|
22
|
+
/** The fields shared by every built message (fresh salt; no topic/expiry/extensions). */
|
|
23
|
+
function base() {
|
|
24
|
+
return { salt: freshSalt(), topicId: new Uint8Array(), expires: null, extensions: new Map() };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* A plain text post.
|
|
28
|
+
* @param body - The markdown message body.
|
|
29
|
+
* @returns A {@link MimiContent} with a SinglePart `text/markdown` Render body and a fresh salt.
|
|
30
|
+
*/
|
|
31
|
+
export function buildPost(body) {
|
|
32
|
+
return { ...base(), replaces: null, inReplyTo: null, nestedPart: singleText(body, Disposition.Render, "text/markdown") };
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A reply to another message.
|
|
36
|
+
* @param body - The reply body.
|
|
37
|
+
* @param targetHash - The replied-to message's 32-byte content-hash (MessageId).
|
|
38
|
+
* @returns A text {@link MimiContent} with `inReplyTo` set to `targetHash`.
|
|
39
|
+
*/
|
|
40
|
+
export function buildReply(body, targetHash) {
|
|
41
|
+
return { ...base(), replaces: null, inReplyTo: targetHash, nestedPart: singleText(body, Disposition.Render, "text/markdown") };
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* An edit of an existing message.
|
|
45
|
+
* @param targetHash - The edited message's 32-byte content-hash.
|
|
46
|
+
* @param body - The new body.
|
|
47
|
+
* @returns A text {@link MimiContent} with `replaces` set to `targetHash`.
|
|
48
|
+
*/
|
|
49
|
+
export function buildEdit(targetHash, body) {
|
|
50
|
+
return { ...base(), replaces: targetHash, inReplyTo: null, nestedPart: singleText(body, Disposition.Render, "text/markdown") };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A delete (tombstone) of an existing message.
|
|
54
|
+
* @param targetHash - The deleted message's 32-byte content-hash.
|
|
55
|
+
* @returns A {@link MimiContent} with `replaces` set and a NullPart body.
|
|
56
|
+
*/
|
|
57
|
+
export function buildDelete(targetHash) {
|
|
58
|
+
return { ...base(), replaces: targetHash, inReplyTo: null, nestedPart: nullPart() };
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* A reaction to a message.
|
|
62
|
+
* @param targetHash - The reacted-to message's 32-byte content-hash.
|
|
63
|
+
* @param token - The reaction token (e.g. an emoji).
|
|
64
|
+
* @returns A {@link MimiContent} with `inReplyTo` set and a Reaction-disposition `text/plain` body.
|
|
65
|
+
*/
|
|
66
|
+
export function buildReaction(targetHash, token) {
|
|
67
|
+
return { ...base(), replaces: null, inReplyTo: targetHash, nestedPart: singleText(token, Disposition.Reaction, "text/plain") };
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* An un-react: withdraws one of your own reactions.
|
|
71
|
+
* @param reactionHash - The 32-byte content-hash of YOUR reaction message being withdrawn.
|
|
72
|
+
* @returns A {@link MimiContent} with `replaces` set and a NullPart body.
|
|
73
|
+
*/
|
|
74
|
+
export function buildUnreact(reactionHash) {
|
|
75
|
+
return { ...base(), replaces: reactionHash, inReplyTo: null, nestedPart: nullPart() };
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=builders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builders.js","sourceRoot":"","sources":["../../../src/content/builders.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,EAAE;AACF,qGAAqG;AACrG,+FAA+F;AAC/F,wGAAwG;AACxG,sGAAsG;AACtG,+CAA+C;AAE/C,OAAO,EACL,WAAW,EAAE,WAAW,GACzB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAExD,2GAA2G;AAC3G,SAAS,SAAS;IAChB,OAAO,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,qEAAqE;AACrE,SAAS,UAAU,CAAC,IAAY,EAAE,WAAwB,EAAE,WAAmB;IAC7E,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC1G,CAAC;AAED,kGAAkG;AAClG,SAAS,QAAQ;IACf,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AAC1F,CAAC;AAED,yFAAyF;AACzF,SAAS,IAAI;IACX,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAChG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;AAC3H,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,UAAsB;IAC7D,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;AACjI,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,UAAsB,EAAE,IAAY;IAC5D,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,UAAU,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC;AACjI,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,UAAsB;IAChD,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;AACtF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,UAAsB,EAAE,KAAa;IACjE,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;AACjI,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,YAAwB;IACnD,OAAO,EAAE,GAAG,IAAI,EAAE,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,CAAC;AACxF,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** A value in the supported CBOR subset. Integers in safe-int range are `number`; larger are `bigint`. */
|
|
2
|
+
export type CborValue = number | bigint | Uint8Array | string | CborValue[] | CborMap | CborTag | boolean | null;
|
|
3
|
+
/** A CBOR map (major type 5). Keys are encoded and sorted deterministically on encode. */
|
|
4
|
+
export type CborMap = Map<CborValue, CborValue>;
|
|
5
|
+
/** A CBOR tagged value (major type 6): a `tag` number wrapping one nested value. */
|
|
6
|
+
export declare class CborTag {
|
|
7
|
+
/** The CBOR tag number (major type 6 argument). */
|
|
8
|
+
readonly tag: number | bigint;
|
|
9
|
+
/** The single nested value wrapped by this tag. */
|
|
10
|
+
readonly value: CborValue;
|
|
11
|
+
constructor(
|
|
12
|
+
/** The CBOR tag number (major type 6 argument). */
|
|
13
|
+
tag: number | bigint,
|
|
14
|
+
/** The single nested value wrapped by this tag. */
|
|
15
|
+
value: CborValue);
|
|
16
|
+
}
|
|
17
|
+
/** Strict-decode bounds. Defaults: 1 MiB total, depth 32, 4096 items per array/map. */
|
|
18
|
+
export interface CborLimits {
|
|
19
|
+
/** Reject inputs longer than this many bytes (DoS guard). Default 1 << 20. */
|
|
20
|
+
maxBytes?: number;
|
|
21
|
+
/** Reject nesting deeper than this. Default 32. */
|
|
22
|
+
maxDepth?: number;
|
|
23
|
+
/** Reject any array/map with more than this many items. Default 4096. */
|
|
24
|
+
maxItems?: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Encode a {@link CborValue} to canonical CBOR bytes (RFC 8949 §4.2 core deterministic rules).
|
|
28
|
+
*
|
|
29
|
+
* @param value - A value in the supported subset.
|
|
30
|
+
* @returns The canonical CBOR byte encoding.
|
|
31
|
+
* @throws {Error} On a non-integer number, an integer above u64, or an unsupported value type.
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* encode(new Map([[1, "a"]])); // → a2 01 61 61 … (keys sorted by encoded bytes)
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function encode(value: CborValue): Uint8Array;
|
|
38
|
+
/**
|
|
39
|
+
* Strict-decode canonical CBOR bytes from the supported subset. Rejects non-canonical encodings,
|
|
40
|
+
* out-of-subset major/simple values, trailing bytes, and anything exceeding {@link CborLimits}.
|
|
41
|
+
*
|
|
42
|
+
* @param bytes - The CBOR input (untrusted peer data — decoded fail-closed).
|
|
43
|
+
* @param limits - Optional {@link CborLimits} bounds.
|
|
44
|
+
* @returns The decoded {@link CborValue}.
|
|
45
|
+
* @throws {Error} On any non-canonical encoding, out-of-subset value, truncation, trailing bytes, or
|
|
46
|
+
* a bound (size/depth/item-count) being exceeded.
|
|
47
|
+
*/
|
|
48
|
+
export declare function decode(bytes: Uint8Array, limits?: CborLimits): CborValue;
|