UNPKG

inngest

Version:

Official SDK for Inngest.com. Inngest is the reliability layer for modern applications. Inngest combines durable execution, events, and queues into a zero-infra platform with built-in observability.

1 lines 16.1 kB
{"version":3,"file":"deterministicId.cjs","names":["hashjs"],"sources":["../../src/helpers/deterministicId.ts"],"sourcesContent":["/**\n * Produces span IDs identical to the Go executor's\n * `DeterministicSpanConfig(seed).SpanID` in `pkg/tracing/tracer.go`.\n *\n * Algorithm: SHA-256 the seed, interpret the 32-byte digest as a ChaCha8\n * key, then read 24 bytes from Go's `chacha8rand` PRNG\n * (https://c2sp.org/chacha8rand) — 16 bytes for TraceID (discarded) plus\n * 8 bytes for SpanID (returned). This is the 3rd uint64 in the\n * interleaved output buffer (buf[2] = word 1 from blocks 0 and 1).\n *\n * Uses `hash.js` for SHA-256 (same as the rest of the SDK) so it works in\n * Node, browsers, and edge runtimes without `node:crypto`.\n */\nimport hashjs from \"hash.js\";\n\nconst { sha256 } = hashjs;\n\n/**\n * Compute a deterministic 8-byte span ID from an arbitrary seed string,\n * byte-for-byte compatible with Go's `DeterministicSpanConfig(seed).SpanID`.\n *\n * Returns the span ID as a 16-character hex string (the format OTel uses).\n */\nexport function deterministicSpanID(seed: string): string {\n const hash = sha256().update(seed).digest(); // number[]\n const third = chacha8randThirdUint64(hash);\n return uint64ToLEHex(third);\n}\n\n// ---------------------------------------------------------------------------\n// chacha8rand – Go's math/rand/v2.ChaCha8 PRNG (3rd uint64)\n// ---------------------------------------------------------------------------\n\n/**\n * Compute blocks 0 and 1 (counters 0,1) and return the 3rd uint64 (buf[2])\n * of the interleaved output buffer. This matches `DeterministicSpanConfig.SpanID`\n * which reads 16 bytes (TraceID = buf[0..1]) then 8 bytes (SpanID = buf[2]).\n *\n * The chacha8rand interleaved layout is:\n * buf[2*i] = block0[i] | block1[i] << 32\n * buf[2*i+1] = block2[i] | block3[i] << 32\n * So buf[2] = buf[2*1] = block0[1] | block1[1] << 32 = s1 from both blocks.\n */\nfunction chacha8randThirdUint64(key: number[]): bigint {\n // Interpret 32-byte key as 4 little-endian uint64 → 8 uint32 words.\n const k = new Uint32Array(8);\n for (let i = 0; i < 8; i++) {\n k[i] =\n (key[i * 4]! |\n (key[i * 4 + 1]! << 8) |\n (key[i * 4 + 2]! << 16) |\n (key[i * 4 + 3]! << 24)) >>>\n 0;\n }\n\n // We only need block-column 0 (counter = 0) to get the first uint64.\n // Initial state: [constants | key | counter=0 | nonce=0]\n let s0 = 0x61707865;\n let s1 = 0x3320646e;\n let s2 = 0x79622d32;\n let s3 = 0x6b206574;\n let s4 = k[0]!;\n let s5 = k[1]!;\n let s6 = k[2]!;\n let s7 = k[3]!;\n let s8 = k[4]!;\n let s9 = k[5]!;\n let s10 = k[6]!;\n let s11 = k[7]!;\n let s12 = 0; // counter\n let s13 = 0; // nonce\n let s14 = 0;\n let s15 = 0;\n\n // Save key words for partial addition later (positions 4-11).\n const ok4 = s4,\n ok5 = s5,\n ok6 = s6,\n ok7 = s7;\n const ok8 = s8,\n ok9 = s9,\n ok10 = s10,\n ok11 = s11;\n\n // 4 double-rounds = 8 quarter-round rounds (ChaCha8).\n for (let i = 0; i < 4; i++) {\n // Column rounds\n s0 = (s0 + s4) >>> 0;\n s12 ^= s0;\n s12 = ((s12 << 16) | (s12 >>> 16)) >>> 0;\n s8 = (s8 + s12) >>> 0;\n s4 ^= s8;\n s4 = ((s4 << 12) | (s4 >>> 20)) >>> 0;\n s0 = (s0 + s4) >>> 0;\n s12 ^= s0;\n s12 = ((s12 << 8) | (s12 >>> 24)) >>> 0;\n s8 = (s8 + s12) >>> 0;\n s4 ^= s8;\n s4 = ((s4 << 7) | (s4 >>> 25)) >>> 0;\n\n s1 = (s1 + s5) >>> 0;\n s13 ^= s1;\n s13 = ((s13 << 16) | (s13 >>> 16)) >>> 0;\n s9 = (s9 + s13) >>> 0;\n s5 ^= s9;\n s5 = ((s5 << 12) | (s5 >>> 20)) >>> 0;\n s1 = (s1 + s5) >>> 0;\n s13 ^= s1;\n s13 = ((s13 << 8) | (s13 >>> 24)) >>> 0;\n s9 = (s9 + s13) >>> 0;\n s5 ^= s9;\n s5 = ((s5 << 7) | (s5 >>> 25)) >>> 0;\n\n s2 = (s2 + s6) >>> 0;\n s14 ^= s2;\n s14 = ((s14 << 16) | (s14 >>> 16)) >>> 0;\n s10 = (s10 + s14) >>> 0;\n s6 ^= s10;\n s6 = ((s6 << 12) | (s6 >>> 20)) >>> 0;\n s2 = (s2 + s6) >>> 0;\n s14 ^= s2;\n s14 = ((s14 << 8) | (s14 >>> 24)) >>> 0;\n s10 = (s10 + s14) >>> 0;\n s6 ^= s10;\n s6 = ((s6 << 7) | (s6 >>> 25)) >>> 0;\n\n s3 = (s3 + s7) >>> 0;\n s15 ^= s3;\n s15 = ((s15 << 16) | (s15 >>> 16)) >>> 0;\n s11 = (s11 + s15) >>> 0;\n s7 ^= s11;\n s7 = ((s7 << 12) | (s7 >>> 20)) >>> 0;\n s3 = (s3 + s7) >>> 0;\n s15 ^= s3;\n s15 = ((s15 << 8) | (s15 >>> 24)) >>> 0;\n s11 = (s11 + s15) >>> 0;\n s7 ^= s11;\n s7 = ((s7 << 7) | (s7 >>> 25)) >>> 0;\n\n // Diagonal rounds\n s0 = (s0 + s5) >>> 0;\n s15 ^= s0;\n s15 = ((s15 << 16) | (s15 >>> 16)) >>> 0;\n s10 = (s10 + s15) >>> 0;\n s5 ^= s10;\n s5 = ((s5 << 12) | (s5 >>> 20)) >>> 0;\n s0 = (s0 + s5) >>> 0;\n s15 ^= s0;\n s15 = ((s15 << 8) | (s15 >>> 24)) >>> 0;\n s10 = (s10 + s15) >>> 0;\n s5 ^= s10;\n s5 = ((s5 << 7) | (s5 >>> 25)) >>> 0;\n\n s1 = (s1 + s6) >>> 0;\n s12 ^= s1;\n s12 = ((s12 << 16) | (s12 >>> 16)) >>> 0;\n s11 = (s11 + s12) >>> 0;\n s6 ^= s11;\n s6 = ((s6 << 12) | (s6 >>> 20)) >>> 0;\n s1 = (s1 + s6) >>> 0;\n s12 ^= s1;\n s12 = ((s12 << 8) | (s12 >>> 24)) >>> 0;\n s11 = (s11 + s12) >>> 0;\n s6 ^= s11;\n s6 = ((s6 << 7) | (s6 >>> 25)) >>> 0;\n\n s2 = (s2 + s7) >>> 0;\n s13 ^= s2;\n s13 = ((s13 << 16) | (s13 >>> 16)) >>> 0;\n s8 = (s8 + s13) >>> 0;\n s7 ^= s8;\n s7 = ((s7 << 12) | (s7 >>> 20)) >>> 0;\n s2 = (s2 + s7) >>> 0;\n s13 ^= s2;\n s13 = ((s13 << 8) | (s13 >>> 24)) >>> 0;\n s8 = (s8 + s13) >>> 0;\n s7 ^= s8;\n s7 = ((s7 << 7) | (s7 >>> 25)) >>> 0;\n\n s3 = (s3 + s4) >>> 0;\n s14 ^= s3;\n s14 = ((s14 << 16) | (s14 >>> 16)) >>> 0;\n s9 = (s9 + s14) >>> 0;\n s4 ^= s9;\n s4 = ((s4 << 12) | (s4 >>> 20)) >>> 0;\n s3 = (s3 + s4) >>> 0;\n s14 ^= s3;\n s14 = ((s14 << 8) | (s14 >>> 24)) >>> 0;\n s9 = (s9 + s14) >>> 0;\n s4 ^= s9;\n s4 = ((s4 << 7) | (s4 >>> 25)) >>> 0;\n }\n\n // Partial addition: only key positions (4-11) get the original added back.\n s4 = (s4 + ok4) >>> 0;\n s5 = (s5 + ok5) >>> 0;\n s6 = (s6 + ok6) >>> 0;\n s7 = (s7 + ok7) >>> 0;\n s8 = (s8 + ok8) >>> 0;\n s9 = (s9 + ok9) >>> 0;\n s10 = (s10 + ok10) >>> 0;\n s11 = (s11 + ok11) >>> 0;\n\n // The chacha8rand interleaved output layout is:\n // buf[2*i] = block0[i] | block1[i] << 32 (blocks 0,1)\n // buf[2*i+1] = block2[i] | block3[i] << 32 (blocks 2,3)\n //\n // DeterministicSpanConfig reads 16 bytes (TraceID = buf[0..1]) then\n // 8 bytes (SpanID = buf[2]). buf[2] = buf[2*1] = block0[1] | block1[1] << 32.\n // So the SpanID uses state word index 1 (s1) from both blocks.\n // s1 is a constants position (no addition in chacha8rand).\n const hi = chacha8randColumn1Row1(k);\n\n return BigInt(s1 >>> 0) | (BigInt(hi >>> 0) << 32n);\n}\n\n/**\n * Run chacha8rand for column 1 (counter = 1) and return row 1 (s1).\n */\nfunction chacha8randColumn1Row1(k: Uint32Array): number {\n let s0 = 0x61707865;\n let s1 = 0x3320646e;\n let s2 = 0x79622d32;\n let s3 = 0x6b206574;\n let s4 = k[0]!;\n let s5 = k[1]!;\n let s6 = k[2]!;\n let s7 = k[3]!;\n let s8 = k[4]!;\n let s9 = k[5]!;\n let s10 = k[6]!;\n let s11 = k[7]!;\n let s12 = 1; // counter = 1\n let s13 = 0;\n let s14 = 0;\n let s15 = 0;\n\n for (let i = 0; i < 4; i++) {\n // Column rounds\n s0 = (s0 + s4) >>> 0;\n s12 ^= s0;\n s12 = ((s12 << 16) | (s12 >>> 16)) >>> 0;\n s8 = (s8 + s12) >>> 0;\n s4 ^= s8;\n s4 = ((s4 << 12) | (s4 >>> 20)) >>> 0;\n s0 = (s0 + s4) >>> 0;\n s12 ^= s0;\n s12 = ((s12 << 8) | (s12 >>> 24)) >>> 0;\n s8 = (s8 + s12) >>> 0;\n s4 ^= s8;\n s4 = ((s4 << 7) | (s4 >>> 25)) >>> 0;\n\n s1 = (s1 + s5) >>> 0;\n s13 ^= s1;\n s13 = ((s13 << 16) | (s13 >>> 16)) >>> 0;\n s9 = (s9 + s13) >>> 0;\n s5 ^= s9;\n s5 = ((s5 << 12) | (s5 >>> 20)) >>> 0;\n s1 = (s1 + s5) >>> 0;\n s13 ^= s1;\n s13 = ((s13 << 8) | (s13 >>> 24)) >>> 0;\n s9 = (s9 + s13) >>> 0;\n s5 ^= s9;\n s5 = ((s5 << 7) | (s5 >>> 25)) >>> 0;\n\n s2 = (s2 + s6) >>> 0;\n s14 ^= s2;\n s14 = ((s14 << 16) | (s14 >>> 16)) >>> 0;\n s10 = (s10 + s14) >>> 0;\n s6 ^= s10;\n s6 = ((s6 << 12) | (s6 >>> 20)) >>> 0;\n s2 = (s2 + s6) >>> 0;\n s14 ^= s2;\n s14 = ((s14 << 8) | (s14 >>> 24)) >>> 0;\n s10 = (s10 + s14) >>> 0;\n s6 ^= s10;\n s6 = ((s6 << 7) | (s6 >>> 25)) >>> 0;\n\n s3 = (s3 + s7) >>> 0;\n s15 ^= s3;\n s15 = ((s15 << 16) | (s15 >>> 16)) >>> 0;\n s11 = (s11 + s15) >>> 0;\n s7 ^= s11;\n s7 = ((s7 << 12) | (s7 >>> 20)) >>> 0;\n s3 = (s3 + s7) >>> 0;\n s15 ^= s3;\n s15 = ((s15 << 8) | (s15 >>> 24)) >>> 0;\n s11 = (s11 + s15) >>> 0;\n s7 ^= s11;\n s7 = ((s7 << 7) | (s7 >>> 25)) >>> 0;\n\n // Diagonal rounds\n s0 = (s0 + s5) >>> 0;\n s15 ^= s0;\n s15 = ((s15 << 16) | (s15 >>> 16)) >>> 0;\n s10 = (s10 + s15) >>> 0;\n s5 ^= s10;\n s5 = ((s5 << 12) | (s5 >>> 20)) >>> 0;\n s0 = (s0 + s5) >>> 0;\n s15 ^= s0;\n s15 = ((s15 << 8) | (s15 >>> 24)) >>> 0;\n s10 = (s10 + s15) >>> 0;\n s5 ^= s10;\n s5 = ((s5 << 7) | (s5 >>> 25)) >>> 0;\n\n s1 = (s1 + s6) >>> 0;\n s12 ^= s1;\n s12 = ((s12 << 16) | (s12 >>> 16)) >>> 0;\n s11 = (s11 + s12) >>> 0;\n s6 ^= s11;\n s6 = ((s6 << 12) | (s6 >>> 20)) >>> 0;\n s1 = (s1 + s6) >>> 0;\n s12 ^= s1;\n s12 = ((s12 << 8) | (s12 >>> 24)) >>> 0;\n s11 = (s11 + s12) >>> 0;\n s6 ^= s11;\n s6 = ((s6 << 7) | (s6 >>> 25)) >>> 0;\n\n s2 = (s2 + s7) >>> 0;\n s13 ^= s2;\n s13 = ((s13 << 16) | (s13 >>> 16)) >>> 0;\n s8 = (s8 + s13) >>> 0;\n s7 ^= s8;\n s7 = ((s7 << 12) | (s7 >>> 20)) >>> 0;\n s2 = (s2 + s7) >>> 0;\n s13 ^= s2;\n s13 = ((s13 << 8) | (s13 >>> 24)) >>> 0;\n s8 = (s8 + s13) >>> 0;\n s7 ^= s8;\n s7 = ((s7 << 7) | (s7 >>> 25)) >>> 0;\n\n s3 = (s3 + s4) >>> 0;\n s14 ^= s3;\n s14 = ((s14 << 16) | (s14 >>> 16)) >>> 0;\n s9 = (s9 + s14) >>> 0;\n s4 ^= s9;\n s4 = ((s4 << 12) | (s4 >>> 20)) >>> 0;\n s3 = (s3 + s4) >>> 0;\n s14 ^= s3;\n s14 = ((s14 << 8) | (s14 >>> 24)) >>> 0;\n s9 = (s9 + s14) >>> 0;\n s4 ^= s9;\n s4 = ((s4 << 7) | (s4 >>> 25)) >>> 0;\n }\n\n // No addition for row 1 (constants row in chacha8rand).\n return s1;\n}\n\n/** Convert a uint64 bigint to a 16-char little-endian hex string. */\nfunction uint64ToLEHex(v: bigint): string {\n let out = \"\";\n for (let i = 0; i < 8; i++) {\n out += (Number((v >> BigInt(i * 8)) & 0xffn) | 0x100).toString(16).slice(1);\n }\n return out;\n}\n"],"mappings":"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"}