@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
|
|
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.
|
|
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.
|
|
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"
|