@openclaw/crabline 0.1.19 → 0.1.20

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 CHANGED
@@ -49,6 +49,10 @@ The source checkout does not link its own `crabline` bin into
49
49
  `pnpm exec crabline`. An installed package exposes the `crabline` command used
50
50
  in the examples below.
51
51
 
52
+ Node.js consumers can bundle the package with its dependencies, including under
53
+ pnpm's isolated linker. WhatsApp's crypto dependency uses static imports so it
54
+ remains available when the bundle runs outside the original installation.
55
+
52
56
  ## Quality Gate
53
57
 
54
58
  ```bash
@@ -191,6 +195,8 @@ Provider servers initialize recorder ownership before reporting readiness,
191
195
  without creating recorder files or emitting synthetic events. Closing a server
192
196
  stops new recorder admissions and waits for admitted persistence to finish.
193
197
  Shutdown does not wait for event observers, which may themselves call `close()`.
198
+ Baileys recorder rejections remain handled when shutdown interrupts compressed
199
+ frame decoding and an event observer subsequently fails.
194
200
  Concurrent and repeated close calls share the same shutdown. All transports are
195
201
  closed even if one fails, and the persistence drain includes asynchronous cleanup
196
202
  after a failed recorder lock acquisition.
@@ -1604,7 +1604,7 @@ export declare const ManifestSchema: z.ZodPreprocess<z.ZodObject<{
1604
1604
  } | undefined;
1605
1605
  }>>>>;
1606
1606
  userName: z.ZodDefault<z.ZodString>;
1607
- }, z.core.$strict>>;
1607
+ }, z.core.$strict>, unknown>;
1608
1608
  export type BuiltinAdapterId = BuiltinAdapterName;
1609
1609
  export type FixtureDefinition = z.infer<typeof FixtureSchema>;
1610
1610
  export type FixtureMode = (typeof FIXTURE_MODES)[number];
@@ -1,8 +1,6 @@
1
1
  import { Buffer } from "node:buffer";
2
2
  import { createCipheriv, createDecipheriv, createHash, createPrivateKey, createPublicKey, diffieHellman, generateKeyPairSync, hkdfSync, randomBytes, } from "node:crypto";
3
- import { createRequire } from "node:module";
4
- const require = createRequire(import.meta.url);
5
- const curve25519 = require("curve25519-js");
3
+ import * as curve25519 from "curve25519-js";
6
4
  const AES_GCM_TAG_LENGTH = 16;
7
5
  const PRIVATE_KEY_DER_PREFIX = Buffer.from([
8
6
  48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32,
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport {\n createCipheriv,\n createDecipheriv,\n createHash,\n createPrivateKey,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n hkdfSync,\n randomBytes,\n} from \"node:crypto\";\nimport { createRequire } from \"node:module\";\n\nconst require = createRequire(import.meta.url);\n\ntype Curve25519Module = {\n generateKeyPair(seed: Uint8Array): { private: Uint8Array; public: Uint8Array };\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Uint8Array;\n sign(privateKey: Uint8Array, message: Uint8Array, random: Uint8Array): Uint8Array;\n};\n\nconst curve25519 = require(\"curve25519-js\") as Curve25519Module;\n\nconst AES_GCM_TAG_LENGTH = 16;\nconst PRIVATE_KEY_DER_PREFIX = Buffer.from([\n 48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32,\n]);\nconst PUBLIC_KEY_DER_PREFIX = Buffer.from([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0]);\n\nexport const KEY_BUNDLE_TYPE = Buffer.from([5]);\nexport const NOISE_MODE = \"Noise_XX_25519_AESGCM_SHA256\\0\\0\\0\\0\";\nexport const NOISE_WA_HEADER = Buffer.from([87, 65, 6, 3]);\n\nexport type KeyPair = {\n private: Buffer;\n public: Buffer;\n};\n\nexport type SignedKeyPair = {\n keyId: number;\n keyPair: KeyPair;\n signature: Buffer;\n};\n\ntype NativeCurveBackend = {\n generateKeyPair(): KeyPair;\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer;\n};\n\ntype CurveApi = NativeCurveBackend & {\n sign(privateKey: Uint8Array, message: Uint8Array): Buffer;\n};\n\nconst nativeCurveBackend: NativeCurveBackend = {\n generateKeyPair() {\n const { privateKey, publicKey } = generateKeyPairSync(\"x25519\", {\n privateKeyEncoding: { format: \"der\", type: \"pkcs8\" },\n publicKeyEncoding: { format: \"der\", type: \"spki\" },\n });\n return {\n private: privateKey.subarray(\n PRIVATE_KEY_DER_PREFIX.length,\n PRIVATE_KEY_DER_PREFIX.length + 32,\n ),\n public: publicKey.subarray(PUBLIC_KEY_DER_PREFIX.length, PUBLIC_KEY_DER_PREFIX.length + 32),\n };\n },\n sharedKey(privateKey, publicKey) {\n const nodePrivateKey = createPrivateKey({\n format: \"der\",\n key: Buffer.concat([PRIVATE_KEY_DER_PREFIX, Buffer.from(privateKey)]),\n type: \"pkcs8\",\n });\n const nodePublicKey = createPublicKey({\n format: \"der\",\n key: Buffer.concat([PUBLIC_KEY_DER_PREFIX, Buffer.from(publicKey)]),\n type: \"spki\",\n });\n return diffieHellman({ privateKey: nodePrivateKey, publicKey: nodePublicKey });\n },\n};\n\nfunction isUnsupportedNativeCurveError(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n return (\n code === \"ERR_OSSL_EVP_UNSUPPORTED\" ||\n code === \"ERR_CRYPTO_UNSUPPORTED_OPERATION\" ||\n code === \"ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE\"\n );\n}\n\nexport function createCurve(nativeBackend: NativeCurveBackend = nativeCurveBackend): CurveApi {\n let nativeAvailable = true;\n return {\n generateKeyPair(): KeyPair {\n if (nativeAvailable) {\n try {\n return nativeBackend.generateKeyPair();\n } catch (error) {\n if (!isUnsupportedNativeCurveError(error)) {\n throw error;\n }\n nativeAvailable = false;\n }\n }\n const keyPair = curve25519.generateKeyPair(randomBytes(32));\n return {\n private: Buffer.from(keyPair.private),\n public: Buffer.from(keyPair.public),\n };\n },\n\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer {\n if (privateKey.byteLength !== 32) {\n throw new Error(`Invalid Signal private key length: ${privateKey.byteLength}.`);\n }\n const rawPublicKey = scrubSignalPublicKey(publicKey);\n if (rawPublicKey.every((byte) => byte === 0)) {\n throw new Error(\"X25519 failed during derivation for an invalid peer key.\");\n }\n if (nativeAvailable) {\n try {\n return requireValidX25519SharedKey(nativeBackend.sharedKey(privateKey, rawPublicKey));\n } catch (error) {\n if (!isUnsupportedNativeCurveError(error)) {\n throw error;\n }\n nativeAvailable = false;\n }\n }\n return requireValidX25519SharedKey(\n curve25519.sharedKey(Buffer.from(privateKey), rawPublicKey),\n );\n },\n\n sign(privateKey: Uint8Array, message: Uint8Array): Buffer {\n return Buffer.from(\n curve25519.sign(Buffer.from(privateKey), Buffer.from(message), randomBytes(64)),\n );\n },\n };\n}\n\nfunction requireValidX25519SharedKey(sharedKey: Uint8Array): Buffer {\n const result = Buffer.from(sharedKey);\n if (result.every((byte) => byte === 0)) {\n throw new Error(\"X25519 failed during derivation for an invalid peer key.\");\n }\n return result;\n}\n\nexport const Curve = createCurve();\n\nexport function generateSignalKeyPair(): KeyPair {\n const keyPair = Curve.generateKeyPair();\n return {\n private: keyPair.private,\n public: ensureSignalPublicKey(keyPair.public),\n };\n}\n\nexport function aesEncryptGCM(\n plaintext: Uint8Array,\n key: Uint8Array,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Buffer {\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n cipher.setAAD(additionalData);\n return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]);\n}\n\nexport function aesDecryptGCM(\n ciphertext: Uint8Array,\n key: Uint8Array,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Buffer {\n if (ciphertext.byteLength < AES_GCM_TAG_LENGTH) {\n throw new Error(\n `AES-GCM ciphertext must include a ${AES_GCM_TAG_LENGTH}-byte authentication tag.`,\n );\n }\n const decipher = createDecipheriv(\"aes-256-gcm\", key, iv, {\n authTagLength: AES_GCM_TAG_LENGTH,\n });\n const encrypted = ciphertext.subarray(0, ciphertext.byteLength - AES_GCM_TAG_LENGTH);\n const tag = ciphertext.subarray(ciphertext.byteLength - AES_GCM_TAG_LENGTH);\n decipher.setAAD(additionalData);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(encrypted), decipher.final()]);\n}\n\nexport function encodeBigEndian(value: number, length = 4): Buffer {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\"Big-endian values must be non-negative safe integers.\");\n }\n if (!Number.isSafeInteger(length) || length < 1 || length > 1024) {\n throw new Error(\"Big-endian lengths must be safe integers between 1 and 1024.\");\n }\n let remaining = BigInt(value);\n if (remaining >= 1n << BigInt(length * 8)) {\n throw new Error(`Big-endian value ${value} does not fit in ${length} bytes.`);\n }\n const bytes = Buffer.alloc(length);\n for (let index = length - 1; index >= 0; index -= 1) {\n bytes[index] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n return bytes;\n}\n\nexport function hkdf(\n input: Uint8Array,\n length: number,\n params: { info: string; salt: Uint8Array },\n) {\n return Buffer.from(hkdfSync(\"sha256\", input, params.salt, params.info, length));\n}\n\nexport function sha256(input: Uint8Array): Buffer {\n return createHash(\"sha256\").update(input).digest();\n}\n\nexport function signedKeyPair(identityKeyPair: KeyPair, keyId: number): SignedKeyPair {\n const keyPair = generateSignalKeyPair();\n return {\n keyId,\n keyPair,\n signature: Curve.sign(identityKeyPair.private, keyPair.public),\n };\n}\n\nexport function ensureSignalPublicKey(publicKey: Uint8Array): Buffer {\n const buffer = Buffer.from(publicKey);\n if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {\n return buffer;\n }\n if (buffer.length === 32) {\n return Buffer.concat([KEY_BUNDLE_TYPE, buffer]);\n }\n throw new Error(`Invalid Signal public key length or type: ${buffer.length}.`);\n}\n\nexport function scrubSignalPublicKey(publicKey: Uint8Array): Buffer {\n const buffer = Buffer.from(publicKey);\n if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {\n return buffer.subarray(1);\n }\n if (buffer.length === 32) {\n return buffer;\n }\n throw new Error(`Invalid Signal public key length: ${buffer.length}.`);\n}\n"]}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../../src/servers/whatsapp-wire/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["import { Buffer } from \"node:buffer\";\nimport {\n createCipheriv,\n createDecipheriv,\n createHash,\n createPrivateKey,\n createPublicKey,\n diffieHellman,\n generateKeyPairSync,\n hkdfSync,\n randomBytes,\n} from \"node:crypto\";\nimport * as curve25519 from \"curve25519-js\";\n\nconst AES_GCM_TAG_LENGTH = 16;\nconst PRIVATE_KEY_DER_PREFIX = Buffer.from([\n 48, 46, 2, 1, 0, 48, 5, 6, 3, 43, 101, 110, 4, 34, 4, 32,\n]);\nconst PUBLIC_KEY_DER_PREFIX = Buffer.from([48, 42, 48, 5, 6, 3, 43, 101, 110, 3, 33, 0]);\n\nexport const KEY_BUNDLE_TYPE = Buffer.from([5]);\nexport const NOISE_MODE = \"Noise_XX_25519_AESGCM_SHA256\\0\\0\\0\\0\";\nexport const NOISE_WA_HEADER = Buffer.from([87, 65, 6, 3]);\n\nexport type KeyPair = {\n private: Buffer;\n public: Buffer;\n};\n\nexport type SignedKeyPair = {\n keyId: number;\n keyPair: KeyPair;\n signature: Buffer;\n};\n\ntype NativeCurveBackend = {\n generateKeyPair(): KeyPair;\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer;\n};\n\ntype CurveApi = NativeCurveBackend & {\n sign(privateKey: Uint8Array, message: Uint8Array): Buffer;\n};\n\nconst nativeCurveBackend: NativeCurveBackend = {\n generateKeyPair() {\n const { privateKey, publicKey } = generateKeyPairSync(\"x25519\", {\n privateKeyEncoding: { format: \"der\", type: \"pkcs8\" },\n publicKeyEncoding: { format: \"der\", type: \"spki\" },\n });\n return {\n private: privateKey.subarray(\n PRIVATE_KEY_DER_PREFIX.length,\n PRIVATE_KEY_DER_PREFIX.length + 32,\n ),\n public: publicKey.subarray(PUBLIC_KEY_DER_PREFIX.length, PUBLIC_KEY_DER_PREFIX.length + 32),\n };\n },\n sharedKey(privateKey, publicKey) {\n const nodePrivateKey = createPrivateKey({\n format: \"der\",\n key: Buffer.concat([PRIVATE_KEY_DER_PREFIX, Buffer.from(privateKey)]),\n type: \"pkcs8\",\n });\n const nodePublicKey = createPublicKey({\n format: \"der\",\n key: Buffer.concat([PUBLIC_KEY_DER_PREFIX, Buffer.from(publicKey)]),\n type: \"spki\",\n });\n return diffieHellman({ privateKey: nodePrivateKey, publicKey: nodePublicKey });\n },\n};\n\nfunction isUnsupportedNativeCurveError(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException | undefined)?.code;\n return (\n code === \"ERR_OSSL_EVP_UNSUPPORTED\" ||\n code === \"ERR_CRYPTO_UNSUPPORTED_OPERATION\" ||\n code === \"ERR_CRYPTO_INVALID_KEY_OBJECT_TYPE\"\n );\n}\n\nexport function createCurve(nativeBackend: NativeCurveBackend = nativeCurveBackend): CurveApi {\n let nativeAvailable = true;\n return {\n generateKeyPair(): KeyPair {\n if (nativeAvailable) {\n try {\n return nativeBackend.generateKeyPair();\n } catch (error) {\n if (!isUnsupportedNativeCurveError(error)) {\n throw error;\n }\n nativeAvailable = false;\n }\n }\n const keyPair = curve25519.generateKeyPair(randomBytes(32));\n return {\n private: Buffer.from(keyPair.private),\n public: Buffer.from(keyPair.public),\n };\n },\n\n sharedKey(privateKey: Uint8Array, publicKey: Uint8Array): Buffer {\n if (privateKey.byteLength !== 32) {\n throw new Error(`Invalid Signal private key length: ${privateKey.byteLength}.`);\n }\n const rawPublicKey = scrubSignalPublicKey(publicKey);\n if (rawPublicKey.every((byte) => byte === 0)) {\n throw new Error(\"X25519 failed during derivation for an invalid peer key.\");\n }\n if (nativeAvailable) {\n try {\n return requireValidX25519SharedKey(nativeBackend.sharedKey(privateKey, rawPublicKey));\n } catch (error) {\n if (!isUnsupportedNativeCurveError(error)) {\n throw error;\n }\n nativeAvailable = false;\n }\n }\n return requireValidX25519SharedKey(\n curve25519.sharedKey(Buffer.from(privateKey), rawPublicKey),\n );\n },\n\n sign(privateKey: Uint8Array, message: Uint8Array): Buffer {\n return Buffer.from(\n curve25519.sign(Buffer.from(privateKey), Buffer.from(message), randomBytes(64)),\n );\n },\n };\n}\n\nfunction requireValidX25519SharedKey(sharedKey: Uint8Array): Buffer {\n const result = Buffer.from(sharedKey);\n if (result.every((byte) => byte === 0)) {\n throw new Error(\"X25519 failed during derivation for an invalid peer key.\");\n }\n return result;\n}\n\nexport const Curve = createCurve();\n\nexport function generateSignalKeyPair(): KeyPair {\n const keyPair = Curve.generateKeyPair();\n return {\n private: keyPair.private,\n public: ensureSignalPublicKey(keyPair.public),\n };\n}\n\nexport function aesEncryptGCM(\n plaintext: Uint8Array,\n key: Uint8Array,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Buffer {\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n cipher.setAAD(additionalData);\n return Buffer.concat([cipher.update(plaintext), cipher.final(), cipher.getAuthTag()]);\n}\n\nexport function aesDecryptGCM(\n ciphertext: Uint8Array,\n key: Uint8Array,\n iv: Uint8Array,\n additionalData: Uint8Array,\n): Buffer {\n if (ciphertext.byteLength < AES_GCM_TAG_LENGTH) {\n throw new Error(\n `AES-GCM ciphertext must include a ${AES_GCM_TAG_LENGTH}-byte authentication tag.`,\n );\n }\n const decipher = createDecipheriv(\"aes-256-gcm\", key, iv, {\n authTagLength: AES_GCM_TAG_LENGTH,\n });\n const encrypted = ciphertext.subarray(0, ciphertext.byteLength - AES_GCM_TAG_LENGTH);\n const tag = ciphertext.subarray(ciphertext.byteLength - AES_GCM_TAG_LENGTH);\n decipher.setAAD(additionalData);\n decipher.setAuthTag(tag);\n return Buffer.concat([decipher.update(encrypted), decipher.final()]);\n}\n\nexport function encodeBigEndian(value: number, length = 4): Buffer {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(\"Big-endian values must be non-negative safe integers.\");\n }\n if (!Number.isSafeInteger(length) || length < 1 || length > 1024) {\n throw new Error(\"Big-endian lengths must be safe integers between 1 and 1024.\");\n }\n let remaining = BigInt(value);\n if (remaining >= 1n << BigInt(length * 8)) {\n throw new Error(`Big-endian value ${value} does not fit in ${length} bytes.`);\n }\n const bytes = Buffer.alloc(length);\n for (let index = length - 1; index >= 0; index -= 1) {\n bytes[index] = Number(remaining & 0xffn);\n remaining >>= 8n;\n }\n return bytes;\n}\n\nexport function hkdf(\n input: Uint8Array,\n length: number,\n params: { info: string; salt: Uint8Array },\n) {\n return Buffer.from(hkdfSync(\"sha256\", input, params.salt, params.info, length));\n}\n\nexport function sha256(input: Uint8Array): Buffer {\n return createHash(\"sha256\").update(input).digest();\n}\n\nexport function signedKeyPair(identityKeyPair: KeyPair, keyId: number): SignedKeyPair {\n const keyPair = generateSignalKeyPair();\n return {\n keyId,\n keyPair,\n signature: Curve.sign(identityKeyPair.private, keyPair.public),\n };\n}\n\nexport function ensureSignalPublicKey(publicKey: Uint8Array): Buffer {\n const buffer = Buffer.from(publicKey);\n if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {\n return buffer;\n }\n if (buffer.length === 32) {\n return Buffer.concat([KEY_BUNDLE_TYPE, buffer]);\n }\n throw new Error(`Invalid Signal public key length or type: ${buffer.length}.`);\n}\n\nexport function scrubSignalPublicKey(publicKey: Uint8Array): Buffer {\n const buffer = Buffer.from(publicKey);\n if (buffer.length === 33 && buffer[0] === KEY_BUNDLE_TYPE[0]) {\n return buffer.subarray(1);\n }\n if (buffer.length === 32) {\n return buffer;\n }\n throw new Error(`Invalid Signal public key length: ${buffer.length}.`);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openclaw/crabline",
3
- "version": "0.1.19",
3
+ "version": "0.1.20",
4
4
  "description": "Standalone CLI for deterministic messaging provider E2E tests",
5
5
  "homepage": "https://github.com/openclaw/crabline#readme",
6
6
  "bugs": {
@@ -60,7 +60,7 @@
60
60
  "re2js": "2.8.6",
61
61
  "ws": "^8.21.3",
62
62
  "yaml": "^2.9.0",
63
- "zod": "^4.4.3"
63
+ "zod": "^4.5.2"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@types/proper-lockfile": "4.1.4",
@@ -72,6 +72,7 @@
72
72
  "oxfmt": "^0.65.0",
73
73
  "oxlint": "^1.80.0",
74
74
  "oxlint-tsgolint": "^7.0.2001",
75
+ "rolldown": "1.2.5",
75
76
  "tsx": "^4.23.12",
76
77
  "typescript": "npm:@typescript/typescript6@^6.0.2",
77
78
  "vitest": "^4.1.11"