@oxidezap/baileyrs 0.0.7 → 0.0.8
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 +119 -5
- package/lib/Bridge/__tests__/adapt.test.d.ts +2 -0
- package/lib/Bridge/__tests__/adapt.test.d.ts.map +1 -0
- package/lib/Bridge/__tests__/adapt.test.js +355 -0
- package/lib/Bridge/__tests__/adapt.test.js.map +1 -0
- package/lib/Bridge/__tests__/dts-drift.test.d.ts +13 -0
- package/lib/Bridge/__tests__/dts-drift.test.d.ts.map +1 -0
- package/lib/Bridge/__tests__/dts-drift.test.js +92 -0
- package/lib/Bridge/__tests__/dts-drift.test.js.map +1 -0
- package/lib/Bridge/__tests__/fixtures.d.ts +192 -0
- package/lib/Bridge/__tests__/fixtures.d.ts.map +1 -0
- package/lib/Bridge/__tests__/fixtures.js +99 -0
- package/lib/Bridge/__tests__/fixtures.js.map +1 -0
- package/lib/Bridge/adapt.d.ts +28 -0
- package/lib/Bridge/adapt.d.ts.map +1 -0
- package/lib/Bridge/adapt.js +504 -0
- package/lib/Bridge/adapt.js.map +1 -0
- package/lib/Bridge/index.d.ts +12 -0
- package/lib/Bridge/index.d.ts.map +1 -0
- package/lib/Bridge/index.js +12 -0
- package/lib/Bridge/index.js.map +1 -0
- package/lib/Bridge/primitives.d.ts +56 -0
- package/lib/Bridge/primitives.d.ts.map +1 -0
- package/lib/Bridge/primitives.js +58 -0
- package/lib/Bridge/primitives.js.map +1 -0
- package/lib/Bridge/types.d.ts +273 -0
- package/lib/Bridge/types.d.ts.map +1 -0
- package/lib/Bridge/types.js +17 -0
- package/lib/Bridge/types.js.map +1 -0
- package/lib/Defaults/index.d.ts.map +1 -1
- package/lib/Defaults/index.js +2 -2
- package/lib/Defaults/index.js.map +1 -1
- package/lib/Socket/blocking.d.ts.map +1 -1
- package/lib/Socket/chat-actions.d.ts.map +1 -1
- package/lib/Socket/contacts.d.ts +9 -4
- package/lib/Socket/contacts.d.ts.map +1 -1
- package/lib/Socket/contacts.js +11 -8
- package/lib/Socket/contacts.js.map +1 -1
- package/lib/Socket/events.d.ts +7 -1
- package/lib/Socket/events.d.ts.map +1 -1
- package/lib/Socket/events.js +212 -243
- package/lib/Socket/events.js.map +1 -1
- package/lib/Socket/group-notifications.d.ts +25 -0
- package/lib/Socket/group-notifications.d.ts.map +1 -0
- package/lib/Socket/group-notifications.js +162 -0
- package/lib/Socket/group-notifications.js.map +1 -0
- package/lib/Socket/groups.d.ts +12 -1
- package/lib/Socket/groups.d.ts.map +1 -1
- package/lib/Socket/groups.js +44 -1
- package/lib/Socket/groups.js.map +1 -1
- package/lib/Socket/index.d.ts +47 -13
- package/lib/Socket/index.d.ts.map +1 -1
- package/lib/Socket/index.js +158 -24
- package/lib/Socket/index.js.map +1 -1
- package/lib/Socket/messages.d.ts +5 -2
- package/lib/Socket/messages.d.ts.map +1 -1
- package/lib/Socket/messages.js +42 -21
- package/lib/Socket/messages.js.map +1 -1
- package/lib/Socket/newsletter.d.ts.map +1 -1
- package/lib/Socket/presence.d.ts.map +1 -1
- package/lib/Socket/profile.d.ts +7 -1
- package/lib/Socket/profile.d.ts.map +1 -1
- package/lib/Socket/profile.js +20 -5
- package/lib/Socket/profile.js.map +1 -1
- package/lib/Socket/transport.d.ts.map +1 -1
- package/lib/Socket/transport.js +14 -13
- package/lib/Socket/transport.js.map +1 -1
- package/lib/Socket/types.d.ts.map +1 -1
- package/lib/Types/Auth.d.ts +1 -1
- package/lib/Types/Auth.d.ts.map +1 -1
- package/lib/Types/Bussines.d.ts +1 -1
- package/lib/Types/Bussines.d.ts.map +1 -1
- package/lib/Types/Chat.d.ts +1 -1
- package/lib/Types/Chat.d.ts.map +1 -1
- package/lib/Types/Events.d.ts +12 -3
- package/lib/Types/Events.d.ts.map +1 -1
- package/lib/Types/Events.js +1 -1
- package/lib/Types/Events.js.map +1 -1
- package/lib/Types/GroupMetadata.d.ts.map +1 -1
- package/lib/Types/Message.d.ts +16 -1
- package/lib/Types/Message.d.ts.map +1 -1
- package/lib/Types/Message.js +1 -1
- package/lib/Types/Message.js.map +1 -1
- package/lib/Types/Socket.d.ts +42 -1
- package/lib/Types/Socket.d.ts.map +1 -1
- package/lib/Types/State.d.ts +1 -1
- package/lib/Types/State.d.ts.map +1 -1
- package/lib/Types/index.d.ts +1 -1
- package/lib/Types/index.d.ts.map +1 -1
- package/lib/Types/index.js +17 -12
- package/lib/Types/index.js.map +1 -1
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts +23 -0
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.d.ts.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js +157 -0
- package/lib/Utils/__tests__/wrap-legacy-store-lid-mapping.test.js.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts +31 -0
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.d.ts.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js +253 -0
- package/lib/Utils/__tests__/wrap-legacy-store-sender-key.test.js.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts +32 -0
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.d.ts.map +1 -0
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.js +488 -0
- package/lib/Utils/__tests__/wrap-legacy-store-session.test.js.map +1 -0
- package/lib/Utils/boom.d.ts +33 -0
- package/lib/Utils/boom.d.ts.map +1 -0
- package/lib/Utils/boom.js +63 -0
- package/lib/Utils/boom.js.map +1 -0
- package/lib/Utils/browser-utils.d.ts.map +1 -1
- package/lib/Utils/event-buffer.d.ts.map +1 -1
- package/lib/Utils/generics.d.ts +37 -1
- package/lib/Utils/generics.d.ts.map +1 -1
- package/lib/Utils/generics.js +60 -2
- package/lib/Utils/generics.js.map +1 -1
- package/lib/Utils/index.d.ts +1 -0
- package/lib/Utils/index.d.ts.map +1 -1
- package/lib/Utils/index.js +10 -9
- package/lib/Utils/index.js.map +1 -1
- package/lib/Utils/lid-mapping-store.d.ts +81 -0
- package/lib/Utils/lid-mapping-store.d.ts.map +1 -0
- package/lib/Utils/lid-mapping-store.js +126 -0
- package/lib/Utils/lid-mapping-store.js.map +1 -0
- package/lib/Utils/logger.d.ts.map +1 -1
- package/lib/Utils/logger.js +25 -1
- package/lib/Utils/logger.js.map +1 -1
- package/lib/Utils/messages-media.d.ts.map +1 -1
- package/lib/Utils/messages-media.js +1 -1
- package/lib/Utils/messages-media.js.map +1 -1
- package/lib/Utils/messages.d.ts +30 -1
- package/lib/Utils/messages.d.ts.map +1 -1
- package/lib/Utils/messages.js +115 -41
- package/lib/Utils/messages.js.map +1 -1
- package/lib/Utils/native-crypto-provider.d.ts +18 -0
- package/lib/Utils/native-crypto-provider.d.ts.map +1 -0
- package/lib/Utils/native-crypto-provider.js +67 -0
- package/lib/Utils/native-crypto-provider.js.map +1 -0
- package/lib/Utils/use-bridge-store.d.ts.map +1 -1
- package/lib/Utils/use-memory-store.d.ts.map +1 -1
- package/lib/Utils/use-memory-store.js +1 -1
- package/lib/Utils/use-memory-store.js.map +1 -1
- package/lib/Utils/use-multi-file-auth-state.d.ts.map +1 -1
- package/lib/Utils/use-multi-file-auth-state.js +1 -1
- package/lib/Utils/use-multi-file-auth-state.js.map +1 -1
- package/lib/Utils/wrap-legacy-store.d.ts.map +1 -1
- package/lib/Utils/wrap-legacy-store.js +621 -13
- package/lib/Utils/wrap-legacy-store.js.map +1 -1
- package/lib/WABinary/index.d.ts.map +1 -1
- package/lib/WABinary/index.js +1 -1
- package/lib/WABinary/index.js.map +1 -1
- package/lib/__tests__/expect.d.ts +30 -0
- package/lib/__tests__/expect.d.ts.map +1 -0
- package/lib/__tests__/expect.js +60 -0
- package/lib/__tests__/expect.js.map +1 -0
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +9 -6
- package/lib/index.js.map +1 -1
- package/package.json +30 -25
- package/WAProto/index.d.ts +0 -13875
- package/WAProto/index.js +0 -175
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pin down the `session` cross-impl gap. Sister of the sender_key test.
|
|
3
|
+
*
|
|
4
|
+
* Bridge (Rust libsignal) writes:
|
|
5
|
+
* • store: `session`
|
|
6
|
+
* • key: `{user}[:jidDev]@{server}.{signalDev}` e.g. "100000037037034@lid.0"
|
|
7
|
+
* • value: raw protobuf bytes of `waproto.RecordStructure`
|
|
8
|
+
* (current_session + previous_sessions, both `SessionStructure`)
|
|
9
|
+
*
|
|
10
|
+
* Upstream baileys (JS libsignal) writes:
|
|
11
|
+
* • store: `session` (same name, so no rename)
|
|
12
|
+
* • key: `{signalUser}.{deviceId}` e.g. "100000037037034_1.0"
|
|
13
|
+
* where signalUser = `${user}` for s.whatsapp.net (domainType 0),
|
|
14
|
+
* `${user}_${domainType}` otherwise
|
|
15
|
+
* • value: a plain JS object (NOT bytes!) with shape
|
|
16
|
+
* `{ _sessions: { [base64BaseKey]: SessionEntry }, version: 'v1' }`
|
|
17
|
+
* The keys store is responsible for JSON-stringifying it on disk.
|
|
18
|
+
*
|
|
19
|
+
* Two diffs at the boundary:
|
|
20
|
+
* 1. KEY format: bridge `addr@server.dev` ↔ upstream `signalUser.deviceId`
|
|
21
|
+
* 2. VALUE format: proto bytes ↔ JS object (with base64-encoded byte fields)
|
|
22
|
+
*
|
|
23
|
+
* If wrap-legacy-store doesn't translate, upstream's `loadSession` either
|
|
24
|
+
* (a) doesn't find the key at all, OR
|
|
25
|
+
* (b) finds it (Buffer of proto bytes) and throws inside SessionRecord.deserialize
|
|
26
|
+
* → returns null → falls back to fresh PreKey signal handshake. The e2e
|
|
27
|
+
* 1:1 phases still pass via that fallback, but every cross-impl swap then
|
|
28
|
+
* costs an extra ~3 wire roundtrips per peer pair. These tests pin down
|
|
29
|
+
* the contract for direct, no-re-handshake compatibility.
|
|
30
|
+
*/
|
|
31
|
+
import { Buffer } from 'node:buffer';
|
|
32
|
+
import { describe, test } from 'node:test';
|
|
33
|
+
// libsignal has no .d.ts; importing the JS module directly is fine for a
|
|
34
|
+
// node-test runtime, we just have to widen the type at the boundary.
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
36
|
+
// @ts-expect-error -- no types
|
|
37
|
+
import SessionRecord from 'libsignal/src/session_record.js';
|
|
38
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- bridge proto-types ambient
|
|
39
|
+
import { proto as bridgeProto } from 'whatsapp-rust-bridge/proto-types';
|
|
40
|
+
import { wrapLegacyStore } from "../wrap-legacy-store.js";
|
|
41
|
+
import { initAuthCreds } from "../generics.js";
|
|
42
|
+
import { expect } from "../../__tests__/expect.js";
|
|
43
|
+
// ── Helpers ──────────────────────────────────────────────────────────────
|
|
44
|
+
function makeMemKeys() {
|
|
45
|
+
const data = {};
|
|
46
|
+
return {
|
|
47
|
+
raw: data,
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
async get(type, ids) {
|
|
50
|
+
const bucket = data[type] ?? {};
|
|
51
|
+
const out = {};
|
|
52
|
+
for (const id of ids)
|
|
53
|
+
out[id] = bucket[id] ?? null;
|
|
54
|
+
return out;
|
|
55
|
+
},
|
|
56
|
+
async set(updates) {
|
|
57
|
+
for (const [type, bucket] of Object.entries(updates)) {
|
|
58
|
+
data[type] ?? (data[type] = {});
|
|
59
|
+
for (const [id, val] of Object.entries(bucket)) {
|
|
60
|
+
if (val === null || val === undefined)
|
|
61
|
+
delete data[type][id];
|
|
62
|
+
else
|
|
63
|
+
data[type][id] = val;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async function makeWrapped() {
|
|
70
|
+
const creds = initAuthCreds();
|
|
71
|
+
const keys = makeMemKeys();
|
|
72
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
73
|
+
const state = { creds, keys: keys };
|
|
74
|
+
const wrapped = await wrapLegacyStore(state, async () => { });
|
|
75
|
+
return { wrapped, keys, creds };
|
|
76
|
+
}
|
|
77
|
+
const fill = (n, base) => new Uint8Array(n).map((_, i) => (i * base + base) & 0xff);
|
|
78
|
+
/** Build a realistic, fully-populated `RecordStructure` proto byte blob —
|
|
79
|
+
* matching what Rust libsignal would produce for an established Signal
|
|
80
|
+
* session that has both a sender chain and a receiver chain. */
|
|
81
|
+
function buildBridgeSessionBytes(opts) {
|
|
82
|
+
const { rootKey = fill(32, 1), previousCounter = 0, senderRatchetPub = fill(33, 2), senderRatchetPriv = fill(32, 3), senderChainKey = fill(32, 4), senderChainIndex = 0, receiverRatchetPub = fill(33, 5), receiverChainKey = fill(32, 6), receiverChainIndex = 1, aliceBaseKey = fill(33, 7), remoteIdentity = fill(33, 8), remoteRegistrationId = 1234, localRegistrationId = 5678 } = opts;
|
|
83
|
+
const session = bridgeProto.SessionStructure.create({
|
|
84
|
+
sessionVersion: 3,
|
|
85
|
+
localIdentityPublic: fill(33, 9),
|
|
86
|
+
remoteIdentityPublic: remoteIdentity,
|
|
87
|
+
rootKey,
|
|
88
|
+
previousCounter,
|
|
89
|
+
senderChain: {
|
|
90
|
+
senderRatchetKey: senderRatchetPub,
|
|
91
|
+
senderRatchetKeyPrivate: senderRatchetPriv,
|
|
92
|
+
chainKey: { index: senderChainIndex, key: senderChainKey },
|
|
93
|
+
messageKeys: []
|
|
94
|
+
},
|
|
95
|
+
receiverChains: [
|
|
96
|
+
{
|
|
97
|
+
senderRatchetKey: receiverRatchetPub,
|
|
98
|
+
chainKey: { index: receiverChainIndex, key: receiverChainKey },
|
|
99
|
+
messageKeys: []
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
remoteRegistrationId,
|
|
103
|
+
localRegistrationId,
|
|
104
|
+
aliceBaseKey
|
|
105
|
+
});
|
|
106
|
+
const record = bridgeProto.RecordStructure.create({
|
|
107
|
+
currentSession: session,
|
|
108
|
+
previousSessions: []
|
|
109
|
+
});
|
|
110
|
+
return bridgeProto.RecordStructure.encode(record).finish();
|
|
111
|
+
}
|
|
112
|
+
const SAMPLE_BRIDGE_KEY_LID = '100000037037034@lid.0';
|
|
113
|
+
const EXPECTED_UPSTREAM_KEY_LID = '100000037037034_1.0';
|
|
114
|
+
const SAMPLE_BRIDGE_KEY_PN = '559980000003@s.whatsapp.net.0';
|
|
115
|
+
const EXPECTED_UPSTREAM_KEY_PN = '559980000003.0';
|
|
116
|
+
const SAMPLE_BRIDGE_KEY_PN_DEV = '559980000003:5@s.whatsapp.net.0';
|
|
117
|
+
const EXPECTED_UPSTREAM_KEY_PN_DEV = '559980000003.5';
|
|
118
|
+
// ── Tests ────────────────────────────────────────────────────────────────
|
|
119
|
+
describe('wrap-legacy-store: session key-name translation (cross-impl)', () => {
|
|
120
|
+
test('bridge SET writes under the upstream-formatted key (LID)', async () => {
|
|
121
|
+
const { wrapped, keys } = await makeWrapped();
|
|
122
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, buildBridgeSessionBytes({}));
|
|
123
|
+
expect(keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID]).toBeDefined();
|
|
124
|
+
// The bridge-shaped key MUST NOT be written; otherwise upstream's
|
|
125
|
+
// `loadSession(<upstreamKey>)` won't find anything.
|
|
126
|
+
expect(keys.raw['session']?.[SAMPLE_BRIDGE_KEY_LID]).toBeUndefined();
|
|
127
|
+
});
|
|
128
|
+
test('bridge SET writes under the upstream-formatted key (PN, no device)', async () => {
|
|
129
|
+
const { wrapped, keys } = await makeWrapped();
|
|
130
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_PN, buildBridgeSessionBytes({}));
|
|
131
|
+
expect(keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN]).toBeDefined();
|
|
132
|
+
});
|
|
133
|
+
test('bridge SET writes under the upstream-formatted key (PN with device)', async () => {
|
|
134
|
+
const { wrapped, keys } = await makeWrapped();
|
|
135
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_PN_DEV, buildBridgeSessionBytes({}));
|
|
136
|
+
expect(keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN_DEV]).toBeDefined();
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
describe('wrap-legacy-store: session value-byte translation (cross-impl)', () => {
|
|
140
|
+
test('bridge-written proto bytes are loadable by upstream SessionRecord.deserialize', async () => {
|
|
141
|
+
const { wrapped, keys } = await makeWrapped();
|
|
142
|
+
const aliceBaseKey = Buffer.from(new Uint8Array(33).map((_, i) => (i + 100) & 0xff));
|
|
143
|
+
const rootKey = Buffer.from(new Uint8Array(32).map((_, i) => (i * 3 + 1) & 0xff));
|
|
144
|
+
const remoteIdentity = Buffer.from(new Uint8Array(33).map((_, i) => (i * 5 + 7) & 0xff));
|
|
145
|
+
const senderRatchetPub = Buffer.from(new Uint8Array(33).map((_, i) => (i * 11 + 13) & 0xff));
|
|
146
|
+
const senderRatchetPriv = Buffer.from(new Uint8Array(32).map((_, i) => (i * 13 + 17) & 0xff));
|
|
147
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, buildBridgeSessionBytes({
|
|
148
|
+
rootKey: new Uint8Array(rootKey),
|
|
149
|
+
aliceBaseKey: new Uint8Array(aliceBaseKey),
|
|
150
|
+
remoteIdentity: new Uint8Array(remoteIdentity),
|
|
151
|
+
senderRatchetPub: new Uint8Array(senderRatchetPub),
|
|
152
|
+
senderRatchetPriv: new Uint8Array(senderRatchetPriv),
|
|
153
|
+
remoteRegistrationId: 99,
|
|
154
|
+
previousCounter: 4
|
|
155
|
+
}));
|
|
156
|
+
const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID];
|
|
157
|
+
expect(stored).toBeDefined();
|
|
158
|
+
// THE call upstream's loadSession makes. If it throws or produces a
|
|
159
|
+
// session with no open entries, the regression isn't fixed.
|
|
160
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- libsignal lacks .d.ts
|
|
161
|
+
const rec = SessionRecord.deserialize(stored);
|
|
162
|
+
expect(rec.haveOpenSession()).toBe(true);
|
|
163
|
+
const open = rec.getOpenSession();
|
|
164
|
+
expect(open).toBeDefined();
|
|
165
|
+
expect(open.registrationId).toBe(99);
|
|
166
|
+
expect(open.currentRatchet.previousCounter).toBe(4);
|
|
167
|
+
expect(Buffer.from(open.currentRatchet.rootKey).equals(rootKey)).toBe(true);
|
|
168
|
+
expect(Buffer.from(open.currentRatchet.ephemeralKeyPair.pubKey).equals(senderRatchetPub)).toBe(true);
|
|
169
|
+
expect(Buffer.from(open.currentRatchet.ephemeralKeyPair.privKey).equals(senderRatchetPriv)).toBe(true);
|
|
170
|
+
expect(Buffer.from(open.indexInfo.baseKey).equals(aliceBaseKey)).toBe(true);
|
|
171
|
+
expect(Buffer.from(open.indexInfo.remoteIdentityKey).equals(remoteIdentity)).toBe(true);
|
|
172
|
+
// indexInfo.closed === -1 means the session is OPEN; cross-impl
|
|
173
|
+
// swap of an open session is the whole point.
|
|
174
|
+
expect(open.indexInfo.closed).toBe(-1);
|
|
175
|
+
// We expect at least one chain populated (sender + receiver).
|
|
176
|
+
expect(Object.keys(open._chains).length).toBeGreaterThanOrEqual(1);
|
|
177
|
+
});
|
|
178
|
+
test('upstream-written JS-shaped object round-trips through bridge GET to valid proto bytes', async () => {
|
|
179
|
+
const { wrapped, keys } = await makeWrapped();
|
|
180
|
+
// Build a SessionRecord the upstream way (start from a synthetic
|
|
181
|
+
// session shape, since libsignal exposes no public constructor that
|
|
182
|
+
// fully populates the entry).
|
|
183
|
+
const baseKey = Buffer.alloc(33, 0xa0);
|
|
184
|
+
const rootKey = Buffer.alloc(32, 0xb0);
|
|
185
|
+
const remoteIdent = Buffer.alloc(33, 0xc0);
|
|
186
|
+
const ephPub = Buffer.alloc(33, 0xd0);
|
|
187
|
+
const ephPriv = Buffer.alloc(32, 0xe0);
|
|
188
|
+
const lastRemoteEph = Buffer.alloc(33, 0xf0);
|
|
189
|
+
const upstreamRecord = {
|
|
190
|
+
_sessions: {
|
|
191
|
+
[baseKey.toString('base64')]: {
|
|
192
|
+
registrationId: 4242,
|
|
193
|
+
currentRatchet: {
|
|
194
|
+
ephemeralKeyPair: {
|
|
195
|
+
pubKey: ephPub.toString('base64'),
|
|
196
|
+
privKey: ephPriv.toString('base64')
|
|
197
|
+
},
|
|
198
|
+
lastRemoteEphemeralKey: lastRemoteEph.toString('base64'),
|
|
199
|
+
previousCounter: 7,
|
|
200
|
+
rootKey: rootKey.toString('base64')
|
|
201
|
+
},
|
|
202
|
+
indexInfo: {
|
|
203
|
+
baseKey: baseKey.toString('base64'),
|
|
204
|
+
baseKeyType: 1, // OURS — we initiated
|
|
205
|
+
closed: -1,
|
|
206
|
+
used: Date.now(),
|
|
207
|
+
created: Date.now(),
|
|
208
|
+
remoteIdentityKey: remoteIdent.toString('base64')
|
|
209
|
+
},
|
|
210
|
+
_chains: {}
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
version: 'v1'
|
|
214
|
+
};
|
|
215
|
+
keys.raw['session'] = { [EXPECTED_UPSTREAM_KEY_LID]: upstreamRecord };
|
|
216
|
+
const protoOut = (await wrapped.get('session', SAMPLE_BRIDGE_KEY_LID));
|
|
217
|
+
expect(protoOut).not.toBe(null);
|
|
218
|
+
const decoded = bridgeProto.RecordStructure.decode(protoOut);
|
|
219
|
+
expect(decoded.currentSession).toBeDefined();
|
|
220
|
+
const cs = decoded.currentSession;
|
|
221
|
+
expect(cs.remoteRegistrationId).toBe(4242);
|
|
222
|
+
expect(cs.previousCounter).toBe(7);
|
|
223
|
+
expect(Buffer.from(cs.rootKey).equals(rootKey)).toBe(true);
|
|
224
|
+
expect(Buffer.from(cs.aliceBaseKey).equals(baseKey)).toBe(true);
|
|
225
|
+
expect(Buffer.from(cs.remoteIdentityPublic).equals(remoteIdent)).toBe(true);
|
|
226
|
+
expect(Buffer.from(cs.senderChain.senderRatchetKey).equals(ephPub)).toBe(true);
|
|
227
|
+
expect(Buffer.from(cs.senderChain.senderRatchetKeyPrivate).equals(ephPriv)).toBe(true);
|
|
228
|
+
});
|
|
229
|
+
test('round-trip: bridge SET → upstream loadSession+haveOpenSession → still open + correct identity', async () => {
|
|
230
|
+
const { wrapped, keys } = await makeWrapped();
|
|
231
|
+
const remoteIdentity = Buffer.alloc(33, 0x11);
|
|
232
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_PN, buildBridgeSessionBytes({ remoteIdentity: new Uint8Array(remoteIdentity), remoteRegistrationId: 7 }));
|
|
233
|
+
const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN];
|
|
234
|
+
expect(stored).toBeDefined();
|
|
235
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
236
|
+
const rec = SessionRecord.deserialize(stored);
|
|
237
|
+
expect(rec.haveOpenSession()).toBe(true);
|
|
238
|
+
const open = rec.getOpenSession();
|
|
239
|
+
expect(open.registrationId).toBe(7);
|
|
240
|
+
expect(Buffer.from(open.indexInfo.remoteIdentityKey).equals(remoteIdentity)).toBe(true);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe('wrap-legacy-store: session edge cases (multi-session, pendingPreKey, lastRemoteEph)', () => {
|
|
244
|
+
test('lastRemoteEphemeralKey does NOT collide with senderRatchetKey when receiverChains is empty (no-collide bug fix)', async () => {
|
|
245
|
+
// Regression for the bug discovered in audit: previously the
|
|
246
|
+
// converter used senderRatchetKey as a placeholder for
|
|
247
|
+
// lastRemoteEphemeralKey when receiverChains was empty, which
|
|
248
|
+
// caused upstream's `maybeStepRatchet` → `getChain(lastRemoteEph)`
|
|
249
|
+
// to return the SENDER chain and `delete chainKey.key` corrupted
|
|
250
|
+
// the outbound encryption channel.
|
|
251
|
+
const { wrapped, keys } = await makeWrapped();
|
|
252
|
+
// Build a freshly-initiated alice-side session: sender chain
|
|
253
|
+
// populated, no receiverChain yet, pendingPreKey set (alice waits
|
|
254
|
+
// for bob's first reply).
|
|
255
|
+
const senderRatchetPub = fill(33, 2);
|
|
256
|
+
const aliceBaseKey = fill(33, 7);
|
|
257
|
+
const protoBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
|
|
258
|
+
currentSession: bridgeProto.SessionStructure.create({
|
|
259
|
+
sessionVersion: 3,
|
|
260
|
+
rootKey: fill(32, 1),
|
|
261
|
+
previousCounter: 0,
|
|
262
|
+
senderChain: {
|
|
263
|
+
senderRatchetKey: senderRatchetPub,
|
|
264
|
+
senderRatchetKeyPrivate: fill(32, 3),
|
|
265
|
+
chainKey: { index: 0, key: fill(32, 4) },
|
|
266
|
+
messageKeys: []
|
|
267
|
+
},
|
|
268
|
+
receiverChains: [],
|
|
269
|
+
remoteIdentityPublic: fill(33, 8),
|
|
270
|
+
remoteRegistrationId: 99,
|
|
271
|
+
localRegistrationId: 11,
|
|
272
|
+
aliceBaseKey,
|
|
273
|
+
pendingPreKey: { preKeyId: 42, signedPreKeyId: 7, baseKey: aliceBaseKey }
|
|
274
|
+
}),
|
|
275
|
+
previousSessions: []
|
|
276
|
+
})).finish();
|
|
277
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, protoBytes);
|
|
278
|
+
const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID];
|
|
279
|
+
expect(stored).toBeDefined();
|
|
280
|
+
const entry = Object.values(stored._sessions)[0];
|
|
281
|
+
// The last-remote-eph MUST NOT equal the sender's ratchet pubkey,
|
|
282
|
+
// otherwise upstream's maybeStepRatchet will close the SENDER chain
|
|
283
|
+
// when the peer ratchets next.
|
|
284
|
+
expect(entry.currentRatchet.lastRemoteEphemeralKey).not.toBe(Buffer.from(senderRatchetPub).toString('base64'));
|
|
285
|
+
});
|
|
286
|
+
test('baseKeyType derives from pendingPreKey: present → OURS (alice), absent → THEIRS (bob)', async () => {
|
|
287
|
+
// Regression for the bug where I always set OURS when aliceBaseKey
|
|
288
|
+
// was set (which is ALWAYS in established sessions), causing
|
|
289
|
+
// upstream's `getSession(byBaseKey)` to throw on every lookup.
|
|
290
|
+
const { wrapped, keys } = await makeWrapped();
|
|
291
|
+
// Bob-side session: established, no pendingPreKey, aliceBaseKey set
|
|
292
|
+
// (it's the peer's ephemeral). MUST land as THEIRS so upstream can
|
|
293
|
+
// look it up by baseKey.
|
|
294
|
+
const bobSideBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
|
|
295
|
+
currentSession: bridgeProto.SessionStructure.create({
|
|
296
|
+
sessionVersion: 3,
|
|
297
|
+
rootKey: fill(32, 1),
|
|
298
|
+
previousCounter: 0,
|
|
299
|
+
senderChain: {
|
|
300
|
+
senderRatchetKey: fill(33, 2),
|
|
301
|
+
senderRatchetKeyPrivate: fill(32, 3),
|
|
302
|
+
chainKey: { index: 0, key: fill(32, 4) },
|
|
303
|
+
messageKeys: []
|
|
304
|
+
},
|
|
305
|
+
receiverChains: [
|
|
306
|
+
{
|
|
307
|
+
senderRatchetKey: fill(33, 5),
|
|
308
|
+
chainKey: { index: 1, key: fill(32, 6) },
|
|
309
|
+
messageKeys: []
|
|
310
|
+
}
|
|
311
|
+
],
|
|
312
|
+
remoteIdentityPublic: fill(33, 8),
|
|
313
|
+
remoteRegistrationId: 1,
|
|
314
|
+
aliceBaseKey: fill(33, 7) // present but we're bob (no pendingPreKey)
|
|
315
|
+
}),
|
|
316
|
+
previousSessions: []
|
|
317
|
+
})).finish();
|
|
318
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_PN, bobSideBytes);
|
|
319
|
+
const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN];
|
|
320
|
+
const bobEntry = Object.values(stored._sessions)[0];
|
|
321
|
+
expect(bobEntry.indexInfo.baseKeyType).toBe(2); // THEIRS
|
|
322
|
+
// Now alice-side: same session shape but with pendingPreKey → OURS.
|
|
323
|
+
const { wrapped: w2, keys: k2 } = await makeWrapped();
|
|
324
|
+
const aliceBaseKey = fill(33, 7);
|
|
325
|
+
const aliceBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
|
|
326
|
+
currentSession: bridgeProto.SessionStructure.create({
|
|
327
|
+
sessionVersion: 3,
|
|
328
|
+
rootKey: fill(32, 1),
|
|
329
|
+
previousCounter: 0,
|
|
330
|
+
senderChain: {
|
|
331
|
+
senderRatchetKey: fill(33, 2),
|
|
332
|
+
senderRatchetKeyPrivate: fill(32, 3),
|
|
333
|
+
chainKey: { index: 0, key: fill(32, 4) },
|
|
334
|
+
messageKeys: []
|
|
335
|
+
},
|
|
336
|
+
receiverChains: [],
|
|
337
|
+
remoteIdentityPublic: fill(33, 8),
|
|
338
|
+
remoteRegistrationId: 1,
|
|
339
|
+
aliceBaseKey,
|
|
340
|
+
pendingPreKey: { preKeyId: 1, signedPreKeyId: 2, baseKey: aliceBaseKey }
|
|
341
|
+
}),
|
|
342
|
+
previousSessions: []
|
|
343
|
+
})).finish();
|
|
344
|
+
await w2.set('session', SAMPLE_BRIDGE_KEY_PN, aliceBytes);
|
|
345
|
+
const aliceStored = k2.raw['session']?.[EXPECTED_UPSTREAM_KEY_PN];
|
|
346
|
+
const aliceEntry = Object.values(aliceStored._sessions)[0];
|
|
347
|
+
expect(aliceEntry.indexInfo.baseKeyType).toBe(1); // OURS
|
|
348
|
+
});
|
|
349
|
+
test('multi-session: currentSession + previousSessions[] all round-trip into upstream _sessions', async () => {
|
|
350
|
+
// Cover the path where Rust archives sessions into previous_sessions
|
|
351
|
+
// (e.g. after identity change). Upstream should see one OPEN entry
|
|
352
|
+
// (closed=-1) plus one or more closed entries that share the same
|
|
353
|
+
// peer key.
|
|
354
|
+
const { wrapped, keys } = await makeWrapped();
|
|
355
|
+
const mkSession = (rootSeed, baseKeySeed) => bridgeProto.SessionStructure.create({
|
|
356
|
+
sessionVersion: 3,
|
|
357
|
+
rootKey: fill(32, rootSeed),
|
|
358
|
+
previousCounter: 0,
|
|
359
|
+
senderChain: {
|
|
360
|
+
senderRatchetKey: fill(33, rootSeed * 3),
|
|
361
|
+
senderRatchetKeyPrivate: fill(32, rootSeed * 5),
|
|
362
|
+
chainKey: { index: 0, key: fill(32, rootSeed * 7) },
|
|
363
|
+
messageKeys: []
|
|
364
|
+
},
|
|
365
|
+
receiverChains: [
|
|
366
|
+
{
|
|
367
|
+
senderRatchetKey: fill(33, rootSeed * 11),
|
|
368
|
+
chainKey: { index: 1, key: fill(32, rootSeed * 13) },
|
|
369
|
+
messageKeys: []
|
|
370
|
+
}
|
|
371
|
+
],
|
|
372
|
+
remoteIdentityPublic: fill(33, 8),
|
|
373
|
+
remoteRegistrationId: 1,
|
|
374
|
+
aliceBaseKey: fill(33, baseKeySeed)
|
|
375
|
+
});
|
|
376
|
+
const protoBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
|
|
377
|
+
currentSession: mkSession(1, 100),
|
|
378
|
+
previousSessions: [mkSession(2, 200), mkSession(3, 250)]
|
|
379
|
+
})).finish();
|
|
380
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, protoBytes);
|
|
381
|
+
const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID];
|
|
382
|
+
expect(stored.version).toBe('v1');
|
|
383
|
+
// 1 current + 2 previous, distinct baseKeys → 3 entries.
|
|
384
|
+
expect(Object.keys(stored._sessions).length).toBe(3);
|
|
385
|
+
// Exactly one OPEN session (closed=-1).
|
|
386
|
+
const open = Object.values(stored._sessions).filter(e => e.indexInfo.closed === -1);
|
|
387
|
+
expect(open.length).toBe(1);
|
|
388
|
+
expect(open[0].indexInfo.baseKey).toBe(Buffer.from(fill(33, 100)).toString('base64'));
|
|
389
|
+
// The other two are CLOSED with positive timestamps. Most recent
|
|
390
|
+
// archived (previous[0]) must have a LARGER timestamp than
|
|
391
|
+
// previous[1] so removeOldSessions evicts the oldest first
|
|
392
|
+
// (matching Rust's archive ordering: front = newest).
|
|
393
|
+
const closedEntries = Object.values(stored._sessions).filter(e => e.indexInfo.closed > 0);
|
|
394
|
+
expect(closedEntries.length).toBe(2);
|
|
395
|
+
const newer = closedEntries.find(e => e.indexInfo.baseKey === Buffer.from(fill(33, 200)).toString('base64'));
|
|
396
|
+
const older = closedEntries.find(e => e.indexInfo.baseKey === Buffer.from(fill(33, 250)).toString('base64'));
|
|
397
|
+
expect(newer).toBeDefined();
|
|
398
|
+
expect(older).toBeDefined();
|
|
399
|
+
expect(newer.indexInfo.closed).toBeGreaterThan(older.indexInfo.closed);
|
|
400
|
+
});
|
|
401
|
+
test('pendingPreKey: round-trips through bridge→upstream→bridge with field rename preserved', async () => {
|
|
402
|
+
// Bridge proto: pendingPreKey { preKeyId, signedPreKeyId, baseKey }
|
|
403
|
+
// Upstream JS: session.pendingPreKey { preKeyId, signedKeyId, baseKey }
|
|
404
|
+
// (yes, the field name differs — `signedPreKeyId` vs `signedKeyId`)
|
|
405
|
+
const { wrapped, keys } = await makeWrapped();
|
|
406
|
+
const aliceBaseKey = fill(33, 7);
|
|
407
|
+
const protoBytes = bridgeProto.RecordStructure.encode(bridgeProto.RecordStructure.create({
|
|
408
|
+
currentSession: bridgeProto.SessionStructure.create({
|
|
409
|
+
sessionVersion: 3,
|
|
410
|
+
rootKey: fill(32, 1),
|
|
411
|
+
previousCounter: 0,
|
|
412
|
+
senderChain: {
|
|
413
|
+
senderRatchetKey: fill(33, 2),
|
|
414
|
+
senderRatchetKeyPrivate: fill(32, 3),
|
|
415
|
+
chainKey: { index: 0, key: fill(32, 4) },
|
|
416
|
+
messageKeys: []
|
|
417
|
+
},
|
|
418
|
+
receiverChains: [],
|
|
419
|
+
remoteIdentityPublic: fill(33, 8),
|
|
420
|
+
remoteRegistrationId: 1,
|
|
421
|
+
aliceBaseKey,
|
|
422
|
+
pendingPreKey: { preKeyId: 314, signedPreKeyId: 271, baseKey: aliceBaseKey }
|
|
423
|
+
}),
|
|
424
|
+
previousSessions: []
|
|
425
|
+
})).finish();
|
|
426
|
+
await wrapped.set('session', SAMPLE_BRIDGE_KEY_LID, protoBytes);
|
|
427
|
+
const stored = keys.raw['session']?.[EXPECTED_UPSTREAM_KEY_LID];
|
|
428
|
+
const entry = Object.values(stored._sessions)[0];
|
|
429
|
+
expect(entry.pendingPreKey).toBeDefined();
|
|
430
|
+
expect(entry.pendingPreKey.preKeyId).toBe(314);
|
|
431
|
+
// Field rename: bridge's `signedPreKeyId` → upstream's `signedKeyId`.
|
|
432
|
+
expect(entry.pendingPreKey.signedKeyId).toBe(271);
|
|
433
|
+
expect(entry.pendingPreKey.baseKey).toBe(Buffer.from(aliceBaseKey).toString('base64'));
|
|
434
|
+
// Now read it back through the bridge GET path — pendingPreKey
|
|
435
|
+
// should round-trip with the original field names.
|
|
436
|
+
const protoOut = (await wrapped.get('session', SAMPLE_BRIDGE_KEY_LID));
|
|
437
|
+
const decoded = bridgeProto.RecordStructure.decode(protoOut);
|
|
438
|
+
expect(decoded.currentSession?.pendingPreKey?.preKeyId).toBe(314);
|
|
439
|
+
expect(decoded.currentSession?.pendingPreKey?.signedPreKeyId).toBe(271);
|
|
440
|
+
});
|
|
441
|
+
test('aliceBaseKey is preserved on JS→bridge round-trip regardless of baseKeyType', async () => {
|
|
442
|
+
// Regression for the matching-second bug discovered in audit: the
|
|
443
|
+
// reverse converter only set aliceBaseKey when baseKeyType=OURS, so
|
|
444
|
+
// bob-side sessions lost aliceBaseKey, breaking Rust's
|
|
445
|
+
// `find_matching_previous_session_index` lookups on subsequent
|
|
446
|
+
// PreKeySignal arrivals.
|
|
447
|
+
const { wrapped, keys } = await makeWrapped();
|
|
448
|
+
const baseKey = Buffer.alloc(33, 0xa0);
|
|
449
|
+
const remoteIdent = Buffer.alloc(33, 0xc0);
|
|
450
|
+
const ephPub = Buffer.alloc(33, 0xd0);
|
|
451
|
+
const ephPriv = Buffer.alloc(32, 0xe0);
|
|
452
|
+
const lastRemoteEph = Buffer.alloc(33, 0xf0);
|
|
453
|
+
const rootKey = Buffer.alloc(32, 0xb0);
|
|
454
|
+
// Bob-side stored object (baseKeyType=THEIRS, no pendingPreKey).
|
|
455
|
+
keys.raw['session'] = {
|
|
456
|
+
[EXPECTED_UPSTREAM_KEY_LID]: {
|
|
457
|
+
_sessions: {
|
|
458
|
+
[baseKey.toString('base64')]: {
|
|
459
|
+
registrationId: 4242,
|
|
460
|
+
currentRatchet: {
|
|
461
|
+
ephemeralKeyPair: { pubKey: ephPub.toString('base64'), privKey: ephPriv.toString('base64') },
|
|
462
|
+
lastRemoteEphemeralKey: lastRemoteEph.toString('base64'),
|
|
463
|
+
previousCounter: 0,
|
|
464
|
+
rootKey: rootKey.toString('base64')
|
|
465
|
+
},
|
|
466
|
+
indexInfo: {
|
|
467
|
+
baseKey: baseKey.toString('base64'),
|
|
468
|
+
baseKeyType: 2, // THEIRS — we're bob
|
|
469
|
+
closed: -1,
|
|
470
|
+
used: Date.now(),
|
|
471
|
+
created: Date.now(),
|
|
472
|
+
remoteIdentityKey: remoteIdent.toString('base64')
|
|
473
|
+
},
|
|
474
|
+
_chains: {}
|
|
475
|
+
}
|
|
476
|
+
},
|
|
477
|
+
version: 'v1'
|
|
478
|
+
}
|
|
479
|
+
};
|
|
480
|
+
const protoOut = (await wrapped.get('session', SAMPLE_BRIDGE_KEY_LID));
|
|
481
|
+
const decoded = bridgeProto.RecordStructure.decode(protoOut);
|
|
482
|
+
// aliceBaseKey MUST be set even when we're bob (baseKeyType=THEIRS),
|
|
483
|
+
// otherwise Rust's session-matching path breaks.
|
|
484
|
+
expect(decoded.currentSession?.aliceBaseKey).toBeDefined();
|
|
485
|
+
expect(Buffer.from(decoded.currentSession.aliceBaseKey).equals(baseKey)).toBe(true);
|
|
486
|
+
});
|
|
487
|
+
});
|
|
488
|
+
//# sourceMappingURL=wrap-legacy-store-session.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wrap-legacy-store-session.test.js","sourceRoot":"","sources":["../../../src/Utils/__tests__/wrap-legacy-store-session.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC1C,yEAAyE;AACzE,qEAAqE;AACrE,6DAA6D;AAC7D,+BAA+B;AAC/B,OAAO,aAAa,MAAM,iCAAiC,CAAA;AAC3D,4FAA4F;AAC5F,OAAO,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,kCAAkC,CAAA;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAElD,4EAA4E;AAE5E,SAAS,WAAW;IACnB,MAAM,IAAI,GAA4C,EAAE,CAAA;IACxD,OAAO;QACN,GAAG,EAAE,IAAI;QACT,8DAA8D;QAC9D,KAAK,CAAC,GAAG,CAAC,IAAY,EAAE,GAAa;YACpC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAA;YAC/B,MAAM,GAAG,GAA4B,EAAE,CAAA;YACvC,KAAK,MAAM,EAAE,IAAI,GAAG;gBAAE,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAA;YAClD,OAAO,GAAG,CAAA;QACX,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,OAAgD;YACzD,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtD,IAAI,CAAC,IAAI,MAAT,IAAI,CAAC,IAAI,IAAM,EAAE,EAAA;gBACjB,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAChD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;wBAAE,OAAO,IAAI,CAAC,IAAI,CAAE,CAAC,EAAE,CAAC,CAAA;;wBACxD,IAAI,CAAC,IAAI,CAAE,CAAC,EAAE,CAAC,GAAG,GAAG,CAAA;gBAC3B,CAAC;YACF,CAAC;QACF,CAAC;KACD,CAAA;AACF,CAAC;AAED,KAAK,UAAU,WAAW;IACzB,MAAM,KAAK,GAAG,aAAa,EAAE,CAAA;IAC7B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAA;IAC1B,8DAA8D;IAC9D,MAAM,KAAK,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,IAAW,EAAE,CAAA;IAC1C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAA;IAC5D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA;AAChC,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,IAAY,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAA;AAEnG;;gEAEgE;AAChE,SAAS,uBAAuB,CAAC,IAchC;IACA,MAAM,EACL,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EACrB,eAAe,GAAG,CAAC,EACnB,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAC9B,iBAAiB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAC/B,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAC5B,gBAAgB,GAAG,CAAC,EACpB,kBAAkB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAChC,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAC9B,kBAAkB,GAAG,CAAC,EACtB,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAC1B,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAC5B,oBAAoB,GAAG,IAAI,EAC3B,mBAAmB,GAAG,IAAI,EAC1B,GAAG,IAAI,CAAA;IAER,MAAM,OAAO,GAAG,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;QACnD,cAAc,EAAE,CAAC;QACjB,mBAAmB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;QAChC,oBAAoB,EAAE,cAAc;QACpC,OAAO;QACP,eAAe;QACf,WAAW,EAAE;YACZ,gBAAgB,EAAE,gBAAgB;YAClC,uBAAuB,EAAE,iBAAiB;YAC1C,QAAQ,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,GAAG,EAAE,cAAc,EAAE;YAC1D,WAAW,EAAE,EAAE;SACf;QACD,cAAc,EAAE;YACf;gBACC,gBAAgB,EAAE,kBAAkB;gBACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,EAAE,gBAAgB,EAAE;gBAC9D,WAAW,EAAE,EAAE;aACf;SACD;QACD,oBAAoB;QACpB,mBAAmB;QACnB,YAAY;KACZ,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC;QACjD,cAAc,EAAE,OAAO;QACvB,gBAAgB,EAAE,EAAE;KACpB,CAAC,CAAA;IACF,OAAO,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAA;AAC3D,CAAC;AAED,MAAM,qBAAqB,GAAG,uBAAuB,CAAA;AACrD,MAAM,yBAAyB,GAAG,qBAAqB,CAAA;AACvD,MAAM,oBAAoB,GAAG,+BAA+B,CAAA;AAC5D,MAAM,wBAAwB,GAAG,gBAAgB,CAAA;AACjD,MAAM,wBAAwB,GAAG,iCAAiC,CAAA;AAClE,MAAM,4BAA4B,GAAG,gBAAgB,CAAA;AAErD,4EAA4E;AAE5E,QAAQ,CAAC,8DAA8D,EAAE,GAAG,EAAE;IAC7E,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAE7C,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,EAAE,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAA;QAEhF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;QACtE,kEAAkE;QAClE,oDAAoD;QACpD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,qBAAqB,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;IACrE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QACrF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,oBAAoB,EAAE,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAA;QAC/E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,wBAAwB,EAAE,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAA;QACnF,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,4BAA4B,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAC1E,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC/E,IAAI,CAAC,+EAA+E,EAAE,KAAK,IAAI,EAAE;QAChG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAE7C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACpF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACjF,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QACxF,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QAC5F,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAA;QAE7F,MAAM,OAAO,CAAC,GAAG,CAChB,SAAS,EACT,qBAAqB,EACrB,uBAAuB,CAAC;YACvB,OAAO,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC;YAChC,YAAY,EAAE,IAAI,UAAU,CAAC,YAAY,CAAC;YAC1C,cAAc,EAAE,IAAI,UAAU,CAAC,cAAc,CAAC;YAC9C,gBAAgB,EAAE,IAAI,UAAU,CAAC,gBAAgB,CAAC;YAClD,iBAAiB,EAAE,IAAI,UAAU,CAAC,iBAAiB,CAAC;YACpD,oBAAoB,EAAE,EAAE;YACxB,eAAe,EAAE,CAAC;SAClB,CAAC,CACF,CAAA;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAA;QAC/D,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAE5B,oEAAoE;QACpE,4DAA4D;QAC5D,uFAAuF;QACvF,MAAM,GAAG,GAAI,aAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAA;QAC1B,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACpC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACtG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvF,gEAAgE;QAChE,8CAA8C;QAC9C,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;QACtC,8DAA8D;QAC9D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAA;IACnE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACxG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAE7C,iEAAiE;QACjE,oEAAoE;QACpE,8BAA8B;QAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACtC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACtC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAE5C,MAAM,cAAc,GAAG;YACtB,SAAS,EAAE;gBACV,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE;oBAC7B,cAAc,EAAE,IAAI;oBACpB,cAAc,EAAE;wBACf,gBAAgB,EAAE;4BACjB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;4BACjC,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;yBACnC;wBACD,sBAAsB,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBACxD,eAAe,EAAE,CAAC;wBAClB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;qBACnC;oBACD,SAAS,EAAE;wBACV,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;wBACnC,WAAW,EAAE,CAAC,EAAE,sBAAsB;wBACtC,MAAM,EAAE,CAAC,CAAC;wBACV,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;wBAChB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;wBACnB,iBAAiB,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;qBACjD;oBACD,OAAO,EAAE,EAAE;iBACX;aACD;YACD,OAAO,EAAE,IAAI;SACb,CAAA;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,yBAAyB,CAAC,EAAE,cAAc,EAAE,CAAA;QAErE,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAsB,CAAA;QAC3F,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE/B,MAAM,OAAO,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,QAAS,CAAC,CAAA;QAC7D,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5C,MAAM,EAAE,GAAG,OAAO,CAAC,cAAe,CAAA;QAClC,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC1C,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAClC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,OAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,YAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,oBAAqB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5E,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,WAAY,CAAC,gBAAiB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChF,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,WAAY,CAAC,uBAAwB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzF,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+FAA+F,EAAE,KAAK,IAAI,EAAE;QAChH,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC7C,MAAM,OAAO,CAAC,GAAG,CAChB,SAAS,EACT,oBAAoB,EACpB,uBAAuB,CAAC,EAAE,cAAc,EAAE,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,oBAAoB,EAAE,CAAC,EAAE,CAAC,CACpG,CAAA;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAA;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5B,8DAA8D;QAC9D,MAAM,GAAG,GAAI,aAAqB,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;QACtD,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxC,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,EAAE,CAAA;QACjC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACxF,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qFAAqF,EAAE,GAAG,EAAE;IACpG,IAAI,CAAC,iHAAiH,EAAE,KAAK,IAAI,EAAE;QAClI,6DAA6D;QAC7D,uDAAuD;QACvD,8DAA8D;QAC9D,mEAAmE;QACnE,iEAAiE;QACjE,mCAAmC;QACnC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,6DAA6D;QAC7D,kEAAkE;QAClE,0BAA0B;QAC1B,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QACpC,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAChC,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CACpD,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC;YAClC,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBACnD,cAAc,EAAE,CAAC;gBACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,WAAW,EAAE;oBACZ,gBAAgB,EAAE,gBAAgB;oBAClC,uBAAuB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACxC,WAAW,EAAE,EAAE;iBACf;gBACD,cAAc,EAAE,EAAE;gBAClB,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,oBAAoB,EAAE,EAAE;gBACxB,mBAAmB,EAAE,EAAE;gBACvB,YAAY;gBACZ,aAAa,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE;aACzE,CAAC;YACF,gBAAgB,EAAE,EAAE;SACpB,CAAC,CACF,CAAC,MAAM,EAAE,CAAA;QAEV,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,yBAAyB,CAK7D,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,CAAA;QACjD,kEAAkE;QAClE,oEAAoE;QACpE,+BAA+B;QAC/B,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,sBAAsB,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;IAC/G,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACxG,mEAAmE;QACnE,6DAA6D;QAC7D,+DAA+D;QAC/D,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAE7C,oEAAoE;QACpE,mEAAmE;QACnE,yBAAyB;QACzB,MAAM,YAAY,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CACtD,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC;YAClC,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBACnD,cAAc,EAAE,CAAC;gBACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,WAAW,EAAE;oBACZ,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,uBAAuB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACxC,WAAW,EAAE,EAAE;iBACf;gBACD,cAAc,EAAE;oBACf;wBACC,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;wBAC7B,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;wBACxC,WAAW,EAAE,EAAE;qBACf;iBACD;gBACD,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,oBAAoB,EAAE,CAAC;gBACvB,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,2CAA2C;aACrE,CAAC;YACF,gBAAgB,EAAE,EAAE;SACpB,CAAC,CACF,CAAC,MAAM,EAAE,CAAA;QAEV,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,oBAAoB,EAAE,YAAY,CAAC,CAAA;QAChE,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,wBAAwB,CAE5D,CAAA;QACD,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,CAAA;QACpD,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,SAAS;QAExD,oEAAoE;QACpE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QACrD,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAChC,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CACpD,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC;YAClC,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBACnD,cAAc,EAAE,CAAC;gBACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,WAAW,EAAE;oBACZ,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,uBAAuB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACxC,WAAW,EAAE,EAAE;iBACf;gBACD,cAAc,EAAE,EAAE;gBAClB,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,oBAAoB,EAAE,CAAC;gBACvB,YAAY;gBACZ,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE;aACxE,CAAC;YACF,gBAAgB,EAAE,EAAE;SACpB,CAAC,CACF,CAAC,MAAM,EAAE,CAAA;QACV,MAAM,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,oBAAoB,EAAE,UAAU,CAAC,CAAA;QACzD,MAAM,WAAW,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,wBAAwB,CAE/D,CAAA;QACD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,CAAA;QAC3D,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA,CAAC,OAAO;IACzD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QAC5G,qEAAqE;QACrE,mEAAmE;QACnE,kEAAkE;QAClE,YAAY;QACZ,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAE7C,MAAM,SAAS,GAAG,CAAC,QAAgB,EAAE,WAAmB,EAAE,EAAE,CAC3D,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACnC,cAAc,EAAE,CAAC;YACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC;YAC3B,eAAe,EAAE,CAAC;YAClB,WAAW,EAAE;gBACZ,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC;gBACxC,uBAAuB,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC;gBAC/C,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,GAAG,CAAC,CAAC,EAAE;gBACnD,WAAW,EAAE,EAAE;aACf;YACD,cAAc,EAAE;gBACf;oBACC,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC;oBACzC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC,EAAE;oBACpD,WAAW,EAAE,EAAE;iBACf;aACD;YACD,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;YACjC,oBAAoB,EAAE,CAAC;YACvB,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,WAAW,CAAC;SACnC,CAAC,CAAA;QAEH,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CACpD,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC;YAClC,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;YACjC,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACxD,CAAC,CACF,CAAC,MAAM,EAAE,CAAA;QAEV,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,yBAAyB,CAG7D,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACjC,yDAAyD;QACzD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEpD,wCAAwC;QACxC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAA;QACnF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;QAEtF,iEAAiE;QACjE,2DAA2D;QAC3D,2DAA2D;QAC3D,sDAAsD;QACtD,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QACzF,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACpC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC5G,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC5G,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;QAC3B,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;QAC3B,MAAM,CAAC,KAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,KAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACzE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uFAAuF,EAAE,KAAK,IAAI,EAAE;QACxG,oEAAoE;QACpE,wEAAwE;QACxE,oEAAoE;QACpE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAE7C,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;QAChC,MAAM,UAAU,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CACpD,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC;YAClC,cAAc,EAAE,WAAW,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBACnD,cAAc,EAAE,CAAC;gBACjB,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpB,eAAe,EAAE,CAAC;gBAClB,WAAW,EAAE;oBACZ,gBAAgB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBAC7B,uBAAuB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;oBACpC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;oBACxC,WAAW,EAAE,EAAE;iBACf;gBACD,cAAc,EAAE,EAAE;gBAClB,oBAAoB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjC,oBAAoB,EAAE,CAAC;gBACvB,YAAY;gBACZ,aAAa,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,EAAE;aAC5E,CAAC;YACF,gBAAgB,EAAE,EAAE;SACpB,CAAC,CACF,CAAC,MAAM,EAAE,CAAA;QAEV,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAA;QAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,yBAAyB,CAE7D,CAAA;QACD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,CAAA;QACjD,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAA;QACzC,MAAM,CAAC,KAAK,CAAC,aAAc,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC/C,sEAAsE;QACtE,MAAM,CAAC,KAAK,CAAC,aAAc,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClD,MAAM,CAAC,KAAK,CAAC,aAAc,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAA;QAEvF,+DAA+D;QAC/D,mDAAmD;QACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAe,CAAA;QACpF,MAAM,OAAO,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5D,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACjE,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IACxE,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC9F,kEAAkE;QAClE,oEAAoE;QACpE,uDAAuD;QACvD,+DAA+D;QAC/D,yBAAyB;QACzB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,WAAW,EAAE,CAAA;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACrC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACtC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAEtC,iEAAiE;QACjE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG;YACrB,CAAC,yBAAyB,CAAC,EAAE;gBAC5B,SAAS,EAAE;oBACV,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE;wBAC7B,cAAc,EAAE,IAAI;wBACpB,cAAc,EAAE;4BACf,gBAAgB,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;4BAC5F,sBAAsB,EAAE,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC;4BACxD,eAAe,EAAE,CAAC;4BAClB,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;yBACnC;wBACD,SAAS,EAAE;4BACV,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;4BACnC,WAAW,EAAE,CAAC,EAAE,qBAAqB;4BACrC,MAAM,EAAE,CAAC,CAAC;4BACV,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;4BAChB,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE;4BACnB,iBAAiB,EAAE,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC;yBACjD;wBACD,OAAO,EAAE,EAAE;qBACX;iBACD;gBACD,OAAO,EAAE,IAAI;aACb;SACD,CAAA;QAED,MAAM,QAAQ,GAAG,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,qBAAqB,CAAC,CAAe,CAAA;QACpF,MAAM,OAAO,GAAG,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC5D,qEAAqE;QACrE,iDAAiD;QACjD,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,WAAW,EAAE,CAAA;QAC1D,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAe,CAAC,YAAa,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACtF,CAAC,CAAC,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface BoomPayload {
|
|
2
|
+
readonly statusCode: number;
|
|
3
|
+
readonly error: string;
|
|
4
|
+
readonly message: string;
|
|
5
|
+
}
|
|
6
|
+
export interface BoomOutput {
|
|
7
|
+
readonly statusCode: number;
|
|
8
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
9
|
+
readonly payload: BoomPayload;
|
|
10
|
+
}
|
|
11
|
+
export interface BoomOptions<TData = unknown> {
|
|
12
|
+
readonly statusCode?: number;
|
|
13
|
+
readonly data?: TData;
|
|
14
|
+
readonly cause?: unknown;
|
|
15
|
+
}
|
|
16
|
+
export declare class Boom<TData = unknown> extends Error {
|
|
17
|
+
readonly isBoom: true;
|
|
18
|
+
readonly statusCode: number;
|
|
19
|
+
readonly data?: TData;
|
|
20
|
+
constructor(message?: string | Error, options?: BoomOptions<TData>);
|
|
21
|
+
get isServer(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* `@hapi/boom`-compatible nested status info. Computed on every access
|
|
24
|
+
* (no `#private` cache) so the getter survives prototype-chain rewrites
|
|
25
|
+
* by other Boom-shaped wrappers — concretely, `new HapiBoom(ourBoom)`
|
|
26
|
+
* coerces the input to be `instanceof Boom` via `Object.setPrototypeOf`
|
|
27
|
+
* but never calls our constructor, leaving any private slot uninitialized
|
|
28
|
+
* and crashing the getter at runtime.
|
|
29
|
+
*/
|
|
30
|
+
get output(): BoomOutput;
|
|
31
|
+
static isBoom(err: unknown): err is Boom;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=boom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boom.d.ts","sourceRoot":"","sources":["../../src/Utils/boom.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,UAAU;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAClD,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAC7B;AAED,MAAM,WAAW,WAAW,CAAC,KAAK,GAAG,OAAO;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACxB;AA2BD,qBAAa,IAAI,CAAC,KAAK,GAAG,OAAO,CAAE,SAAQ,KAAK;IAC/C,QAAQ,CAAC,MAAM,EAAG,IAAI,CAAS;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,CAAA;gBAET,OAAO,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,OAAO,GAAE,WAAW,CAAC,KAAK,CAAM;IAQtE,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED;;;;;;;OAOG;IACH,IAAI,MAAM,IAAI,UAAU,CAUvB;IAED,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,IAAI;CAGxC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
const EMPTY_HEADERS = Object.freeze({});
|
|
2
|
+
const STATUS_PHRASES = Object.freeze({
|
|
3
|
+
400: 'Bad Request',
|
|
4
|
+
401: 'Unauthorized',
|
|
5
|
+
403: 'Forbidden',
|
|
6
|
+
404: 'Not Found',
|
|
7
|
+
408: 'Request Timeout',
|
|
8
|
+
411: 'Length Required',
|
|
9
|
+
428: 'Precondition Required',
|
|
10
|
+
440: 'Login Timeout',
|
|
11
|
+
499: 'Client Closed Request',
|
|
12
|
+
500: 'Internal Server Error',
|
|
13
|
+
503: 'Service Unavailable',
|
|
14
|
+
515: 'HTTP Version Not Supported'
|
|
15
|
+
});
|
|
16
|
+
function statusPhrase(code) {
|
|
17
|
+
const known = STATUS_PHRASES[code];
|
|
18
|
+
if (known !== undefined)
|
|
19
|
+
return known;
|
|
20
|
+
if (code >= 500)
|
|
21
|
+
return 'Server Error';
|
|
22
|
+
if (code >= 400)
|
|
23
|
+
return 'Client Error';
|
|
24
|
+
return 'Error';
|
|
25
|
+
}
|
|
26
|
+
export class Boom extends Error {
|
|
27
|
+
constructor(message, options = {}) {
|
|
28
|
+
const msg = message instanceof Error ? message.message : (message ?? 'Unknown error');
|
|
29
|
+
super(msg, options.cause !== undefined ? { cause: options.cause } : undefined);
|
|
30
|
+
this.isBoom = true;
|
|
31
|
+
this.statusCode = options.statusCode ?? 500;
|
|
32
|
+
if (options.data !== undefined)
|
|
33
|
+
this.data = options.data;
|
|
34
|
+
if (message instanceof Error && message.stack)
|
|
35
|
+
this.stack = message.stack;
|
|
36
|
+
}
|
|
37
|
+
get isServer() {
|
|
38
|
+
return this.statusCode >= 500;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* `@hapi/boom`-compatible nested status info. Computed on every access
|
|
42
|
+
* (no `#private` cache) so the getter survives prototype-chain rewrites
|
|
43
|
+
* by other Boom-shaped wrappers — concretely, `new HapiBoom(ourBoom)`
|
|
44
|
+
* coerces the input to be `instanceof Boom` via `Object.setPrototypeOf`
|
|
45
|
+
* but never calls our constructor, leaving any private slot uninitialized
|
|
46
|
+
* and crashing the getter at runtime.
|
|
47
|
+
*/
|
|
48
|
+
get output() {
|
|
49
|
+
return {
|
|
50
|
+
statusCode: this.statusCode,
|
|
51
|
+
headers: EMPTY_HEADERS,
|
|
52
|
+
payload: {
|
|
53
|
+
statusCode: this.statusCode,
|
|
54
|
+
error: statusPhrase(this.statusCode),
|
|
55
|
+
message: this.message
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
static isBoom(err) {
|
|
60
|
+
return typeof err === 'object' && err !== null && err.isBoom === true;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=boom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boom.js","sourceRoot":"","sources":["../../src/Utils/boom.ts"],"names":[],"mappings":"AAkBA,MAAM,aAAa,GAAqC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;AAEzE,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACpC,GAAG,EAAE,aAAa;IAClB,GAAG,EAAE,cAAc;IACnB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,iBAAiB;IACtB,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,eAAe;IACpB,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,uBAAuB;IAC5B,GAAG,EAAE,qBAAqB;IAC1B,GAAG,EAAE,4BAA4B;CACxB,CAA4C,CAAA;AAEtD,SAAS,YAAY,CAAC,IAAY;IACjC,MAAM,KAAK,GAAI,cAAmD,CAAC,IAAI,CAAC,CAAA;IACxE,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACrC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,cAAc,CAAA;IACtC,IAAI,IAAI,IAAI,GAAG;QAAE,OAAO,cAAc,CAAA;IACtC,OAAO,OAAO,CAAA;AACf,CAAC;AAED,MAAM,OAAO,IAAsB,SAAQ,KAAK;IAK/C,YAAY,OAAwB,EAAE,UAA8B,EAAE;QACrE,MAAM,GAAG,GAAG,OAAO,YAAY,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,eAAe,CAAC,CAAA;QACrF,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QANtE,WAAM,GAAG,IAAa,CAAA;QAO9B,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,GAAG,CAAA;QAC3C,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS;YAAE,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QACxD,IAAI,OAAO,YAAY,KAAK,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IAC1E,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,UAAU,IAAI,GAAG,CAAA;IAC9B,CAAC;IAED;;;;;;;OAOG;IACH,IAAI,MAAM;QACT,OAAO;YACN,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,OAAO,EAAE,aAAa;YACtB,OAAO,EAAE;gBACR,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;gBACpC,OAAO,EAAE,IAAI,CAAC,OAAO;aACrB;SACD,CAAA;IACF,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,GAAY;QACzB,OAAO,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAK,GAA4B,CAAC,MAAM,KAAK,IAAI,CAAA;IAChG,CAAC;CACD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/browser-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"browser-utils.d.ts","sourceRoot":"","sources":["../../src/Utils/browser-utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAgBpD,eAAO,MAAM,QAAQ,EAAE,WAMtB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-buffer.d.ts","sourceRoot":"","sources":["../../src/Utils/event-buffer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,
|
|
1
|
+
{"version":3,"file":"event-buffer.d.ts","sourceRoot":"","sources":["../../src/Utils/event-buffer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAmB,MAAM,mBAAmB,CAAA;AAE7E;;;GAGG;AACH,eAAO,MAAM,eAAe,QAAO,mBAuClC,CAAA"}
|