fb-messenger-e2ee 0.1.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 (106) hide show
  1. package/DOCS.md +310 -0
  2. package/LICENSE +660 -0
  3. package/README.md +153 -0
  4. package/bun.lock +1014 -0
  5. package/examples/basic-usage.ts +52 -0
  6. package/jest.config.ts +18 -0
  7. package/package.json +56 -0
  8. package/src/config/env.ts +15 -0
  9. package/src/controllers/client.controller.ts +805 -0
  10. package/src/controllers/dgw-handler.ts +171 -0
  11. package/src/controllers/e2ee-handler.ts +832 -0
  12. package/src/controllers/event-mapper.ts +327 -0
  13. package/src/core/client.ts +151 -0
  14. package/src/e2ee/application/e2ee-client.ts +376 -0
  15. package/src/e2ee/application/fanout-planner.ts +79 -0
  16. package/src/e2ee/application/outbound-message-cache.ts +58 -0
  17. package/src/e2ee/application/prekey-maintenance.ts +55 -0
  18. package/src/e2ee/application/retry-manager.ts +156 -0
  19. package/src/e2ee/facebook/facebook-protocol-utils.ts +230 -0
  20. package/src/e2ee/facebook/icdc-payload.ts +31 -0
  21. package/src/e2ee/index.ts +76 -0
  22. package/src/e2ee/internal.ts +27 -0
  23. package/src/e2ee/media/media-crypto.ts +147 -0
  24. package/src/e2ee/media/media-upload.ts +90 -0
  25. package/src/e2ee/message/builders/client-payload.ts +54 -0
  26. package/src/e2ee/message/builders/consumer-application.ts +362 -0
  27. package/src/e2ee/message/builders/message-application.ts +64 -0
  28. package/src/e2ee/message/builders/message-transport.ts +84 -0
  29. package/src/e2ee/message/codecs/protobuf-codecs.ts +101 -0
  30. package/src/e2ee/message/constants.ts +4 -0
  31. package/src/e2ee/message/message-builder.ts +15 -0
  32. package/src/e2ee/message/proto/ArmadilloApplication.proto +281 -0
  33. package/src/e2ee/message/proto/ArmadilloICDC.proto +14 -0
  34. package/src/e2ee/message/proto/ConsumerApplication.proto +232 -0
  35. package/src/e2ee/message/proto/MessageApplication.proto +82 -0
  36. package/src/e2ee/message/proto/MessageTransport.proto +77 -0
  37. package/src/e2ee/message/proto/WACommon.proto +66 -0
  38. package/src/e2ee/message/proto/WAMediaTransport.proto +176 -0
  39. package/src/e2ee/message/proto/proto-writer.ts +76 -0
  40. package/src/e2ee/signal/prekey-manager.ts +140 -0
  41. package/src/e2ee/signal/signal-manager.ts +365 -0
  42. package/src/e2ee/store/device-json.ts +47 -0
  43. package/src/e2ee/store/device-repository.ts +12 -0
  44. package/src/e2ee/store/device-store.ts +538 -0
  45. package/src/e2ee/transport/binary/decoder.ts +180 -0
  46. package/src/e2ee/transport/binary/encoder.ts +143 -0
  47. package/src/e2ee/transport/binary/stanzas.ts +97 -0
  48. package/src/e2ee/transport/binary/tokens.ts +64 -0
  49. package/src/e2ee/transport/binary/wa-binary.ts +8 -0
  50. package/src/e2ee/transport/dgw/dgw-socket.ts +345 -0
  51. package/src/e2ee/transport/noise/noise-handshake.ts +417 -0
  52. package/src/e2ee/transport/noise/noise-socket.ts +230 -0
  53. package/src/index.ts +34 -0
  54. package/src/models/client.ts +26 -0
  55. package/src/models/config.ts +14 -0
  56. package/src/models/domain.ts +299 -0
  57. package/src/models/e2ee.ts +295 -0
  58. package/src/models/media.ts +41 -0
  59. package/src/models/messaging.ts +88 -0
  60. package/src/models/thread.ts +69 -0
  61. package/src/repositories/session.repository.ts +20 -0
  62. package/src/services/auth.service.ts +55 -0
  63. package/src/services/e2ee.service.ts +174 -0
  64. package/src/services/facebook-gateway.service.ts +245 -0
  65. package/src/services/icdc.service.ts +177 -0
  66. package/src/services/media.service.ts +304 -0
  67. package/src/services/messaging.service.ts +28 -0
  68. package/src/services/thread.service.ts +199 -0
  69. package/src/types/advanced-types.ts +61 -0
  70. package/src/types/fca-unofficial.d.ts +212 -0
  71. package/src/types/protocol-types.ts +43 -0
  72. package/src/utils/fca-utils.ts +30 -0
  73. package/src/utils/logger.ts +24 -0
  74. package/src/utils/mime.ts +51 -0
  75. package/tests/.env.example +87 -0
  76. package/tests/data/1x1.png +0 -0
  77. package/tests/data/example.txt +1 -0
  78. package/tests/data/file_example.mp3 +0 -0
  79. package/tests/data/file_example.mp4 +0 -0
  80. package/tests/integration.test.ts +498 -0
  81. package/tests/script/echo-e2ee.ts +174 -0
  82. package/tests/script/send-e2ee-media.ts +227 -0
  83. package/tests/script/send-e2ee-reaction.ts +108 -0
  84. package/tests/script/send-e2ee-unsend.ts +115 -0
  85. package/tests/script/send-typing.ts +107 -0
  86. package/tests/script/test-group-send.ts +105 -0
  87. package/tests/setup.ts +3 -0
  88. package/tests/types.test.ts +57 -0
  89. package/tests/unit/controllers/dgw-handler.test.ts +60 -0
  90. package/tests/unit/controllers/e2ee-handler.test.ts +293 -0
  91. package/tests/unit/controllers/event-mapper.test.ts +252 -0
  92. package/tests/unit/e2ee/application-helpers.test.ts +418 -0
  93. package/tests/unit/e2ee/device-store.test.ts +126 -0
  94. package/tests/unit/e2ee/facebook-protocol-utils.test.ts +134 -0
  95. package/tests/unit/e2ee/media-crypto.test.ts +55 -0
  96. package/tests/unit/e2ee/media-upload.test.ts +60 -0
  97. package/tests/unit/e2ee/message-builder.test.ts +42 -0
  98. package/tests/unit/e2ee/message-builders.test.ts +230 -0
  99. package/tests/unit/e2ee/noise-handshake.test.ts +260 -0
  100. package/tests/unit/e2ee/prekey-manager.test.ts +55 -0
  101. package/tests/unit/e2ee/wa-binary.test.ts +127 -0
  102. package/tests/unit/services/e2ee.service.test.ts +101 -0
  103. package/tests/unit/services/facebook-gateway.service.test.ts +138 -0
  104. package/tests/unit/services/media.service.test.ts +169 -0
  105. package/tests/unit/utils/fca-utils.test.ts +48 -0
  106. package/tsconfig.json +19 -0
@@ -0,0 +1,52 @@
1
+ import { FBClient } from "../src/index.ts";
2
+ import { loadEnv } from "../src/config/env.ts";
3
+ import { logger } from "../src/utils/logger.ts";
4
+
5
+ async function bootstrap(): Promise<void> {
6
+ const env = loadEnv();
7
+
8
+ // You can pass appState directly as an array or string,
9
+ // or use appStatePath to let the client read it from a file.
10
+ const client = new FBClient({
11
+ appStatePath: env.appStatePath,
12
+ sessionStorePath: env.sessionStorePath,
13
+ platform: env.platform,
14
+ });
15
+
16
+ client.onEvent(event => {
17
+ switch (event.type) {
18
+ case "message":
19
+ logger.info("example", `Message from ${event.data.senderId}: ${event.data.text}`);
20
+ break;
21
+ case "e2ee_message":
22
+ logger.info("example", `[E2EE] Message from ${event.data.senderId}: ${event.data.text}`);
23
+ break;
24
+ case "error":
25
+ logger.error("example", `Error: ${event.data.message}`);
26
+ break;
27
+ default:
28
+ logger.debug("example", `Event: ${event.type}`, event.data);
29
+ }
30
+ });
31
+
32
+ try {
33
+ const { userId } = await client.connect();
34
+ logger.info("example", `Successfully connected as ${userId}`);
35
+
36
+ // Initiate E2EE connection
37
+ const deviceStorePath = `device-${userId}.json`;
38
+ await client.connectE2EE(deviceStorePath, userId);
39
+ logger.info("example", "E2EE connection established.");
40
+
41
+ // Example: Send a message after 5 seconds
42
+ setTimeout(async () => {
43
+ // await client.sendMessage({ threadId: "...", text: "Hello from E2EE!" });
44
+ }, 5000);
45
+
46
+ } catch (error) {
47
+ const message = error instanceof Error ? error.message : String(error);
48
+ logger.error("example", `Connection failed: ${message}`);
49
+ }
50
+ }
51
+
52
+ void bootstrap();
package/jest.config.ts ADDED
@@ -0,0 +1,18 @@
1
+ /** @type {import('ts-jest').JestConfigWithTsJest} */
2
+ export default {
3
+ preset: 'ts-jest/presets/default-esm',
4
+ testEnvironment: 'node',
5
+ moduleNameMapper: {
6
+ '^(\\.{1,2}/.*)\\.js$': '$1',
7
+ },
8
+ transform: {
9
+ '^.+\\.tsx?$': [
10
+ 'ts-jest',
11
+ {
12
+ useESM: true,
13
+ },
14
+ ],
15
+ },
16
+ testMatch: ['**/tests/unit/**/*.test.ts'],
17
+ setupFiles: ['<rootDir>/tests/setup.ts'],
18
+ };
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "fb-messenger-e2ee",
3
+ "version": "0.1.0",
4
+ "description": "E2EE-only TypeScript/Bun toolkit for Facebook Messenger Noise, Signal Protocol, WA-binary, media, and DGW flows",
5
+ "main": "src/index.ts",
6
+ "module": "src/index.ts",
7
+ "type": "module",
8
+ "exports": {
9
+ ".": "./src/index.ts"
10
+ },
11
+ "scripts": {
12
+ "dev": "bun run examples/basic-usage.ts",
13
+ "start": "bun run examples/basic-usage.ts",
14
+ "typecheck": "tsc --noEmit",
15
+ "test": "NODE_OPTIONS='--experimental-vm-modules' npx jest"
16
+ },
17
+ "dependencies": {
18
+ "@noble/curves": "^2.2.0",
19
+ "@noble/hashes": "^2.2.0",
20
+ "@signalapp/libsignal-client": "0.70.0",
21
+ "fca-unofficial": "github:VangBanLaNhat/fca-unofficial",
22
+ "protobufjs": "^8.0.1"
23
+ },
24
+ "devDependencies": {
25
+ "@types/bun": "latest",
26
+ "@types/jest": "^30.0.0",
27
+ "@types/ws": "^8.18.1",
28
+ "jest": "^30.3.0",
29
+ "ts-jest": "^29.4.9",
30
+ "typescript": "^5.8.3"
31
+ },
32
+ "trustedDependencies": [
33
+ "@signalapp/libsignal-client"
34
+ ],
35
+ "directories": {
36
+ "example": "examples",
37
+ "test": "tests"
38
+ },
39
+ "repository": {
40
+ "type": "git",
41
+ "url": "git+https://github.com/HerokeyVN/FB-Messenger-E2EE.git"
42
+ },
43
+ "keywords": [
44
+ "facebook",
45
+ "messenger",
46
+ "e2ee",
47
+ "encode",
48
+ "encrypt"
49
+ ],
50
+ "author": "HerokeyVN",
51
+ "license": "AGPL-3.0-or-later",
52
+ "bugs": {
53
+ "url": "https://github.com/HerokeyVN/FB-Messenger-E2EE/issues"
54
+ },
55
+ "homepage": "https://github.com/HerokeyVN/FB-Messenger-E2EE#readme"
56
+ }
@@ -0,0 +1,15 @@
1
+ import { resolve } from "node:path";
2
+
3
+ import type { AppEnv } from "../models/config.ts";
4
+
5
+ export function loadEnv(): AppEnv {
6
+ const appStatePath = process.env.FB_APPSTATE_PATH ?? "./data/appstate.json";
7
+ const sessionStorePath = process.env.FB_SESSION_STORE_PATH ?? "./data/session.json";
8
+ const platform = (process.env.FB_PLATFORM ?? "facebook") as "facebook" | "messenger";
9
+
10
+ return {
11
+ appStatePath: resolve(appStatePath),
12
+ sessionStorePath: resolve(sessionStorePath),
13
+ platform,
14
+ };
15
+ }