@zapo-js/fake-server 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -0
- package/dist/api/AppStateSyncManager.d.ts +27 -0
- package/dist/api/AppStateSyncManager.d.ts.map +1 -0
- package/dist/api/AppStateSyncManager.js +151 -0
- package/dist/api/AppStateSyncManager.js.map +1 -0
- package/dist/api/FakePairingDriver.d.ts +27 -0
- package/dist/api/FakePairingDriver.d.ts.map +1 -0
- package/dist/api/FakePairingDriver.js +36 -0
- package/dist/api/FakePairingDriver.js.map +1 -0
- package/dist/api/FakePeer.d.ts +143 -0
- package/dist/api/FakePeer.d.ts.map +1 -0
- package/dist/api/FakePeer.js +408 -0
- package/dist/api/FakePeer.js.map +1 -0
- package/dist/api/FakeWaServer.d.ts +167 -0
- package/dist/api/FakeWaServer.d.ts.map +1 -0
- package/dist/api/FakeWaServer.js +652 -0
- package/dist/api/FakeWaServer.js.map +1 -0
- package/dist/api/PreKeyDispenser.d.ts +23 -0
- package/dist/api/PreKeyDispenser.d.ts.map +1 -0
- package/dist/api/PreKeyDispenser.js +98 -0
- package/dist/api/PreKeyDispenser.js.map +1 -0
- package/dist/api/Scenario.d.ts +24 -0
- package/dist/api/Scenario.d.ts.map +1 -0
- package/dist/api/Scenario.js +38 -0
- package/dist/api/Scenario.js.map +1 -0
- package/dist/api/ServerRegistries.d.ts +110 -0
- package/dist/api/ServerRegistries.d.ts.map +1 -0
- package/dist/api/ServerRegistries.js +268 -0
- package/dist/api/ServerRegistries.js.map +1 -0
- package/dist/api/iq-handlers.d.ts +47 -0
- package/dist/api/iq-handlers.d.ts.map +1 -0
- package/dist/api/iq-handlers.js +498 -0
- package/dist/api/iq-handlers.js.map +1 -0
- package/dist/cli.d.ts +4 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +249 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +51 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +74 -0
- package/dist/index.js.map +1 -0
- package/dist/infra/WaFakeConnection.d.ts +23 -0
- package/dist/infra/WaFakeConnection.d.ts.map +1 -0
- package/dist/infra/WaFakeConnection.js +54 -0
- package/dist/infra/WaFakeConnection.js.map +1 -0
- package/dist/infra/WaFakeConnectionPipeline.d.ts +51 -0
- package/dist/infra/WaFakeConnectionPipeline.d.ts.map +1 -0
- package/dist/infra/WaFakeConnectionPipeline.js +224 -0
- package/dist/infra/WaFakeConnectionPipeline.js.map +1 -0
- package/dist/infra/WaFakeFrameSocket.d.ts +29 -0
- package/dist/infra/WaFakeFrameSocket.d.ts.map +1 -0
- package/dist/infra/WaFakeFrameSocket.js +122 -0
- package/dist/infra/WaFakeFrameSocket.js.map +1 -0
- package/dist/infra/WaFakeMediaHttpsServer.d.ts +16 -0
- package/dist/infra/WaFakeMediaHttpsServer.d.ts.map +1 -0
- package/dist/infra/WaFakeMediaHttpsServer.js +131 -0
- package/dist/infra/WaFakeMediaHttpsServer.js.map +1 -0
- package/dist/infra/WaFakeNoiseHandshake.d.ts +23 -0
- package/dist/infra/WaFakeNoiseHandshake.d.ts.map +1 -0
- package/dist/infra/WaFakeNoiseHandshake.js +76 -0
- package/dist/infra/WaFakeNoiseHandshake.js.map +1 -0
- package/dist/infra/WaFakeTransport.d.ts +15 -0
- package/dist/infra/WaFakeTransport.d.ts.map +1 -0
- package/dist/infra/WaFakeTransport.js +34 -0
- package/dist/infra/WaFakeTransport.js.map +1 -0
- package/dist/infra/WaFakeWsServer.d.ts +29 -0
- package/dist/infra/WaFakeWsServer.d.ts.map +1 -0
- package/dist/infra/WaFakeWsServer.js +101 -0
- package/dist/infra/WaFakeWsServer.js.map +1 -0
- package/dist/protocol/auth/cert-chain.d.ts +18 -0
- package/dist/protocol/auth/cert-chain.d.ts.map +1 -0
- package/dist/protocol/auth/cert-chain.js +44 -0
- package/dist/protocol/auth/cert-chain.js.map +1 -0
- package/dist/protocol/auth/client-payload-validate.d.ts +21 -0
- package/dist/protocol/auth/client-payload-validate.d.ts.map +1 -0
- package/dist/protocol/auth/client-payload-validate.js +61 -0
- package/dist/protocol/auth/client-payload-validate.js.map +1 -0
- package/dist/protocol/auth/fake-primary-device.d.ts +19 -0
- package/dist/protocol/auth/fake-primary-device.d.ts.map +1 -0
- package/dist/protocol/auth/fake-primary-device.js +53 -0
- package/dist/protocol/auth/fake-primary-device.js.map +1 -0
- package/dist/protocol/auth/pair-device.d.ts +26 -0
- package/dist/protocol/auth/pair-device.d.ts.map +1 -0
- package/dist/protocol/auth/pair-device.js +104 -0
- package/dist/protocol/auth/pair-device.js.map +1 -0
- package/dist/protocol/auth/success-node.d.ts +15 -0
- package/dist/protocol/auth/success-node.d.ts.map +1 -0
- package/dist/protocol/auth/success-node.js +30 -0
- package/dist/protocol/auth/success-node.js.map +1 -0
- package/dist/protocol/iq/abprops.d.ts +14 -0
- package/dist/protocol/iq/abprops.d.ts.map +1 -0
- package/dist/protocol/iq/abprops.js +34 -0
- package/dist/protocol/iq/abprops.js.map +1 -0
- package/dist/protocol/iq/appstate-sync.d.ts +38 -0
- package/dist/protocol/iq/appstate-sync.d.ts.map +1 -0
- package/dist/protocol/iq/appstate-sync.js +154 -0
- package/dist/protocol/iq/appstate-sync.js.map +1 -0
- package/dist/protocol/iq/business.d.ts +13 -0
- package/dist/protocol/iq/business.d.ts.map +1 -0
- package/dist/protocol/iq/business.js +64 -0
- package/dist/protocol/iq/business.js.map +1 -0
- package/dist/protocol/iq/dirty-bits.d.ts +8 -0
- package/dist/protocol/iq/dirty-bits.d.ts.map +1 -0
- package/dist/protocol/iq/dirty-bits.js +23 -0
- package/dist/protocol/iq/dirty-bits.js.map +1 -0
- package/dist/protocol/iq/group-ops.d.ts +34 -0
- package/dist/protocol/iq/group-ops.d.ts.map +1 -0
- package/dist/protocol/iq/group-ops.js +164 -0
- package/dist/protocol/iq/group-ops.js.map +1 -0
- package/dist/protocol/iq/newsletter.d.ts +4 -0
- package/dist/protocol/iq/newsletter.d.ts.map +1 -0
- package/dist/protocol/iq/newsletter.js +18 -0
- package/dist/protocol/iq/newsletter.js.map +1 -0
- package/dist/protocol/iq/prekey-fetch.d.ts +18 -0
- package/dist/protocol/iq/prekey-fetch.d.ts.map +1 -0
- package/dist/protocol/iq/prekey-fetch.js +92 -0
- package/dist/protocol/iq/prekey-fetch.js.map +1 -0
- package/dist/protocol/iq/privacy-token.d.ts +9 -0
- package/dist/protocol/iq/privacy-token.d.ts.map +1 -0
- package/dist/protocol/iq/privacy-token.js +30 -0
- package/dist/protocol/iq/privacy-token.js.map +1 -0
- package/dist/protocol/iq/privacy.d.ts +22 -0
- package/dist/protocol/iq/privacy.d.ts.map +1 -0
- package/dist/protocol/iq/privacy.js +133 -0
- package/dist/protocol/iq/privacy.js.map +1 -0
- package/dist/protocol/iq/profile.d.ts +22 -0
- package/dist/protocol/iq/profile.d.ts.map +1 -0
- package/dist/protocol/iq/profile.js +80 -0
- package/dist/protocol/iq/profile.js.map +1 -0
- package/dist/protocol/iq/router.d.ts +39 -0
- package/dist/protocol/iq/router.d.ts.map +1 -0
- package/dist/protocol/iq/router.js +118 -0
- package/dist/protocol/iq/router.js.map +1 -0
- package/dist/protocol/iq/usync.d.ts +8 -0
- package/dist/protocol/iq/usync.d.ts.map +1 -0
- package/dist/protocol/iq/usync.js +68 -0
- package/dist/protocol/iq/usync.js.map +1 -0
- package/dist/protocol/push/app-state-key-share.d.ts +17 -0
- package/dist/protocol/push/app-state-key-share.d.ts.map +1 -0
- package/dist/protocol/push/app-state-key-share.js +30 -0
- package/dist/protocol/push/app-state-key-share.js.map +1 -0
- package/dist/protocol/push/call-failure.d.ts +16 -0
- package/dist/protocol/push/call-failure.d.ts.map +1 -0
- package/dist/protocol/push/call-failure.js +32 -0
- package/dist/protocol/push/call-failure.js.map +1 -0
- package/dist/protocol/push/chatstate.d.ts +15 -0
- package/dist/protocol/push/chatstate.d.ts.map +1 -0
- package/dist/protocol/push/chatstate.js +27 -0
- package/dist/protocol/push/chatstate.js.map +1 -0
- package/dist/protocol/push/error-stanza.d.ts +8 -0
- package/dist/protocol/push/error-stanza.d.ts.map +1 -0
- package/dist/protocol/push/error-stanza.js +17 -0
- package/dist/protocol/push/error-stanza.js.map +1 -0
- package/dist/protocol/push/history-sync.d.ts +46 -0
- package/dist/protocol/push/history-sync.d.ts.map +1 -0
- package/dist/protocol/push/history-sync.js +117 -0
- package/dist/protocol/push/history-sync.js.map +1 -0
- package/dist/protocol/push/message.d.ts +21 -0
- package/dist/protocol/push/message.d.ts.map +1 -0
- package/dist/protocol/push/message.js +42 -0
- package/dist/protocol/push/message.js.map +1 -0
- package/dist/protocol/push/notification.d.ts +21 -0
- package/dist/protocol/push/notification.d.ts.map +1 -0
- package/dist/protocol/push/notification.js +34 -0
- package/dist/protocol/push/notification.js.map +1 -0
- package/dist/protocol/push/presence.d.ts +11 -0
- package/dist/protocol/push/presence.d.ts.map +1 -0
- package/dist/protocol/push/presence.js +18 -0
- package/dist/protocol/push/presence.js.map +1 -0
- package/dist/protocol/push/receipt.d.ts +14 -0
- package/dist/protocol/push/receipt.d.ts.map +1 -0
- package/dist/protocol/push/receipt.js +25 -0
- package/dist/protocol/push/receipt.js.map +1 -0
- package/dist/protocol/signal/fake-app-state-crypto.d.ts +49 -0
- package/dist/protocol/signal/fake-app-state-crypto.d.ts.map +1 -0
- package/dist/protocol/signal/fake-app-state-crypto.js +202 -0
- package/dist/protocol/signal/fake-app-state-crypto.js.map +1 -0
- package/dist/protocol/signal/fake-peer-double-ratchet.d.ts +38 -0
- package/dist/protocol/signal/fake-peer-double-ratchet.d.ts.map +1 -0
- package/dist/protocol/signal/fake-peer-double-ratchet.js +408 -0
- package/dist/protocol/signal/fake-peer-double-ratchet.js.map +1 -0
- package/dist/protocol/signal/fake-peer-group-recv-session.d.ts +10 -0
- package/dist/protocol/signal/fake-peer-group-recv-session.d.ts.map +1 -0
- package/dist/protocol/signal/fake-peer-group-recv-session.js +129 -0
- package/dist/protocol/signal/fake-peer-group-recv-session.js.map +1 -0
- package/dist/protocol/signal/fake-peer-identity.d.ts +7 -0
- package/dist/protocol/signal/fake-peer-identity.d.ts.map +1 -0
- package/dist/protocol/signal/fake-peer-identity.js +12 -0
- package/dist/protocol/signal/fake-peer-identity.js.map +1 -0
- package/dist/protocol/signal/fake-peer-key-bundle.d.ts +24 -0
- package/dist/protocol/signal/fake-peer-key-bundle.d.ts.map +1 -0
- package/dist/protocol/signal/fake-peer-key-bundle.js +29 -0
- package/dist/protocol/signal/fake-peer-key-bundle.js.map +1 -0
- package/dist/protocol/signal/fake-peer-recv-session.d.ts +60 -0
- package/dist/protocol/signal/fake-peer-recv-session.d.ts.map +1 -0
- package/dist/protocol/signal/fake-peer-recv-session.js +284 -0
- package/dist/protocol/signal/fake-peer-recv-session.js.map +1 -0
- package/dist/protocol/signal/fake-peer-session.d.ts +87 -0
- package/dist/protocol/signal/fake-peer-session.d.ts.map +1 -0
- package/dist/protocol/signal/fake-peer-session.js +207 -0
- package/dist/protocol/signal/fake-peer-session.js.map +1 -0
- package/dist/protocol/signal/fake-sender-key.d.ts +15 -0
- package/dist/protocol/signal/fake-sender-key.d.ts.map +1 -0
- package/dist/protocol/signal/fake-sender-key.js +91 -0
- package/dist/protocol/signal/fake-sender-key.js.map +1 -0
- package/dist/protocol/signal/prekey-upload.d.ts +22 -0
- package/dist/protocol/signal/prekey-upload.d.ts.map +1 -0
- package/dist/protocol/signal/prekey-upload.js +113 -0
- package/dist/protocol/signal/prekey-upload.js.map +1 -0
- package/dist/protocol/stream/stream-error.d.ts +8 -0
- package/dist/protocol/stream/stream-error.d.ts.map +1 -0
- package/dist/protocol/stream/stream-error.js +64 -0
- package/dist/protocol/stream/stream-error.js.map +1 -0
- package/dist/state/fake-app-state-collection.d.ts +35 -0
- package/dist/state/fake-app-state-collection.d.ts.map +1 -0
- package/dist/state/fake-app-state-collection.js +139 -0
- package/dist/state/fake-app-state-collection.js.map +1 -0
- package/dist/state/fake-media-store.d.ts +35 -0
- package/dist/state/fake-media-store.d.ts.map +1 -0
- package/dist/state/fake-media-store.js +57 -0
- package/dist/state/fake-media-store.js.map +1 -0
- package/dist/transport/codec.d.ts +10 -0
- package/dist/transport/codec.d.ts.map +1 -0
- package/dist/transport/codec.js +17 -0
- package/dist/transport/codec.js.map +1 -0
- package/dist/transport/crypto.d.ts +11 -0
- package/dist/transport/crypto.d.ts.map +1 -0
- package/dist/transport/crypto.js +36 -0
- package/dist/transport/crypto.js.map +1 -0
- package/dist/transport/index.d.ts +4 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +20 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/protos.d.ts +10 -0
- package/dist/transport/protos.d.ts.map +1 -0
- package/dist/transport/protos.js +13 -0
- package/dist/transport/protos.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** In-memory app-state collection tracker (version/LTHash + patch queue). */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.FakeAppStateCollection = void 0;
|
|
5
|
+
const fake_app_state_crypto_1 = require("../protocol/signal/fake-app-state-crypto");
|
|
6
|
+
const protos_1 = require("../transport/protos");
|
|
7
|
+
class FakeAppStateCollection {
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.currentVersion = 0;
|
|
10
|
+
this.currentLtHash = fake_app_state_crypto_1.APP_STATE_EMPTY_LT_HASH;
|
|
11
|
+
this.recordsByIndexMacHex = new Map();
|
|
12
|
+
this.pendingPatchMutations = [];
|
|
13
|
+
this.hasUnflushedSnapshotChanges = false;
|
|
14
|
+
this.name = options.name;
|
|
15
|
+
this.keyId = options.keyId;
|
|
16
|
+
this.keyData = options.keyData;
|
|
17
|
+
this.crypto = options.crypto ?? new fake_app_state_crypto_1.FakeAppStateCrypto();
|
|
18
|
+
}
|
|
19
|
+
get version() {
|
|
20
|
+
return this.currentVersion;
|
|
21
|
+
}
|
|
22
|
+
get ltHash() {
|
|
23
|
+
return this.currentLtHash;
|
|
24
|
+
}
|
|
25
|
+
async applyMutation(input) {
|
|
26
|
+
const baseInput = {
|
|
27
|
+
operation: input.operation,
|
|
28
|
+
keyId: this.keyId,
|
|
29
|
+
keyData: this.keyData,
|
|
30
|
+
index: input.index,
|
|
31
|
+
value: input.value,
|
|
32
|
+
version: input.version
|
|
33
|
+
};
|
|
34
|
+
const encrypted = await this.crypto.encryptMutation(baseInput);
|
|
35
|
+
const indexMacHex = bytesToHex(encrypted.indexMac);
|
|
36
|
+
const existing = this.recordsByIndexMacHex.get(indexMacHex);
|
|
37
|
+
const removeValues = [];
|
|
38
|
+
const addValues = [];
|
|
39
|
+
if (existing) {
|
|
40
|
+
removeValues.push(existing.valueMac);
|
|
41
|
+
this.recordsByIndexMacHex.delete(indexMacHex);
|
|
42
|
+
}
|
|
43
|
+
if (input.operation === 'set') {
|
|
44
|
+
const record = {
|
|
45
|
+
indexMacHex,
|
|
46
|
+
indexMac: encrypted.indexMac,
|
|
47
|
+
valueMac: encrypted.valueMac,
|
|
48
|
+
valueBlob: encrypted.valueBlob
|
|
49
|
+
};
|
|
50
|
+
this.recordsByIndexMacHex.set(indexMacHex, record);
|
|
51
|
+
addValues.push(encrypted.valueMac);
|
|
52
|
+
this.pendingPatchMutations.push({ operation: 'set', record });
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
this.pendingPatchMutations.push({
|
|
56
|
+
operation: 'remove',
|
|
57
|
+
record: {
|
|
58
|
+
indexMacHex,
|
|
59
|
+
indexMac: encrypted.indexMac,
|
|
60
|
+
valueMac: encrypted.valueMac,
|
|
61
|
+
valueBlob: encrypted.valueBlob
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
const nextHash = await this.applyLtHash(this.currentLtHash, addValues, removeValues);
|
|
66
|
+
this.currentLtHash = nextHash;
|
|
67
|
+
this.hasUnflushedSnapshotChanges = true;
|
|
68
|
+
}
|
|
69
|
+
async encodeSnapshot() {
|
|
70
|
+
this.currentVersion += 1;
|
|
71
|
+
const records = [];
|
|
72
|
+
for (const record of this.recordsByIndexMacHex.values()) {
|
|
73
|
+
records.push({
|
|
74
|
+
index: { blob: record.indexMac },
|
|
75
|
+
value: { blob: record.valueBlob },
|
|
76
|
+
keyId: { id: this.keyId }
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const mac = await this.crypto.generateSnapshotMac(this.keyData, this.currentLtHash, this.currentVersion, this.name);
|
|
80
|
+
this.pendingPatchMutations.length = 0;
|
|
81
|
+
this.hasUnflushedSnapshotChanges = false;
|
|
82
|
+
return protos_1.proto.SyncdSnapshot.encode({
|
|
83
|
+
version: { version: this.currentVersion },
|
|
84
|
+
records,
|
|
85
|
+
mac,
|
|
86
|
+
keyId: { id: this.keyId }
|
|
87
|
+
}).finish();
|
|
88
|
+
}
|
|
89
|
+
async encodePendingPatch() {
|
|
90
|
+
if (this.pendingPatchMutations.length === 0) {
|
|
91
|
+
throw new Error(`fake app-state collection ${this.name}: no pending mutations to encode`);
|
|
92
|
+
}
|
|
93
|
+
this.currentVersion += 1;
|
|
94
|
+
const patchVersion = this.currentVersion;
|
|
95
|
+
const mutations = [];
|
|
96
|
+
const valueMacs = [];
|
|
97
|
+
for (const pending of this.pendingPatchMutations) {
|
|
98
|
+
mutations.push({
|
|
99
|
+
operation: pending.operation === 'set'
|
|
100
|
+
? protos_1.proto.SyncdMutation.SyncdOperation.SET
|
|
101
|
+
: protos_1.proto.SyncdMutation.SyncdOperation.REMOVE,
|
|
102
|
+
record: {
|
|
103
|
+
keyId: { id: this.keyId },
|
|
104
|
+
index: { blob: pending.record.indexMac },
|
|
105
|
+
value: { blob: pending.record.valueBlob }
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
valueMacs.push(pending.record.valueMac);
|
|
109
|
+
}
|
|
110
|
+
const snapshotMac = await this.crypto.generateSnapshotMac(this.keyData, this.currentLtHash, patchVersion, this.name);
|
|
111
|
+
const patchMac = await this.crypto.generatePatchMac(this.keyData, snapshotMac, valueMacs, patchVersion, this.name);
|
|
112
|
+
this.pendingPatchMutations.length = 0;
|
|
113
|
+
this.hasUnflushedSnapshotChanges = false;
|
|
114
|
+
return protos_1.proto.SyncdPatch.encode({
|
|
115
|
+
version: { version: patchVersion },
|
|
116
|
+
mutations,
|
|
117
|
+
snapshotMac,
|
|
118
|
+
patchMac,
|
|
119
|
+
keyId: { id: this.keyId }
|
|
120
|
+
}).finish();
|
|
121
|
+
}
|
|
122
|
+
hasPending() {
|
|
123
|
+
return this.pendingPatchMutations.length > 0 || this.hasUnflushedSnapshotChanges;
|
|
124
|
+
}
|
|
125
|
+
async applyLtHash(base, addValues, removeValues) {
|
|
126
|
+
const afterRemove = await this.crypto.ltHashSubtract(base, removeValues);
|
|
127
|
+
return this.crypto.ltHashAdd(afterRemove, addValues);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.FakeAppStateCollection = FakeAppStateCollection;
|
|
131
|
+
function bytesToHex(bytes) {
|
|
132
|
+
let out = '';
|
|
133
|
+
for (let index = 0; index < bytes.byteLength; index += 1) {
|
|
134
|
+
const value = bytes[index];
|
|
135
|
+
out += value < 16 ? `0${value.toString(16)}` : value.toString(16);
|
|
136
|
+
}
|
|
137
|
+
return out;
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=fake-app-state-collection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-app-state-collection.js","sourceRoot":"","sources":["../../src/state/fake-app-state-collection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** In-memory media blob store served by the fake media endpoint. */
|
|
2
|
+
export type FakeMediaType = 'image' | 'video' | 'audio' | 'document' | 'sticker' | 'gif' | 'ptt' | 'history' | 'md-app-state';
|
|
3
|
+
export interface PublishMediaInput {
|
|
4
|
+
readonly plaintext: Uint8Array;
|
|
5
|
+
readonly mediaType: FakeMediaType;
|
|
6
|
+
readonly path?: string;
|
|
7
|
+
readonly mediaKey?: Uint8Array;
|
|
8
|
+
}
|
|
9
|
+
export interface PublishedMediaBlob {
|
|
10
|
+
readonly path: string;
|
|
11
|
+
readonly mediaKey: Uint8Array;
|
|
12
|
+
readonly fileSha256: Uint8Array;
|
|
13
|
+
readonly fileEncSha256: Uint8Array;
|
|
14
|
+
readonly fileLength: number;
|
|
15
|
+
readonly mediaType: FakeMediaType;
|
|
16
|
+
}
|
|
17
|
+
interface StoredBlob {
|
|
18
|
+
readonly mediaType: FakeMediaType;
|
|
19
|
+
readonly encryptedBytes: Uint8Array;
|
|
20
|
+
readonly mediaKey: Uint8Array;
|
|
21
|
+
readonly fileSha256: Uint8Array;
|
|
22
|
+
readonly fileEncSha256: Uint8Array;
|
|
23
|
+
}
|
|
24
|
+
export declare class FakeMediaStore {
|
|
25
|
+
private readonly blobs;
|
|
26
|
+
publish(input: PublishMediaInput): Promise<PublishedMediaBlob>;
|
|
27
|
+
/** Stores pre-encrypted bytes uploaded by the lib so the download path can serve them back. */
|
|
28
|
+
setRaw(path: string, encryptedBytes: Uint8Array, mediaType?: FakeMediaType): void;
|
|
29
|
+
get(path: string): StoredBlob | undefined;
|
|
30
|
+
delete(path: string): boolean;
|
|
31
|
+
clear(): void;
|
|
32
|
+
private randomPath;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
35
|
+
//# sourceMappingURL=fake-media-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-media-store.d.ts","sourceRoot":"","sources":["../../src/state/fake-media-store.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAMpE,MAAM,MAAM,aAAa,GACnB,OAAO,GACP,OAAO,GACP,OAAO,GACP,UAAU,GACV,SAAS,GACT,KAAK,GACL,KAAK,GACL,SAAS,GACT,cAAc,CAAA;AAEpB,MAAM,WAAW,iBAAiB;IAC9B,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAA;IAC9B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAA;CACjC;AAED,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAA;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;CACpC;AAED,UAAU,UAAU;IAChB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAA;IACjC,QAAQ,CAAC,cAAc,EAAE,UAAU,CAAA;IACnC,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAA;IAC7B,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAA;IAC/B,QAAQ,CAAC,aAAa,EAAE,UAAU,CAAA;CACrC;AAED,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEzC,OAAO,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0B3E,+FAA+F;IACxF,MAAM,CACT,IAAI,EAAE,MAAM,EACZ,cAAc,EAAE,UAAU,EAC1B,SAAS,GAAE,aAAuB,GACnC,IAAI;IAUA,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIzC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI7B,KAAK,IAAI,IAAI;IAIpB,OAAO,CAAC,UAAU;CAIrB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/** In-memory media blob store served by the fake media endpoint. */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.FakeMediaStore = void 0;
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
6
|
+
const crypto_1 = require("../transport/crypto");
|
|
7
|
+
class FakeMediaStore {
|
|
8
|
+
constructor() {
|
|
9
|
+
this.blobs = new Map();
|
|
10
|
+
}
|
|
11
|
+
async publish(input) {
|
|
12
|
+
const mediaKey = input.mediaKey ?? new Uint8Array((0, node_crypto_1.randomBytes)(32));
|
|
13
|
+
const encrypted = await crypto_1.WaMediaCrypto.encryptBytes(input.mediaType, mediaKey, input.plaintext);
|
|
14
|
+
const path = input.path ?? this.randomPath(input.mediaType);
|
|
15
|
+
const stored = {
|
|
16
|
+
mediaType: input.mediaType,
|
|
17
|
+
encryptedBytes: encrypted.ciphertextHmac,
|
|
18
|
+
mediaKey,
|
|
19
|
+
fileSha256: encrypted.fileSha256,
|
|
20
|
+
fileEncSha256: encrypted.fileEncSha256
|
|
21
|
+
};
|
|
22
|
+
this.blobs.set(path, stored);
|
|
23
|
+
return {
|
|
24
|
+
path,
|
|
25
|
+
mediaKey,
|
|
26
|
+
fileSha256: encrypted.fileSha256,
|
|
27
|
+
fileEncSha256: encrypted.fileEncSha256,
|
|
28
|
+
fileLength: encrypted.ciphertextHmac.byteLength,
|
|
29
|
+
mediaType: input.mediaType
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** Stores pre-encrypted bytes uploaded by the lib so the download path can serve them back. */
|
|
33
|
+
setRaw(path, encryptedBytes, mediaType = 'image') {
|
|
34
|
+
this.blobs.set(path, {
|
|
35
|
+
mediaType,
|
|
36
|
+
encryptedBytes,
|
|
37
|
+
mediaKey: new Uint8Array(32),
|
|
38
|
+
fileSha256: new Uint8Array(32),
|
|
39
|
+
fileEncSha256: new Uint8Array(32)
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
get(path) {
|
|
43
|
+
return this.blobs.get(path);
|
|
44
|
+
}
|
|
45
|
+
delete(path) {
|
|
46
|
+
return this.blobs.delete(path);
|
|
47
|
+
}
|
|
48
|
+
clear() {
|
|
49
|
+
this.blobs.clear();
|
|
50
|
+
}
|
|
51
|
+
randomPath(mediaType) {
|
|
52
|
+
const slug = (0, node_crypto_1.randomBytes)(16).toString('hex');
|
|
53
|
+
return `/fake-media/${mediaType}/${slug}`;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
exports.FakeMediaStore = FakeMediaStore;
|
|
57
|
+
//# sourceMappingURL=fake-media-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fake-media-store.js","sourceRoot":"","sources":["../../src/state/fake-media-store.ts"],"names":[],"mappings":";AAAA,oEAAoE;;;AAEpE,6CAAyC;AAEzC,gDAAmD;AAqCnD,MAAa,cAAc;IAA3B;QACqB,UAAK,GAAG,IAAI,GAAG,EAAsB,CAAA;IA2D1D,CAAC;IAzDU,KAAK,CAAC,OAAO,CAAC,KAAwB;QACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,IAAI,UAAU,CAAC,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,CAAA;QAClE,MAAM,SAAS,GAAG,MAAM,sBAAa,CAAC,YAAY,CAC9C,KAAK,CAAC,SAAS,EACf,QAAQ,EACR,KAAK,CAAC,SAAS,CAClB,CAAA;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAe;YACvB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,cAAc,EAAE,SAAS,CAAC,cAAc;YACxC,QAAQ;YACR,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,aAAa,EAAE,SAAS,CAAC,aAAa;SACzC,CAAA;QACD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;QAC5B,OAAO;YACH,IAAI;YACJ,QAAQ;YACR,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,UAAU,EAAE,SAAS,CAAC,cAAc,CAAC,UAAU;YAC/C,SAAS,EAAE,KAAK,CAAC,SAAS;SAC7B,CAAA;IACL,CAAC;IAED,+FAA+F;IACxF,MAAM,CACT,IAAY,EACZ,cAA0B,EAC1B,YAA2B,OAAO;QAElC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;YACjB,SAAS;YACT,cAAc;YACd,QAAQ,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC;YAC5B,UAAU,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC;YAC9B,aAAa,EAAE,IAAI,UAAU,CAAC,EAAE,CAAC;SACpC,CAAC,CAAA;IACN,CAAC;IAEM,GAAG,CAAC,IAAY;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IAC/B,CAAC;IAEM,MAAM,CAAC,IAAY;QACtB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAClC,CAAC;IAEM,KAAK;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;IACtB,CAAC;IAEO,UAAU,CAAC,SAAwB;QACvC,MAAM,IAAI,GAAG,IAAA,yBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAC5C,OAAO,eAAe,SAAS,IAAI,IAAI,EAAE,CAAA;IAC7C,CAAC;CACJ;AA5DD,wCA4DC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 1 — binary stanza codec wrapper.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the bit-exact WhatsApp WAP token encoder/decoder from zapo-js.
|
|
5
|
+
* This file is the only sanctioned import path for binary node serialization
|
|
6
|
+
* inside the fake server. See AGENTS.md §3 for the layering rule.
|
|
7
|
+
*/
|
|
8
|
+
export { decodeBinaryNode, decodeBinaryNodeStanza, encodeBinaryNode, encodeBinaryNodeStanza, verifyNoiseCertificateChain } from 'zapo-js/transport';
|
|
9
|
+
export type { BinaryNode, WaNoiseRootCa } from 'zapo-js/transport';
|
|
10
|
+
//# sourceMappingURL=codec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../../src/transport/codec.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,sBAAsB,EACtB,2BAA2B,EAC9B,MAAM,mBAAmB,CAAA;AAC1B,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 1 — binary stanza codec wrapper.
|
|
4
|
+
*
|
|
5
|
+
* Re-exports the bit-exact WhatsApp WAP token encoder/decoder from zapo-js.
|
|
6
|
+
* This file is the only sanctioned import path for binary node serialization
|
|
7
|
+
* inside the fake server. See AGENTS.md §3 for the layering rule.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.verifyNoiseCertificateChain = exports.encodeBinaryNodeStanza = exports.encodeBinaryNode = exports.decodeBinaryNodeStanza = exports.decodeBinaryNode = void 0;
|
|
11
|
+
var transport_1 = require("zapo-js/transport");
|
|
12
|
+
Object.defineProperty(exports, "decodeBinaryNode", { enumerable: true, get: function () { return transport_1.decodeBinaryNode; } });
|
|
13
|
+
Object.defineProperty(exports, "decodeBinaryNodeStanza", { enumerable: true, get: function () { return transport_1.decodeBinaryNodeStanza; } });
|
|
14
|
+
Object.defineProperty(exports, "encodeBinaryNode", { enumerable: true, get: function () { return transport_1.encodeBinaryNode; } });
|
|
15
|
+
Object.defineProperty(exports, "encodeBinaryNodeStanza", { enumerable: true, get: function () { return transport_1.encodeBinaryNodeStanza; } });
|
|
16
|
+
Object.defineProperty(exports, "verifyNoiseCertificateChain", { enumerable: true, get: function () { return transport_1.verifyNoiseCertificateChain; } });
|
|
17
|
+
//# sourceMappingURL=codec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../../src/transport/codec.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,+CAM0B;AALtB,6GAAA,gBAAgB,OAAA;AAChB,mHAAA,sBAAsB,OAAA;AACtB,6GAAA,gBAAgB,OAAA;AAChB,mHAAA,sBAAsB,OAAA;AACtB,wHAAA,2BAA2B,OAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 1 — crypto primitives wrapper.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports cryptographic primitives from zapo-js. These are bit-exact
|
|
5
|
+
* implementations with no protocol interpretation, so reusing them does not
|
|
6
|
+
* create the tautology described in AGENTS.md §2.
|
|
7
|
+
*/
|
|
8
|
+
export { aesCbcDecrypt, aesCbcEncrypt, aesGcmDecrypt, aesGcmEncrypt, Ed25519, hkdf, hkdfSplit, hmacSign, importAesCbcKey, importAesGcmKey, importHmacKey, importHmacSha512Key, prependVersion, randomBytesAsync, readVersionedContent, sha256, sha512, toRawPubKey, toSerializedPubKey, X25519, xeddsaSign, xeddsaVerify } from 'zapo-js/crypto';
|
|
9
|
+
export type { CryptoKey, SignalKeyPair } from 'zapo-js/crypto';
|
|
10
|
+
export { WaMediaCrypto } from 'zapo-js/media';
|
|
11
|
+
//# sourceMappingURL=crypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/transport/crypto.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACH,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,OAAO,EACP,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,eAAe,EACf,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,MAAM,EACN,MAAM,EACN,WAAW,EACX,kBAAkB,EAClB,MAAM,EACN,UAAU,EACV,YAAY,EACf,MAAM,gBAAgB,CAAA;AACvB,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 1 — crypto primitives wrapper.
|
|
4
|
+
*
|
|
5
|
+
* Re-exports cryptographic primitives from zapo-js. These are bit-exact
|
|
6
|
+
* implementations with no protocol interpretation, so reusing them does not
|
|
7
|
+
* create the tautology described in AGENTS.md §2.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.WaMediaCrypto = exports.xeddsaVerify = exports.xeddsaSign = exports.X25519 = exports.toSerializedPubKey = exports.toRawPubKey = exports.sha512 = exports.sha256 = exports.readVersionedContent = exports.randomBytesAsync = exports.prependVersion = exports.importHmacSha512Key = exports.importHmacKey = exports.importAesGcmKey = exports.importAesCbcKey = exports.hmacSign = exports.hkdfSplit = exports.hkdf = exports.Ed25519 = exports.aesGcmEncrypt = exports.aesGcmDecrypt = exports.aesCbcEncrypt = exports.aesCbcDecrypt = void 0;
|
|
11
|
+
var crypto_1 = require("zapo-js/crypto");
|
|
12
|
+
Object.defineProperty(exports, "aesCbcDecrypt", { enumerable: true, get: function () { return crypto_1.aesCbcDecrypt; } });
|
|
13
|
+
Object.defineProperty(exports, "aesCbcEncrypt", { enumerable: true, get: function () { return crypto_1.aesCbcEncrypt; } });
|
|
14
|
+
Object.defineProperty(exports, "aesGcmDecrypt", { enumerable: true, get: function () { return crypto_1.aesGcmDecrypt; } });
|
|
15
|
+
Object.defineProperty(exports, "aesGcmEncrypt", { enumerable: true, get: function () { return crypto_1.aesGcmEncrypt; } });
|
|
16
|
+
Object.defineProperty(exports, "Ed25519", { enumerable: true, get: function () { return crypto_1.Ed25519; } });
|
|
17
|
+
Object.defineProperty(exports, "hkdf", { enumerable: true, get: function () { return crypto_1.hkdf; } });
|
|
18
|
+
Object.defineProperty(exports, "hkdfSplit", { enumerable: true, get: function () { return crypto_1.hkdfSplit; } });
|
|
19
|
+
Object.defineProperty(exports, "hmacSign", { enumerable: true, get: function () { return crypto_1.hmacSign; } });
|
|
20
|
+
Object.defineProperty(exports, "importAesCbcKey", { enumerable: true, get: function () { return crypto_1.importAesCbcKey; } });
|
|
21
|
+
Object.defineProperty(exports, "importAesGcmKey", { enumerable: true, get: function () { return crypto_1.importAesGcmKey; } });
|
|
22
|
+
Object.defineProperty(exports, "importHmacKey", { enumerable: true, get: function () { return crypto_1.importHmacKey; } });
|
|
23
|
+
Object.defineProperty(exports, "importHmacSha512Key", { enumerable: true, get: function () { return crypto_1.importHmacSha512Key; } });
|
|
24
|
+
Object.defineProperty(exports, "prependVersion", { enumerable: true, get: function () { return crypto_1.prependVersion; } });
|
|
25
|
+
Object.defineProperty(exports, "randomBytesAsync", { enumerable: true, get: function () { return crypto_1.randomBytesAsync; } });
|
|
26
|
+
Object.defineProperty(exports, "readVersionedContent", { enumerable: true, get: function () { return crypto_1.readVersionedContent; } });
|
|
27
|
+
Object.defineProperty(exports, "sha256", { enumerable: true, get: function () { return crypto_1.sha256; } });
|
|
28
|
+
Object.defineProperty(exports, "sha512", { enumerable: true, get: function () { return crypto_1.sha512; } });
|
|
29
|
+
Object.defineProperty(exports, "toRawPubKey", { enumerable: true, get: function () { return crypto_1.toRawPubKey; } });
|
|
30
|
+
Object.defineProperty(exports, "toSerializedPubKey", { enumerable: true, get: function () { return crypto_1.toSerializedPubKey; } });
|
|
31
|
+
Object.defineProperty(exports, "X25519", { enumerable: true, get: function () { return crypto_1.X25519; } });
|
|
32
|
+
Object.defineProperty(exports, "xeddsaSign", { enumerable: true, get: function () { return crypto_1.xeddsaSign; } });
|
|
33
|
+
Object.defineProperty(exports, "xeddsaVerify", { enumerable: true, get: function () { return crypto_1.xeddsaVerify; } });
|
|
34
|
+
var media_1 = require("zapo-js/media");
|
|
35
|
+
Object.defineProperty(exports, "WaMediaCrypto", { enumerable: true, get: function () { return media_1.WaMediaCrypto; } });
|
|
36
|
+
//# sourceMappingURL=crypto.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/transport/crypto.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,yCAuBuB;AAtBnB,uGAAA,aAAa,OAAA;AACb,uGAAA,aAAa,OAAA;AACb,uGAAA,aAAa,OAAA;AACb,uGAAA,aAAa,OAAA;AACb,iGAAA,OAAO,OAAA;AACP,8FAAA,IAAI,OAAA;AACJ,mGAAA,SAAS,OAAA;AACT,kGAAA,QAAQ,OAAA;AACR,yGAAA,eAAe,OAAA;AACf,yGAAA,eAAe,OAAA;AACf,uGAAA,aAAa,OAAA;AACb,6GAAA,mBAAmB,OAAA;AACnB,wGAAA,cAAc,OAAA;AACd,0GAAA,gBAAgB,OAAA;AAChB,8GAAA,oBAAoB,OAAA;AACpB,gGAAA,MAAM,OAAA;AACN,gGAAA,MAAM,OAAA;AACN,qGAAA,WAAW,OAAA;AACX,4GAAA,kBAAkB,OAAA;AAClB,gGAAA,MAAM,OAAA;AACN,oGAAA,UAAU,OAAA;AACV,sGAAA,YAAY,OAAA;AAGhB,uCAA6C;AAApC,sGAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,UAAU,CAAA;AACxB,cAAc,UAAU,CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./codec"), exports);
|
|
18
|
+
__exportStar(require("./crypto"), exports);
|
|
19
|
+
__exportStar(require("./protos"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transport/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAuB;AACvB,2CAAwB;AACxB,2CAAwB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layer 1 — generated protobuf wrapper.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the proto namespace from zapo-js. The protos are generated from
|
|
5
|
+
* `.proto` definitions, so they are not "lib behavior" and are safe to reuse
|
|
6
|
+
* directly. See AGENTS.md §3.
|
|
7
|
+
*/
|
|
8
|
+
export { proto } from 'zapo-js/proto';
|
|
9
|
+
export type { Proto } from 'zapo-js/proto';
|
|
10
|
+
//# sourceMappingURL=protos.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protos.d.ts","sourceRoot":"","sources":["../../src/transport/protos.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA;AACrC,YAAY,EAAE,KAAK,EAAE,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Layer 1 — generated protobuf wrapper.
|
|
4
|
+
*
|
|
5
|
+
* Re-exports the proto namespace from zapo-js. The protos are generated from
|
|
6
|
+
* `.proto` definitions, so they are not "lib behavior" and are safe to reuse
|
|
7
|
+
* directly. See AGENTS.md §3.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.proto = void 0;
|
|
11
|
+
var proto_1 = require("zapo-js/proto");
|
|
12
|
+
Object.defineProperty(exports, "proto", { enumerable: true, get: function () { return proto_1.proto; } });
|
|
13
|
+
//# sourceMappingURL=protos.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protos.js","sourceRoot":"","sources":["../../src/transport/protos.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAEH,uCAAqC;AAA5B,8FAAA,KAAK,OAAA"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zapo-js/fake-server",
|
|
3
|
+
"version": "0.3.0",
|
|
4
|
+
"description": "Fake WhatsApp Web server used to test zapo-js",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"bin": {
|
|
8
|
+
"fake-wa-server": "./dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"require": "./dist/index.js",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"scripts": {
|
|
24
|
+
"build": "tsc -p tsconfig.build.cjs.json",
|
|
25
|
+
"typecheck": "tsc --noEmit",
|
|
26
|
+
"test": "node --import tsx --test --test-concurrency=1 \"src/**/__tests__/**/*.test.ts\"",
|
|
27
|
+
"cli": "node --import tsx src/cli.ts",
|
|
28
|
+
"bench:messaging": "node --expose-gc --import tsx bench/messaging.bench.ts"
|
|
29
|
+
},
|
|
30
|
+
"peerDependencies": {
|
|
31
|
+
"zapo-js": ">=0.1.0"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"ws": "^8.18.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"@types/ws": "^8.18.1",
|
|
38
|
+
"zapo-js": "file:../.."
|
|
39
|
+
},
|
|
40
|
+
"engines": {
|
|
41
|
+
"node": ">=20.9.0"
|
|
42
|
+
}
|
|
43
|
+
}
|