@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.
Files changed (238) hide show
  1. package/README.md +176 -0
  2. package/dist/api/AppStateSyncManager.d.ts +27 -0
  3. package/dist/api/AppStateSyncManager.d.ts.map +1 -0
  4. package/dist/api/AppStateSyncManager.js +151 -0
  5. package/dist/api/AppStateSyncManager.js.map +1 -0
  6. package/dist/api/FakePairingDriver.d.ts +27 -0
  7. package/dist/api/FakePairingDriver.d.ts.map +1 -0
  8. package/dist/api/FakePairingDriver.js +36 -0
  9. package/dist/api/FakePairingDriver.js.map +1 -0
  10. package/dist/api/FakePeer.d.ts +143 -0
  11. package/dist/api/FakePeer.d.ts.map +1 -0
  12. package/dist/api/FakePeer.js +408 -0
  13. package/dist/api/FakePeer.js.map +1 -0
  14. package/dist/api/FakeWaServer.d.ts +167 -0
  15. package/dist/api/FakeWaServer.d.ts.map +1 -0
  16. package/dist/api/FakeWaServer.js +652 -0
  17. package/dist/api/FakeWaServer.js.map +1 -0
  18. package/dist/api/PreKeyDispenser.d.ts +23 -0
  19. package/dist/api/PreKeyDispenser.d.ts.map +1 -0
  20. package/dist/api/PreKeyDispenser.js +98 -0
  21. package/dist/api/PreKeyDispenser.js.map +1 -0
  22. package/dist/api/Scenario.d.ts +24 -0
  23. package/dist/api/Scenario.d.ts.map +1 -0
  24. package/dist/api/Scenario.js +38 -0
  25. package/dist/api/Scenario.js.map +1 -0
  26. package/dist/api/ServerRegistries.d.ts +110 -0
  27. package/dist/api/ServerRegistries.d.ts.map +1 -0
  28. package/dist/api/ServerRegistries.js +268 -0
  29. package/dist/api/ServerRegistries.js.map +1 -0
  30. package/dist/api/iq-handlers.d.ts +47 -0
  31. package/dist/api/iq-handlers.d.ts.map +1 -0
  32. package/dist/api/iq-handlers.js +498 -0
  33. package/dist/api/iq-handlers.js.map +1 -0
  34. package/dist/cli.d.ts +4 -0
  35. package/dist/cli.d.ts.map +1 -0
  36. package/dist/cli.js +249 -0
  37. package/dist/cli.js.map +1 -0
  38. package/dist/index.d.ts +51 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +74 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/infra/WaFakeConnection.d.ts +23 -0
  43. package/dist/infra/WaFakeConnection.d.ts.map +1 -0
  44. package/dist/infra/WaFakeConnection.js +54 -0
  45. package/dist/infra/WaFakeConnection.js.map +1 -0
  46. package/dist/infra/WaFakeConnectionPipeline.d.ts +51 -0
  47. package/dist/infra/WaFakeConnectionPipeline.d.ts.map +1 -0
  48. package/dist/infra/WaFakeConnectionPipeline.js +224 -0
  49. package/dist/infra/WaFakeConnectionPipeline.js.map +1 -0
  50. package/dist/infra/WaFakeFrameSocket.d.ts +29 -0
  51. package/dist/infra/WaFakeFrameSocket.d.ts.map +1 -0
  52. package/dist/infra/WaFakeFrameSocket.js +122 -0
  53. package/dist/infra/WaFakeFrameSocket.js.map +1 -0
  54. package/dist/infra/WaFakeMediaHttpsServer.d.ts +16 -0
  55. package/dist/infra/WaFakeMediaHttpsServer.d.ts.map +1 -0
  56. package/dist/infra/WaFakeMediaHttpsServer.js +131 -0
  57. package/dist/infra/WaFakeMediaHttpsServer.js.map +1 -0
  58. package/dist/infra/WaFakeNoiseHandshake.d.ts +23 -0
  59. package/dist/infra/WaFakeNoiseHandshake.d.ts.map +1 -0
  60. package/dist/infra/WaFakeNoiseHandshake.js +76 -0
  61. package/dist/infra/WaFakeNoiseHandshake.js.map +1 -0
  62. package/dist/infra/WaFakeTransport.d.ts +15 -0
  63. package/dist/infra/WaFakeTransport.d.ts.map +1 -0
  64. package/dist/infra/WaFakeTransport.js +34 -0
  65. package/dist/infra/WaFakeTransport.js.map +1 -0
  66. package/dist/infra/WaFakeWsServer.d.ts +29 -0
  67. package/dist/infra/WaFakeWsServer.d.ts.map +1 -0
  68. package/dist/infra/WaFakeWsServer.js +101 -0
  69. package/dist/infra/WaFakeWsServer.js.map +1 -0
  70. package/dist/protocol/auth/cert-chain.d.ts +18 -0
  71. package/dist/protocol/auth/cert-chain.d.ts.map +1 -0
  72. package/dist/protocol/auth/cert-chain.js +44 -0
  73. package/dist/protocol/auth/cert-chain.js.map +1 -0
  74. package/dist/protocol/auth/client-payload-validate.d.ts +21 -0
  75. package/dist/protocol/auth/client-payload-validate.d.ts.map +1 -0
  76. package/dist/protocol/auth/client-payload-validate.js +61 -0
  77. package/dist/protocol/auth/client-payload-validate.js.map +1 -0
  78. package/dist/protocol/auth/fake-primary-device.d.ts +19 -0
  79. package/dist/protocol/auth/fake-primary-device.d.ts.map +1 -0
  80. package/dist/protocol/auth/fake-primary-device.js +53 -0
  81. package/dist/protocol/auth/fake-primary-device.js.map +1 -0
  82. package/dist/protocol/auth/pair-device.d.ts +26 -0
  83. package/dist/protocol/auth/pair-device.d.ts.map +1 -0
  84. package/dist/protocol/auth/pair-device.js +104 -0
  85. package/dist/protocol/auth/pair-device.js.map +1 -0
  86. package/dist/protocol/auth/success-node.d.ts +15 -0
  87. package/dist/protocol/auth/success-node.d.ts.map +1 -0
  88. package/dist/protocol/auth/success-node.js +30 -0
  89. package/dist/protocol/auth/success-node.js.map +1 -0
  90. package/dist/protocol/iq/abprops.d.ts +14 -0
  91. package/dist/protocol/iq/abprops.d.ts.map +1 -0
  92. package/dist/protocol/iq/abprops.js +34 -0
  93. package/dist/protocol/iq/abprops.js.map +1 -0
  94. package/dist/protocol/iq/appstate-sync.d.ts +38 -0
  95. package/dist/protocol/iq/appstate-sync.d.ts.map +1 -0
  96. package/dist/protocol/iq/appstate-sync.js +154 -0
  97. package/dist/protocol/iq/appstate-sync.js.map +1 -0
  98. package/dist/protocol/iq/business.d.ts +13 -0
  99. package/dist/protocol/iq/business.d.ts.map +1 -0
  100. package/dist/protocol/iq/business.js +64 -0
  101. package/dist/protocol/iq/business.js.map +1 -0
  102. package/dist/protocol/iq/dirty-bits.d.ts +8 -0
  103. package/dist/protocol/iq/dirty-bits.d.ts.map +1 -0
  104. package/dist/protocol/iq/dirty-bits.js +23 -0
  105. package/dist/protocol/iq/dirty-bits.js.map +1 -0
  106. package/dist/protocol/iq/group-ops.d.ts +34 -0
  107. package/dist/protocol/iq/group-ops.d.ts.map +1 -0
  108. package/dist/protocol/iq/group-ops.js +164 -0
  109. package/dist/protocol/iq/group-ops.js.map +1 -0
  110. package/dist/protocol/iq/newsletter.d.ts +4 -0
  111. package/dist/protocol/iq/newsletter.d.ts.map +1 -0
  112. package/dist/protocol/iq/newsletter.js +18 -0
  113. package/dist/protocol/iq/newsletter.js.map +1 -0
  114. package/dist/protocol/iq/prekey-fetch.d.ts +18 -0
  115. package/dist/protocol/iq/prekey-fetch.d.ts.map +1 -0
  116. package/dist/protocol/iq/prekey-fetch.js +92 -0
  117. package/dist/protocol/iq/prekey-fetch.js.map +1 -0
  118. package/dist/protocol/iq/privacy-token.d.ts +9 -0
  119. package/dist/protocol/iq/privacy-token.d.ts.map +1 -0
  120. package/dist/protocol/iq/privacy-token.js +30 -0
  121. package/dist/protocol/iq/privacy-token.js.map +1 -0
  122. package/dist/protocol/iq/privacy.d.ts +22 -0
  123. package/dist/protocol/iq/privacy.d.ts.map +1 -0
  124. package/dist/protocol/iq/privacy.js +133 -0
  125. package/dist/protocol/iq/privacy.js.map +1 -0
  126. package/dist/protocol/iq/profile.d.ts +22 -0
  127. package/dist/protocol/iq/profile.d.ts.map +1 -0
  128. package/dist/protocol/iq/profile.js +80 -0
  129. package/dist/protocol/iq/profile.js.map +1 -0
  130. package/dist/protocol/iq/router.d.ts +39 -0
  131. package/dist/protocol/iq/router.d.ts.map +1 -0
  132. package/dist/protocol/iq/router.js +118 -0
  133. package/dist/protocol/iq/router.js.map +1 -0
  134. package/dist/protocol/iq/usync.d.ts +8 -0
  135. package/dist/protocol/iq/usync.d.ts.map +1 -0
  136. package/dist/protocol/iq/usync.js +68 -0
  137. package/dist/protocol/iq/usync.js.map +1 -0
  138. package/dist/protocol/push/app-state-key-share.d.ts +17 -0
  139. package/dist/protocol/push/app-state-key-share.d.ts.map +1 -0
  140. package/dist/protocol/push/app-state-key-share.js +30 -0
  141. package/dist/protocol/push/app-state-key-share.js.map +1 -0
  142. package/dist/protocol/push/call-failure.d.ts +16 -0
  143. package/dist/protocol/push/call-failure.d.ts.map +1 -0
  144. package/dist/protocol/push/call-failure.js +32 -0
  145. package/dist/protocol/push/call-failure.js.map +1 -0
  146. package/dist/protocol/push/chatstate.d.ts +15 -0
  147. package/dist/protocol/push/chatstate.d.ts.map +1 -0
  148. package/dist/protocol/push/chatstate.js +27 -0
  149. package/dist/protocol/push/chatstate.js.map +1 -0
  150. package/dist/protocol/push/error-stanza.d.ts +8 -0
  151. package/dist/protocol/push/error-stanza.d.ts.map +1 -0
  152. package/dist/protocol/push/error-stanza.js +17 -0
  153. package/dist/protocol/push/error-stanza.js.map +1 -0
  154. package/dist/protocol/push/history-sync.d.ts +46 -0
  155. package/dist/protocol/push/history-sync.d.ts.map +1 -0
  156. package/dist/protocol/push/history-sync.js +117 -0
  157. package/dist/protocol/push/history-sync.js.map +1 -0
  158. package/dist/protocol/push/message.d.ts +21 -0
  159. package/dist/protocol/push/message.d.ts.map +1 -0
  160. package/dist/protocol/push/message.js +42 -0
  161. package/dist/protocol/push/message.js.map +1 -0
  162. package/dist/protocol/push/notification.d.ts +21 -0
  163. package/dist/protocol/push/notification.d.ts.map +1 -0
  164. package/dist/protocol/push/notification.js +34 -0
  165. package/dist/protocol/push/notification.js.map +1 -0
  166. package/dist/protocol/push/presence.d.ts +11 -0
  167. package/dist/protocol/push/presence.d.ts.map +1 -0
  168. package/dist/protocol/push/presence.js +18 -0
  169. package/dist/protocol/push/presence.js.map +1 -0
  170. package/dist/protocol/push/receipt.d.ts +14 -0
  171. package/dist/protocol/push/receipt.d.ts.map +1 -0
  172. package/dist/protocol/push/receipt.js +25 -0
  173. package/dist/protocol/push/receipt.js.map +1 -0
  174. package/dist/protocol/signal/fake-app-state-crypto.d.ts +49 -0
  175. package/dist/protocol/signal/fake-app-state-crypto.d.ts.map +1 -0
  176. package/dist/protocol/signal/fake-app-state-crypto.js +202 -0
  177. package/dist/protocol/signal/fake-app-state-crypto.js.map +1 -0
  178. package/dist/protocol/signal/fake-peer-double-ratchet.d.ts +38 -0
  179. package/dist/protocol/signal/fake-peer-double-ratchet.d.ts.map +1 -0
  180. package/dist/protocol/signal/fake-peer-double-ratchet.js +408 -0
  181. package/dist/protocol/signal/fake-peer-double-ratchet.js.map +1 -0
  182. package/dist/protocol/signal/fake-peer-group-recv-session.d.ts +10 -0
  183. package/dist/protocol/signal/fake-peer-group-recv-session.d.ts.map +1 -0
  184. package/dist/protocol/signal/fake-peer-group-recv-session.js +129 -0
  185. package/dist/protocol/signal/fake-peer-group-recv-session.js.map +1 -0
  186. package/dist/protocol/signal/fake-peer-identity.d.ts +7 -0
  187. package/dist/protocol/signal/fake-peer-identity.d.ts.map +1 -0
  188. package/dist/protocol/signal/fake-peer-identity.js +12 -0
  189. package/dist/protocol/signal/fake-peer-identity.js.map +1 -0
  190. package/dist/protocol/signal/fake-peer-key-bundle.d.ts +24 -0
  191. package/dist/protocol/signal/fake-peer-key-bundle.d.ts.map +1 -0
  192. package/dist/protocol/signal/fake-peer-key-bundle.js +29 -0
  193. package/dist/protocol/signal/fake-peer-key-bundle.js.map +1 -0
  194. package/dist/protocol/signal/fake-peer-recv-session.d.ts +60 -0
  195. package/dist/protocol/signal/fake-peer-recv-session.d.ts.map +1 -0
  196. package/dist/protocol/signal/fake-peer-recv-session.js +284 -0
  197. package/dist/protocol/signal/fake-peer-recv-session.js.map +1 -0
  198. package/dist/protocol/signal/fake-peer-session.d.ts +87 -0
  199. package/dist/protocol/signal/fake-peer-session.d.ts.map +1 -0
  200. package/dist/protocol/signal/fake-peer-session.js +207 -0
  201. package/dist/protocol/signal/fake-peer-session.js.map +1 -0
  202. package/dist/protocol/signal/fake-sender-key.d.ts +15 -0
  203. package/dist/protocol/signal/fake-sender-key.d.ts.map +1 -0
  204. package/dist/protocol/signal/fake-sender-key.js +91 -0
  205. package/dist/protocol/signal/fake-sender-key.js.map +1 -0
  206. package/dist/protocol/signal/prekey-upload.d.ts +22 -0
  207. package/dist/protocol/signal/prekey-upload.d.ts.map +1 -0
  208. package/dist/protocol/signal/prekey-upload.js +113 -0
  209. package/dist/protocol/signal/prekey-upload.js.map +1 -0
  210. package/dist/protocol/stream/stream-error.d.ts +8 -0
  211. package/dist/protocol/stream/stream-error.d.ts.map +1 -0
  212. package/dist/protocol/stream/stream-error.js +64 -0
  213. package/dist/protocol/stream/stream-error.js.map +1 -0
  214. package/dist/state/fake-app-state-collection.d.ts +35 -0
  215. package/dist/state/fake-app-state-collection.d.ts.map +1 -0
  216. package/dist/state/fake-app-state-collection.js +139 -0
  217. package/dist/state/fake-app-state-collection.js.map +1 -0
  218. package/dist/state/fake-media-store.d.ts +35 -0
  219. package/dist/state/fake-media-store.d.ts.map +1 -0
  220. package/dist/state/fake-media-store.js +57 -0
  221. package/dist/state/fake-media-store.js.map +1 -0
  222. package/dist/transport/codec.d.ts +10 -0
  223. package/dist/transport/codec.d.ts.map +1 -0
  224. package/dist/transport/codec.js +17 -0
  225. package/dist/transport/codec.js.map +1 -0
  226. package/dist/transport/crypto.d.ts +11 -0
  227. package/dist/transport/crypto.d.ts.map +1 -0
  228. package/dist/transport/crypto.js +36 -0
  229. package/dist/transport/crypto.js.map +1 -0
  230. package/dist/transport/index.d.ts +4 -0
  231. package/dist/transport/index.d.ts.map +1 -0
  232. package/dist/transport/index.js +20 -0
  233. package/dist/transport/index.js.map +1 -0
  234. package/dist/transport/protos.d.ts +10 -0
  235. package/dist/transport/protos.d.ts.map +1 -0
  236. package/dist/transport/protos.js +13 -0
  237. package/dist/transport/protos.js.map +1 -0
  238. 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,4 @@
1
+ export * from './codec';
2
+ export * from './crypto';
3
+ export * from './protos';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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
+ }