@query-farm/vgi-rpc 0.7.0 → 0.7.1

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 (65) hide show
  1. package/dist/access-log.d.ts +5 -0
  2. package/dist/access-log.d.ts.map +1 -1
  3. package/dist/auth.d.ts +5 -0
  4. package/dist/auth.d.ts.map +1 -1
  5. package/dist/client/connect.d.ts +10 -0
  6. package/dist/client/connect.d.ts.map +1 -1
  7. package/dist/client/introspect.d.ts +14 -0
  8. package/dist/client/introspect.d.ts.map +1 -1
  9. package/dist/client/oauth.d.ts +9 -0
  10. package/dist/client/oauth.d.ts.map +1 -1
  11. package/dist/client/pipe.d.ts +24 -0
  12. package/dist/client/pipe.d.ts.map +1 -1
  13. package/dist/client/stream.d.ts +8 -0
  14. package/dist/client/stream.d.ts.map +1 -1
  15. package/dist/client/types.d.ts +23 -0
  16. package/dist/client/types.d.ts.map +1 -1
  17. package/dist/constants.d.ts +15 -1
  18. package/dist/constants.d.ts.map +1 -1
  19. package/dist/errors.d.ts +20 -3
  20. package/dist/errors.d.ts.map +1 -1
  21. package/dist/external.d.ts +2 -0
  22. package/dist/external.d.ts.map +1 -1
  23. package/dist/http/auth.d.ts +13 -0
  24. package/dist/http/auth.d.ts.map +1 -1
  25. package/dist/http/common.d.ts +1 -0
  26. package/dist/http/common.d.ts.map +1 -1
  27. package/dist/http/jwt.d.ts +1 -0
  28. package/dist/http/jwt.d.ts.map +1 -1
  29. package/dist/http/mtls.d.ts +7 -0
  30. package/dist/http/mtls.d.ts.map +1 -1
  31. package/dist/http/token.d.ts +5 -0
  32. package/dist/http/token.d.ts.map +1 -1
  33. package/dist/http/types.d.ts +2 -0
  34. package/dist/http/types.d.ts.map +1 -1
  35. package/dist/index.js.map +10 -10
  36. package/dist/launcher/serve-unix.d.ts +1 -0
  37. package/dist/launcher/serve-unix.d.ts.map +1 -1
  38. package/dist/launcher/state.d.ts +12 -0
  39. package/dist/launcher/state.d.ts.map +1 -1
  40. package/dist/protocol.d.ts +3 -0
  41. package/dist/protocol.d.ts.map +1 -1
  42. package/dist/types.d.ts +54 -0
  43. package/dist/types.d.ts.map +1 -1
  44. package/package.json +12 -12
  45. package/src/access-log.ts +5 -0
  46. package/src/auth.ts +5 -0
  47. package/src/client/connect.ts +10 -0
  48. package/src/client/introspect.ts +14 -0
  49. package/src/client/oauth.ts +9 -0
  50. package/src/client/pipe.ts +24 -0
  51. package/src/client/stream.ts +8 -0
  52. package/src/client/types.ts +23 -0
  53. package/src/constants.ts +16 -1
  54. package/src/errors.ts +13 -2
  55. package/src/external.ts +6 -1
  56. package/src/http/auth.ts +13 -0
  57. package/src/http/common.ts +1 -0
  58. package/src/http/jwt.ts +1 -0
  59. package/src/http/mtls.ts +7 -0
  60. package/src/http/token.ts +5 -0
  61. package/src/http/types.ts +2 -0
  62. package/src/launcher/serve-unix.ts +1 -0
  63. package/src/launcher/state.ts +12 -0
  64. package/src/protocol.ts +3 -0
  65. package/src/types.ts +54 -0
package/dist/index.js.map CHANGED
@@ -4,23 +4,23 @@
4
4
  "sourcesContent": [
5
5
  "// Some numerical data is initialized as -1 even when it doesn't need initialization to help the JIT infer types\n// aliases for shorter compressed code (most minifers don't do this)\nvar ab = ArrayBuffer, u8 = Uint8Array, u16 = Uint16Array, i16 = Int16Array, u32 = Uint32Array, i32 = Int32Array;\nvar slc = function (v, s, e) {\n if (u8.prototype.slice)\n return u8.prototype.slice.call(v, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n var n = new u8(e - s);\n n.set(v.subarray(s, e));\n return n;\n};\nvar fill = function (v, n, s, e) {\n if (u8.prototype.fill)\n return u8.prototype.fill.call(v, n, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n for (; s < e; ++s)\n v[s] = n;\n return v;\n};\nvar cpw = function (v, t, s, e) {\n if (u8.prototype.copyWithin)\n return u8.prototype.copyWithin.call(v, t, s, e);\n if (s == null || s < 0)\n s = 0;\n if (e == null || e > v.length)\n e = v.length;\n while (s < e) {\n v[t++] = v[s++];\n }\n};\n/**\n * Codes for errors generated within this library\n */\nexport var ZstdErrorCode = {\n InvalidData: 0,\n WindowSizeTooLarge: 1,\n InvalidBlockType: 2,\n FSEAccuracyTooHigh: 3,\n DistanceTooFarBack: 4,\n UnexpectedEOF: 5\n};\n// error codes\nvar ec = [\n 'invalid zstd data',\n 'window size too large (>2046MB)',\n 'invalid block type',\n 'FSE accuracy too high',\n 'match distance too far back',\n 'unexpected EOF'\n];\nvar err = function (ind, msg, nt) {\n var e = new Error(msg || ec[ind]);\n e.code = ind;\n if (Error.captureStackTrace)\n Error.captureStackTrace(e, err);\n if (!nt)\n throw e;\n return e;\n};\nvar rb = function (d, b, n) {\n var i = 0, o = 0;\n for (; i < n; ++i)\n o |= d[b++] << (i << 3);\n return o;\n};\nvar b4 = function (d, b) { return (d[b] | (d[b + 1] << 8) | (d[b + 2] << 16) | (d[b + 3] << 24)) >>> 0; };\n// read Zstandard frame header\nvar rzfh = function (dat, w) {\n var n3 = dat[0] | (dat[1] << 8) | (dat[2] << 16);\n if (n3 == 0x2FB528 && dat[3] == 253) {\n // Zstandard\n var flg = dat[4];\n // single segment checksum dict flag frame content flag\n var ss = (flg >> 5) & 1, cc = (flg >> 2) & 1, df = flg & 3, fcf = flg >> 6;\n if (flg & 8)\n err(0);\n // byte\n var bt = 6 - ss;\n // dict bytes\n var db = df == 3 ? 4 : df;\n // dictionary id\n var di = rb(dat, bt, db);\n bt += db;\n // frame size bytes\n var fsb = fcf ? (1 << fcf) : ss;\n // frame source size\n var fss = rb(dat, bt, fsb) + ((fcf == 1) && 256);\n // window size\n var ws = fss;\n if (!ss) {\n // window descriptor\n var wb = 1 << (10 + (dat[5] >> 3));\n ws = wb + (wb >> 3) * (dat[5] & 7);\n }\n if (ws > 2145386496)\n err(1);\n var buf = new u8((w == 1 ? (fss || ws) : w ? 0 : ws) + 12);\n buf[0] = 1, buf[4] = 4, buf[8] = 8;\n return {\n b: bt + fsb,\n y: 0,\n l: 0,\n d: di,\n w: (w && w != 1) ? w : buf.subarray(12),\n e: ws,\n o: new i32(buf.buffer, 0, 3),\n u: fss,\n c: cc,\n m: Math.min(131072, ws)\n };\n }\n else if (((n3 >> 4) | (dat[3] << 20)) == 0x184D2A5) {\n // skippable\n return b4(dat, 4) + 8;\n }\n err(0);\n};\n// most significant bit for nonzero\nvar msb = function (val) {\n var bits = 0;\n for (; (1 << bits) <= val; ++bits)\n ;\n return bits - 1;\n};\n// read finite state entropy\nvar rfse = function (dat, bt, mal) {\n // table pos\n var tpos = (bt << 3) + 4;\n // accuracy log\n var al = (dat[bt] & 15) + 5;\n if (al > mal)\n err(3);\n // size\n var sz = 1 << al;\n // probabilities symbols repeat index high threshold\n var probs = sz, sym = -1, re = -1, i = -1, ht = sz;\n // optimization: single allocation is much faster\n var buf = new ab(512 + (sz << 2));\n var freq = new i16(buf, 0, 256);\n // same view as freq\n var dstate = new u16(buf, 0, 256);\n var nstate = new u16(buf, 512, sz);\n var bb1 = 512 + (sz << 1);\n var syms = new u8(buf, bb1, sz);\n var nbits = new u8(buf, bb1 + sz);\n while (sym < 255 && probs > 0) {\n var bits = msb(probs + 1);\n var cbt = tpos >> 3;\n // mask\n var msk = (1 << (bits + 1)) - 1;\n var val = ((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (tpos & 7)) & msk;\n // mask (1 fewer bit)\n var msk1fb = (1 << bits) - 1;\n // max small value\n var msv = msk - probs - 1;\n // small value\n var sval = val & msk1fb;\n if (sval < msv)\n tpos += bits, val = sval;\n else {\n tpos += bits + 1;\n if (val > msk1fb)\n val -= msv;\n }\n freq[++sym] = --val;\n if (val == -1) {\n probs += val;\n syms[--ht] = sym;\n }\n else\n probs -= val;\n if (!val) {\n do {\n // repeat byte\n var rbt = tpos >> 3;\n re = ((dat[rbt] | (dat[rbt + 1] << 8)) >> (tpos & 7)) & 3;\n tpos += 2;\n sym += re;\n } while (re == 3);\n }\n }\n if (sym > 255 || probs)\n err(0);\n var sympos = 0;\n // sym step (coprime with sz - formula from zstd source)\n var sstep = (sz >> 1) + (sz >> 3) + 3;\n // sym mask\n var smask = sz - 1;\n for (var s = 0; s <= sym; ++s) {\n var sf = freq[s];\n if (sf < 1) {\n dstate[s] = -sf;\n continue;\n }\n // This is split into two loops in zstd to avoid branching, but as JS is higher-level that is unnecessary\n for (i = 0; i < sf; ++i) {\n syms[sympos] = s;\n do {\n sympos = (sympos + sstep) & smask;\n } while (sympos >= ht);\n }\n }\n // After spreading symbols, should be zero again\n if (sympos)\n err(0);\n for (i = 0; i < sz; ++i) {\n // next state\n var ns = dstate[syms[i]]++;\n // num bits\n var nb = nbits[i] = al - msb(ns);\n nstate[i] = (ns << nb) - sz;\n }\n return [(tpos + 7) >> 3, {\n b: al,\n s: syms,\n n: nbits,\n t: nstate\n }];\n};\n// read huffman\nvar rhu = function (dat, bt) {\n // index weight count\n var i = 0, wc = -1;\n // buffer header byte\n var buf = new u8(292), hb = dat[bt];\n // huffman weights\n var hw = buf.subarray(0, 256);\n // rank count\n var rc = buf.subarray(256, 268);\n // rank index\n var ri = new u16(buf.buffer, 268);\n // NOTE: at this point bt is 1 less than expected\n if (hb < 128) {\n // end byte, fse decode table\n var _a = rfse(dat, bt + 1, 6), ebt = _a[0], fdt = _a[1];\n bt += hb;\n var epos = ebt << 3;\n // last byte\n var lb = dat[bt];\n if (!lb)\n err(0);\n // state1 state2 state1 bits state2 bits\n var st1 = 0, st2 = 0, btr1 = fdt.b, btr2 = btr1;\n // fse pos\n // pre-increment to account for original deficit of 1\n var fpos = (++bt << 3) - 8 + msb(lb);\n for (;;) {\n fpos -= btr1;\n if (fpos < epos)\n break;\n var cbt = fpos >> 3;\n st1 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr1) - 1);\n hw[++wc] = fdt.s[st1];\n fpos -= btr2;\n if (fpos < epos)\n break;\n cbt = fpos >> 3;\n st2 += ((dat[cbt] | (dat[cbt + 1] << 8)) >> (fpos & 7)) & ((1 << btr2) - 1);\n hw[++wc] = fdt.s[st2];\n btr1 = fdt.n[st1];\n st1 = fdt.t[st1];\n btr2 = fdt.n[st2];\n st2 = fdt.t[st2];\n }\n if (++wc > 255)\n err(0);\n }\n else {\n wc = hb - 127;\n for (; i < wc; i += 2) {\n var byte = dat[++bt];\n hw[i] = byte >> 4;\n hw[i + 1] = byte & 15;\n }\n ++bt;\n }\n // weight exponential sum\n var wes = 0;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n // bits must be at most 11, same as weight\n if (wt > 11)\n err(0);\n wes += wt && (1 << (wt - 1));\n }\n // max bits\n var mb = msb(wes) + 1;\n // table size\n var ts = 1 << mb;\n // remaining sum\n var rem = ts - wes;\n // must be power of 2\n if (rem & (rem - 1))\n err(0);\n hw[wc++] = msb(rem) + 1;\n for (i = 0; i < wc; ++i) {\n var wt = hw[i];\n ++rc[hw[i] = wt && (mb + 1 - wt)];\n }\n // huf buf\n var hbuf = new u8(ts << 1);\n // symbols num bits\n var syms = hbuf.subarray(0, ts), nb = hbuf.subarray(ts);\n ri[mb] = 0;\n for (i = mb; i > 0; --i) {\n var pv = ri[i];\n fill(nb, i, pv, ri[i - 1] = pv + rc[i] * (1 << (mb - i)));\n }\n if (ri[0] != ts)\n err(0);\n for (i = 0; i < wc; ++i) {\n var bits = hw[i];\n if (bits) {\n var code = ri[bits];\n fill(syms, i, code, ri[bits] = code + (1 << (mb - bits)));\n }\n }\n return [bt, {\n n: nb,\n b: mb,\n s: syms\n }];\n};\n// Tables generated using this:\n// https://gist.github.com/101arrowz/a979452d4355992cbf8f257cbffc9edd\n// default literal length table\nvar dllt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 81, 16, 99, 140, 49, 198, 24, 99, 12, 33, 196, 24, 99, 102, 102, 134, 70, 146, 4\n]), 0, 6)[1];\n// default match length table\nvar dmlt = /*#__PURE__*/ rfse(/*#__PURE__*/ new u8([\n 33, 20, 196, 24, 99, 140, 33, 132, 16, 66, 8, 33, 132, 16, 66, 8, 33, 68, 68, 68, 68, 68, 68, 68, 68, 36, 9\n]), 0, 6)[1];\n// default offset code table\nvar doct = /*#__PURE__ */ rfse(/*#__PURE__*/ new u8([\n 32, 132, 16, 66, 102, 70, 68, 68, 68, 68, 36, 73, 2\n]), 0, 5)[1];\n// bits to baseline\nvar b2bl = function (b, s) {\n var len = b.length, bl = new i32(len);\n for (var i = 0; i < len; ++i) {\n bl[i] = s;\n s += 1 << b[i];\n }\n return bl;\n};\n// literal length bits\nvar llb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 16843009, 50528770, 134678020, 202050057, 269422093\n])).buffer, 0, 36);\n// literal length baseline\nvar llbl = /*#__PURE__ */ b2bl(llb, 0);\n// match length bits\nvar mlb = /*#__PURE__ */ new u8(( /*#__PURE__ */new i32([\n 0, 0, 0, 0, 0, 0, 0, 0, 16843009, 50528770, 117769220, 185207048, 252579084, 16\n])).buffer, 0, 53);\n// match length baseline\nvar mlbl = /*#__PURE__ */ b2bl(mlb, 3);\n// decode huffman stream\nvar dhu = function (dat, out, hu) {\n var len = dat.length, ss = out.length, lb = dat[len - 1], msk = (1 << hu.b) - 1, eb = -hu.b;\n if (!lb)\n err(0);\n var st = 0, btr = hu.b, pos = (len << 3) - 8 + msb(lb) - btr, i = -1;\n for (; pos > eb && i < ss;) {\n var cbt = pos >> 3;\n var val = (dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (pos & 7);\n st = ((st << btr) | val) & msk;\n out[++i] = hu.s[st];\n pos -= (btr = hu.n[st]);\n }\n if (pos != eb || i + 1 != ss)\n err(0);\n};\n// decode huffman stream 4x\n// TODO: use workers to parallelize\nvar dhu4 = function (dat, out, hu) {\n var bt = 6;\n var ss = out.length, sz1 = (ss + 3) >> 2, sz2 = sz1 << 1, sz3 = sz1 + sz2;\n dhu(dat.subarray(bt, bt += dat[0] | (dat[1] << 8)), out.subarray(0, sz1), hu);\n dhu(dat.subarray(bt, bt += dat[2] | (dat[3] << 8)), out.subarray(sz1, sz2), hu);\n dhu(dat.subarray(bt, bt += dat[4] | (dat[5] << 8)), out.subarray(sz2, sz3), hu);\n dhu(dat.subarray(bt), out.subarray(sz3), hu);\n};\n// read Zstandard block\nvar rzb = function (dat, st, out) {\n var _a;\n var bt = st.b;\n // byte 0 block type\n var b0 = dat[bt], btype = (b0 >> 1) & 3;\n st.l = b0 & 1;\n var sz = (b0 >> 3) | (dat[bt + 1] << 5) | (dat[bt + 2] << 13);\n // end byte for block\n var ebt = (bt += 3) + sz;\n if (btype == 1) {\n if (bt >= dat.length)\n return;\n st.b = bt + 1;\n if (out) {\n fill(out, dat[bt], st.y, st.y += sz);\n return out;\n }\n return fill(new u8(sz), dat[bt]);\n }\n if (ebt > dat.length)\n return;\n if (btype == 0) {\n st.b = ebt;\n if (out) {\n out.set(dat.subarray(bt, ebt), st.y);\n st.y += sz;\n return out;\n }\n return slc(dat, bt, ebt);\n }\n if (btype == 2) {\n // byte 3 lit btype size format\n var b3 = dat[bt], lbt = b3 & 3, sf = (b3 >> 2) & 3;\n // lit src size lit cmp sz 4 streams\n var lss = b3 >> 4, lcs = 0, s4 = 0;\n if (lbt < 2) {\n if (sf & 1)\n lss |= (dat[++bt] << 4) | ((sf & 2) && (dat[++bt] << 12));\n else\n lss = b3 >> 3;\n }\n else {\n s4 = sf;\n if (sf < 2)\n lss |= ((dat[++bt] & 63) << 4), lcs = (dat[bt] >> 6) | (dat[++bt] << 2);\n else if (sf == 2)\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 3) << 12), lcs = (dat[bt] >> 2) | (dat[++bt] << 6);\n else\n lss |= (dat[++bt] << 4) | ((dat[++bt] & 63) << 12), lcs = (dat[bt] >> 6) | (dat[++bt] << 2) | (dat[++bt] << 10);\n }\n ++bt;\n // add literals to end - can never overlap with backreferences because unused literals always appended\n var buf = out ? out.subarray(st.y, st.y + st.m) : new u8(st.m);\n // starting point for literals\n var spl = buf.length - lss;\n if (lbt == 0)\n buf.set(dat.subarray(bt, bt += lss), spl);\n else if (lbt == 1)\n fill(buf, dat[bt++], spl);\n else {\n // huffman table\n var hu = st.h;\n if (lbt == 2) {\n var hud = rhu(dat, bt);\n // subtract description length\n lcs += bt - (bt = hud[0]);\n st.h = hu = hud[1];\n }\n else if (!hu)\n err(0);\n (s4 ? dhu4 : dhu)(dat.subarray(bt, bt += lcs), buf.subarray(spl), hu);\n }\n // num sequences\n var ns = dat[bt++];\n if (ns) {\n if (ns == 255)\n ns = (dat[bt++] | (dat[bt++] << 8)) + 0x7F00;\n else if (ns > 127)\n ns = ((ns - 128) << 8) | dat[bt++];\n // symbol compression modes\n var scm = dat[bt++];\n if (scm & 3)\n err(0);\n var dts = [dmlt, doct, dllt];\n for (var i = 2; i > -1; --i) {\n var md = (scm >> ((i << 1) + 2)) & 3;\n if (md == 1) {\n // rle buf\n var rbuf = new u8([0, 0, dat[bt++]]);\n dts[i] = {\n s: rbuf.subarray(2, 3),\n n: rbuf.subarray(0, 1),\n t: new u16(rbuf.buffer, 0, 1),\n b: 0\n };\n }\n else if (md == 2) {\n // accuracy log 8 for offsets, 9 for others\n _a = rfse(dat, bt, 9 - (i & 1)), bt = _a[0], dts[i] = _a[1];\n }\n else if (md == 3) {\n if (!st.t)\n err(0);\n dts[i] = st.t[i];\n }\n }\n var _b = st.t = dts, mlt = _b[0], oct = _b[1], llt = _b[2];\n var lb = dat[ebt - 1];\n if (!lb)\n err(0);\n var spos = (ebt << 3) - 8 + msb(lb) - llt.b, cbt = spos >> 3, oubt = 0;\n var lst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << llt.b) - 1);\n cbt = (spos -= oct.b) >> 3;\n var ost = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << oct.b) - 1);\n cbt = (spos -= mlt.b) >> 3;\n var mst = ((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mlt.b) - 1);\n for (++ns; --ns;) {\n var llc = llt.s[lst];\n var lbtr = llt.n[lst];\n var mlc = mlt.s[mst];\n var mbtr = mlt.n[mst];\n var ofc = oct.s[ost];\n var obtr = oct.n[ost];\n cbt = (spos -= ofc) >> 3;\n var ofp = 1 << ofc;\n var off = ofp + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16) | (dat[cbt + 3] << 24)) >>> (spos & 7)) & (ofp - 1));\n cbt = (spos -= mlb[mlc]) >> 3;\n var ml = mlbl[mlc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << mlb[mlc]) - 1));\n cbt = (spos -= llb[llc]) >> 3;\n var ll = llbl[llc] + (((dat[cbt] | (dat[cbt + 1] << 8) | (dat[cbt + 2] << 16)) >> (spos & 7)) & ((1 << llb[llc]) - 1));\n cbt = (spos -= lbtr) >> 3;\n lst = llt.t[lst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << lbtr) - 1));\n cbt = (spos -= mbtr) >> 3;\n mst = mlt.t[mst] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << mbtr) - 1));\n cbt = (spos -= obtr) >> 3;\n ost = oct.t[ost] + (((dat[cbt] | (dat[cbt + 1] << 8)) >> (spos & 7)) & ((1 << obtr) - 1));\n if (off > 3) {\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off -= 3;\n }\n else {\n var idx = off - (ll != 0);\n if (idx) {\n off = idx == 3 ? st.o[0] - 1 : st.o[idx];\n if (idx > 1)\n st.o[2] = st.o[1];\n st.o[1] = st.o[0];\n st.o[0] = off;\n }\n else\n off = st.o[0];\n }\n for (var i = 0; i < ll; ++i) {\n buf[oubt + i] = buf[spl + i];\n }\n oubt += ll, spl += ll;\n var stin = oubt - off;\n if (stin < 0) {\n var len = -stin;\n var bs = st.e + stin;\n if (len > ml)\n len = ml;\n for (var i = 0; i < len; ++i) {\n buf[oubt + i] = st.w[bs + i];\n }\n oubt += len, ml -= len, stin = 0;\n }\n for (var i = 0; i < ml; ++i) {\n buf[oubt + i] = buf[stin + i];\n }\n oubt += ml;\n }\n if (oubt != spl) {\n while (spl < buf.length) {\n buf[oubt++] = buf[spl++];\n }\n }\n else\n oubt = buf.length;\n if (out)\n st.y += oubt;\n else\n buf = slc(buf, 0, oubt);\n }\n else if (out) {\n st.y += lss;\n if (spl) {\n for (var i = 0; i < lss; ++i) {\n buf[i] = buf[spl + i];\n }\n }\n }\n else if (spl)\n buf = slc(buf, spl);\n st.b = ebt;\n return buf;\n }\n err(2);\n};\n// concat\nvar cct = function (bufs, ol) {\n if (bufs.length == 1)\n return bufs[0];\n var buf = new u8(ol);\n for (var i = 0, b = 0; i < bufs.length; ++i) {\n var chk = bufs[i];\n buf.set(chk, b);\n b += chk.length;\n }\n return buf;\n};\n/**\n * Decompresses Zstandard data\n * @param dat The input data\n * @param buf The output buffer. If unspecified, the function will allocate\n * exactly enough memory to fit the decompressed data. If your\n * data has multiple frames and you know the output size, specifying\n * it will yield better performance.\n * @returns The decompressed data\n */\nexport function decompress(dat, buf) {\n var bufs = [], nb = +!buf;\n var bt = 0, ol = 0;\n for (; dat.length;) {\n var st = rzfh(dat, nb || buf);\n if (typeof st == 'object') {\n if (nb) {\n buf = null;\n if (st.w.length == st.u) {\n bufs.push(buf = st.w);\n ol += st.u;\n }\n }\n else {\n bufs.push(buf);\n st.e = 0;\n }\n for (; !st.l;) {\n var blk = rzb(dat, st, buf);\n if (!blk)\n err(5);\n if (buf)\n st.e = st.y;\n else {\n bufs.push(blk);\n ol += blk.length;\n cpw(st.w, 0, blk.length);\n st.w.set(blk, st.w.length - blk.length);\n }\n }\n bt = st.b + (st.c * 4);\n }\n else\n bt = st;\n dat = dat.subarray(bt);\n }\n return cct(bufs, ol);\n}\n/**\n * Decompressor for Zstandard streamed data\n */\nvar Decompress = /*#__PURE__*/ (function () {\n /**\n * Creates a Zstandard decompressor\n * @param ondata The handler for stream data\n */\n function Decompress(ondata) {\n this.ondata = ondata;\n this.c = [];\n this.l = 0;\n this.z = 0;\n }\n /**\n * Pushes data to be decompressed\n * @param chunk The chunk of data to push\n * @param final Whether or not this is the last chunk in the stream\n */\n Decompress.prototype.push = function (chunk, final) {\n if (typeof this.s == 'number') {\n var sub = Math.min(chunk.length, this.s);\n chunk = chunk.subarray(sub);\n this.s -= sub;\n }\n var sl = chunk.length;\n var ncs = sl + this.l;\n if (!this.s) {\n if (final) {\n if (!ncs) {\n this.ondata(new u8(0), true);\n return;\n }\n // min for frame + one block\n if (ncs < 5)\n err(5);\n }\n else if (ncs < 18) {\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (typeof (this.s = rzfh(chunk)) == 'number')\n return this.push(chunk, final);\n }\n if (typeof this.s != 'number') {\n if (ncs < (this.z || 3)) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n if (this.l) {\n this.c.push(chunk);\n chunk = cct(this.c, ncs);\n this.c = [];\n this.l = 0;\n }\n if (!this.z && ncs < (this.z = (chunk[this.s.b] & 2) ? 4 : 3 + ((chunk[this.s.b] >> 3) | (chunk[this.s.b + 1] << 5) | (chunk[this.s.b + 2] << 13)))) {\n if (final)\n err(5);\n this.c.push(chunk);\n this.l = ncs;\n return;\n }\n else\n this.z = 0;\n for (;;) {\n var blk = rzb(chunk, this.s);\n if (!blk) {\n if (final)\n err(5);\n var adc = chunk.subarray(this.s.b);\n this.s.b = 0;\n this.c.push(adc), this.l += adc.length;\n return;\n }\n else {\n this.ondata(blk, false);\n cpw(this.s.w, 0, blk.length);\n this.s.w.set(blk, this.s.w.length - blk.length);\n }\n if (this.s.l) {\n var rest = chunk.subarray(this.s.b);\n this.s = this.s.c * 4;\n this.push(rest, final);\n return;\n }\n }\n }\n else if (final)\n err(5);\n };\n return Decompress;\n}());\nexport { Decompress };\n",
6
6
  "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Cross-runtime zstd compression/decompression.\n *\n * Decompression order of preference: Bun.zstd → node:zlib zstd (Node 22.15+,\n * Deno 2.6.9+) → fzstd pure-JS fallback. The fzstd fallback exists so\n * Cloudflare workerd — which has no native zstd — can still decode\n * `Content-Encoding: zstd` request bodies (the DuckDB VGI extension always\n * sends them). fzstd is decompression-only, so compression on workerd still\n * throws.\n */\n\nimport { decompress as fzstdDecompress } from \"fzstd\";\n\n// Resolve node:zlib via indirect-string require so esbuild/wrangler can't\n// trace it statically. On workerd we want the fzstd path, not a node:zlib\n// import that wouldn't have zstd anyway.\nconst _NODE_ZLIB_MOD = \"node:zlib\";\nconst isBun = typeof globalThis.Bun !== \"undefined\";\nfunction _loadZlibOrNull(): any | null {\n const req: any = (import.meta as any).require ?? (globalThis as any).require ?? null;\n if (!req) return null;\n try {\n return req(_NODE_ZLIB_MOD);\n } catch {\n return null;\n }\n}\n\n/** Return true when the current runtime can produce zstd-compressed output.\n *\n * Bun has `Bun.zstdCompressSync`; Node ≥22.15 / Deno ≥2.6.9 expose it via\n * `node:zlib`. Other runtimes (workerd, older Node) have no encoder. The\n * fzstd fallback is decompress-only so it doesn't count.\n */\nexport function isZstdCompressAvailable(): boolean {\n if (isBun) return true;\n const zlib = _loadZlibOrNull();\n return typeof zlib?.zstdCompressSync === \"function\";\n}\n\n/** Compress data with zstd at the given level (1-22). */\nexport async function zstdCompress(data: Uint8Array, level: number): Promise<Uint8Array<ArrayBuffer>> {\n if (isBun) {\n return new Uint8Array(Bun.zstdCompressSync(data, { level }));\n }\n const zlib = _loadZlibOrNull();\n const fn = zlib?.zstdCompressSync;\n if (typeof fn !== \"function\") {\n throw new Error(\n \"zstd compression is not available in this runtime. \" +\n \"Requires Bun or Node.js >= 22.15 / Deno >= 2.6.9. \" +\n \"(workerd has no native zstd encoder; fzstd is decompress-only.)\",\n );\n }\n return new Uint8Array(\n fn(data, {\n params: {\n [zlib.constants.ZSTD_c_compressionLevel]: level,\n },\n }),\n );\n}\n\n/**\n * Decompress zstd-compressed data, optionally bounding the output size.\n *\n * Zstd frames carry the decompressed size in the header and decompressors\n * trust it eagerly: a ~3 KB compressed body claiming 100 MB output would\n * allocate 100 MB. When `maxOutputSize` is supplied, this helper:\n *\n * 1. Reads `Frame_Content_Size` from the frame header. If declared and\n * above the cap, refuses *before* allocation with a clear error.\n * 2. Decompresses, then asserts the actual output size is also under the\n * cap (covers frames whose size is not in the header — a streaming\n * cap would be tighter, but neither Bun.zstdDecompressSync nor\n * node:zlib's sync API exposes one, so we use the post-check).\n *\n * Mirrors the Python server-side fix in `_decompress_body` and the\n * client-side fix in `external_fetch.fetch_url`.\n */\nexport async function zstdDecompress(data: Uint8Array, maxOutputSize?: number): Promise<Uint8Array<ArrayBuffer>> {\n if (maxOutputSize != null) {\n const declared = readZstdFrameContentSize(data);\n if (declared !== null && declared > maxOutputSize) {\n throw new Error(`zstd decompressed size (${declared}) would exceed cap (${maxOutputSize})`);\n }\n }\n\n let out: Uint8Array<ArrayBuffer>;\n if (isBun) {\n out = new Uint8Array(Bun.zstdDecompressSync(data));\n } else {\n const zlib = _loadZlibOrNull();\n const fn = zlib?.zstdDecompressSync;\n if (typeof fn === \"function\") {\n out = new Uint8Array(fn(data));\n } else {\n // workerd path: no native zstd, fall back to the pure-JS decoder.\n // fzstd is decompress-only and synchronous; cap-checking already ran\n // above against the frame header, but pure-JS decode of large inputs\n // is slow — keep the upstream maxOutputSize tight.\n //\n // CRITICAL: copy into a freshly-allocated ArrayBuffer so byteOffset is\n // 0. fzstd internally returns subarray views with arbitrary byteOffset\n // (often not 8-aligned), and downstream Arrow IPC readers create\n // BigInt64Array views relative to the buffer's byteOffset — those\n // throw `start offset of BigInt64Array should be a multiple of 8` if\n // the underlying offset isn't 8-aligned.\n const decoded = fzstdDecompress(data);\n out = new Uint8Array(decoded.byteLength);\n out.set(decoded);\n }\n }\n\n if (maxOutputSize != null && out.byteLength > maxOutputSize) {\n throw new Error(`zstd decompressed size (${out.byteLength}) exceeds cap (${maxOutputSize})`);\n }\n return out;\n}\n\n/**\n * Parse `Frame_Content_Size` from a zstd frame header.\n *\n * Returns the declared decompressed size, or `null` if the frame header\n * does not include it (frames may omit it for streaming compression) or\n * the input is too short / not a valid zstd frame magic.\n *\n * Frame format (RFC 8478): magic(4) | FHD(1) | window_desc(0|1) |\n * dict_id(0|1|2|4) | frame_content_size(0|1|2|4|8). FCS_size depends on\n * FCS_field_size (FHD bits 6-7) and Single_Segment_flag (FHD bit 5).\n */\nfunction readZstdFrameContentSize(data: Uint8Array): number | null {\n if (data.length < 6) return null;\n // Magic: 0xFD2FB528 little-endian.\n if (data[0] !== 0x28 || data[1] !== 0xb5 || data[2] !== 0x2f || data[3] !== 0xfd) {\n return null;\n }\n const fhd = data[4];\n const fcsFieldSize = (fhd >> 6) & 0x3;\n const singleSegment = ((fhd >> 5) & 0x1) === 1;\n const dictIdFlag = fhd & 0x3;\n // Per spec: FCS_size = 0 → 0 unless Single_Segment_flag is set, then 1.\n const fcsSize = fcsFieldSize === 0 ? (singleSegment ? 1 : 0) : fcsFieldSize === 1 ? 2 : fcsFieldSize === 2 ? 4 : 8;\n if (fcsSize === 0) return null;\n\n const windowDescSize = singleSegment ? 0 : 1;\n const dictIdSize = dictIdFlag === 0 ? 0 : dictIdFlag === 1 ? 1 : dictIdFlag === 2 ? 2 : 4;\n const fcsOffset = 5 + windowDescSize + dictIdSize;\n if (data.length < fcsOffset + fcsSize) return null;\n\n let fcs = 0n;\n for (let i = 0; i < fcsSize; i++) {\n fcs |= BigInt(data[fcsOffset + i]) << BigInt(i * 8);\n }\n // FCS_field_size == 1 (size 2) carries an offset of 256.\n if (fcsSize === 2) fcs += 256n;\n if (fcs > BigInt(Number.MAX_SAFE_INTEGER)) return Number.MAX_SAFE_INTEGER;\n return Number(fcs);\n}\n",
7
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Well-known metadata keys matching Python's metadata.py */\n\nexport const RPC_METHOD_KEY = \"vgi_rpc.method\";\nexport const LOG_LEVEL_KEY = \"vgi_rpc.log_level\";\nexport const LOG_MESSAGE_KEY = \"vgi_rpc.log_message\";\nexport const LOG_EXTRA_KEY = \"vgi_rpc.log_extra\";\nexport const REQUEST_VERSION_KEY = \"vgi_rpc.request_version\";\nexport const REQUEST_VERSION = \"1\";\n\nexport const SERVER_ID_KEY = \"vgi_rpc.server_id\";\nexport const REQUEST_ID_KEY = \"vgi_rpc.request_id\";\n\nexport const PROTOCOL_NAME_KEY = \"vgi_rpc.protocol_name\";\nexport const DESCRIBE_VERSION_KEY = \"vgi_rpc.describe_version\";\nexport const PROTOCOL_HASH_KEY = \"vgi_rpc.protocol_hash\";\nexport const DESCRIBE_VERSION = \"4\";\n\n/** Application protocol surface version. Carried on every request batch from\n * a client bound to a Protocol that declares `protocolVersion`; also emitted\n * in the __describe__ response metadata. Format: canonical semver\n * MAJOR.MINOR.PATCH. Enforced at the dispatch boundary on the server: exact\n * major+minor match required, patch ignored. Distinct from `REQUEST_VERSION`\n * (wire framing). Mirrors Python's `PROTOCOL_VERSION_KEY`. */\nexport const PROTOCOL_VERSION_KEY = \"vgi_rpc.protocol_version\";\n\nexport const DESCRIBE_METHOD_NAME = \"__describe__\";\n\nexport const STATE_KEY = \"vgi_rpc.stream_state#b64\";\nexport const CANCEL_KEY = \"vgi_rpc.cancel\";\n\nexport const LOCATION_KEY = \"vgi_rpc.location\";\nexport const LOCATION_SHA256_KEY = \"vgi_rpc.location.sha256\";\n\nexport const RPC_ERROR_HEADER = \"X-VGI-RPC-Error\";\n\n/** Top-level metadata key on an EXCEPTION batch identifying the error category.\n * Hoisted by `buildErrorBatch` when the thrown error has a static or instance\n * `errorKind` property. Mirrors Python's `vgi_rpc.metadata.ERROR_KIND_KEY`. */\nexport const ERROR_KIND_KEY = \"vgi_rpc.error_kind\";\n",
8
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Error thrown when the server encounters an RPC protocol error. */\nexport class RpcError extends Error {\n constructor(\n public readonly errorType: string,\n public readonly errorMessage: string,\n public readonly remoteTraceback: string,\n ) {\n super(`${errorType}: ${errorMessage}`);\n this.name = \"RpcError\";\n }\n}\n\n/** Error thrown when the client sends an unsupported request version. */\nexport class VersionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VersionError\";\n }\n}\n\n/** Well-known values for the `vgi_rpc.error_kind` batch metadata key. Mirrors\n * Python's `vgi_rpc.metadata.ERROR_KIND_*` constants. */\nexport const ERROR_KIND_METHOD_NOT_IMPLEMENTED = \"method_not_implemented\";\nexport const ERROR_KIND_SESSION_LOST = \"session_lost\";\nexport const ERROR_KIND_SERVER_DRAINING = \"server_draining\";\nexport const ERROR_KIND_PROTOCOL_VERSION_MISMATCH = \"protocol_version_mismatch\";\n\n/** Raised when the client's declared `vgi_rpc.protocol_version` is\n * incompatible with the server's. Subclass of `VersionError` so existing\n * catch sites continue to write a typed error stream and keep serving.\n * Carries a directional message that tells the reader which side to\n * upgrade. Mirrors Python's `vgi_rpc.rpc.ProtocolVersionError`. */\nexport class ProtocolVersionError extends VersionError {\n static readonly errorKind = ERROR_KIND_PROTOCOL_VERSION_MISMATCH;\n readonly errorKind = ERROR_KIND_PROTOCOL_VERSION_MISMATCH;\n constructor(message: string) {\n super(message);\n this.name = \"ProtocolVersionError\";\n }\n}\n\nconst SEMVER_REGEX = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/;\n\n/** Parse a canonical semver string into `[major, minor, patch]`. Throws on\n * any input that isn't `MAJOR.MINOR.PATCH` with non-negative integers and\n * no leading zeros (except literal `0`). No prereleases, no build metadata.\n * Mirrors Python's `vgi_rpc.metadata.parse_version`. */\nexport function parseProtocolVersion(value: string): [number, number, number] {\n const m = SEMVER_REGEX.exec(value);\n if (!m) {\n throw new Error(\n `Invalid protocol version '${value}': expected canonical semver ` +\n \"MAJOR.MINOR.PATCH with non-negative integers and no leading zeros \" +\n \"(no prereleases or build metadata).\",\n );\n }\n return [Number(m[1]), Number(m[2]), Number(m[3])];\n}\n\n/** Raised when a client invokes a method the server does not implement.\n *\n * Mirrors Python's `vgi_rpc.rpc.MethodNotImplementedError`. The static\n * `errorKind` is hoisted onto the error batch metadata as\n * `vgi_rpc.error_kind` so clients can branch on the typed marker without\n * string-matching the message.\n */\nexport class MethodNotImplementedError extends Error {\n static readonly errorKind = ERROR_KIND_METHOD_NOT_IMPLEMENTED;\n readonly errorKind = ERROR_KIND_METHOD_NOT_IMPLEMENTED;\n constructor(message: string) {\n super(message);\n this.name = \"MethodNotImplementedError\";\n }\n}\n\n/** Raised when a sticky session token is malformed, expired, evicted, or\n * bound to a different worker / principal. HTTP-only. */\nexport class SessionLostError extends Error {\n static readonly errorKind = ERROR_KIND_SESSION_LOST;\n readonly errorKind = ERROR_KIND_SESSION_LOST;\n constructor(message: string) {\n super(message);\n this.name = \"SessionLostError\";\n }\n}\n\n/** Raised when `ctx.openSession` is called while the server is draining. */\nexport class ServerDrainingError extends Error {\n static readonly errorKind = ERROR_KIND_SERVER_DRAINING;\n readonly errorKind = ERROR_KIND_SERVER_DRAINING;\n constructor(message: string) {\n super(message);\n this.name = \"ServerDrainingError\";\n }\n}\n",
7
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n// Well-known metadata keys matching Python's metadata.py.\n\n/** Batch-metadata key carrying the invoked RPC method name. */\nexport const RPC_METHOD_KEY = \"vgi_rpc.method\";\n/** Batch-metadata key carrying a log batch's severity level. */\nexport const LOG_LEVEL_KEY = \"vgi_rpc.log_level\";\n/** Batch-metadata key carrying a log batch's message text. */\nexport const LOG_MESSAGE_KEY = \"vgi_rpc.log_message\";\n/** Batch-metadata key carrying a log batch's structured extra fields. */\nexport const LOG_EXTRA_KEY = \"vgi_rpc.log_extra\";\n/** Batch-metadata key carrying the wire request-framing version. */\nexport const REQUEST_VERSION_KEY = \"vgi_rpc.request_version\";\n/** Current wire request-framing version. Distinct from the application-level\n * {@link PROTOCOL_VERSION_KEY protocol version}. */\nexport const REQUEST_VERSION = \"1\";\n\n/** Batch-metadata key identifying the server instance that produced a batch. */\nexport const SERVER_ID_KEY = \"vgi_rpc.server_id\";\n/** Batch-metadata key carrying the client-supplied request id. */\nexport const REQUEST_ID_KEY = \"vgi_rpc.request_id\";\n\n/** Batch-metadata key carrying the service / protocol name. */\nexport const PROTOCOL_NAME_KEY = \"vgi_rpc.protocol_name\";\n/** Batch-metadata key carrying the `__describe__` response schema version. */\nexport const DESCRIBE_VERSION_KEY = \"vgi_rpc.describe_version\";\nexport const PROTOCOL_HASH_KEY = \"vgi_rpc.protocol_hash\";\n/** Current `__describe__` response schema version (the slim 8-column schema). */\nexport const DESCRIBE_VERSION = \"4\";\n\n/** Application protocol surface version. Carried on every request batch from\n * a client bound to a Protocol that declares `protocolVersion`; also emitted\n * in the __describe__ response metadata. Format: canonical semver\n * MAJOR.MINOR.PATCH. Enforced at the dispatch boundary on the server: exact\n * major+minor match required, patch ignored. Distinct from `REQUEST_VERSION`\n * (wire framing). Mirrors Python's `PROTOCOL_VERSION_KEY`. */\nexport const PROTOCOL_VERSION_KEY = \"vgi_rpc.protocol_version\";\n\n/** Reserved method name for the introspection (`__describe__`) call. */\nexport const DESCRIBE_METHOD_NAME = \"__describe__\";\n\n/** Batch-metadata key carrying the base64-encoded stream continuation/state token. */\nexport const STATE_KEY = \"vgi_rpc.stream_state#b64\";\nexport const CANCEL_KEY = \"vgi_rpc.cancel\";\n\nexport const LOCATION_KEY = \"vgi_rpc.location\";\nexport const LOCATION_SHA256_KEY = \"vgi_rpc.location.sha256\";\n\n/** HTTP response header set when an RPC error is returned over the HTTP transport. */\nexport const RPC_ERROR_HEADER = \"X-VGI-RPC-Error\";\n\n/** Top-level metadata key on an EXCEPTION batch identifying the error category.\n * Hoisted by `buildErrorBatch` when the thrown error has a static or instance\n * `errorKind` property. Mirrors Python's `vgi_rpc.metadata.ERROR_KIND_KEY`. */\nexport const ERROR_KIND_KEY = \"vgi_rpc.error_kind\";\n",
8
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** Error thrown when the server encounters an RPC protocol error. */\nexport class RpcError extends Error {\n constructor(\n /** Remote error class name (e.g. `\"ValueError\"`). */\n public readonly errorType: string,\n /** Human-readable message from the remote error. */\n public readonly errorMessage: string,\n /** Remote stack-trace text, or an empty string when unavailable. */\n public readonly remoteTraceback: string,\n ) {\n super(`${errorType}: ${errorMessage}`);\n this.name = \"RpcError\";\n }\n}\n\n/** Error thrown when the client sends an unsupported request version. */\nexport class VersionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"VersionError\";\n }\n}\n\n/** `vgi_rpc.error_kind` batch-metadata value for {@link MethodNotImplementedError}.\n * Mirrors Python's `vgi_rpc.metadata.ERROR_KIND_*` constants. */\nexport const ERROR_KIND_METHOD_NOT_IMPLEMENTED = \"method_not_implemented\";\n/** `vgi_rpc.error_kind` batch-metadata value for {@link SessionLostError}. */\nexport const ERROR_KIND_SESSION_LOST = \"session_lost\";\n/** `vgi_rpc.error_kind` batch-metadata value for {@link ServerDrainingError}. */\nexport const ERROR_KIND_SERVER_DRAINING = \"server_draining\";\nexport const ERROR_KIND_PROTOCOL_VERSION_MISMATCH = \"protocol_version_mismatch\";\n\n/** Raised when the client's declared `vgi_rpc.protocol_version` is\n * incompatible with the server's. Subclass of `VersionError` so existing\n * catch sites continue to write a typed error stream and keep serving.\n * Carries a directional message that tells the reader which side to\n * upgrade. Mirrors Python's `vgi_rpc.rpc.ProtocolVersionError`. */\nexport class ProtocolVersionError extends VersionError {\n static readonly errorKind = ERROR_KIND_PROTOCOL_VERSION_MISMATCH;\n readonly errorKind = ERROR_KIND_PROTOCOL_VERSION_MISMATCH;\n constructor(message: string) {\n super(message);\n this.name = \"ProtocolVersionError\";\n }\n}\n\nconst SEMVER_REGEX = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$/;\n\n/** Parse a canonical semver string into `[major, minor, patch]`. Throws on\n * any input that isn't `MAJOR.MINOR.PATCH` with non-negative integers and\n * no leading zeros (except literal `0`). No prereleases, no build metadata.\n * Mirrors Python's `vgi_rpc.metadata.parse_version`. */\nexport function parseProtocolVersion(value: string): [number, number, number] {\n const m = SEMVER_REGEX.exec(value);\n if (!m) {\n throw new Error(\n `Invalid protocol version '${value}': expected canonical semver ` +\n \"MAJOR.MINOR.PATCH with non-negative integers and no leading zeros \" +\n \"(no prereleases or build metadata).\",\n );\n }\n return [Number(m[1]), Number(m[2]), Number(m[3])];\n}\n\n/** Raised when a client invokes a method the server does not implement.\n *\n * Mirrors Python's `vgi_rpc.rpc.MethodNotImplementedError`. The static\n * `errorKind` is hoisted onto the error batch metadata as\n * `vgi_rpc.error_kind` so clients can branch on the typed marker without\n * string-matching the message.\n */\nexport class MethodNotImplementedError extends Error {\n /** Typed `vgi_rpc.error_kind` marker for this error class. */\n static readonly errorKind = ERROR_KIND_METHOD_NOT_IMPLEMENTED;\n /** Typed `vgi_rpc.error_kind` marker hoisted onto the error batch metadata. */\n readonly errorKind = ERROR_KIND_METHOD_NOT_IMPLEMENTED;\n constructor(message: string) {\n super(message);\n this.name = \"MethodNotImplementedError\";\n }\n}\n\n/** Raised when a sticky session token is malformed, expired, evicted, or\n * bound to a different worker / principal. HTTP-only. */\nexport class SessionLostError extends Error {\n /** Typed `vgi_rpc.error_kind` marker for this error class. */\n static readonly errorKind = ERROR_KIND_SESSION_LOST;\n /** Typed `vgi_rpc.error_kind` marker hoisted onto the error batch metadata. */\n readonly errorKind = ERROR_KIND_SESSION_LOST;\n constructor(message: string) {\n super(message);\n this.name = \"SessionLostError\";\n }\n}\n\n/** Raised when `ctx.openSession` is called while the server is draining. */\nexport class ServerDrainingError extends Error {\n /** Typed `vgi_rpc.error_kind` marker for this error class. */\n static readonly errorKind = ERROR_KIND_SERVER_DRAINING;\n /** Typed `vgi_rpc.error_kind` marker hoisted onto the error batch metadata. */\n readonly errorKind = ERROR_KIND_SERVER_DRAINING;\n constructor(message: string) {\n super(message);\n this.name = \"ServerDrainingError\";\n }\n}\n",
9
9
  "// arrow-js backend for vgi-rpc-typescript's Arrow facade.\n\nimport {\n Binary as A_Binary,\n Bool as A_Bool,\n Data as A_Data,\n type DataType as A_DataType,\n DataType as A_DataTypeNS,\n DateDay as A_DateDay,\n Decimal as A_Decimal,\n Dictionary as A_Dictionary,\n DurationMicrosecond as A_DurationMicrosecond,\n Field as A_Field,\n FixedSizeBinary as A_FixedSizeBinary,\n Float32 as A_Float32,\n Float64 as A_Float64,\n Int8 as A_Int8,\n Int16 as A_Int16,\n Int32 as A_Int32,\n Int64 as A_Int64,\n LargeBinary as A_LargeBinary,\n LargeUtf8 as A_LargeUtf8,\n List as A_List,\n Map_ as A_Map,\n Null as A_Null,\n RecordBatch as A_RecordBatch,\n Schema as A_Schema,\n Struct as A_Struct,\n TimeMicrosecond as A_TimeMicrosecond,\n Timestamp as A_Timestamp,\n TimeUnit as A_TimeUnit,\n Type as A_Type,\n Uint8 as A_Uint8,\n Uint16 as A_Uint16,\n Uint32 as A_Uint32,\n Uint64 as A_Uint64,\n Utf8 as A_Utf8,\n makeData as a_makeData,\n vectorFromArray as a_vectorFromArray,\n RecordBatchReader,\n RecordBatchStreamWriter,\n} from \"@query-farm/apache-arrow\";\n\n// Local type-only helpers used by conformBatchToSchema.\ntype _NeedsCast = (src: A_DataType, dst: A_DataType) => boolean;\n\nimport type {\n IncrementalEncoder,\n VgiBackendInfo,\n VgiBatch,\n VgiColumnData,\n VgiDataType,\n VgiField,\n VgiSchema,\n} from \"../types.js\";\n\nexport const backend: VgiBackendInfo = { name: \"arrow-js\", opaquePassthrough: true };\n\n// ----- Type factories ------------------------------------------------------\n\nexport const nullType = (): VgiDataType => new A_Null() as unknown as VgiDataType;\nexport const bool = (): VgiDataType => new A_Bool() as unknown as VgiDataType;\nexport const int8 = (): VgiDataType => new A_Int8() as unknown as VgiDataType;\nexport const int16 = (): VgiDataType => new A_Int16() as unknown as VgiDataType;\nexport const int32 = (): VgiDataType => new A_Int32() as unknown as VgiDataType;\nexport const int64 = (): VgiDataType => new A_Int64() as unknown as VgiDataType;\nexport const uint8 = (): VgiDataType => new A_Uint8() as unknown as VgiDataType;\nexport const uint16 = (): VgiDataType => new A_Uint16() as unknown as VgiDataType;\nexport const uint32 = (): VgiDataType => new A_Uint32() as unknown as VgiDataType;\nexport const uint64 = (): VgiDataType => new A_Uint64() as unknown as VgiDataType;\nexport const float32 = (): VgiDataType => new A_Float32() as unknown as VgiDataType;\nexport const float64 = (): VgiDataType => new A_Float64() as unknown as VgiDataType;\nexport const utf8 = (): VgiDataType => new A_Utf8() as unknown as VgiDataType;\nexport const binary = (): VgiDataType => new A_Binary() as unknown as VgiDataType;\n\n/** Microsecond Timestamp with optional timezone. */\nexport const timestampMicro = (timezone: string | null = null): VgiDataType =>\n new A_Timestamp(A_TimeUnit.MICROSECOND, timezone) as unknown as VgiDataType;\n\n/** Date32 with day resolution. */\nexport const dateDay = (): VgiDataType => new A_DateDay() as unknown as VgiDataType;\n/** Time64 with microsecond resolution. */\nexport const timeMicro = (): VgiDataType => new A_TimeMicrosecond() as unknown as VgiDataType;\n/** Duration with microsecond resolution. */\nexport const durationMicro = (): VgiDataType => new A_DurationMicrosecond() as unknown as VgiDataType;\n/** Decimal128 by default; pass bitWidth=256 for Decimal256. */\nexport const decimal = (precision: number, scale: number, bitWidth: 128 | 256 = 128): VgiDataType =>\n new A_Decimal(scale, precision, bitWidth) as unknown as VgiDataType;\n/** FixedSizeBinary with the given byte width. */\nexport const fixedSizeBinary = (byteWidth: number): VgiDataType =>\n new A_FixedSizeBinary(byteWidth) as unknown as VgiDataType;\n/** LargeUtf8 — 64-bit-offset UTF-8 string. */\nexport const largeUtf8 = (): VgiDataType => new A_LargeUtf8() as unknown as VgiDataType;\n/** LargeBinary — 64-bit-offset binary blob. */\nexport const largeBinary = (): VgiDataType => new A_LargeBinary() as unknown as VgiDataType;\n/** List of `child` items. The child field carries name + nullability + type. */\nexport const list = (child: VgiField): VgiDataType => new A_List(child as unknown as A_Field) as unknown as VgiDataType;\n/** Struct of `fields`. */\nexport const struct = (fields: readonly VgiField[]): VgiDataType =>\n new A_Struct(fields as unknown as A_Field[]) as unknown as VgiDataType;\n/** Map (key → value) carried as a List<Struct<key,value>>. arrow-js's Map_\n * constructor takes a child Field whose type is a Struct of [key, value]. */\nexport const map = (keyField: VgiField, valueField: VgiField, keysSorted = false): VgiDataType => {\n const k = keyField as unknown as A_Field;\n const v = valueField as unknown as A_Field;\n const entriesField = new A_Field(\"entries\", new A_Struct([k, v]), /* nullable */ false);\n return new A_Map(entriesField, keysSorted) as unknown as VgiDataType;\n};\n/** Dictionary-encoded type. `indices` must be an integer type.\n *\n * `id` is left undefined by default so arrow-js's internal `getId()`\n * counter assigns a fresh unique id per Dictionary instance. Passing\n * `-1` (or any concrete number) here would short-circuit that counter\n * and produce id collisions when multiple Dictionary types are used. */\nexport const dictionary = (indices: VgiDataType, values: VgiDataType, id?: number, ordered = false): VgiDataType =>\n new A_Dictionary(values as A_DataType, indices as any, id, ordered) as unknown as VgiDataType;\n\nexport function field(name: string, type: VgiDataType, nullable = true, metadata?: Map<string, string>): VgiField {\n return new A_Field(name, type as A_DataType, nullable, metadata ?? new Map()) as unknown as VgiField;\n}\n\nexport function schema(fields: readonly VgiField[], metadata?: Map<string, string>): VgiSchema {\n return new A_Schema(fields as A_Field[], metadata ?? new Map()) as unknown as VgiSchema;\n}\n\n// ----- IPC -----------------------------------------------------------------\n\nexport function serializeSchema(s: VgiSchema): Uint8Array {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, s as unknown as A_Schema);\n writer.close();\n return writer.toUint8Array(true);\n}\n\nexport function deserializeSchema(bytes: Uint8Array): VgiSchema {\n const reader = RecordBatchReader.from(bytes);\n const batches = [...reader];\n if (batches.length > 0) return batches[0].schema as unknown as VgiSchema;\n if (reader.schema) return reader.schema as unknown as VgiSchema;\n throw new Error(\"Cannot deserialize schema from empty IPC stream\");\n}\n\nexport function serializeBatch(batch: VgiBatch): Uint8Array {\n const a = batch as unknown as A_RecordBatch;\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, a.schema);\n (writer as any)._writeRecordBatch(a);\n writer.close();\n return writer.toUint8Array(true);\n}\n\n/**\n * Incremental IPC encoder over arrow-js's `RecordBatchStreamWriter`. Each\n * call drains the writer's internal sink queue and returns the new bytes,\n * so the caller can flush them synchronously between lockstep turns.\n *\n * `_writeRecordBatch` is called directly (rather than the public `write`)\n * to bypass arrow-js's schema comparison, which would auto-close the\n * writer and silently drop a batch whose schema differs only in\n * nullability — our output schema is fixed at open time and all batches\n * are structurally compatible.\n */\nexport function createIncrementalEncoder(s: VgiSchema): IncrementalEncoder {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, s as unknown as A_Schema);\n const drain = (): Uint8Array => {\n const values = (writer as any)._sink._values as Uint8Array[];\n const total = values.reduce((n, c) => n + c.length, 0);\n const out = new Uint8Array(total);\n let off = 0;\n for (const c of values) {\n out.set(c, off);\n off += c.length;\n }\n values.length = 0;\n return out;\n };\n return {\n start: () => drain(),\n writeBatch(batch: VgiBatch): Uint8Array {\n (writer as any)._writeRecordBatch(batch as unknown as A_RecordBatch);\n return drain();\n },\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000).\n finish: () => new Uint8Array(new Int32Array([-1, 0]).buffer),\n };\n}\n\nexport function deserializeBatch(bytes: Uint8Array): VgiBatch {\n const reader = RecordBatchReader.from(bytes);\n const batches = [...reader];\n if (batches.length === 0) {\n const sch = reader.schema ?? new A_Schema([]);\n // Build an empty batch matching the schema. arrow-js quirk: empty IPC\n // streams may not give us a Schema; default to no fields.\n const structType = new A_Struct(sch.fields);\n const data = a_makeData({ type: structType, length: 0, children: [], nullCount: 0 });\n return new A_RecordBatch(sch, data) as unknown as VgiBatch;\n }\n return batches[0] as unknown as VgiBatch;\n}\n\n// ----- Construction --------------------------------------------------------\n\nexport function columnFromArray(values: any[], type: VgiDataType): VgiColumnData {\n return a_vectorFromArray(values, type as A_DataType).data[0] as VgiColumnData;\n}\n\n/** Build a 1-row batch from {colName: value} dict (Int64 numbers auto-coerced). */\nexport function singleRowBatch(s: VgiSchema, values: Record<string, any>): VgiBatch {\n const a = s as unknown as A_Schema;\n const children = a.fields.map((f) => {\n let val = values[f.name];\n if (f.type.typeId === A_Type.Int && (f.type as any).bitWidth === 64) {\n if (typeof val === \"number\") val = BigInt(val);\n }\n return a_vectorFromArray([val], f.type).data[0];\n });\n const structType = new A_Struct(a.fields);\n const data = a_makeData({ type: structType, length: 1, children, nullCount: 0 });\n return new A_RecordBatch(a, data) as unknown as VgiBatch;\n}\n\n/** Build an N-row batch from columnar arrays. */\nexport function batchFromColumns(s: VgiSchema, columns: Record<string, any[]>): VgiBatch {\n const a = s as unknown as A_Schema;\n const numRows = a.fields.length > 0 ? (columns[a.fields[0].name]?.length ?? 0) : 0;\n const children = a.fields.map((f) => {\n const vals = columns[f.name];\n if (!vals) return a_makeData({ type: f.type, length: numRows, nullCount: numRows });\n return a_vectorFromArray(vals, f.type).data[0];\n });\n const structType = new A_Struct(a.fields);\n const data = a_makeData({ type: structType, length: numRows, children, nullCount: 0 });\n return new A_RecordBatch(a, data) as unknown as VgiBatch;\n}\n\n/** Build a batch from pre-built column-data handles + schema. */\nexport function batchFromColumnData(\n s: VgiSchema,\n numRows: number,\n columnData: VgiColumnData[],\n metadata?: Map<string, string>,\n): VgiBatch {\n const a = s as unknown as A_Schema;\n const structType = new A_Struct(a.fields);\n const data = a_makeData({\n type: structType,\n length: numRows,\n children: columnData as any[],\n nullCount: 0,\n });\n // arrow-js Schema doesn't carry batch-level metadata; attach it when present\n // by cloning with a fresh metadata map.\n const finalSchema = metadata && metadata.size > 0 ? new A_Schema(a.fields, metadata) : a;\n return new A_RecordBatch(finalSchema, data) as unknown as VgiBatch;\n}\n\n/** Empty-Data builder used when assembling batches with pre-built children. */\nexport function emptyColumnData(type: VgiDataType): VgiColumnData {\n return makeEmptyDataRecursive(type as A_DataType) as VgiColumnData;\n}\n\n/**\n * 0-row batch with optional batch-level metadata (used for log/error/empty\n * tombstone batches by the wire layer).\n */\nexport function emptyBatchWithMetadata(s: VgiSchema, metadata?: Map<string, string>): VgiBatch {\n const a = s as unknown as A_Schema;\n const children = a.fields.map((f) => makeEmptyDataRecursive(f.type));\n const structType = new A_Struct(a.fields);\n const data = a_makeData({ type: structType, length: 0, children, nullCount: 0 });\n return new A_RecordBatch(a, data, metadata) as unknown as VgiBatch;\n}\n\n/** Recursive empty-Data builder — needed for nested types so arrow-js's\n * IPC writer doesn't crash on List/Map/Struct/Union with absent children. */\nfunction makeEmptyDataRecursive(type: A_DataType): any {\n const M = { DataType: A_DataTypeNS, Data: A_Data };\n if (M.DataType.isStruct(type)) {\n const children = (type as any).children.map((f: any) => makeEmptyDataRecursive(f.type));\n return a_makeData({ type, length: 0, children, nullCount: 0 } as any);\n }\n if (M.DataType.isList(type)) {\n const childData = makeEmptyDataRecursive((type as any).children[0].type);\n return a_makeData({ type, length: 0, child: childData, nullCount: 0, valueOffsets: new Int32Array([0]) } as any);\n }\n if (M.DataType.isFixedSizeList(type)) {\n const childData = makeEmptyDataRecursive((type as any).children[0].type);\n return a_makeData({ type, length: 0, child: childData, nullCount: 0 } as any);\n }\n if (M.DataType.isMap(type)) {\n const entryType = (type as any).children[0]?.type;\n const entryData = entryType\n ? makeEmptyDataRecursive(entryType)\n : a_makeData({ type: new A_Struct([]), length: 0, children: [], nullCount: 0 });\n return a_makeData({ type, length: 0, child: entryData, nullCount: 0, valueOffsets: new Int32Array([0]) } as any);\n }\n if (M.DataType.isUnion(type)) {\n const children = (type as any).children.map((f: any) => makeEmptyDataRecursive(f.type));\n if (M.DataType.isDenseUnion(type)) {\n return a_makeData({\n type,\n length: 0,\n typeIds: new Int8Array(0),\n valueOffsets: new Int32Array(0),\n children,\n nullCount: 0,\n } as any);\n }\n return a_makeData({\n type,\n length: 0,\n typeIds: new Int8Array(0),\n children,\n nullCount: 0,\n } as any);\n }\n return a_makeData({ type, length: 0, nullCount: 0 });\n}\n\n/** 1-row result batch: vectorFromArray each value, support raw Data\n * passthrough (for Map/opaque types whose .get(0) is unreliable). */\nexport function singleRowBatchWithMetadata(\n s: VgiSchema,\n values: Record<string, any>,\n metadata?: Map<string, string>,\n): VgiBatch {\n const a = s as unknown as A_Schema;\n const M = { DataType: A_DataTypeNS, Data: A_Data };\n const children = a.fields.map((f) => {\n const val = values[f.name];\n if (val instanceof M.Data) return val;\n return a_vectorFromArray([val], f.type).data[0];\n });\n const structType = new A_Struct(a.fields);\n const data = a_makeData({ type: structType, length: 1, children, nullCount: 0 });\n return new A_RecordBatch(a, data, metadata) as unknown as VgiBatch;\n}\n\n/** Tag a value as a raw Data passthrough. arrow-js: returns true if the\n * value is an arrow-js Data instance. flechette: always false (the\n * flechette backend doesn't surface this opaque-type quirk). */\nexport function isOpaqueData(val: unknown): boolean {\n const M = { DataType: A_DataTypeNS, Data: A_Data };\n return val instanceof M.Data;\n}\n\n/** Re-emit a batch with a different metadata map (same schema + data). */\nexport function withBatchMetadata(batch: VgiBatch, metadata: Map<string, string>): VgiBatch {\n const a = batch as unknown as A_RecordBatch;\n return new A_RecordBatch(a.schema, a.data, metadata) as unknown as VgiBatch;\n}\n\n/**\n * Serialize a sequence of batches into a single multi-batch IPC stream.\n * arrow-js's `RecordBatchStreamWriter` writes schema + N batches + EOS\n * incrementally — exactly what consumers expect for a producer/exchange\n * response that emits more than one batch.\n */\nexport function serializeBatches(schema: VgiSchema, batches: VgiBatch[]): Uint8Array {\n const writer = new RecordBatchStreamWriter();\n writer.reset(undefined, schema as unknown as A_Schema);\n for (const batch of batches) {\n (writer as any)._writeRecordBatch(batch as unknown as A_RecordBatch);\n }\n writer.close();\n return writer.toUint8Array(true);\n}\n\n/**\n * Rebuild a batch's data to match a target schema's field types.\n *\n * Lives on the backend because every line touches arrow-js internals\n * (Data.children, Data.clone, vectorFromArray, makeData with nullBitmap\n * passthrough). flechette's IPC reader produces specific types upfront, so\n * its `conformBatchToSchema` is a no-op — keeping this code out of the\n * shared util/ tree is what lets the worker-cf bundle drop arrow-js.\n */\nconst _needsValueCast: _NeedsCast = (src, dst) => {\n if (src.typeId === dst.typeId) return false;\n if (src.constructor === dst.constructor) return false;\n return true;\n};\n\nconst _isNumeric = (t: A_DataType): boolean => t.typeId === A_Type.Int || t.typeId === A_Type.Float;\n\nexport function conformBatchToSchema(batch: VgiBatch, schema: VgiSchema): VgiBatch {\n const a = batch as unknown as A_RecordBatch;\n if (a.numRows === 0) return batch;\n const s = schema as unknown as A_Schema;\n\n if (a.schema.fields.length !== s.fields.length) {\n throw new TypeError(`Field count mismatch: expected ${s.fields.length}, got ${a.schema.fields.length}`);\n }\n for (let i = 0; i < s.fields.length; i++) {\n if (a.schema.fields[i].name !== s.fields[i].name) {\n throw new TypeError(\n `Field name mismatch at index ${i}: expected '${s.fields[i].name}', got '${a.schema.fields[i].name}'`,\n );\n }\n }\n\n const children = s.fields.map((f, i) => {\n const srcChild = a.data.children[i];\n const srcType = srcChild.type;\n const dstType = f.type;\n\n if (!_needsValueCast(srcType, dstType)) {\n return srcChild.clone(dstType);\n }\n if (_isNumeric(srcType) && _isNumeric(dstType)) {\n const col = a.getChildAt(i)!;\n const values: number[] = [];\n for (let r = 0; r < a.numRows; r++) {\n const v = col.get(r);\n values.push(typeof v === \"bigint\" ? Number(v) : (v as number));\n }\n return a_vectorFromArray(values, dstType).data[0];\n }\n return srcChild.clone(dstType);\n });\n\n const structType = new A_Struct(s.fields);\n const data = a_makeData({\n type: structType,\n length: a.numRows,\n children,\n nullCount: a.data.nullCount,\n nullBitmap: a.data.nullBitmap,\n });\n return new A_RecordBatch(s, data, a.metadata) as unknown as VgiBatch;\n}\n",
10
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * External storage support for large Arrow IPC batches.\n *\n * When a batch exceeds a configurable threshold, it is serialized to IPC,\n * optionally compressed with zstd, and uploaded to pluggable storage.\n * The batch is replaced with a zero-row \"pointer batch\" containing the\n * download URL and SHA-256 checksum in metadata.\n */\n\nimport { deserializeBatch, serializeBatch, type VgiBatch, type VgiSchema } from \"./arrow/index.js\";\nimport { LOCATION_KEY, LOCATION_SHA256_KEY, LOG_LEVEL_KEY } from \"./constants.js\";\nimport { zstdCompress, zstdDecompress } from \"./util/zstd.js\";\nimport { buildEmptyBatch } from \"./wire/response.js\";\n\n// ---------------------------------------------------------------------------\n// Interfaces and configuration\n// ---------------------------------------------------------------------------\n\n/** Pluggable storage backend for uploading large batches. */\nexport interface ExternalStorage {\n /** Upload IPC data and return a URL for retrieval. */\n upload(data: Uint8Array, contentEncoding: string): Promise<string>;\n}\n\n/** A pre-signed PUT/GET URL pair for client-side data upload. */\nexport interface UploadUrl {\n /** Pre-signed PUT URL the client uploads to. */\n uploadUrl: string;\n /** Pre-signed GET URL the server fetches from. */\n downloadUrl: string;\n /** Expiration time (UTC) for the URL pair. */\n expiresAt: Date;\n}\n\n/**\n * Generates pre-signed upload URL pairs for client-vended externalization.\n *\n * Implementations must be safe to call from multiple concurrent requests.\n * Object lifecycle is the operator's responsibility — uploaded objects are\n * not automatically deleted by vgi-rpc.\n */\nexport interface UploadUrlProvider {\n /** Allocate one upload/download URL pair. */\n generateUploadUrl(): Promise<UploadUrl> | UploadUrl;\n}\n\n/** Configuration for external storage of large batches. */\nexport interface ExternalLocationConfig {\n /** Storage backend for uploading. */\n storage: ExternalStorage;\n /** Minimum batch byte size to trigger externalization. Default: 1MB. */\n externalizeThresholdBytes?: number;\n /** Optional zstd compression for uploaded data. */\n compression?: { algorithm: \"zstd\"; level?: number };\n /** URL validator called before fetching. Throw to reject. Default: HTTPS-only. */\n urlValidator?: ((url: string) => void) | null;\n}\n\nconst DEFAULT_THRESHOLD = 1_048_576; // 1 MB\n\n// ---------------------------------------------------------------------------\n// URL validation\n// ---------------------------------------------------------------------------\n\n/** Default validator that rejects non-HTTPS URLs. */\nexport function httpsOnlyValidator(url: string): void {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(`External location URL must use HTTPS, got \"${parsed.protocol}\"`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// SHA-256 helpers\n// ---------------------------------------------------------------------------\n\nasync function sha256Hex(data: Uint8Array): Promise<string> {\n // Copy to a plain ArrayBuffer to satisfy Web Crypto API type requirements\n const buf = new ArrayBuffer(data.byteLength);\n new Uint8Array(buf).set(data);\n const hash = await crypto.subtle.digest(\"SHA-256\", buf);\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n// ---------------------------------------------------------------------------\n// Detection\n// ---------------------------------------------------------------------------\n\n/** Returns true if the batch is a zero-row pointer to external data. */\nexport function isExternalLocationBatch(batch: VgiBatch): boolean {\n if (batch.numRows !== 0) return false;\n const meta = batch.metadata;\n if (!meta) return false;\n return meta.has(LOCATION_KEY) && !meta.has(LOG_LEVEL_KEY);\n}\n\n// ---------------------------------------------------------------------------\n// Pointer batch creation\n// ---------------------------------------------------------------------------\n\n/** Create a zero-row pointer batch with location URL and optional SHA-256. */\nexport function makeExternalLocationBatch(schema: VgiSchema, url: string, sha256?: string): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOCATION_KEY, url);\n if (sha256) {\n metadata.set(LOCATION_SHA256_KEY, sha256);\n }\n return buildEmptyBatch(schema, metadata);\n}\n\n// ---------------------------------------------------------------------------\n// IPC serialization helpers\n// ---------------------------------------------------------------------------\n\nfunction serializeBatchToIpc(batch: VgiBatch): Uint8Array {\n return serializeBatch(batch);\n}\n\nfunction batchByteSize(batch: VgiBatch): number {\n // Estimate from IPC serialization size for threshold check.\n return serializeBatch(batch).byteLength;\n}\n\n// ---------------------------------------------------------------------------\n// Write path: externalization\n// ---------------------------------------------------------------------------\n\n/**\n * Maybe externalize a batch if it exceeds the threshold.\n * Returns the original batch unchanged if below threshold or no config.\n */\nexport async function maybeExternalizeBatch(\n batch: VgiBatch,\n config?: ExternalLocationConfig | null,\n): Promise<VgiBatch> {\n if (!config?.storage) return batch;\n if (batch.numRows === 0) return batch;\n\n const threshold = config.externalizeThresholdBytes ?? DEFAULT_THRESHOLD;\n if (batchByteSize(batch) < threshold) return batch;\n\n // Serialize to IPC\n let ipcData = serializeBatchToIpc(batch);\n\n // Compute SHA-256 of raw IPC bytes (pre-compression)\n const checksum = await sha256Hex(ipcData);\n\n // Optionally compress\n let contentEncoding = \"\";\n if (config.compression?.algorithm === \"zstd\") {\n ipcData = (await zstdCompress(ipcData, config.compression.level ?? 3)) as Uint8Array;\n contentEncoding = \"zstd\";\n }\n\n // Upload\n const url = await config.storage.upload(ipcData, contentEncoding);\n\n // Return pointer batch\n return makeExternalLocationBatch(batch.schema, url, checksum);\n}\n\n// ---------------------------------------------------------------------------\n// Read path: resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve an external pointer batch by fetching the data from the URL.\n * Returns the original batch unchanged if not a pointer or no config.\n */\nexport async function resolveExternalLocation(\n batch: VgiBatch,\n config?: ExternalLocationConfig | null,\n): Promise<VgiBatch> {\n if (!config) return batch;\n if (!isExternalLocationBatch(batch)) return batch;\n\n const url = batch.metadata?.get(LOCATION_KEY);\n if (!url) return batch;\n\n // Validate URL\n const validator = config.urlValidator === null ? undefined : (config.urlValidator ?? httpsOnlyValidator);\n if (validator) {\n validator(url);\n }\n\n // Fetch\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`External location fetch failed: ${response.status} ${response.statusText} [url: ${url}]`);\n }\n let data = new Uint8Array(await response.arrayBuffer());\n\n // Decompress if needed. Cap the decompressed size at 16x the\n // compressed body — generous for typical Arrow IPC zstd ratios but\n // tight enough that a tiny response cannot inflate to multi-GB.\n // Mirrors Python's external_fetch.fetch_url.\n const contentEncoding = response.headers.get(\"Content-Encoding\");\n if (contentEncoding === \"zstd\") {\n const cap = data.byteLength * 16;\n data = new Uint8Array(await zstdDecompress(data, cap));\n }\n\n // Verify SHA-256 if present\n const expectedSha256 = batch.metadata?.get(LOCATION_SHA256_KEY);\n if (expectedSha256) {\n const actualSha256 = await sha256Hex(data);\n if (actualSha256 !== expectedSha256) {\n throw new Error(`SHA-256 checksum mismatch for ${url}: expected ${expectedSha256}, got ${actualSha256}`);\n }\n }\n\n // Parse IPC stream\n const resolved = deserializeBatch(data);\n if (resolved.numRows === 0 && resolved.schema.fields.length === 0) {\n throw new Error(`No data batch found in external IPC stream from ${url}`);\n }\n return resolved;\n}\n",
10
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * External storage support for large Arrow IPC batches.\n *\n * When a batch exceeds a configurable threshold, it is serialized to IPC,\n * optionally compressed with zstd, and uploaded to pluggable storage.\n * The batch is replaced with a zero-row \"pointer batch\" containing the\n * download URL and SHA-256 checksum in metadata.\n */\n\nimport { deserializeBatch, serializeBatch, type VgiBatch, type VgiSchema } from \"./arrow/index.js\";\nimport { LOCATION_KEY, LOCATION_SHA256_KEY, LOG_LEVEL_KEY } from \"./constants.js\";\nimport { zstdCompress, zstdDecompress } from \"./util/zstd.js\";\nimport { buildEmptyBatch } from \"./wire/response.js\";\n\n// ---------------------------------------------------------------------------\n// Interfaces and configuration\n// ---------------------------------------------------------------------------\n\n/** Pluggable storage backend for uploading large batches. */\nexport interface ExternalStorage {\n /** Upload IPC data and return a URL for retrieval. */\n upload(data: Uint8Array, contentEncoding: string): Promise<string>;\n}\n\n/** A pre-signed PUT/GET URL pair for client-side data upload. */\nexport interface UploadUrl {\n /** Pre-signed PUT URL the client uploads to. */\n uploadUrl: string;\n /** Pre-signed GET URL the server fetches from. */\n downloadUrl: string;\n /** Expiration time (UTC) for the URL pair. */\n expiresAt: Date;\n}\n\n/**\n * Generates pre-signed upload URL pairs for client-vended externalization.\n *\n * Implementations must be safe to call from multiple concurrent requests.\n * Object lifecycle is the operator's responsibility — uploaded objects are\n * not automatically deleted by vgi-rpc.\n */\nexport interface UploadUrlProvider {\n /** Allocate one upload/download URL pair. */\n generateUploadUrl(): Promise<UploadUrl> | UploadUrl;\n}\n\n/** Configuration for external storage of large batches. */\nexport interface ExternalLocationConfig {\n /** Storage backend for uploading. */\n storage: ExternalStorage;\n /** Minimum batch byte size to trigger externalization. Default: 1MB. */\n externalizeThresholdBytes?: number;\n /** Optional zstd compression for uploaded data. */\n compression?: {\n /** Compression algorithm; only `\"zstd\"` is currently supported. */\n algorithm: \"zstd\";\n /** zstd compression level. Default: 3. */\n level?: number;\n };\n /** URL validator called before fetching. Throw to reject. Default: HTTPS-only. */\n urlValidator?: ((url: string) => void) | null;\n}\n\nconst DEFAULT_THRESHOLD = 1_048_576; // 1 MB\n\n// ---------------------------------------------------------------------------\n// URL validation\n// ---------------------------------------------------------------------------\n\n/** Default validator that rejects non-HTTPS URLs. */\nexport function httpsOnlyValidator(url: string): void {\n const parsed = new URL(url);\n if (parsed.protocol !== \"https:\") {\n throw new Error(`External location URL must use HTTPS, got \"${parsed.protocol}\"`);\n }\n}\n\n// ---------------------------------------------------------------------------\n// SHA-256 helpers\n// ---------------------------------------------------------------------------\n\nasync function sha256Hex(data: Uint8Array): Promise<string> {\n // Copy to a plain ArrayBuffer to satisfy Web Crypto API type requirements\n const buf = new ArrayBuffer(data.byteLength);\n new Uint8Array(buf).set(data);\n const hash = await crypto.subtle.digest(\"SHA-256\", buf);\n return Array.from(new Uint8Array(hash))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n}\n\n// ---------------------------------------------------------------------------\n// Detection\n// ---------------------------------------------------------------------------\n\n/** Returns true if the batch is a zero-row pointer to external data. */\nexport function isExternalLocationBatch(batch: VgiBatch): boolean {\n if (batch.numRows !== 0) return false;\n const meta = batch.metadata;\n if (!meta) return false;\n return meta.has(LOCATION_KEY) && !meta.has(LOG_LEVEL_KEY);\n}\n\n// ---------------------------------------------------------------------------\n// Pointer batch creation\n// ---------------------------------------------------------------------------\n\n/** Create a zero-row pointer batch with location URL and optional SHA-256. */\nexport function makeExternalLocationBatch(schema: VgiSchema, url: string, sha256?: string): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOCATION_KEY, url);\n if (sha256) {\n metadata.set(LOCATION_SHA256_KEY, sha256);\n }\n return buildEmptyBatch(schema, metadata);\n}\n\n// ---------------------------------------------------------------------------\n// IPC serialization helpers\n// ---------------------------------------------------------------------------\n\nfunction serializeBatchToIpc(batch: VgiBatch): Uint8Array {\n return serializeBatch(batch);\n}\n\nfunction batchByteSize(batch: VgiBatch): number {\n // Estimate from IPC serialization size for threshold check.\n return serializeBatch(batch).byteLength;\n}\n\n// ---------------------------------------------------------------------------\n// Write path: externalization\n// ---------------------------------------------------------------------------\n\n/**\n * Maybe externalize a batch if it exceeds the threshold.\n * Returns the original batch unchanged if below threshold or no config.\n */\nexport async function maybeExternalizeBatch(\n batch: VgiBatch,\n config?: ExternalLocationConfig | null,\n): Promise<VgiBatch> {\n if (!config?.storage) return batch;\n if (batch.numRows === 0) return batch;\n\n const threshold = config.externalizeThresholdBytes ?? DEFAULT_THRESHOLD;\n if (batchByteSize(batch) < threshold) return batch;\n\n // Serialize to IPC\n let ipcData = serializeBatchToIpc(batch);\n\n // Compute SHA-256 of raw IPC bytes (pre-compression)\n const checksum = await sha256Hex(ipcData);\n\n // Optionally compress\n let contentEncoding = \"\";\n if (config.compression?.algorithm === \"zstd\") {\n ipcData = (await zstdCompress(ipcData, config.compression.level ?? 3)) as Uint8Array;\n contentEncoding = \"zstd\";\n }\n\n // Upload\n const url = await config.storage.upload(ipcData, contentEncoding);\n\n // Return pointer batch\n return makeExternalLocationBatch(batch.schema, url, checksum);\n}\n\n// ---------------------------------------------------------------------------\n// Read path: resolution\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve an external pointer batch by fetching the data from the URL.\n * Returns the original batch unchanged if not a pointer or no config.\n */\nexport async function resolveExternalLocation(\n batch: VgiBatch,\n config?: ExternalLocationConfig | null,\n): Promise<VgiBatch> {\n if (!config) return batch;\n if (!isExternalLocationBatch(batch)) return batch;\n\n const url = batch.metadata?.get(LOCATION_KEY);\n if (!url) return batch;\n\n // Validate URL\n const validator = config.urlValidator === null ? undefined : (config.urlValidator ?? httpsOnlyValidator);\n if (validator) {\n validator(url);\n }\n\n // Fetch\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`External location fetch failed: ${response.status} ${response.statusText} [url: ${url}]`);\n }\n let data = new Uint8Array(await response.arrayBuffer());\n\n // Decompress if needed. Cap the decompressed size at 16x the\n // compressed body — generous for typical Arrow IPC zstd ratios but\n // tight enough that a tiny response cannot inflate to multi-GB.\n // Mirrors Python's external_fetch.fetch_url.\n const contentEncoding = response.headers.get(\"Content-Encoding\");\n if (contentEncoding === \"zstd\") {\n const cap = data.byteLength * 16;\n data = new Uint8Array(await zstdDecompress(data, cap));\n }\n\n // Verify SHA-256 if present\n const expectedSha256 = batch.metadata?.get(LOCATION_SHA256_KEY);\n if (expectedSha256) {\n const actualSha256 = await sha256Hex(data);\n if (actualSha256 !== expectedSha256) {\n throw new Error(`SHA-256 checksum mismatch for ${url}: expected ${expectedSha256}, got ${actualSha256}`);\n }\n }\n\n // Parse IPC stream\n const resolved = deserializeBatch(data);\n if (resolved.numRows === 0 && resolved.schema.fields.length === 0) {\n throw new Error(`No data batch found in external IPC stream from ${url}`);\n }\n return resolved;\n}\n",
11
11
  "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n emptyBatchWithMetadata,\n isInt,\n singleRowBatchWithMetadata,\n type VgiBatch,\n type VgiSchema,\n} from \"../arrow/index.js\";\nimport {\n ERROR_KIND_KEY,\n LOG_EXTRA_KEY,\n LOG_LEVEL_KEY,\n LOG_MESSAGE_KEY,\n REQUEST_ID_KEY,\n SERVER_ID_KEY,\n} from \"../constants.js\";\n\n/**\n * Coerce values for Int64 schema fields from Number to BigInt.\n * Handles both single values and arrays. Returns a new record with coerced values.\n */\nexport function coerceInt64(schema: VgiSchema, values: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = { ...values };\n for (const f of schema.fields) {\n const val = result[f.name];\n if (val === undefined) continue;\n if (!isInt(f.type) || (f.type as any).bitWidth !== 64) continue;\n\n if (Array.isArray(val)) {\n result[f.name] = val.map((v: any) => (typeof v === \"number\" ? BigInt(v) : v));\n } else if (typeof val === \"number\") {\n result[f.name] = BigInt(val);\n }\n }\n return result;\n}\n\n/**\n * Build a 1-row result batch with optional metadata.\n * For unary methods, `values` maps field names to single values.\n */\nexport function buildResultBatch(\n schema: VgiSchema,\n values: Record<string, any>,\n serverId: string,\n requestId: string | null,\n): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(SERVER_ID_KEY, serverId);\n if (requestId !== null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n if (schema.fields.length === 0) {\n return buildEmptyBatch(schema, metadata);\n }\n\n // Validate required fields\n for (const f of schema.fields) {\n if (values[f.name] === undefined && !f.nullable) {\n const got = Object.keys(values);\n throw new TypeError(`Handler result missing required field '${f.name}'. Got keys: [${got.join(\", \")}]`);\n }\n }\n\n const coerced = coerceInt64(schema, values);\n return singleRowBatchWithMetadata(schema, coerced, metadata);\n}\n\n/**\n * Build a 0-row error batch with EXCEPTION metadata matching Python's Message.from_exception().\n */\nexport function buildErrorBatch(schema: VgiSchema, error: Error, serverId: string, requestId: string | null): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOG_LEVEL_KEY, \"EXCEPTION\");\n // Prefer the standard `error.name` property (which user classes can set\n // via `this.name = \"Foo\"` even after a bundler renames the class) over\n // `constructor.name`, which is fragile under minification.\n const exceptionType = typeof error.name === \"string\" && error.name !== \"Error\" ? error.name : error.constructor.name;\n metadata.set(LOG_MESSAGE_KEY, `${exceptionType}: ${error.message}`);\n\n // Hoist `errorKind` (typed-exception marker) into the EXCEPTION batch\n // metadata as a top-level `vgi_rpc.error_kind` field so clients can\n // branch on the kind without parsing the log_extra JSON blob. Mirrors\n // Python's `Message.from_exception()` + `add_to_metadata()` hoisting.\n const errorKind =\n (error as { errorKind?: unknown }).errorKind ??\n ((error.constructor as { errorKind?: unknown }).errorKind as unknown);\n if (typeof errorKind === \"string\" && errorKind.length > 0) {\n metadata.set(ERROR_KIND_KEY, errorKind);\n }\n\n const extra: Record<string, any> = {\n exception_type: exceptionType,\n exception_message: error.message,\n traceback: error.stack ?? \"\",\n };\n if (typeof errorKind === \"string\" && errorKind.length > 0) {\n extra.error_kind = errorKind;\n }\n metadata.set(LOG_EXTRA_KEY, JSON.stringify(extra));\n metadata.set(SERVER_ID_KEY, serverId);\n if (requestId !== null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n return buildEmptyBatch(schema, metadata);\n}\n\n/**\n * Build a 0-row log batch.\n */\nexport function buildLogBatch(\n schema: VgiSchema,\n level: string,\n message: string,\n extra?: Record<string, any>,\n serverId?: string,\n requestId?: string | null,\n): VgiBatch {\n const metadata = new Map<string, string>();\n metadata.set(LOG_LEVEL_KEY, level);\n metadata.set(LOG_MESSAGE_KEY, message);\n if (extra) {\n metadata.set(LOG_EXTRA_KEY, JSON.stringify(extra));\n }\n if (serverId != null) {\n metadata.set(SERVER_ID_KEY, serverId);\n }\n if (requestId != null) {\n metadata.set(REQUEST_ID_KEY, requestId);\n }\n\n return buildEmptyBatch(schema, metadata);\n}\n\n/**\n * Build a 0-row batch from a schema with metadata.\n * Used for error/log batches.\n */\nexport function buildEmptyBatch(schema: VgiSchema, metadata?: Map<string, string>): VgiBatch {\n return emptyBatchWithMetadata(schema, metadata);\n}\n",
12
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n conformBatchToSchema,\n deserializeBatch,\n serializeBatches,\n type VgiBatch,\n type VgiSchema,\n} from \"../arrow/index.js\";\nimport { RPC_ERROR_HEADER } from \"../constants.js\";\nimport type { CookieSpec } from \"../types.js\";\n\nexport const ARROW_CONTENT_TYPE = \"application/vnd.apache.arrow.stream\";\n\n// Sticky session header conventions (HTTP-only). Mirrors Python's\n// `vgi_rpc.http._common`. Headers — not cookies — so multiple concurrent\n// sessions to one host from a single client multiplex correctly.\nexport const SESSION_HEADER = \"VGI-Session\";\nexport const SESSION_ACCEPT_HEADER = \"VGI-Session-Accept\";\nexport const SESSION_CLOSE_HEADER = \"VGI-Session-Close\";\nexport const STICKY_ENABLED_HEADER = \"VGI-Sticky-Enabled\";\nexport const STICKY_DEFAULT_TTL_HEADER = \"VGI-Sticky-Default-TTL\";\nexport const STICKY_ECHO_HEADERS_HEADER = \"VGI-Sticky-Echo-Headers\";\n\n/** Prefix the server uses to tell the client \"echo this header on subsequent\n * requests in this session\". Clients capture and replay\n * `VGI-Echo-<name>: <value>` as plain `<name>: <value>` for the session\n * lifetime — used for client-driven routing (e.g. `fly-force-instance-id`). */\nexport const ECHO_HEADER_PREFIX = \"VGI-Echo-\";\n\n/** Framework-managed sticky session teardown endpoint path component.\n * `DELETE {prefix}/__session__` idempotently closes the session referenced\n * by the request's `VGI-Session` header. */\nexport const SESSION_ENDPOINT = \"__session__\";\n\n/** Serialize a CookieSpec into a Set-Cookie header value. */\nexport function formatSetCookieHeader(c: CookieSpec): string {\n const parts: string[] = [];\n if (c.delete) {\n parts.push(`${c.name}=`);\n parts.push(\"Max-Age=0\");\n } else {\n parts.push(`${c.name}=${c.value}`);\n if (c.maxAge !== undefined) parts.push(`Max-Age=${c.maxAge}`);\n if (c.expires) parts.push(`Expires=${c.expires.toUTCString()}`);\n }\n if (c.path) parts.push(`Path=${c.path}`);\n if (c.domain) parts.push(`Domain=${c.domain}`);\n if (c.secure) parts.push(\"Secure\");\n if (c.httpOnly) parts.push(\"HttpOnly\");\n if (c.sameSite) parts.push(`SameSite=${c.sameSite}`);\n if (c.partitioned) parts.push(\"Partitioned\");\n return parts.join(\"; \");\n}\n\n/** Append Set-Cookie headers for each queued CookieSpec onto an existing Headers object. */\nexport function appendCookieHeaders(headers: Headers, cookies: readonly CookieSpec[]): void {\n for (const c of cookies) {\n headers.append(\"Set-Cookie\", formatSetCookieHeader(c));\n }\n}\n\nexport class HttpRpcError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n this.name = \"HttpRpcError\";\n }\n}\n\n/**\n * Serialize a schema + batches into a complete IPC stream as Uint8Array.\n *\n * A single IPC stream is `[schema_msg, batch_msg, batch_msg, ..., EOS]`.\n * Each backend implements `serializeBatches` to write that atomically —\n * arrow-js via `RecordBatchStreamWriter`, flechette via `tablesToIPC`\n * (added in our flechette fork). Naive concatenation of per-batch streams\n * produces multiple EOS markers and breaks readers.\n */\nexport function serializeIpcStream(schema: VgiSchema, batches: VgiBatch[]): Uint8Array {\n const conformed = batches.map((b) => conformBatchToSchema(b, schema));\n return serializeBatches(schema, conformed);\n}\n\n/**\n * Create a Response with Arrow IPC content type.\n *\n * Server errors (status 500) are translated to HTTP 200 with an\n * ``X-VGI-RPC-Error: true`` header so that clients which discard\n * response bodies on 5xx still receive the Arrow IPC error metadata.\n * Client errors (400, 401, 404, 415) are passed through unchanged.\n */\nexport function arrowResponse(body: Uint8Array, status = 200, extraHeaders?: Headers): Response {\n const headers = extraHeaders ?? new Headers();\n headers.set(\"Content-Type\", ARROW_CONTENT_TYPE);\n if (status === 500) {\n headers.set(RPC_ERROR_HEADER, \"true\");\n return new Response(body as unknown as BodyInit, { status: 200, headers });\n }\n return new Response(body as unknown as BodyInit, { status, headers });\n}\n\n/** Read schema + first batch from an IPC stream body via the facade. */\nexport async function readRequestFromBody(body: Uint8Array): Promise<{ schema: VgiSchema; batch: VgiBatch }> {\n const batch = deserializeBatch(body);\n // Reject only truly empty bodies. A zero-field, zero-row batch with batch\n // metadata is a legal exchange/cancel/continuation signal — the state\n // token rides on `batch.metadata` and downstream code (cancel detection,\n // schema conformance gating) is built to handle it.\n if (batch.schema.fields.length === 0 && batch.numRows === 0 && (batch.metadata?.size ?? 0) === 0) {\n throw new HttpRpcError(\"Empty IPC stream: no schema\", 400);\n }\n return { schema: batch.schema, batch };\n}\n",
12
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n conformBatchToSchema,\n deserializeBatch,\n serializeBatches,\n type VgiBatch,\n type VgiSchema,\n} from \"../arrow/index.js\";\nimport { RPC_ERROR_HEADER } from \"../constants.js\";\nimport type { CookieSpec } from \"../types.js\";\n\n/** MIME type for Arrow IPC stream request and response bodies. */\nexport const ARROW_CONTENT_TYPE = \"application/vnd.apache.arrow.stream\";\n\n// Sticky session header conventions (HTTP-only). Mirrors Python's\n// `vgi_rpc.http._common`. Headers — not cookies — so multiple concurrent\n// sessions to one host from a single client multiplex correctly.\nexport const SESSION_HEADER = \"VGI-Session\";\nexport const SESSION_ACCEPT_HEADER = \"VGI-Session-Accept\";\nexport const SESSION_CLOSE_HEADER = \"VGI-Session-Close\";\nexport const STICKY_ENABLED_HEADER = \"VGI-Sticky-Enabled\";\nexport const STICKY_DEFAULT_TTL_HEADER = \"VGI-Sticky-Default-TTL\";\nexport const STICKY_ECHO_HEADERS_HEADER = \"VGI-Sticky-Echo-Headers\";\n\n/** Prefix the server uses to tell the client \"echo this header on subsequent\n * requests in this session\". Clients capture and replay\n * `VGI-Echo-<name>: <value>` as plain `<name>: <value>` for the session\n * lifetime — used for client-driven routing (e.g. `fly-force-instance-id`). */\nexport const ECHO_HEADER_PREFIX = \"VGI-Echo-\";\n\n/** Framework-managed sticky session teardown endpoint path component.\n * `DELETE {prefix}/__session__` idempotently closes the session referenced\n * by the request's `VGI-Session` header. */\nexport const SESSION_ENDPOINT = \"__session__\";\n\n/** Serialize a CookieSpec into a Set-Cookie header value. */\nexport function formatSetCookieHeader(c: CookieSpec): string {\n const parts: string[] = [];\n if (c.delete) {\n parts.push(`${c.name}=`);\n parts.push(\"Max-Age=0\");\n } else {\n parts.push(`${c.name}=${c.value}`);\n if (c.maxAge !== undefined) parts.push(`Max-Age=${c.maxAge}`);\n if (c.expires) parts.push(`Expires=${c.expires.toUTCString()}`);\n }\n if (c.path) parts.push(`Path=${c.path}`);\n if (c.domain) parts.push(`Domain=${c.domain}`);\n if (c.secure) parts.push(\"Secure\");\n if (c.httpOnly) parts.push(\"HttpOnly\");\n if (c.sameSite) parts.push(`SameSite=${c.sameSite}`);\n if (c.partitioned) parts.push(\"Partitioned\");\n return parts.join(\"; \");\n}\n\n/** Append Set-Cookie headers for each queued CookieSpec onto an existing Headers object. */\nexport function appendCookieHeaders(headers: Headers, cookies: readonly CookieSpec[]): void {\n for (const c of cookies) {\n headers.append(\"Set-Cookie\", formatSetCookieHeader(c));\n }\n}\n\nexport class HttpRpcError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n ) {\n super(message);\n this.name = \"HttpRpcError\";\n }\n}\n\n/**\n * Serialize a schema + batches into a complete IPC stream as Uint8Array.\n *\n * A single IPC stream is `[schema_msg, batch_msg, batch_msg, ..., EOS]`.\n * Each backend implements `serializeBatches` to write that atomically —\n * arrow-js via `RecordBatchStreamWriter`, flechette via `tablesToIPC`\n * (added in our flechette fork). Naive concatenation of per-batch streams\n * produces multiple EOS markers and breaks readers.\n */\nexport function serializeIpcStream(schema: VgiSchema, batches: VgiBatch[]): Uint8Array {\n const conformed = batches.map((b) => conformBatchToSchema(b, schema));\n return serializeBatches(schema, conformed);\n}\n\n/**\n * Create a Response with Arrow IPC content type.\n *\n * Server errors (status 500) are translated to HTTP 200 with an\n * ``X-VGI-RPC-Error: true`` header so that clients which discard\n * response bodies on 5xx still receive the Arrow IPC error metadata.\n * Client errors (400, 401, 404, 415) are passed through unchanged.\n */\nexport function arrowResponse(body: Uint8Array, status = 200, extraHeaders?: Headers): Response {\n const headers = extraHeaders ?? new Headers();\n headers.set(\"Content-Type\", ARROW_CONTENT_TYPE);\n if (status === 500) {\n headers.set(RPC_ERROR_HEADER, \"true\");\n return new Response(body as unknown as BodyInit, { status: 200, headers });\n }\n return new Response(body as unknown as BodyInit, { status, headers });\n}\n\n/** Read schema + first batch from an IPC stream body via the facade. */\nexport async function readRequestFromBody(body: Uint8Array): Promise<{ schema: VgiSchema; batch: VgiBatch }> {\n const batch = deserializeBatch(body);\n // Reject only truly empty bodies. A zero-field, zero-row batch with batch\n // metadata is a legal exchange/cancel/continuation signal — the state\n // token rides on `batch.metadata` and downstream code (cancel detection,\n // schema conformance gating) is built to handle it.\n if (batch.schema.fields.length === 0 && batch.numRows === 0 && (batch.metadata?.size ?? 0) === 0) {\n throw new HttpRpcError(\"Empty IPC stream: no schema\", 400);\n }\n return { schema: batch.schema, batch };\n}\n",
13
13
  "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * HTTP server capability discovery.\n *\n * Mirrors Python's `http_capabilities()`: probes `OPTIONS {prefix}/health`\n * and reads three response headers:\n * - `VGI-Max-Request-Bytes` — server-enforced inline request cap\n * - `VGI-Upload-URL-Support` — \"true\" when the server vends upload URLs\n * - `VGI-Max-Upload-Bytes` — cap on out-of-band upload size\n *\n * Honours `Cache-Control: max-age=N` for refresh scheduling.\n */\n\nexport interface HttpServerCapabilities {\n /** Server's advertised max inline request body size (bytes). */\n maxRequestBytes: number | null;\n /** Whether the server vends upload URLs via `__upload_url__/init`. */\n uploadUrlSupport: boolean;\n /** Cap on the size of an externalized upload (bytes). */\n maxUploadBytes: number | null;\n /** Monotonic-time-ish epoch (ms) at which this snapshot should be re-probed. */\n cacheExpiresAt: number | null;\n}\n\nconst MAX_REQUEST_BYTES_HEADER = \"VGI-Max-Request-Bytes\";\nconst UPLOAD_URL_HEADER = \"VGI-Upload-URL-Support\";\nconst MAX_UPLOAD_BYTES_HEADER = \"VGI-Max-Upload-Bytes\";\n\nfunction parseHeaderInt(headers: Headers, name: string): number | null {\n const raw = headers.get(name) ?? headers.get(name.toLowerCase());\n if (raw == null) return null;\n const parsed = Number.parseInt(raw, 10);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nexport function parseCapabilitiesFromHeaders(headers: Headers): HttpServerCapabilities {\n const uploadRaw = headers.get(UPLOAD_URL_HEADER) ?? headers.get(UPLOAD_URL_HEADER.toLowerCase());\n const uploadUrlSupport = uploadRaw === \"true\";\n\n let cacheExpiresAt: number | null = null;\n const cc = headers.get(\"Cache-Control\") ?? headers.get(\"cache-control\");\n if (cc) {\n for (const token of cc.split(\",\")) {\n const t = token.trim().toLowerCase();\n if (t.startsWith(\"max-age=\")) {\n const seconds = Number.parseFloat(t.slice(\"max-age=\".length));\n if (Number.isFinite(seconds)) {\n cacheExpiresAt = Date.now() + seconds * 1000;\n }\n break;\n }\n }\n }\n\n return {\n maxRequestBytes: parseHeaderInt(headers, MAX_REQUEST_BYTES_HEADER),\n uploadUrlSupport,\n maxUploadBytes: parseHeaderInt(headers, MAX_UPLOAD_BYTES_HEADER),\n cacheExpiresAt,\n };\n}\n\nexport async function discoverHttpCapabilities(\n baseUrl: string,\n prefix: string,\n authorization?: string,\n): Promise<HttpServerCapabilities> {\n const headers: Record<string, string> = {};\n if (authorization) headers.Authorization = authorization;\n const resp = await fetch(`${baseUrl}${prefix}/health`, {\n method: \"OPTIONS\",\n headers,\n });\n // Capability headers are advertised on every response; we don't require 200.\n return parseCapabilitiesFromHeaders(resp.headers);\n}\n\nexport function isCapabilitySnapshotFresh(snapshot: HttpServerCapabilities | null): boolean {\n if (!snapshot) return false;\n if (snapshot.cacheExpiresAt == null) return true;\n return Date.now() < snapshot.cacheExpiresAt;\n}\n",
14
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema as ArrowSchema, type RecordBatch, type Schema } from \"@query-farm/apache-arrow\";\nimport { deserializeSchema as deserializeSchemaImpl } from \"#vgi-rpc-arrow\";\nimport { DESCRIBE_METHOD_NAME, PROTOCOL_NAME_KEY, PROTOCOL_VERSION_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport { buildRequestIpc, dispatchLogOrError, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage } from \"./types.js\";\n\nexport interface MethodInfo {\n name: string;\n type: \"unary\" | \"stream\";\n paramsSchema: Schema;\n resultSchema: Schema;\n inputSchema?: Schema;\n outputSchema?: Schema;\n headerSchema?: Schema;\n doc?: string;\n paramTypes?: Record<string, string>;\n defaults?: Record<string, any>;\n}\n\nexport interface ServiceDescription {\n protocolName: string;\n /** Application protocol surface version surfaced by the server's\n * __describe__ response. Empty string when the server did not declare\n * a `protocolVersion`. */\n protocolVersion: string;\n methods: MethodInfo[];\n}\n\n/**\n * Deserialize a schema from IPC bytes (schema message + EOS).\n *\n * Must dispatch via `#vgi-rpc-arrow` so the resulting type instances are\n * the same impl (apache-arrow / flechette) as the rest of the active\n * backend. Using apache-arrow's `RecordBatchReader` directly here used to\n * silently mix impls: in browser builds the backend is flechette, and a\n * flechette builder receiving an apache-arrow `Binary` type defaults to\n * the wrong offsets buffer (Uint8Array instead of Int32Array) and emits\n * a 0-byte value where a populated binary column was expected. The\n * downstream symptom is \"Tried reading schema message, was null or\n * length 0\" from the server when it tries to open the (empty) binary\n * column as a nested IPC stream. See test/client/ipc-cross-impl.test.ts.\n */\nfunction deserializeSchema(bytes: Uint8Array): Schema {\n return deserializeSchemaImpl(bytes) as unknown as Schema;\n}\n\n/**\n * Parse a __describe__ response from batches into a ServiceDescription.\n * Reusable across transports (HTTP, pipe, subprocess).\n */\nexport async function parseDescribeResponse(\n batches: RecordBatch[],\n onLog?: (msg: LogMessage) => void,\n): Promise<ServiceDescription> {\n // Find the data batch (skip log/error batches)\n let dataBatch = null;\n for (const batch of batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n dataBatch = batch;\n }\n\n if (!dataBatch) {\n throw new Error(\"Empty __describe__ response\");\n }\n\n // Extract metadata from batch\n const meta = dataBatch.metadata;\n const protocolName = meta?.get(PROTOCOL_NAME_KEY) ?? \"\";\n const protocolVersion = meta?.get(PROTOCOL_VERSION_KEY) ?? \"\";\n\n // Slim DESCRIBE_VERSION 4 wire format (see dispatch/describe.ts):\n // 0:name 1:method_type 2:has_return 3:params_schema_ipc\n // 4:result_schema_ipc 5:has_header 6:header_schema_ipc 7:is_exchange\n const methods: MethodInfo[] = [];\n for (let i = 0; i < dataBatch.numRows; i++) {\n const name = dataBatch.getChildAt(0)!.get(i) as string;\n const methodType = dataBatch.getChildAt(1)!.get(i) as string;\n const _hasReturn = dataBatch.getChildAt(2)!.get(i) as boolean;\n const paramsIpc = dataBatch.getChildAt(3)!.get(i) as Uint8Array;\n const resultIpc = dataBatch.getChildAt(4)!.get(i) as Uint8Array;\n const hasHeader = dataBatch.getChildAt(5)!.get(i) as boolean;\n const headerIpc = dataBatch.getChildAt(6)?.get(i) as Uint8Array | null;\n // is_exchange (index 7) currently unused on the client side.\n\n const paramsSchema = await deserializeSchema(paramsIpc);\n const resultSchema = await deserializeSchema(resultIpc);\n\n const info: MethodInfo = {\n name,\n type: methodType as \"unary\" | \"stream\",\n paramsSchema,\n resultSchema,\n };\n\n // For stream methods, result_schema_ipc actually holds the output schema\n if (methodType === \"stream\") {\n info.outputSchema = resultSchema;\n }\n\n if (hasHeader && headerIpc) {\n info.headerSchema = await deserializeSchema(headerIpc);\n }\n\n methods.push(info);\n }\n\n return { protocolName, protocolVersion, methods };\n}\n\n/**\n * Send a __describe__ request and return a ServiceDescription.\n */\nexport async function httpIntrospect(\n baseUrl: string,\n options?: {\n prefix?: string;\n authorization?: string;\n compressionLevel?: number;\n compressFn?: (data: Uint8Array, level: number) => Promise<Uint8Array>;\n decompressFn?: (data: Uint8Array) => Promise<Uint8Array>;\n },\n): Promise<ServiceDescription> {\n const prefix = options?.prefix ?? \"\";\n const emptySchema = new ArrowSchema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n\n const headers: Record<string, string> = { \"Content-Type\": ARROW_CONTENT_TYPE };\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n\n const level = options?.compressionLevel;\n const compressFn = options?.compressFn;\n const decompressFn = options?.decompressFn;\n let sendBody: Uint8Array = body;\n if (level != null && compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n sendBody = await compressFn(body, level);\n }\n if (level != null && decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n\n const response = await fetch(`${baseUrl}${prefix}/${DESCRIBE_METHOD_NAME}`, {\n method: \"POST\",\n headers,\n body: sendBody as unknown as BodyInit,\n });\n if (response.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n let responseBody = new Uint8Array(await response.arrayBuffer());\n if (response.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n responseBody = new Uint8Array(await decompressFn(responseBody));\n }\n const { batches } = await readResponseBatches(responseBody);\n\n return parseDescribeResponse(batches);\n}\n",
14
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Schema as ArrowSchema, type RecordBatch, type Schema } from \"@query-farm/apache-arrow\";\nimport { deserializeSchema as deserializeSchemaImpl } from \"#vgi-rpc-arrow\";\nimport { DESCRIBE_METHOD_NAME, PROTOCOL_NAME_KEY, PROTOCOL_VERSION_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport { buildRequestIpc, dispatchLogOrError, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage } from \"./types.js\";\n\n/** Describes a single RPC method as reported by the server's `__describe__` response. */\nexport interface MethodInfo {\n /** The method name as invoked by {@link RpcClient.call} / {@link RpcClient.stream}. */\n name: string;\n /** Whether the method is a single request/response (`unary`) or a streaming method (`stream`). */\n type: \"unary\" | \"stream\";\n /** Arrow schema of the call parameters. */\n paramsSchema: Schema;\n /** Arrow schema of a unary result; for stream methods this holds the per-batch output schema. */\n resultSchema: Schema;\n /** Arrow schema of the per-batch input rows for exchange streams, when available. */\n inputSchema?: Schema;\n /** Arrow schema of the per-batch output rows for stream methods, when available. */\n outputSchema?: Schema;\n /** Arrow schema of the stream's one-time header row, when the method declares one. */\n headerSchema?: Schema;\n /** Human-readable documentation for the method, if the server provides it. */\n doc?: string;\n /** Per-parameter human-readable type names, if the server provides them. */\n paramTypes?: Record<string, string>;\n /** Default values applied to omitted parameters before a call is sent. */\n defaults?: Record<string, any>;\n}\n\n/** The full set of methods and protocol metadata reported by a server's `__describe__`. */\nexport interface ServiceDescription {\n /** The server's declared protocol/service name. */\n protocolName: string;\n /** Application protocol surface version surfaced by the server's\n * __describe__ response. Empty string when the server did not declare\n * a `protocolVersion`. */\n protocolVersion: string;\n /** Every method the server exposes (excluding the built-in `__describe__`). */\n methods: MethodInfo[];\n}\n\n/**\n * Deserialize a schema from IPC bytes (schema message + EOS).\n *\n * Must dispatch via `#vgi-rpc-arrow` so the resulting type instances are\n * the same impl (apache-arrow / flechette) as the rest of the active\n * backend. Using apache-arrow's `RecordBatchReader` directly here used to\n * silently mix impls: in browser builds the backend is flechette, and a\n * flechette builder receiving an apache-arrow `Binary` type defaults to\n * the wrong offsets buffer (Uint8Array instead of Int32Array) and emits\n * a 0-byte value where a populated binary column was expected. The\n * downstream symptom is \"Tried reading schema message, was null or\n * length 0\" from the server when it tries to open the (empty) binary\n * column as a nested IPC stream. See test/client/ipc-cross-impl.test.ts.\n */\nfunction deserializeSchema(bytes: Uint8Array): Schema {\n return deserializeSchemaImpl(bytes) as unknown as Schema;\n}\n\n/**\n * Parse a __describe__ response from batches into a ServiceDescription.\n * Reusable across transports (HTTP, pipe, subprocess).\n */\nexport async function parseDescribeResponse(\n batches: RecordBatch[],\n onLog?: (msg: LogMessage) => void,\n): Promise<ServiceDescription> {\n // Find the data batch (skip log/error batches)\n let dataBatch = null;\n for (const batch of batches) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n dataBatch = batch;\n }\n\n if (!dataBatch) {\n throw new Error(\"Empty __describe__ response\");\n }\n\n // Extract metadata from batch\n const meta = dataBatch.metadata;\n const protocolName = meta?.get(PROTOCOL_NAME_KEY) ?? \"\";\n const protocolVersion = meta?.get(PROTOCOL_VERSION_KEY) ?? \"\";\n\n // Slim DESCRIBE_VERSION 4 wire format (see dispatch/describe.ts):\n // 0:name 1:method_type 2:has_return 3:params_schema_ipc\n // 4:result_schema_ipc 5:has_header 6:header_schema_ipc 7:is_exchange\n const methods: MethodInfo[] = [];\n for (let i = 0; i < dataBatch.numRows; i++) {\n const name = dataBatch.getChildAt(0)!.get(i) as string;\n const methodType = dataBatch.getChildAt(1)!.get(i) as string;\n const _hasReturn = dataBatch.getChildAt(2)!.get(i) as boolean;\n const paramsIpc = dataBatch.getChildAt(3)!.get(i) as Uint8Array;\n const resultIpc = dataBatch.getChildAt(4)!.get(i) as Uint8Array;\n const hasHeader = dataBatch.getChildAt(5)!.get(i) as boolean;\n const headerIpc = dataBatch.getChildAt(6)?.get(i) as Uint8Array | null;\n // is_exchange (index 7) currently unused on the client side.\n\n const paramsSchema = await deserializeSchema(paramsIpc);\n const resultSchema = await deserializeSchema(resultIpc);\n\n const info: MethodInfo = {\n name,\n type: methodType as \"unary\" | \"stream\",\n paramsSchema,\n resultSchema,\n };\n\n // For stream methods, result_schema_ipc actually holds the output schema\n if (methodType === \"stream\") {\n info.outputSchema = resultSchema;\n }\n\n if (hasHeader && headerIpc) {\n info.headerSchema = await deserializeSchema(headerIpc);\n }\n\n methods.push(info);\n }\n\n return { protocolName, protocolVersion, methods };\n}\n\n/**\n * Send a __describe__ request and return a ServiceDescription.\n */\nexport async function httpIntrospect(\n baseUrl: string,\n options?: {\n prefix?: string;\n authorization?: string;\n compressionLevel?: number;\n compressFn?: (data: Uint8Array, level: number) => Promise<Uint8Array>;\n decompressFn?: (data: Uint8Array) => Promise<Uint8Array>;\n },\n): Promise<ServiceDescription> {\n const prefix = options?.prefix ?? \"\";\n const emptySchema = new ArrowSchema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n\n const headers: Record<string, string> = { \"Content-Type\": ARROW_CONTENT_TYPE };\n if (options?.authorization) {\n headers.Authorization = options.authorization;\n }\n\n const level = options?.compressionLevel;\n const compressFn = options?.compressFn;\n const decompressFn = options?.decompressFn;\n let sendBody: Uint8Array = body;\n if (level != null && compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n sendBody = await compressFn(body, level);\n }\n if (level != null && decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n\n const response = await fetch(`${baseUrl}${prefix}/${DESCRIBE_METHOD_NAME}`, {\n method: \"POST\",\n headers,\n body: sendBody as unknown as BodyInit,\n });\n if (response.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n let responseBody = new Uint8Array(await response.arrayBuffer());\n if (response.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n responseBody = new Uint8Array(await decompressFn(responseBody));\n }\n const { batches } = await readResponseBatches(responseBody);\n\n return parseDescribeResponse(batches);\n}\n",
15
15
  "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Binary,\n Bool,\n DataType,\n Float64,\n Int64,\n type RecordBatch,\n RecordBatchReader,\n type Schema,\n Utf8,\n} from \"@query-farm/apache-arrow\";\nimport { emptyBatchWithMetadata, singleRowBatchWithMetadata } from \"#vgi-rpc-arrow\";\nimport {\n LOG_EXTRA_KEY,\n LOG_LEVEL_KEY,\n LOG_MESSAGE_KEY,\n PROTOCOL_VERSION_KEY,\n REQUEST_VERSION,\n REQUEST_VERSION_KEY,\n RPC_METHOD_KEY,\n} from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { LogMessage } from \"./types.js\";\n\n/** Infer an Arrow DataType from a JS value. */\nexport function inferArrowType(value: any): DataType {\n if (typeof value === \"string\") return new Utf8();\n if (typeof value === \"boolean\") return new Bool();\n if (typeof value === \"bigint\") return new Int64();\n if (typeof value === \"number\") return new Float64();\n if (value instanceof Uint8Array) return new Binary();\n return new Utf8(); // fallback\n}\n\n/**\n * Recursively coerce JS values to match Arrow type expectations.\n * Converts numbers to BigInt for Int64 fields, and recurses into Map/List types.\n */\nfunction coerceForArrow(type: DataType, value: any): any {\n if (value == null) return value;\n\n // Int64: convert number → BigInt\n if (DataType.isInt(type) && (type as any).bitWidth === 64) {\n if (typeof value === \"number\") return BigInt(value);\n return value;\n }\n\n // Map_: coerce map values recursively\n if (DataType.isMap(type)) {\n if (value instanceof Map) {\n const entriesField = (type as any).children[0];\n const valueType = entriesField.type.children[1].type;\n const coerced = new Map();\n for (const [k, v] of value) {\n coerced.set(k, coerceForArrow(valueType, v));\n }\n return coerced;\n }\n return value;\n }\n\n // List: coerce elements recursively\n if (DataType.isList(type)) {\n if (Array.isArray(value)) {\n const elemType = (type as any).children[0].type;\n return value.map((v: any) => coerceForArrow(elemType, v));\n }\n return value;\n }\n\n return value;\n}\n\n/**\n * Build a 1-row Arrow IPC request batch with method metadata.\n *\n * When `options.protocolVersion` is non-empty, the value is emitted as\n * `vgi_rpc.protocol_version` so servers that declare a Protocol-level\n * version validate the request at the dispatch boundary.\n */\nexport function buildRequestIpc(\n schema: Schema,\n params: Record<string, any>,\n method: string,\n options?: { protocolVersion?: string },\n): Uint8Array {\n const metadata = new Map<string, string>();\n metadata.set(RPC_METHOD_KEY, method);\n metadata.set(REQUEST_VERSION_KEY, REQUEST_VERSION);\n if (options?.protocolVersion) {\n metadata.set(PROTOCOL_VERSION_KEY, options.protocolVersion);\n }\n\n // Build the batch through the impl-agnostic #vgi-rpc-arrow layer so this\n // works under both backends. `buildRequestIpc` previously constructed an\n // apache-arrow RecordBatch directly and handed it to `serializeIpcStream`,\n // which then dispatched to the backend's `serializeBatches`. Under the\n // browser/worker condition that backend is flechette, and flechette's\n // `tablesToIPC` cannot read apache-arrow's RecordBatch shape — the cross-\n // impl mixing was silently broken (no browser tests cover this path; see\n // test/client/ipc-cross-impl.test.ts). The abstract helpers produce a\n // 0-row metadata-bearing batch for the empty-schema case (which servers\n // accept identically to a 1-row × 0-col batch) and a 1-row batch with\n // coerced field values otherwise.\n if (schema.fields.length === 0) {\n const batch = emptyBatchWithMetadata(schema, metadata);\n return serializeIpcStream(schema, [batch]);\n }\n\n const coerced: Record<string, any> = {};\n for (const f of schema.fields) {\n const raw = params[f.name];\n // Missing values must be sent as null. arrow-js's typed-array builders\n // throw \"Invalid argument type in ToBigInt\" when handed `undefined` for\n // an Int64 column; null builds a proper validity bitmap entry instead.\n coerced[f.name] = raw === undefined ? null : coerceForArrow(f.type, raw);\n }\n const batch = singleRowBatchWithMetadata(schema, coerced, metadata);\n return serializeIpcStream(schema, [batch]);\n}\n\n/**\n * Read schema + all batches from an IPC stream body.\n */\nexport async function readResponseBatches(body: Uint8Array): Promise<{ schema: Schema; batches: RecordBatch[] }> {\n const reader = await RecordBatchReader.from(body);\n await reader.open();\n const schema = reader.schema;\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Empty IPC stream: no schema\", \"\");\n }\n const batches = reader.readAll();\n return { schema, batches };\n}\n\n/**\n * Check if a zero-row batch carries log/error metadata.\n * If EXCEPTION → throw RpcError.\n * If other level → call onLog.\n * Returns true if the batch was consumed as a log/error.\n */\nexport function dispatchLogOrError(batch: RecordBatch, onLog?: (msg: LogMessage) => void): boolean {\n const meta = batch.metadata;\n if (!meta) return false;\n\n const level = meta.get(LOG_LEVEL_KEY);\n if (!level) return false;\n\n const message = meta.get(LOG_MESSAGE_KEY) ?? \"\";\n\n if (level === \"EXCEPTION\") {\n const extraStr = meta.get(LOG_EXTRA_KEY);\n let errorType = \"RpcError\";\n let errorMessage = message;\n let traceback = \"\";\n if (extraStr) {\n try {\n const extra = JSON.parse(extraStr);\n errorType = extra.exception_type ?? \"RpcError\";\n errorMessage = extra.exception_message ?? message;\n traceback = extra.traceback ?? \"\";\n } catch {}\n }\n throw new RpcError(errorType, errorMessage, traceback);\n }\n\n if (onLog) {\n const extraStr = meta.get(LOG_EXTRA_KEY);\n let extra: Record<string, any> | undefined;\n if (extraStr) {\n try {\n extra = JSON.parse(extraStr);\n } catch {}\n }\n onLog({ level, message, extra });\n }\n\n return true;\n}\n\n/**\n * Extract all rows from a batch as Record<string, any>[].\n * Converts BigInt to Number when safe.\n */\nexport function extractBatchRows(batch: RecordBatch): Record<string, any>[] {\n const rows: Record<string, any>[] = [];\n for (let r = 0; r < batch.numRows; r++) {\n const row: Record<string, any> = {};\n for (let i = 0; i < batch.schema.fields.length; i++) {\n const field = batch.schema.fields[i];\n let value = batch.getChildAt(i)?.get(r);\n if (typeof value === \"bigint\") {\n if (value >= BigInt(Number.MIN_SAFE_INTEGER) && value <= BigInt(Number.MAX_SAFE_INTEGER)) {\n value = Number(value);\n }\n }\n row[field.name] = value;\n }\n rows.push(row);\n }\n return rows;\n}\n\n/**\n * Read sequential IPC streams from a response body.\n * Returns an IpcStreamReader for reading header + data streams.\n */\nexport async function readSequentialStreams(body: Uint8Array): Promise<IpcStreamReader> {\n const stream = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(body);\n controller.close();\n },\n });\n return IpcStreamReader.create(stream);\n}\n",
16
16
  "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { type RecordBatch, RecordBatchReader, type Schema } from \"@query-farm/apache-arrow\";\nimport type { VgiBatch, VgiSchema } from \"../arrow/index.js\";\n\nexport interface StreamMessage {\n schema: VgiSchema;\n batches: VgiBatch[];\n}\n\n/**\n * Reads sequential IPC streams from a byte source (e.g., process.stdin).\n * Uses autoDestroy: false + reset/open pattern to read multiple streams\n * from the same underlying byte source.\n */\nexport class IpcStreamReader {\n private reader: RecordBatchReader;\n private initialized = false;\n /** True once readNextBatch() returns null (EOS reached for current stream). */\n private streamEnded = false;\n\n private constructor(reader: RecordBatchReader) {\n this.reader = reader;\n }\n\n static async create(input: ReadableStream<Uint8Array> | NodeJS.ReadableStream): Promise<IpcStreamReader> {\n const reader = await RecordBatchReader.from(input as any);\n await reader.open({ autoDestroy: false });\n if (reader.closed) {\n throw new Error(\"Input stream closed before first IPC message\");\n }\n return new IpcStreamReader(reader);\n }\n\n /**\n * Read one complete IPC stream (schema + all batches).\n * Returns null on EOF (no more streams).\n */\n async readStream(): Promise<StreamMessage | null> {\n if (this.initialized) {\n // Advance to next stream\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n\n const schema = this.reader.schema;\n if (!schema) {\n return null;\n }\n\n const batches: RecordBatch[] = [];\n while (true) {\n const result = await this.reader.next();\n if (result.done) break;\n // Skip Arrow-JS synthetic placeholder for empty streams\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") break;\n batches.push(result.value);\n }\n\n return { schema, batches };\n }\n\n /**\n * Open the next IPC stream and return its schema.\n * Use readNextBatch() to read batches one at a time.\n * Returns null on EOF.\n */\n async openNextStream(): Promise<VgiSchema | null> {\n if (this.initialized) {\n await this.reader.reset().open();\n if (this.reader.closed) {\n return null;\n }\n }\n this.initialized = true;\n this.streamEnded = false;\n return this.reader.schema ?? null;\n }\n\n /**\n * Read the next batch from the currently open IPC stream.\n * Returns null when the stream ends (EOS).\n *\n * Once EOS is reached, subsequent calls return null immediately without\n * reading from the underlying byte source. This prevents the Arrow-JS\n * reader from consuming bytes that belong to the next IPC stream.\n */\n async readNextBatch(): Promise<VgiBatch | null> {\n if (this.streamEnded) return null;\n const result = await this.reader.next();\n if (result.done) {\n this.streamEnded = true;\n return null;\n }\n // Arrow-JS synthesizes a placeholder batch for streams with a schema but\n // zero real batches. Treat it as EOS so callers don't block trying to\n // read more bytes from a stream that has already ended.\n if (result.value.constructor.name === \"_InternalEmptyPlaceholderRecordBatch\") {\n this.streamEnded = true;\n return null;\n }\n return result.value;\n }\n\n async cancel(): Promise<void> {\n await this.reader.cancel();\n }\n}\n",
17
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Field, makeData, RecordBatch, Schema, Struct, vectorFromArray } from \"@query-farm/apache-arrow\";\nimport { STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { type ExternalLocationConfig, isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE, serializeIpcStream } from \"../http/common.js\";\nimport { dispatchLogOrError, extractBatchRows, inferArrowType, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage, StreamSession } from \"./types.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Promise<Uint8Array>;\ntype DecompressFn = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Posts an Arrow IPC request body to *url*, transparently handling\n * client-vended request externalization. Provided by the parent connection\n * so a single capability cache can drive both unary and stream call paths.\n */\nexport type PostFn = (url: string, body: Uint8Array) => Promise<Response>;\n\nexport class HttpStreamSession implements StreamSession {\n private _baseUrl: string;\n private _prefix: string;\n private _method: string;\n private _stateToken: string | null;\n private _outputSchema: Schema;\n private _inputSchema?: Schema;\n private _onLog?: (msg: LogMessage) => void;\n private _pendingBatches: RecordBatch[];\n private _finished: boolean;\n private _header: Record<string, any> | null;\n private _compressionLevel?: number;\n private _compressFn?: CompressFn;\n private _decompressFn?: DecompressFn;\n private _authorization?: string;\n private _externalConfig?: ExternalLocationConfig;\n private _postFn?: PostFn;\n\n constructor(opts: {\n baseUrl: string;\n prefix: string;\n method: string;\n stateToken: string | null;\n outputSchema: Schema;\n inputSchema?: Schema;\n onLog?: (msg: LogMessage) => void;\n pendingBatches: RecordBatch[];\n finished: boolean;\n header: Record<string, any> | null;\n compressionLevel?: number;\n compressFn?: CompressFn;\n decompressFn?: DecompressFn;\n authorization?: string;\n externalConfig?: ExternalLocationConfig;\n postFn?: PostFn;\n }) {\n this._baseUrl = opts.baseUrl;\n this._prefix = opts.prefix;\n this._method = opts.method;\n this._stateToken = opts.stateToken;\n this._outputSchema = opts.outputSchema;\n this._inputSchema = opts.inputSchema;\n this._onLog = opts.onLog;\n this._pendingBatches = opts.pendingBatches;\n this._finished = opts.finished;\n this._header = opts.header;\n this._compressionLevel = opts.compressionLevel;\n this._compressFn = opts.compressFn;\n this._decompressFn = opts.decompressFn;\n this._authorization = opts.authorization;\n this._externalConfig = opts.externalConfig;\n this._postFn = opts.postFn;\n }\n\n private async _post(url: string, body: Uint8Array): Promise<Response> {\n if (this._postFn) return this._postFn(url, body);\n return fetch(url, {\n method: \"POST\",\n headers: this._buildHeaders(),\n body: (await this._prepareBody(body)) as unknown as BodyInit,\n });\n }\n\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n private _buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (this._compressionLevel != null && this._compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n }\n if (this._compressionLevel != null && this._decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n if (this._authorization) {\n headers.Authorization = this._authorization;\n }\n return headers;\n }\n\n private async _prepareBody(content: Uint8Array): Promise<Uint8Array> {\n if (this._compressionLevel != null && this._compressFn) {\n return await this._compressFn(content, this._compressionLevel);\n }\n return content;\n }\n\n private async _readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && this._decompressFn) {\n body = new Uint8Array(await this._decompressFn(body));\n }\n return body;\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._stateToken === null) {\n throw new RpcError(\"ProtocolError\", \"Stream has finished \\u2014 no state token available\", \"\");\n }\n\n // We need to determine the input schema from the data.\n // Build a batch from the input rows using the output schema's field types.\n // For exchange, the input schema matches what the server expects.\n // We'll use the keys from input[0] to figure out columns.\n if (input.length === 0) {\n // Zero-row exchange: build an empty batch with state token.\n // Use inputSchema from __describe__ if available; fall back to\n // outputSchema so the server sees the correct column names.\n const zeroSchema = this._inputSchema ?? this._outputSchema;\n const emptyBatch = this._buildEmptyBatch(zeroSchema);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batchWithMeta = new RecordBatch(zeroSchema, emptyBatch.data, metadata);\n return this._doExchange(zeroSchema, [batchWithMeta]);\n }\n\n // Infer schema from first row values (input schema may differ from output).\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n // Find first non-null value to infer type\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n const nullable = input.some((row) => row[key] == null);\n return new Field(key, arrowType, nullable);\n });\n\n const inputSchema = new Schema(fields);\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batch = new RecordBatch(inputSchema, data, metadata);\n\n return this._doExchange(inputSchema, [batch]);\n }\n\n private async _doExchange(schema: Schema, batches: RecordBatch[]): Promise<Record<string, any>[]> {\n const body = serializeIpcStream(schema, batches);\n const resp = await this._post(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, body);\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n const responseBody = await this._readResponse(resp);\n const { batches: responseBatches } = await readResponseBatches(responseBody);\n\n let resultRows: Record<string, any>[] = [];\n for (const batch of responseBatches) {\n if (batch.numRows === 0) {\n // Could be log/error or state token\n dispatchLogOrError(batch, this._onLog);\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n continue;\n }\n\n // Data batch — extract state token from metadata\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n\n resultRows = extractBatchRows(batch);\n }\n\n return resultRows;\n }\n\n private _buildEmptyBatch(schema: Schema): RecordBatch {\n const children = schema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n return new RecordBatch(schema, data);\n }\n\n /**\n * Iterate over producer stream batches.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n // Yield pre-loaded batches from init\n for (let batch of this._pendingBatches) {\n if (batch.numRows === 0) {\n if (isExternalLocationBatch(batch)) {\n batch = (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n } else {\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n }\n yield extractBatchRows(batch);\n }\n this._pendingBatches = [];\n\n if (this._finished) return;\n if (this._stateToken === null) return;\n\n // Follow continuation tokens\n while (true) {\n const stateToken = this._stateToken;\n if (stateToken === null) return;\n const responseBody = await this._sendContinuation(stateToken);\n const { batches } = await readResponseBatches(responseBody);\n\n let gotContinuation = false;\n for (let batch of batches) {\n if (batch.numRows === 0) {\n // Check for continuation token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n gotContinuation = true;\n continue;\n }\n // Check for external location pointer\n if (isExternalLocationBatch(batch)) {\n batch = (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n } else {\n // Log/error batch\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n }\n\n yield extractBatchRows(batch);\n }\n\n if (!gotContinuation) break;\n }\n }\n\n private async _sendContinuation(token: string): Promise<Uint8Array> {\n const emptySchema = new Schema([]);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, token);\n\n const structType = new Struct(emptySchema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children: [],\n nullCount: 0,\n });\n const batch = new RecordBatch(emptySchema, data, metadata);\n const body = serializeIpcStream(emptySchema, [batch]);\n\n const resp = await this._post(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, body);\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n return this._readResponse(resp);\n }\n\n close(): void {\n // No-op for HTTP (stateless)\n }\n}\n",
17
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Field, makeData, RecordBatch, Schema, Struct, vectorFromArray } from \"@query-farm/apache-arrow\";\nimport { STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { type ExternalLocationConfig, isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE, serializeIpcStream } from \"../http/common.js\";\nimport { dispatchLogOrError, extractBatchRows, inferArrowType, readResponseBatches } from \"./ipc.js\";\nimport type { LogMessage, StreamSession } from \"./types.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Promise<Uint8Array>;\ntype DecompressFn = (data: Uint8Array) => Promise<Uint8Array>;\n\n/**\n * Posts an Arrow IPC request body to *url*, transparently handling\n * client-vended request externalization. Provided by the parent connection\n * so a single capability cache can drive both unary and stream call paths.\n */\nexport type PostFn = (url: string, body: Uint8Array) => Promise<Response>;\n\n/**\n * {@link StreamSession} implementation for the HTTP transport. Stream state is\n * carried statelessly across requests via an HMAC state token: each\n * {@link HttpStreamSession.exchange} or producer-continuation POST sends the\n * current token and receives the next one in the response metadata.\n */\nexport class HttpStreamSession implements StreamSession {\n private _baseUrl: string;\n private _prefix: string;\n private _method: string;\n private _stateToken: string | null;\n private _outputSchema: Schema;\n private _inputSchema?: Schema;\n private _onLog?: (msg: LogMessage) => void;\n private _pendingBatches: RecordBatch[];\n private _finished: boolean;\n private _header: Record<string, any> | null;\n private _compressionLevel?: number;\n private _compressFn?: CompressFn;\n private _decompressFn?: DecompressFn;\n private _authorization?: string;\n private _externalConfig?: ExternalLocationConfig;\n private _postFn?: PostFn;\n\n constructor(opts: {\n baseUrl: string;\n prefix: string;\n method: string;\n stateToken: string | null;\n outputSchema: Schema;\n inputSchema?: Schema;\n onLog?: (msg: LogMessage) => void;\n pendingBatches: RecordBatch[];\n finished: boolean;\n header: Record<string, any> | null;\n compressionLevel?: number;\n compressFn?: CompressFn;\n decompressFn?: DecompressFn;\n authorization?: string;\n externalConfig?: ExternalLocationConfig;\n postFn?: PostFn;\n }) {\n this._baseUrl = opts.baseUrl;\n this._prefix = opts.prefix;\n this._method = opts.method;\n this._stateToken = opts.stateToken;\n this._outputSchema = opts.outputSchema;\n this._inputSchema = opts.inputSchema;\n this._onLog = opts.onLog;\n this._pendingBatches = opts.pendingBatches;\n this._finished = opts.finished;\n this._header = opts.header;\n this._compressionLevel = opts.compressionLevel;\n this._compressFn = opts.compressFn;\n this._decompressFn = opts.decompressFn;\n this._authorization = opts.authorization;\n this._externalConfig = opts.externalConfig;\n this._postFn = opts.postFn;\n }\n\n private async _post(url: string, body: Uint8Array): Promise<Response> {\n if (this._postFn) return this._postFn(url, body);\n return fetch(url, {\n method: \"POST\",\n headers: this._buildHeaders(),\n body: (await this._prepareBody(body)) as unknown as BodyInit,\n });\n }\n\n /** The stream's one-time header row, or `null` if the method declares no header. */\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n private _buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (this._compressionLevel != null && this._compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n }\n if (this._compressionLevel != null && this._decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n if (this._authorization) {\n headers.Authorization = this._authorization;\n }\n return headers;\n }\n\n private async _prepareBody(content: Uint8Array): Promise<Uint8Array> {\n if (this._compressionLevel != null && this._compressFn) {\n return await this._compressFn(content, this._compressionLevel);\n }\n return content;\n }\n\n private async _readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && this._decompressFn) {\n body = new Uint8Array(await this._decompressFn(body));\n }\n return body;\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._stateToken === null) {\n throw new RpcError(\"ProtocolError\", \"Stream has finished \\u2014 no state token available\", \"\");\n }\n\n // We need to determine the input schema from the data.\n // Build a batch from the input rows using the output schema's field types.\n // For exchange, the input schema matches what the server expects.\n // We'll use the keys from input[0] to figure out columns.\n if (input.length === 0) {\n // Zero-row exchange: build an empty batch with state token.\n // Use inputSchema from __describe__ if available; fall back to\n // outputSchema so the server sees the correct column names.\n const zeroSchema = this._inputSchema ?? this._outputSchema;\n const emptyBatch = this._buildEmptyBatch(zeroSchema);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batchWithMeta = new RecordBatch(zeroSchema, emptyBatch.data, metadata);\n return this._doExchange(zeroSchema, [batchWithMeta]);\n }\n\n // Infer schema from first row values (input schema may differ from output).\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n // Find first non-null value to infer type\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n const nullable = input.some((row) => row[key] == null);\n return new Field(key, arrowType, nullable);\n });\n\n const inputSchema = new Schema(fields);\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, this._stateToken);\n const batch = new RecordBatch(inputSchema, data, metadata);\n\n return this._doExchange(inputSchema, [batch]);\n }\n\n private async _doExchange(schema: Schema, batches: RecordBatch[]): Promise<Record<string, any>[]> {\n const body = serializeIpcStream(schema, batches);\n const resp = await this._post(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, body);\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n const responseBody = await this._readResponse(resp);\n const { batches: responseBatches } = await readResponseBatches(responseBody);\n\n let resultRows: Record<string, any>[] = [];\n for (const batch of responseBatches) {\n if (batch.numRows === 0) {\n // Could be log/error or state token\n dispatchLogOrError(batch, this._onLog);\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n continue;\n }\n\n // Data batch — extract state token from metadata\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n }\n\n resultRows = extractBatchRows(batch);\n }\n\n return resultRows;\n }\n\n private _buildEmptyBatch(schema: Schema): RecordBatch {\n const children = schema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(schema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n return new RecordBatch(schema, data);\n }\n\n /**\n * Iterate over producer stream batches.\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n // Yield pre-loaded batches from init\n for (let batch of this._pendingBatches) {\n if (batch.numRows === 0) {\n if (isExternalLocationBatch(batch)) {\n batch = (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n } else {\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n }\n yield extractBatchRows(batch);\n }\n this._pendingBatches = [];\n\n if (this._finished) return;\n if (this._stateToken === null) return;\n\n // Follow continuation tokens\n while (true) {\n const stateToken = this._stateToken;\n if (stateToken === null) return;\n const responseBody = await this._sendContinuation(stateToken);\n const { batches } = await readResponseBatches(responseBody);\n\n let gotContinuation = false;\n for (let batch of batches) {\n if (batch.numRows === 0) {\n // Check for continuation token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n this._stateToken = token;\n gotContinuation = true;\n continue;\n }\n // Check for external location pointer\n if (isExternalLocationBatch(batch)) {\n batch = (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n } else {\n // Log/error batch\n dispatchLogOrError(batch, this._onLog);\n continue;\n }\n }\n\n yield extractBatchRows(batch);\n }\n\n if (!gotContinuation) break;\n }\n }\n\n private async _sendContinuation(token: string): Promise<Uint8Array> {\n const emptySchema = new Schema([]);\n const metadata = new Map<string, string>();\n metadata.set(STATE_KEY, token);\n\n const structType = new Struct(emptySchema.fields);\n const data = makeData({\n type: structType,\n length: 1,\n children: [],\n nullCount: 0,\n });\n const batch = new RecordBatch(emptySchema, data, metadata);\n const body = serializeIpcStream(emptySchema, [batch]);\n\n const resp = await this._post(`${this._baseUrl}${this._prefix}/${this._method}/exchange`, body);\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n\n return this._readResponse(resp);\n }\n\n /** No-op: the HTTP transport is stateless, so there is nothing to tear down. */\n close(): void {\n // No-op for HTTP (stateless)\n }\n}\n",
18
18
  "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/**\n * Client-side request-body externalization.\n *\n * When a request body would exceed the server-advertised `maxRequestBytes`,\n * we (1) call `{prefix}/__upload_url__/init` to get a pre-signed upload URL,\n * (2) PUT the body to that URL, and (3) replace the inline body with a\n * zero-row \"pointer\" IPC stream that carries the original RPC dispatch\n * metadata plus `vgi_rpc.location: <download-url>`. The server then resolves\n * the pointer and dispatches normally.\n *\n * Mirrors Python's `_externalize_via_upload_url()` and `request_upload_urls()`.\n */\n\nimport { Field, Int64, RecordBatchReader, Schema } from \"@query-farm/apache-arrow\";\nimport { REQUEST_VERSION, REQUEST_VERSION_KEY, RPC_METHOD_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { makeExternalLocationBatch } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE, serializeIpcStream } from \"../http/common.js\";\nimport { buildRequestIpc } from \"./ipc.js\";\n\nconst UPLOAD_URL_METHOD = \"__upload_url__\";\nconst UPLOAD_URL_PARAMS_SCHEMA = new Schema([new Field(\"count\", new Int64(), false)]);\n\nexport interface UploadUrlPair {\n uploadUrl: string;\n downloadUrl: string;\n expiresAt: Date;\n}\n\n/**\n * POST `__upload_url__/init` and return the requested number of pre-signed\n * URL pairs. Server must have an `uploadUrlProvider` configured; otherwise\n * the route returns 404 and we surface that as `RpcError(\"NotSupported\")`.\n */\nexport async function requestUploadUrls(\n baseUrl: string,\n prefix: string,\n count: number,\n authorization?: string,\n): Promise<UploadUrlPair[]> {\n const body = buildRequestIpc(UPLOAD_URL_PARAMS_SCHEMA, { count: BigInt(count) }, UPLOAD_URL_METHOD);\n const headers: Record<string, string> = { \"Content-Type\": ARROW_CONTENT_TYPE };\n if (authorization) headers.Authorization = authorization;\n\n const resp = await fetch(`${baseUrl}${prefix}/${UPLOAD_URL_METHOD}/init`, {\n method: \"POST\",\n headers,\n body: body as unknown as BodyInit,\n });\n if (resp.status === 404) {\n throw new RpcError(\"NotSupported\", \"Server does not support upload URLs\", \"\");\n }\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n if (!resp.ok) {\n throw new RpcError(\"HttpError\", `__upload_url__/init failed: HTTP ${resp.status}`, \"\");\n }\n\n const respBody = new Uint8Array(await resp.arrayBuffer());\n const reader = await RecordBatchReader.from(respBody);\n await reader.open();\n\n const pairs: UploadUrlPair[] = [];\n for (const batch of reader.readAll()) {\n if (batch.numRows === 0) continue;\n for (let r = 0; r < batch.numRows; r++) {\n const uploadUrl = batch.getChildAt(0)?.get(r) as string;\n const downloadUrl = batch.getChildAt(1)?.get(r) as string;\n const expiresRaw = batch.getChildAt(2)?.get(r);\n // Timestamp(us) → either a Date, a number (ms), or a bigint (us)\n let expiresAt: Date;\n if (expiresRaw instanceof Date) {\n expiresAt = expiresRaw;\n } else if (typeof expiresRaw === \"bigint\") {\n expiresAt = new Date(Number(expiresRaw / 1000n));\n } else if (typeof expiresRaw === \"number\") {\n expiresAt = new Date(expiresRaw);\n } else {\n expiresAt = new Date();\n }\n pairs.push({ uploadUrl, downloadUrl, expiresAt });\n }\n }\n\n if (pairs.length === 0) {\n throw new RpcError(\"ProtocolError\", \"Server returned no upload URLs\", \"\");\n }\n return pairs;\n}\n\n/**\n * Build the externalized pointer body to send in place of *originalBody*.\n *\n * The pointer is a zero-row IPC stream whose first batch carries:\n * - same schema as the original request batch\n * - merged custom_metadata: original RPC dispatch keys + `vgi_rpc.location`\n *\n * The server's request reader honours the dispatch keys for routing, then\n * resolves the pointer to fetch the inline batch for parameter extraction.\n */\nasync function buildPointerRequestBody(originalBody: Uint8Array, downloadUrl: string): Promise<Uint8Array> {\n const reader = await RecordBatchReader.from(originalBody);\n await reader.open();\n const schema = reader.schema;\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Original request body has no schema\", \"\");\n }\n const batches = reader.readAll();\n if (batches.length === 0) {\n throw new RpcError(\"ProtocolError\", \"Original request body has no batches\", \"\");\n }\n const original = batches[0];\n const originalMeta = original.metadata ?? new Map<string, string>();\n\n const pointer = makeExternalLocationBatch(schema, downloadUrl);\n const merged = new Map<string, string>(pointer.metadata ?? new Map());\n // Preserve the original RPC dispatch metadata so the server can route.\n const method = originalMeta.get(RPC_METHOD_KEY);\n const version = originalMeta.get(REQUEST_VERSION_KEY) ?? REQUEST_VERSION;\n if (method) merged.set(RPC_METHOD_KEY, method);\n merged.set(REQUEST_VERSION_KEY, version);\n // Carry over any other keys (request id, state token for exchange, etc).\n for (const [k, v] of originalMeta) {\n if (!merged.has(k)) merged.set(k, v);\n }\n\n // Re-emit the pointer batch with merged metadata.\n const { RecordBatch } = await import(\"@query-farm/apache-arrow\");\n const pointerWithMeta = new RecordBatch(schema as any, (pointer as any).data, merged);\n return serializeIpcStream(schema, [pointerWithMeta]);\n}\n\nexport interface ExternalizeOptions {\n baseUrl: string;\n prefix: string;\n authorization?: string;\n /** Optional per-URL validator; throw to reject. */\n urlValidator?: ((url: string) => void) | null;\n}\n\n/**\n * Upload *body* via a server-vended URL and return the pointer-batch body\n * that should be sent in place of the original. Throws if the server does\n * not advertise upload-URL support or the upload fails.\n */\nexport async function externalizeRequestBody(body: Uint8Array, opts: ExternalizeOptions): Promise<Uint8Array> {\n const pairs = await requestUploadUrls(opts.baseUrl, opts.prefix, 1, opts.authorization);\n const pair = pairs[0];\n\n if (opts.urlValidator) {\n opts.urlValidator(pair.uploadUrl);\n opts.urlValidator(pair.downloadUrl);\n }\n\n const putResp = await fetch(pair.uploadUrl, {\n method: \"PUT\",\n headers: { \"Content-Type\": ARROW_CONTENT_TYPE },\n body: body as unknown as BodyInit,\n });\n if (!putResp.ok) {\n throw new RpcError(\"ExternalUploadFailed\", `PUT to upload URL failed: HTTP ${putResp.status}`, \"\");\n }\n\n return buildPointerRequestBody(body, pair.downloadUrl);\n}\n",
19
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { RecordBatch, Schema } from \"@query-farm/apache-arrow\";\nimport { LOG_LEVEL_KEY, STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport {\n type HttpServerCapabilities,\n isCapabilitySnapshotFresh,\n parseCapabilitiesFromHeaders,\n} from \"./capabilities.js\";\nimport { httpIntrospect, type MethodInfo, type ServiceDescription } from \"./introspect.js\";\nimport {\n buildRequestIpc,\n dispatchLogOrError,\n extractBatchRows,\n readResponseBatches,\n readSequentialStreams,\n} from \"./ipc.js\";\nimport { HttpStreamSession } from \"./stream.js\";\nimport type { HttpConnectOptions, StreamSession } from \"./types.js\";\nimport { externalizeRequestBody } from \"./uploadUrl.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Promise<Uint8Array>;\ntype DecompressFn = (data: Uint8Array) => Promise<Uint8Array>;\n\nexport interface RpcClient {\n call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null>;\n stream(method: string, params?: Record<string, any>): Promise<StreamSession>;\n describe(): Promise<ServiceDescription>;\n close(): void;\n}\n\nexport function httpConnect(baseUrl: string, options?: HttpConnectOptions): RpcClient {\n const prefix = (options?.prefix ?? \"\").replace(/\\/+$/, \"\");\n const onLog = options?.onLog;\n const compressionLevel = options?.compressionLevel;\n const authorization = options?.authorization;\n const externalConfig = options?.externalLocation;\n\n let methodCache: Map<string, MethodInfo> | null = null;\n /** Application protocol surface version discovered via __describe__. When\n * non-empty, the client emits it on every request as\n * `vgi_rpc.protocol_version` so a versioned server can validate at the\n * dispatch boundary. */\n let serverProtocolVersion = \"\";\n let compressFn: CompressFn | undefined;\n let decompressFn: DecompressFn | undefined;\n let compressionLoaded = false;\n let capabilities: HttpServerCapabilities | null = null;\n\n function updateCapabilitiesFromResponse(resp: Response): void {\n const next = parseCapabilitiesFromHeaders(resp.headers);\n // Only treat the snapshot as authoritative when the server actually\n // emitted capability hints. Otherwise leave any prior cache in place.\n if (next.maxRequestBytes != null || next.uploadUrlSupport) {\n capabilities = next;\n }\n }\n\n async function maybeExternalize(body: Uint8Array): Promise<Uint8Array> {\n const caps = isCapabilitySnapshotFresh(capabilities) ? capabilities : null;\n if (!caps) return body;\n if (!caps.uploadUrlSupport) return body;\n if (caps.maxRequestBytes == null || body.byteLength <= caps.maxRequestBytes) return body;\n return externalizeRequestBody(body, {\n baseUrl,\n prefix,\n authorization,\n urlValidator: externalConfig?.urlValidator ?? null,\n });\n }\n\n /**\n * Send a POST request, transparently retrying with externalization if\n * the server returns 413 (Payload Too Large) and advertises upload-URL\n * support. Mirrors Python's 413 fallback in `_HttpProxy._post_with_externalization`.\n */\n async function postWithExternalization(url: string, body: Uint8Array): Promise<Response> {\n const sendBody = await maybeExternalize(body);\n let resp = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(),\n body: (await prepareBody(sendBody)) as unknown as BodyInit,\n });\n updateCapabilitiesFromResponse(resp);\n\n if (resp.status === 413 && capabilities?.uploadUrlSupport && body.byteLength > 0) {\n // Refresh-and-retry: caps tell us we can externalize.\n const externalized = await externalizeRequestBody(body, {\n baseUrl,\n prefix,\n authorization,\n urlValidator: externalConfig?.urlValidator ?? null,\n });\n resp = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(),\n body: (await prepareBody(externalized)) as unknown as BodyInit,\n });\n updateCapabilitiesFromResponse(resp);\n }\n\n return resp;\n }\n\n async function ensureCompression(): Promise<void> {\n if (compressionLoaded || compressionLevel == null) return;\n try {\n const mod = await import(\"../util/zstd.js\");\n compressFn = mod.zstdCompress;\n decompressFn = mod.zstdDecompress;\n } catch {\n // zstd not available in this runtime\n }\n compressionLoaded = true;\n }\n\n function buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (compressionLevel != null && compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n }\n if (compressionLevel != null && decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n if (authorization) {\n headers.Authorization = authorization;\n }\n return headers;\n }\n\n async function prepareBody(content: Uint8Array): Promise<Uint8Array> {\n if (compressionLevel != null && compressFn) {\n return await compressFn(content, compressionLevel);\n }\n return content;\n }\n\n function checkAuth(resp: Response): void {\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n }\n\n async function readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n body = new Uint8Array(await decompressFn(body));\n }\n return body;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n await ensureCompression();\n const desc = await httpIntrospect(baseUrl, {\n prefix,\n authorization,\n compressionLevel,\n compressFn,\n decompressFn,\n });\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n serverProtocolVersion = desc.protocolVersion;\n return methodCache;\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n const resp = await postWithExternalization(`${baseUrl}${prefix}/${method}`, body);\n checkAuth(resp);\n\n const responseBody = await readResponse(resp);\n const { batches } = await readResponseBatches(responseBody);\n\n // Process batches: dispatch logs, resolve external pointers, find result\n let resultBatch: RecordBatch | null = null;\n for (let batch of batches) {\n if (batch.numRows === 0) {\n // Check for external location pointer batch\n if (isExternalLocationBatch(batch as any)) {\n batch = (await resolveExternalLocation(batch as any, externalConfig)) as any;\n } else {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n // Void return (result schema has no fields)\n return null;\n }\n\n // Extract single-row result\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n const result = rows[0];\n // For void methods (empty result schema), return null\n if (info.resultSchema.fields.length === 0) return null;\n\n // For single-field results, return the whole object\n return result;\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<HttpStreamSession> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n const resp = await postWithExternalization(`${baseUrl}${prefix}/${method}/init`, body);\n checkAuth(resp);\n\n const responseBody = await readResponse(resp);\n\n // Parse the response: may contain header stream + data stream\n let header: Record<string, any> | null = null;\n let stateToken: string | null = null;\n const pendingBatches: RecordBatch[] = [];\n let finished = false;\n let streamSchema: Schema | null = null;\n\n if (info.headerSchema) {\n // Response may contain two concatenated IPC streams:\n // 1. Header stream\n // 2. Data stream (with state token and/or data batches)\n const reader = await readSequentialStreams(responseBody);\n\n // First stream: header\n const headerStream = await reader.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches as any[]) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n\n // Second stream: data/state\n const dataStream = await reader.readStream();\n if (dataStream) {\n streamSchema = dataStream.schema as any;\n }\n const headerErrorBatches: RecordBatch[] = [];\n if (dataStream) {\n for (const batch of dataStream.batches as any[]) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n headerErrorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n }\n\n if (headerErrorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...headerErrorBatches);\n } else {\n for (const batch of headerErrorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n\n if (!dataStream && !stateToken) {\n finished = true;\n }\n } else {\n // Single IPC stream: data/state (no header)\n const { schema: responseSchema, batches } = await readResponseBatches(responseBody);\n streamSchema = responseSchema;\n\n // Collect error batches separately — only defer them if there are\n // data batches or state tokens (mid-stream errors). Otherwise throw\n // immediately (init-only errors like exchange_error_on_init).\n const errorBatches: RecordBatch[] = [];\n\n for (const batch of batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n // Collect EXCEPTION batches for deferred dispatch\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n errorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n\n // If we have data batches or a state token, defer errors to iteration.\n // Otherwise throw immediately (error on init).\n if (errorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...errorBatches);\n } else {\n // No data, no state — this is a pure init error. Throw now.\n for (const batch of errorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n }\n\n if (pendingBatches.length === 0 && stateToken === null) {\n finished = true;\n }\n\n // Determine output schema: prefer the IPC stream schema from the init\n // response (it carries the server's actual output schema even for\n // zero-row token batches), then pending batch schemas, then describe info.\n const outputSchema =\n (streamSchema && streamSchema.fields.length > 0 ? streamSchema : null) ??\n (pendingBatches.length > 0 ? pendingBatches[0].schema : null) ??\n info.outputSchema ??\n info.resultSchema;\n\n return new HttpStreamSession({\n baseUrl,\n prefix,\n method,\n stateToken,\n outputSchema,\n inputSchema: info.inputSchema,\n onLog,\n pendingBatches,\n finished,\n header,\n compressionLevel,\n compressFn,\n decompressFn,\n authorization,\n externalConfig,\n postFn: postWithExternalization,\n });\n },\n\n async describe(): Promise<ServiceDescription> {\n await ensureCompression();\n return httpIntrospect(baseUrl, {\n prefix,\n authorization,\n compressionLevel,\n compressFn,\n decompressFn,\n });\n },\n\n close(): void {\n // No-op (HTTP stateless)\n },\n };\n}\n",
20
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** RFC 9728 OAuth Protected Resource Metadata (client-side response). */\nexport interface OAuthResourceMetadataResponse {\n resource: string;\n authorizationServers: string[];\n scopesSupported?: string[];\n bearerMethodsSupported?: string[];\n resourceSigningAlgValuesSupported?: string[];\n resourceName?: string;\n resourceDocumentation?: string;\n resourcePolicyUri?: string;\n resourceTosUri?: string;\n /** OAuth client_id advertised by the server. */\n clientId?: string;\n /** OAuth client_secret advertised by the server. */\n clientSecret?: string;\n /** When true, use the OIDC id_token as the Bearer token instead of access_token. */\n useIdTokenAsBearer?: boolean;\n /** OAuth client_id for device code flow. */\n deviceCodeClientId?: string;\n /** OAuth client_secret for device code flow. */\n deviceCodeClientSecret?: string;\n}\n\nfunction parseMetadataJson(json: Record<string, any>): OAuthResourceMetadataResponse {\n const result: OAuthResourceMetadataResponse = {\n resource: json.resource,\n authorizationServers: json.authorization_servers,\n };\n if (json.scopes_supported) result.scopesSupported = json.scopes_supported;\n if (json.bearer_methods_supported) result.bearerMethodsSupported = json.bearer_methods_supported;\n if (json.resource_signing_alg_values_supported)\n result.resourceSigningAlgValuesSupported = json.resource_signing_alg_values_supported;\n if (json.resource_name) result.resourceName = json.resource_name;\n if (json.resource_documentation) result.resourceDocumentation = json.resource_documentation;\n if (json.resource_policy_uri) result.resourcePolicyUri = json.resource_policy_uri;\n if (json.resource_tos_uri) result.resourceTosUri = json.resource_tos_uri;\n if (json.client_id) result.clientId = json.client_id;\n if (json.client_secret) result.clientSecret = json.client_secret;\n if (json.use_id_token_as_bearer) result.useIdTokenAsBearer = json.use_id_token_as_bearer;\n if (json.device_code_client_id) result.deviceCodeClientId = json.device_code_client_id;\n if (json.device_code_client_secret) result.deviceCodeClientSecret = json.device_code_client_secret;\n return result;\n}\n\n/**\n * Discover OAuth Protected Resource Metadata (RFC 9728) from a vgi-rpc server.\n * Returns `null` if the server does not serve the well-known endpoint.\n */\nexport async function httpOAuthMetadata(\n baseUrl: string,\n prefix?: string,\n): Promise<OAuthResourceMetadataResponse | null> {\n const effectivePrefix = (prefix ?? \"\").replace(/\\/+$/, \"\");\n const metadataUrl = `${baseUrl.replace(/\\/+$/, \"\")}/.well-known/oauth-protected-resource${effectivePrefix}`;\n\n try {\n return await fetchOAuthMetadata(metadataUrl);\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch OAuth Protected Resource Metadata from an explicit metadata URL.\n */\nexport async function fetchOAuthMetadata(metadataUrl: string): Promise<OAuthResourceMetadataResponse> {\n const response = await fetch(metadataUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch OAuth metadata from ${metadataUrl}: ${response.status}`);\n }\n const json = await response.json();\n return parseMetadataJson(json);\n}\n\n/**\n * Extract the `resource_metadata` URL from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no resource_metadata parameter is found.\n */\nexport function parseResourceMetadataUrl(wwwAuthenticate: string): string | null {\n // Parse Bearer challenge parameters per RFC 6750\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const metadataMatch = params.match(/resource_metadata=\"([^\"]+)\"/);\n if (!metadataMatch) return null;\n\n return metadataMatch[1];\n}\n\n/**\n * Extract the `client_id` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no client_id parameter is found.\n */\nexport function parseClientId(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const clientIdMatch = params.match(/client_id=\"([^\"]+)\"/);\n if (!clientIdMatch) return null;\n\n return clientIdMatch[1];\n}\n\n/**\n * Extract the `client_secret` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no client_secret parameter is found.\n */\nexport function parseClientSecret(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/client_secret=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n\n/**\n * Extract the `use_id_token_as_bearer` flag from a WWW-Authenticate Bearer challenge.\n * Returns `true` if the parameter is present and set to \"true\", `false` otherwise.\n */\nexport function parseUseIdTokenAsBearer(wwwAuthenticate: string): boolean {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return false;\n\n const params = bearerMatch[1];\n const match = params.match(/use_id_token_as_bearer=\"([^\"]+)\"/);\n if (!match) return false;\n\n return match[1] === \"true\";\n}\n\n/**\n * Extract the `device_code_client_id` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no device_code_client_id parameter is found.\n */\nexport function parseDeviceCodeClientId(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/device_code_client_id=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n\n/**\n * Extract the `device_code_client_secret` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no device_code_client_secret parameter is found.\n */\nexport function parseDeviceCodeClientSecret(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/device_code_client_secret=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n",
21
- "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Field,\n makeData,\n RecordBatch,\n RecordBatchStreamWriter,\n Schema,\n Struct,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { type ExternalLocationConfig, isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { RpcClient } from \"./connect.js\";\nimport { type MethodInfo, parseDescribeResponse, type ServiceDescription } from \"./introspect.js\";\nimport { buildRequestIpc, dispatchLogOrError, extractBatchRows, inferArrowType } from \"./ipc.js\";\nimport type { LogMessage, PipeConnectOptions, StreamSession, SubprocessConnectOptions } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Writable abstraction\n// ---------------------------------------------------------------------------\n\ninterface PipeWritable {\n write(data: Uint8Array): void;\n flush?(): void;\n end(): void;\n}\n\ntype WriteFn = (bytes: Uint8Array) => void;\n\n// ---------------------------------------------------------------------------\n// PipeIncrementalWriter — batch-by-batch IPC writing for lockstep streaming\n// ---------------------------------------------------------------------------\n\nclass PipeIncrementalWriter {\n private writer: RecordBatchStreamWriter;\n private writeFn: WriteFn;\n private closed = false;\n\n constructor(writeFn: WriteFn, schema: Schema) {\n this.writeFn = writeFn;\n this.writer = new RecordBatchStreamWriter();\n this.writer.reset(undefined, schema);\n this.drain(); // flushes schema message\n }\n\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"PipeIncrementalWriter already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n this.writeFn(eos);\n }\n\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n this.writeFn(chunk);\n }\n values.length = 0;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PipeStreamSession — lockstep streaming over pipes\n// ---------------------------------------------------------------------------\n\nexport class PipeStreamSession implements StreamSession {\n private _reader: IpcStreamReader;\n private _writeFn: WriteFn;\n private _onLog?: (msg: LogMessage) => void;\n private _header: Record<string, any> | null;\n private _inputWriter: PipeIncrementalWriter | null = null;\n private _inputSchema: Schema | null = null;\n private _outputStreamOpened = false;\n private _closed = false;\n private _outputSchema: Schema;\n private _releaseBusy: () => void;\n private _setDrainPromise: (p: Promise<void>) => void;\n private _externalConfig?: ExternalLocationConfig;\n\n constructor(opts: {\n reader: IpcStreamReader;\n writeFn: WriteFn;\n onLog?: (msg: LogMessage) => void;\n header: Record<string, any> | null;\n outputSchema: Schema;\n releaseBusy: () => void;\n setDrainPromise: (p: Promise<void>) => void;\n externalConfig?: ExternalLocationConfig;\n }) {\n this._reader = opts.reader;\n this._writeFn = opts.writeFn;\n this._onLog = opts.onLog;\n this._header = opts.header;\n this._outputSchema = opts.outputSchema;\n this._releaseBusy = opts.releaseBusy;\n this._setDrainPromise = opts.setDrainPromise;\n this._externalConfig = opts.externalConfig;\n }\n\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n /**\n * Read output batches from the server until a data batch is found.\n * Dispatches log/error batches along the way.\n * Returns null when server closes output stream (EOS).\n */\n private async _readOutputBatch(): Promise<RecordBatch | null> {\n while (true) {\n const batch = await this._reader.readNextBatch();\n if (batch === null) return null; // Server closed output stream\n\n if (batch.numRows === 0) {\n // Check for external location pointer batch\n if (isExternalLocationBatch(batch as any)) {\n return (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n }\n // Check if it's a log/error batch. If so, dispatch and continue.\n // Otherwise it's a zero-row data batch — return it.\n if (dispatchLogOrError(batch as any, this._onLog)) {\n continue;\n }\n }\n\n return batch as any;\n }\n }\n\n /**\n * Ensure the server's output stream is opened for reading.\n * Must be called AFTER sending the first input batch, because\n * the server's output schema may not be flushed until it processes\n * the first input and writes the first output batch.\n */\n private async _ensureOutputStream(): Promise<void> {\n if (this._outputStreamOpened) return;\n this._outputStreamOpened = true;\n const schema = await this._reader.openNextStream();\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Expected output stream but got EOF\", \"\");\n }\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._closed) {\n throw new RpcError(\"ProtocolError\", \"Stream session is closed\", \"\");\n }\n\n // Build input batch\n let inputSchema: Schema;\n let batch: RecordBatch;\n\n if (input.length === 0) {\n // Zero-row exchange: use cached input schema from a prior exchange,\n // then fall back to the output schema from describe. The cached\n // schema is preferred because input and output schemas may differ\n // (e.g. exchange_accumulate: input {value} → output {running_sum, exchange_count}).\n inputSchema = this._inputSchema ?? this._outputSchema;\n const children = inputSchema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n } else {\n // Infer schema from first row.\n // Always use nullable fields — the server validates input schemas\n // strictly and its schema typically uses nullable columns.\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n return new Field(key, arrowType, /* nullable */ true);\n });\n inputSchema = new Schema(fields);\n\n // Validate schema consistency: all exchanges on the same pipe session\n // share a single IPC stream, so the schema is locked to the first call.\n if (this._inputSchema) {\n const cached = this._inputSchema;\n if (\n cached.fields.length !== inputSchema.fields.length ||\n cached.fields.some((f, i) => f.name !== inputSchema.fields[i].name)\n ) {\n throw new RpcError(\n \"ProtocolError\",\n `Exchange input schema changed: expected [${cached.fields.map((f) => f.name).join(\", \")}] ` +\n `but got [${inputSchema.fields.map((f) => f.name).join(\", \")}]`,\n \"\",\n );\n }\n } else {\n this._inputSchema = inputSchema;\n }\n\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n }\n\n // Lazy-open input writer on first exchange\n if (!this._inputWriter) {\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, inputSchema);\n }\n\n // Write one input batch FIRST, then open output stream.\n // The server may not flush the output schema until it processes the\n // first input batch and writes the first output batch.\n this._inputWriter.write(batch);\n await this._ensureOutputStream();\n\n // Read output batch(es) from server\n try {\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n return [];\n }\n return extractBatchRows(outputBatch);\n } catch (e) {\n // On error, clean up the pipe so it's ready for the next request\n await this._cleanup();\n throw e;\n }\n }\n\n /**\n * Clean up after an error: close input, drain output, release busy.\n */\n private async _cleanup(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._releaseBusy();\n }\n\n /**\n * Iterate over producer stream batches (lockstep).\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n if (this._closed) return;\n\n try {\n // Open input writer with empty schema for tick batches\n const tickSchema = new Schema([]);\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, tickSchema);\n\n // Build a zero-row tick batch\n const structType = new Struct(tickSchema.fields);\n const tickData = makeData({\n type: structType,\n length: 0,\n children: [],\n nullCount: 0,\n });\n const tickBatch = new RecordBatch(tickSchema, tickData);\n\n while (true) {\n // Send one tick FIRST, then open output stream on first iteration.\n // The server may not flush the output schema until it processes the\n // first tick and writes the first output batch.\n this._inputWriter.write(tickBatch);\n await this._ensureOutputStream();\n\n // Read output batch(es)\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n // Server finished — EOS on output stream\n break;\n }\n\n yield extractBatchRows(outputBatch);\n }\n } finally {\n // Close input stream if still open\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n // Drain any remaining output batches\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._closed = true;\n this._releaseBusy();\n }\n }\n\n close(): void {\n if (this._closed) return;\n this._closed = true;\n\n if (this._inputWriter) {\n // Close the input stream (EOS)\n this._inputWriter.close();\n this._inputWriter = null;\n } else {\n // Never iterated/exchanged — send empty schema stream so server unblocks.\n // Server is blocked at reader.openNextStream() waiting for client's input.\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n this._writeFn(ipc);\n }\n\n // Drain remaining output batches asynchronously. Register the drain\n // promise so that the next acquireBusy() waits for it to complete.\n const drainPromise = (async () => {\n try {\n if (!this._outputStreamOpened) {\n const schema = await this._reader.openNextStream();\n if (schema) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } else {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n } finally {\n this._releaseBusy();\n }\n })();\n this._setDrainPromise(drainPromise);\n }\n}\n\n// ---------------------------------------------------------------------------\n// pipeConnect — create an RpcClient over raw readable/writable streams\n// ---------------------------------------------------------------------------\n\nexport function pipeConnect(\n readable: ReadableStream<Uint8Array>,\n writable: PipeWritable,\n options?: PipeConnectOptions,\n): RpcClient {\n const onLog = options?.onLog;\n const externalConfig = options?.externalLocation;\n\n let reader: IpcStreamReader | null = null;\n let readerPromise: Promise<IpcStreamReader> | null = null;\n let methodCache: Map<string, MethodInfo> | null = null;\n let protocolName = \"\";\n let serverProtocolVersion = \"\";\n let _busy = false;\n let _drainPromise: Promise<void> | null = null;\n let closed = false;\n\n const writeFn: WriteFn = (bytes: Uint8Array) => {\n writable.write(bytes);\n writable.flush?.();\n };\n\n // The IpcStreamReader.create() blocks until the first IPC schema arrives\n // on the readable. To avoid deadlock, we must send our first request\n // (the __describe__ call) BEFORE opening the reader. After that, the\n // response bytes are in the pipe buffer and the reader can consume them.\n async function ensureReader(): Promise<IpcStreamReader> {\n if (reader) return reader;\n if (!readerPromise) {\n readerPromise = IpcStreamReader.create(readable);\n }\n reader = await readerPromise;\n return reader;\n }\n\n async function acquireBusy(): Promise<void> {\n // Wait for any pending drain from a previous close()\n if (_drainPromise) {\n await _drainPromise;\n _drainPromise = null;\n }\n if (_busy) {\n throw new Error(\n \"Pipe transport is busy — another call or stream is in progress. \" +\n \"Pipe connections are single-threaded; wait for the current operation to complete.\",\n );\n }\n _busy = true;\n }\n\n function releaseBusy(): void {\n _busy = false;\n }\n\n function setDrainPromise(p: Promise<void>): void {\n _drainPromise = p;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n\n await acquireBusy();\n try {\n // Send __describe__ request BEFORE opening the reader.\n // IpcStreamReader.create() blocks on reader.open() which reads the\n // first schema message. The server won't write anything until it\n // receives a request. Sending first avoids deadlock.\n const emptySchema = new Schema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n writeFn(body);\n\n const r = await ensureReader();\n\n // Read response (first IPC stream = describe response schema + batches)\n // ensureReader() consumed the schema via open(). Use readStream()\n // which — on the first call (initialized=false) — returns the current\n // stream without calling reset().\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading __describe__ response\");\n }\n\n const desc = await parseDescribeResponse(response.batches as any, onLog);\n protocolName = desc.protocolName;\n serverProtocolVersion = desc.protocolVersion;\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n } finally {\n releaseBusy();\n }\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send request\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n writeFn(body);\n\n // Read response\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading response\");\n }\n\n // Process batches: dispatch logs, resolve external pointers, find result\n let resultBatch: RecordBatch | null = null;\n for (let batch of response.batches as any[]) {\n if (batch.numRows === 0) {\n if (isExternalLocationBatch(batch)) {\n batch = await resolveExternalLocation(batch, externalConfig);\n } else {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n return null;\n }\n\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n if (info.resultSchema.fields.length === 0) return null;\n\n return rows[0];\n } finally {\n releaseBusy();\n }\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<StreamSession> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send init request (params as a complete IPC stream)\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n writeFn(body);\n\n // Read header if method has headerSchema\n let header: Record<string, any> | null = null;\n if (info.headerSchema) {\n const headerStream = await r.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches as any[]) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n }\n\n const outputSchema = info.outputSchema ?? info.resultSchema;\n\n // Don't release busy here — PipeStreamSession owns the lock\n // and will release it when done\n return new PipeStreamSession({\n reader: r,\n writeFn,\n onLog,\n header,\n outputSchema,\n releaseBusy,\n setDrainPromise,\n externalConfig,\n });\n } catch (e) {\n // Init error (e.g., server raised exception during init).\n // Send empty input stream so server's drain unblocks, then\n // drain the server's output stream if needed.\n try {\n const r = await ensureReader();\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n writeFn(ipc);\n // Drain server's output stream (error response + EOS)\n const outStream = await r.readStream();\n // outStream may be null or contain remaining batches — just consume\n void outStream;\n } catch {\n // Suppress errors during cleanup\n }\n releaseBusy();\n throw e;\n }\n },\n\n async describe(): Promise<ServiceDescription> {\n const methods = await ensureMethodCache();\n return {\n protocolName,\n protocolVersion: serverProtocolVersion,\n methods: [...methods.values()],\n };\n },\n\n close(): void {\n if (closed) return;\n closed = true;\n writable.end();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// subprocessConnect — spawn a process and wrap with pipeConnect\n// ---------------------------------------------------------------------------\n\nexport function subprocessConnect(cmd: string[], options?: SubprocessConnectOptions): RpcClient {\n const proc = Bun.spawn(cmd, {\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: options?.stderr ?? \"ignore\",\n cwd: options?.cwd,\n env: options?.env ? { ...process.env, ...options.env } : undefined,\n });\n\n const stdout = proc.stdout as ReadableStream<Uint8Array>;\n\n const writable: PipeWritable = {\n write(data: Uint8Array) {\n (proc.stdin as any).write(data);\n },\n flush() {\n (proc.stdin as any).flush();\n },\n end() {\n (proc.stdin as any).end();\n },\n };\n\n const client = pipeConnect(stdout, writable, {\n onLog: options?.onLog,\n externalLocation: options?.externalLocation,\n });\n\n // Wrap close to also kill the subprocess\n const originalClose = client.close;\n client.close = () => {\n originalClose.call(client);\n try {\n proc.kill();\n } catch {\n // Process may have already exited\n }\n };\n\n return client;\n}\n"
19
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { RecordBatch, Schema } from \"@query-farm/apache-arrow\";\nimport { LOG_LEVEL_KEY, STATE_KEY } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { ARROW_CONTENT_TYPE } from \"../http/common.js\";\nimport {\n type HttpServerCapabilities,\n isCapabilitySnapshotFresh,\n parseCapabilitiesFromHeaders,\n} from \"./capabilities.js\";\nimport { httpIntrospect, type MethodInfo, type ServiceDescription } from \"./introspect.js\";\nimport {\n buildRequestIpc,\n dispatchLogOrError,\n extractBatchRows,\n readResponseBatches,\n readSequentialStreams,\n} from \"./ipc.js\";\nimport { HttpStreamSession } from \"./stream.js\";\nimport type { HttpConnectOptions, StreamSession } from \"./types.js\";\nimport { externalizeRequestBody } from \"./uploadUrl.js\";\n\ntype CompressFn = (data: Uint8Array, level: number) => Promise<Uint8Array>;\ntype DecompressFn = (data: Uint8Array) => Promise<Uint8Array>;\n\n/** A connected RPC client, returned by {@link httpConnect}, {@link pipeConnect}, and {@link subprocessConnect}. */\nexport interface RpcClient {\n /** Invoke a unary method. Returns the single result row, or `null` for void methods. Parameter defaults from `__describe__` are applied automatically. */\n call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null>;\n /** Open a streaming method, returning a {@link StreamSession} for exchange or producer iteration. */\n stream(method: string, params?: Record<string, any>): Promise<StreamSession>;\n /** Fetch the server's method/protocol description (cached after the first call). */\n describe(): Promise<ServiceDescription>;\n /** Release transport resources; for subprocess clients this also terminates the child process. */\n close(): void;\n}\n\n/**\n * Connect to a vgi-rpc server over HTTP. The returned client lazily introspects\n * the server (caching `__describe__`) on the first call and transparently handles\n * zstd compression, authorization, and 413 request externalization.\n */\nexport function httpConnect(baseUrl: string, options?: HttpConnectOptions): RpcClient {\n const prefix = (options?.prefix ?? \"\").replace(/\\/+$/, \"\");\n const onLog = options?.onLog;\n const compressionLevel = options?.compressionLevel;\n const authorization = options?.authorization;\n const externalConfig = options?.externalLocation;\n\n let methodCache: Map<string, MethodInfo> | null = null;\n /** Application protocol surface version discovered via __describe__. When\n * non-empty, the client emits it on every request as\n * `vgi_rpc.protocol_version` so a versioned server can validate at the\n * dispatch boundary. */\n let serverProtocolVersion = \"\";\n let compressFn: CompressFn | undefined;\n let decompressFn: DecompressFn | undefined;\n let compressionLoaded = false;\n let capabilities: HttpServerCapabilities | null = null;\n\n function updateCapabilitiesFromResponse(resp: Response): void {\n const next = parseCapabilitiesFromHeaders(resp.headers);\n // Only treat the snapshot as authoritative when the server actually\n // emitted capability hints. Otherwise leave any prior cache in place.\n if (next.maxRequestBytes != null || next.uploadUrlSupport) {\n capabilities = next;\n }\n }\n\n async function maybeExternalize(body: Uint8Array): Promise<Uint8Array> {\n const caps = isCapabilitySnapshotFresh(capabilities) ? capabilities : null;\n if (!caps) return body;\n if (!caps.uploadUrlSupport) return body;\n if (caps.maxRequestBytes == null || body.byteLength <= caps.maxRequestBytes) return body;\n return externalizeRequestBody(body, {\n baseUrl,\n prefix,\n authorization,\n urlValidator: externalConfig?.urlValidator ?? null,\n });\n }\n\n /**\n * Send a POST request, transparently retrying with externalization if\n * the server returns 413 (Payload Too Large) and advertises upload-URL\n * support. Mirrors Python's 413 fallback in `_HttpProxy._post_with_externalization`.\n */\n async function postWithExternalization(url: string, body: Uint8Array): Promise<Response> {\n const sendBody = await maybeExternalize(body);\n let resp = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(),\n body: (await prepareBody(sendBody)) as unknown as BodyInit,\n });\n updateCapabilitiesFromResponse(resp);\n\n if (resp.status === 413 && capabilities?.uploadUrlSupport && body.byteLength > 0) {\n // Refresh-and-retry: caps tell us we can externalize.\n const externalized = await externalizeRequestBody(body, {\n baseUrl,\n prefix,\n authorization,\n urlValidator: externalConfig?.urlValidator ?? null,\n });\n resp = await fetch(url, {\n method: \"POST\",\n headers: buildHeaders(),\n body: (await prepareBody(externalized)) as unknown as BodyInit,\n });\n updateCapabilitiesFromResponse(resp);\n }\n\n return resp;\n }\n\n async function ensureCompression(): Promise<void> {\n if (compressionLoaded || compressionLevel == null) return;\n try {\n const mod = await import(\"../util/zstd.js\");\n compressFn = mod.zstdCompress;\n decompressFn = mod.zstdDecompress;\n } catch {\n // zstd not available in this runtime\n }\n compressionLoaded = true;\n }\n\n function buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n \"Content-Type\": ARROW_CONTENT_TYPE,\n };\n if (compressionLevel != null && compressFn) {\n headers[\"Content-Encoding\"] = \"zstd\";\n }\n if (compressionLevel != null && decompressFn) {\n headers[\"Accept-Encoding\"] = \"zstd\";\n }\n if (authorization) {\n headers.Authorization = authorization;\n }\n return headers;\n }\n\n async function prepareBody(content: Uint8Array): Promise<Uint8Array> {\n if (compressionLevel != null && compressFn) {\n return await compressFn(content, compressionLevel);\n }\n return content;\n }\n\n function checkAuth(resp: Response): void {\n if (resp.status === 401) {\n throw new RpcError(\"AuthenticationError\", \"Authentication required\", \"\");\n }\n }\n\n async function readResponse(resp: Response): Promise<Uint8Array<ArrayBuffer>> {\n let body = new Uint8Array(await resp.arrayBuffer());\n if (resp.headers.get(\"Content-Encoding\") === \"zstd\" && decompressFn) {\n body = new Uint8Array(await decompressFn(body));\n }\n return body;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n await ensureCompression();\n const desc = await httpIntrospect(baseUrl, {\n prefix,\n authorization,\n compressionLevel,\n compressFn,\n decompressFn,\n });\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n serverProtocolVersion = desc.protocolVersion;\n return methodCache;\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n const resp = await postWithExternalization(`${baseUrl}${prefix}/${method}`, body);\n checkAuth(resp);\n\n const responseBody = await readResponse(resp);\n const { batches } = await readResponseBatches(responseBody);\n\n // Process batches: dispatch logs, resolve external pointers, find result\n let resultBatch: RecordBatch | null = null;\n for (let batch of batches) {\n if (batch.numRows === 0) {\n // Check for external location pointer batch\n if (isExternalLocationBatch(batch as any)) {\n batch = (await resolveExternalLocation(batch as any, externalConfig)) as any;\n } else {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n // Void return (result schema has no fields)\n return null;\n }\n\n // Extract single-row result\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n const result = rows[0];\n // For void methods (empty result schema), return null\n if (info.resultSchema.fields.length === 0) return null;\n\n // For single-field results, return the whole object\n return result;\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<HttpStreamSession> {\n await ensureCompression();\n const methods = await ensureMethodCache();\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n const resp = await postWithExternalization(`${baseUrl}${prefix}/${method}/init`, body);\n checkAuth(resp);\n\n const responseBody = await readResponse(resp);\n\n // Parse the response: may contain header stream + data stream\n let header: Record<string, any> | null = null;\n let stateToken: string | null = null;\n const pendingBatches: RecordBatch[] = [];\n let finished = false;\n let streamSchema: Schema | null = null;\n\n if (info.headerSchema) {\n // Response may contain two concatenated IPC streams:\n // 1. Header stream\n // 2. Data stream (with state token and/or data batches)\n const reader = await readSequentialStreams(responseBody);\n\n // First stream: header\n const headerStream = await reader.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches as any[]) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n\n // Second stream: data/state\n const dataStream = await reader.readStream();\n if (dataStream) {\n streamSchema = dataStream.schema as any;\n }\n const headerErrorBatches: RecordBatch[] = [];\n if (dataStream) {\n for (const batch of dataStream.batches as any[]) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n headerErrorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n }\n\n if (headerErrorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...headerErrorBatches);\n } else {\n for (const batch of headerErrorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n\n if (!dataStream && !stateToken) {\n finished = true;\n }\n } else {\n // Single IPC stream: data/state (no header)\n const { schema: responseSchema, batches } = await readResponseBatches(responseBody);\n streamSchema = responseSchema;\n\n // Collect error batches separately — only defer them if there are\n // data batches or state tokens (mid-stream errors). Otherwise throw\n // immediately (init-only errors like exchange_error_on_init).\n const errorBatches: RecordBatch[] = [];\n\n for (const batch of batches) {\n if (batch.numRows === 0) {\n // Check for state token\n const token = batch.metadata?.get(STATE_KEY);\n if (token) {\n stateToken = token;\n continue;\n }\n // Collect EXCEPTION batches for deferred dispatch\n const level = batch.metadata?.get(LOG_LEVEL_KEY);\n if (level === \"EXCEPTION\") {\n errorBatches.push(batch);\n continue;\n }\n dispatchLogOrError(batch, onLog);\n continue;\n }\n pendingBatches.push(batch);\n }\n\n // If we have data batches or a state token, defer errors to iteration.\n // Otherwise throw immediately (error on init).\n if (errorBatches.length > 0) {\n if (pendingBatches.length > 0 || stateToken !== null) {\n pendingBatches.push(...errorBatches);\n } else {\n // No data, no state — this is a pure init error. Throw now.\n for (const batch of errorBatches) {\n dispatchLogOrError(batch, onLog);\n }\n }\n }\n }\n\n if (pendingBatches.length === 0 && stateToken === null) {\n finished = true;\n }\n\n // Determine output schema: prefer the IPC stream schema from the init\n // response (it carries the server's actual output schema even for\n // zero-row token batches), then pending batch schemas, then describe info.\n const outputSchema =\n (streamSchema && streamSchema.fields.length > 0 ? streamSchema : null) ??\n (pendingBatches.length > 0 ? pendingBatches[0].schema : null) ??\n info.outputSchema ??\n info.resultSchema;\n\n return new HttpStreamSession({\n baseUrl,\n prefix,\n method,\n stateToken,\n outputSchema,\n inputSchema: info.inputSchema,\n onLog,\n pendingBatches,\n finished,\n header,\n compressionLevel,\n compressFn,\n decompressFn,\n authorization,\n externalConfig,\n postFn: postWithExternalization,\n });\n },\n\n async describe(): Promise<ServiceDescription> {\n await ensureCompression();\n return httpIntrospect(baseUrl, {\n prefix,\n authorization,\n compressionLevel,\n compressFn,\n decompressFn,\n });\n },\n\n close(): void {\n // No-op (HTTP stateless)\n },\n };\n}\n",
20
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\n/** RFC 9728 OAuth Protected Resource Metadata (client-side response). */\nexport interface OAuthResourceMetadataResponse {\n /** The protected resource's canonical URL (`resource`). */\n resource: string;\n /** Authorization-server issuer URLs; the first is used for OIDC discovery (`authorization_servers`). */\n authorizationServers: string[];\n /** Scopes the resource advertises (`scopes_supported`). */\n scopesSupported?: string[];\n /** Advertised bearer methods, e.g. `[\"header\"]` (`bearer_methods_supported`). */\n bearerMethodsSupported?: string[];\n /** JWS algorithms the resource accepts (`resource_signing_alg_values_supported`). */\n resourceSigningAlgValuesSupported?: string[];\n /** Human-readable resource name (`resource_name`). */\n resourceName?: string;\n /** Documentation URL for the resource (`resource_documentation`). */\n resourceDocumentation?: string;\n /** Policy URL for the resource (`resource_policy_uri`). */\n resourcePolicyUri?: string;\n /** Terms-of-service URL for the resource (`resource_tos_uri`). */\n resourceTosUri?: string;\n /** OAuth client_id advertised by the server. */\n clientId?: string;\n /** OAuth client_secret advertised by the server. */\n clientSecret?: string;\n /** When true, use the OIDC id_token as the Bearer token instead of access_token. */\n useIdTokenAsBearer?: boolean;\n /** OAuth client_id for device code flow. */\n deviceCodeClientId?: string;\n /** OAuth client_secret for device code flow. */\n deviceCodeClientSecret?: string;\n}\n\nfunction parseMetadataJson(json: Record<string, any>): OAuthResourceMetadataResponse {\n const result: OAuthResourceMetadataResponse = {\n resource: json.resource,\n authorizationServers: json.authorization_servers,\n };\n if (json.scopes_supported) result.scopesSupported = json.scopes_supported;\n if (json.bearer_methods_supported) result.bearerMethodsSupported = json.bearer_methods_supported;\n if (json.resource_signing_alg_values_supported)\n result.resourceSigningAlgValuesSupported = json.resource_signing_alg_values_supported;\n if (json.resource_name) result.resourceName = json.resource_name;\n if (json.resource_documentation) result.resourceDocumentation = json.resource_documentation;\n if (json.resource_policy_uri) result.resourcePolicyUri = json.resource_policy_uri;\n if (json.resource_tos_uri) result.resourceTosUri = json.resource_tos_uri;\n if (json.client_id) result.clientId = json.client_id;\n if (json.client_secret) result.clientSecret = json.client_secret;\n if (json.use_id_token_as_bearer) result.useIdTokenAsBearer = json.use_id_token_as_bearer;\n if (json.device_code_client_id) result.deviceCodeClientId = json.device_code_client_id;\n if (json.device_code_client_secret) result.deviceCodeClientSecret = json.device_code_client_secret;\n return result;\n}\n\n/**\n * Discover OAuth Protected Resource Metadata (RFC 9728) from a vgi-rpc server.\n * Returns `null` if the server does not serve the well-known endpoint.\n */\nexport async function httpOAuthMetadata(\n baseUrl: string,\n prefix?: string,\n): Promise<OAuthResourceMetadataResponse | null> {\n const effectivePrefix = (prefix ?? \"\").replace(/\\/+$/, \"\");\n const metadataUrl = `${baseUrl.replace(/\\/+$/, \"\")}/.well-known/oauth-protected-resource${effectivePrefix}`;\n\n try {\n return await fetchOAuthMetadata(metadataUrl);\n } catch {\n return null;\n }\n}\n\n/**\n * Fetch OAuth Protected Resource Metadata from an explicit metadata URL.\n */\nexport async function fetchOAuthMetadata(metadataUrl: string): Promise<OAuthResourceMetadataResponse> {\n const response = await fetch(metadataUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch OAuth metadata from ${metadataUrl}: ${response.status}`);\n }\n const json = await response.json();\n return parseMetadataJson(json);\n}\n\n/**\n * Extract the `resource_metadata` URL from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no resource_metadata parameter is found.\n */\nexport function parseResourceMetadataUrl(wwwAuthenticate: string): string | null {\n // Parse Bearer challenge parameters per RFC 6750\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const metadataMatch = params.match(/resource_metadata=\"([^\"]+)\"/);\n if (!metadataMatch) return null;\n\n return metadataMatch[1];\n}\n\n/**\n * Extract the `client_id` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no client_id parameter is found.\n */\nexport function parseClientId(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const clientIdMatch = params.match(/client_id=\"([^\"]+)\"/);\n if (!clientIdMatch) return null;\n\n return clientIdMatch[1];\n}\n\n/**\n * Extract the `client_secret` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no client_secret parameter is found.\n */\nexport function parseClientSecret(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/client_secret=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n\n/**\n * Extract the `use_id_token_as_bearer` flag from a WWW-Authenticate Bearer challenge.\n * Returns `true` if the parameter is present and set to \"true\", `false` otherwise.\n */\nexport function parseUseIdTokenAsBearer(wwwAuthenticate: string): boolean {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return false;\n\n const params = bearerMatch[1];\n const match = params.match(/use_id_token_as_bearer=\"([^\"]+)\"/);\n if (!match) return false;\n\n return match[1] === \"true\";\n}\n\n/**\n * Extract the `device_code_client_id` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no device_code_client_id parameter is found.\n */\nexport function parseDeviceCodeClientId(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/device_code_client_id=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n\n/**\n * Extract the `device_code_client_secret` from a WWW-Authenticate Bearer challenge.\n * Returns `null` if no device_code_client_secret parameter is found.\n */\nexport function parseDeviceCodeClientSecret(wwwAuthenticate: string): string | null {\n const bearerMatch = wwwAuthenticate.match(/^Bearer\\s+(.*)/i);\n if (!bearerMatch) return null;\n\n const params = bearerMatch[1];\n const match = params.match(/device_code_client_secret=\"([^\"]+)\"/);\n if (!match) return null;\n\n return match[1];\n}\n",
21
+ "// © Copyright 2025-2026, Query.Farm LLC - https://query.farm\n// SPDX-License-Identifier: Apache-2.0\n\nimport {\n Field,\n makeData,\n RecordBatch,\n RecordBatchStreamWriter,\n Schema,\n Struct,\n vectorFromArray,\n} from \"@query-farm/apache-arrow\";\nimport { DESCRIBE_METHOD_NAME } from \"../constants.js\";\nimport { RpcError } from \"../errors.js\";\nimport { type ExternalLocationConfig, isExternalLocationBatch, resolveExternalLocation } from \"../external.js\";\nimport { serializeIpcStream } from \"../http/common.js\";\nimport { IpcStreamReader } from \"../wire/reader.js\";\nimport type { RpcClient } from \"./connect.js\";\nimport { type MethodInfo, parseDescribeResponse, type ServiceDescription } from \"./introspect.js\";\nimport { buildRequestIpc, dispatchLogOrError, extractBatchRows, inferArrowType } from \"./ipc.js\";\nimport type { LogMessage, PipeConnectOptions, StreamSession, SubprocessConnectOptions } from \"./types.js\";\n\n// ---------------------------------------------------------------------------\n// Writable abstraction\n// ---------------------------------------------------------------------------\n\ninterface PipeWritable {\n write(data: Uint8Array): void;\n flush?(): void;\n end(): void;\n}\n\ntype WriteFn = (bytes: Uint8Array) => void;\n\n// ---------------------------------------------------------------------------\n// PipeIncrementalWriter — batch-by-batch IPC writing for lockstep streaming\n// ---------------------------------------------------------------------------\n\nclass PipeIncrementalWriter {\n private writer: RecordBatchStreamWriter;\n private writeFn: WriteFn;\n private closed = false;\n\n constructor(writeFn: WriteFn, schema: Schema) {\n this.writeFn = writeFn;\n this.writer = new RecordBatchStreamWriter();\n this.writer.reset(undefined, schema);\n this.drain(); // flushes schema message\n }\n\n write(batch: RecordBatch): void {\n if (this.closed) throw new Error(\"PipeIncrementalWriter already closed\");\n (this.writer as any)._writeRecordBatch(batch);\n this.drain();\n }\n\n close(): void {\n if (this.closed) return;\n this.closed = true;\n // EOS marker: continuation (0xFFFFFFFF) + metadata length (0x00000000)\n const eos = new Uint8Array(new Int32Array([-1, 0]).buffer);\n this.writeFn(eos);\n }\n\n private drain(): void {\n const values = (this.writer as any)._sink._values as Uint8Array[];\n for (const chunk of values) {\n this.writeFn(chunk);\n }\n values.length = 0;\n }\n}\n\n// ---------------------------------------------------------------------------\n// PipeStreamSession — lockstep streaming over pipes\n// ---------------------------------------------------------------------------\n\n/**\n * {@link StreamSession} implementation for the pipe/subprocess transport.\n * Drives lockstep streaming over a single bidirectional pipe: each\n * {@link PipeStreamSession.exchange} or iteration step writes one input batch\n * and reads one output batch. Holds the connection's single-threaded busy lock\n * until closed.\n */\nexport class PipeStreamSession implements StreamSession {\n private _reader: IpcStreamReader;\n private _writeFn: WriteFn;\n private _onLog?: (msg: LogMessage) => void;\n private _header: Record<string, any> | null;\n private _inputWriter: PipeIncrementalWriter | null = null;\n private _inputSchema: Schema | null = null;\n private _outputStreamOpened = false;\n private _closed = false;\n private _outputSchema: Schema;\n private _releaseBusy: () => void;\n private _setDrainPromise: (p: Promise<void>) => void;\n private _externalConfig?: ExternalLocationConfig;\n\n constructor(opts: {\n reader: IpcStreamReader;\n writeFn: WriteFn;\n onLog?: (msg: LogMessage) => void;\n header: Record<string, any> | null;\n outputSchema: Schema;\n releaseBusy: () => void;\n setDrainPromise: (p: Promise<void>) => void;\n externalConfig?: ExternalLocationConfig;\n }) {\n this._reader = opts.reader;\n this._writeFn = opts.writeFn;\n this._onLog = opts.onLog;\n this._header = opts.header;\n this._outputSchema = opts.outputSchema;\n this._releaseBusy = opts.releaseBusy;\n this._setDrainPromise = opts.setDrainPromise;\n this._externalConfig = opts.externalConfig;\n }\n\n /** The stream's one-time header row, or `null` if the method declares no header. */\n get header(): Record<string, any> | null {\n return this._header;\n }\n\n /**\n * Read output batches from the server until a data batch is found.\n * Dispatches log/error batches along the way.\n * Returns null when server closes output stream (EOS).\n */\n private async _readOutputBatch(): Promise<RecordBatch | null> {\n while (true) {\n const batch = await this._reader.readNextBatch();\n if (batch === null) return null; // Server closed output stream\n\n if (batch.numRows === 0) {\n // Check for external location pointer batch\n if (isExternalLocationBatch(batch as any)) {\n return (await resolveExternalLocation(batch as any, this._externalConfig)) as any;\n }\n // Check if it's a log/error batch. If so, dispatch and continue.\n // Otherwise it's a zero-row data batch — return it.\n if (dispatchLogOrError(batch as any, this._onLog)) {\n continue;\n }\n }\n\n return batch as any;\n }\n }\n\n /**\n * Ensure the server's output stream is opened for reading.\n * Must be called AFTER sending the first input batch, because\n * the server's output schema may not be flushed until it processes\n * the first input and writes the first output batch.\n */\n private async _ensureOutputStream(): Promise<void> {\n if (this._outputStreamOpened) return;\n this._outputStreamOpened = true;\n const schema = await this._reader.openNextStream();\n if (!schema) {\n throw new RpcError(\"ProtocolError\", \"Expected output stream but got EOF\", \"\");\n }\n }\n\n /**\n * Send an exchange request and return the data rows.\n */\n async exchange(input: Record<string, any>[]): Promise<Record<string, any>[]> {\n if (this._closed) {\n throw new RpcError(\"ProtocolError\", \"Stream session is closed\", \"\");\n }\n\n // Build input batch\n let inputSchema: Schema;\n let batch: RecordBatch;\n\n if (input.length === 0) {\n // Zero-row exchange: use cached input schema from a prior exchange,\n // then fall back to the output schema from describe. The cached\n // schema is preferred because input and output schemas may differ\n // (e.g. exchange_accumulate: input {value} → output {running_sum, exchange_count}).\n inputSchema = this._inputSchema ?? this._outputSchema;\n const children = inputSchema.fields.map((f) => {\n return makeData({ type: f.type, length: 0, nullCount: 0 });\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: 0,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n } else {\n // Infer schema from first row.\n // Always use nullable fields — the server validates input schemas\n // strictly and its schema typically uses nullable columns.\n const keys = Object.keys(input[0]);\n const fields = keys.map((key) => {\n let sample: any;\n for (const row of input) {\n if (row[key] != null) {\n sample = row[key];\n break;\n }\n }\n const arrowType = inferArrowType(sample);\n return new Field(key, arrowType, /* nullable */ true);\n });\n inputSchema = new Schema(fields);\n\n // Validate schema consistency: all exchanges on the same pipe session\n // share a single IPC stream, so the schema is locked to the first call.\n if (this._inputSchema) {\n const cached = this._inputSchema;\n if (\n cached.fields.length !== inputSchema.fields.length ||\n cached.fields.some((f, i) => f.name !== inputSchema.fields[i].name)\n ) {\n throw new RpcError(\n \"ProtocolError\",\n `Exchange input schema changed: expected [${cached.fields.map((f) => f.name).join(\", \")}] ` +\n `but got [${inputSchema.fields.map((f) => f.name).join(\", \")}]`,\n \"\",\n );\n }\n } else {\n this._inputSchema = inputSchema;\n }\n\n const children = inputSchema.fields.map((f) => {\n const values = input.map((row) => row[f.name]);\n return vectorFromArray(values, f.type).data[0];\n });\n const structType = new Struct(inputSchema.fields);\n const data = makeData({\n type: structType,\n length: input.length,\n children,\n nullCount: 0,\n });\n batch = new RecordBatch(inputSchema, data);\n }\n\n // Lazy-open input writer on first exchange\n if (!this._inputWriter) {\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, inputSchema);\n }\n\n // Write one input batch FIRST, then open output stream.\n // The server may not flush the output schema until it processes the\n // first input batch and writes the first output batch.\n this._inputWriter.write(batch);\n await this._ensureOutputStream();\n\n // Read output batch(es) from server\n try {\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n return [];\n }\n return extractBatchRows(outputBatch);\n } catch (e) {\n // On error, clean up the pipe so it's ready for the next request\n await this._cleanup();\n throw e;\n }\n }\n\n /**\n * Clean up after an error: close input, drain output, release busy.\n */\n private async _cleanup(): Promise<void> {\n if (this._closed) return;\n this._closed = true;\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._releaseBusy();\n }\n\n /**\n * Iterate over producer stream batches (lockstep).\n */\n async *[Symbol.asyncIterator](): AsyncIterableIterator<Record<string, any>[]> {\n if (this._closed) return;\n\n try {\n // Open input writer with empty schema for tick batches\n const tickSchema = new Schema([]);\n this._inputWriter = new PipeIncrementalWriter(this._writeFn, tickSchema);\n\n // Build a zero-row tick batch\n const structType = new Struct(tickSchema.fields);\n const tickData = makeData({\n type: structType,\n length: 0,\n children: [],\n nullCount: 0,\n });\n const tickBatch = new RecordBatch(tickSchema, tickData);\n\n while (true) {\n // Send one tick FIRST, then open output stream on first iteration.\n // The server may not flush the output schema until it processes the\n // first tick and writes the first output batch.\n this._inputWriter.write(tickBatch);\n await this._ensureOutputStream();\n\n // Read output batch(es)\n const outputBatch = await this._readOutputBatch();\n if (outputBatch === null) {\n // Server finished — EOS on output stream\n break;\n }\n\n yield extractBatchRows(outputBatch);\n }\n } finally {\n // Close input stream if still open\n if (this._inputWriter) {\n this._inputWriter.close();\n this._inputWriter = null;\n }\n // Drain any remaining output batches\n try {\n if (this._outputStreamOpened) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n }\n this._closed = true;\n this._releaseBusy();\n }\n }\n\n /**\n * End the stream: close the input side (or send an empty stream if nothing\n * was sent yet) and drain the server's remaining output in the background,\n * releasing the connection's busy lock once the drain completes.\n */\n close(): void {\n if (this._closed) return;\n this._closed = true;\n\n if (this._inputWriter) {\n // Close the input stream (EOS)\n this._inputWriter.close();\n this._inputWriter = null;\n } else {\n // Never iterated/exchanged — send empty schema stream so server unblocks.\n // Server is blocked at reader.openNextStream() waiting for client's input.\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n this._writeFn(ipc);\n }\n\n // Drain remaining output batches asynchronously. Register the drain\n // promise so that the next acquireBusy() waits for it to complete.\n const drainPromise = (async () => {\n try {\n if (!this._outputStreamOpened) {\n const schema = await this._reader.openNextStream();\n if (schema) {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } else {\n while ((await this._reader.readNextBatch()) !== null) {}\n }\n } catch {\n // Suppress errors during drain\n } finally {\n this._releaseBusy();\n }\n })();\n this._setDrainPromise(drainPromise);\n }\n}\n\n// ---------------------------------------------------------------------------\n// pipeConnect — create an RpcClient over raw readable/writable streams\n// ---------------------------------------------------------------------------\n\n/**\n * Connect to a vgi-rpc server over a raw bidirectional pipe (a readable stream\n * of server output plus a writable for client input). The connection is\n * single-threaded: only one call or stream may be in flight at a time. The\n * `__describe__` handshake is sent before the reader is opened to avoid deadlock.\n */\nexport function pipeConnect(\n readable: ReadableStream<Uint8Array>,\n writable: PipeWritable,\n options?: PipeConnectOptions,\n): RpcClient {\n const onLog = options?.onLog;\n const externalConfig = options?.externalLocation;\n\n let reader: IpcStreamReader | null = null;\n let readerPromise: Promise<IpcStreamReader> | null = null;\n let methodCache: Map<string, MethodInfo> | null = null;\n let protocolName = \"\";\n let serverProtocolVersion = \"\";\n let _busy = false;\n let _drainPromise: Promise<void> | null = null;\n let closed = false;\n\n const writeFn: WriteFn = (bytes: Uint8Array) => {\n writable.write(bytes);\n writable.flush?.();\n };\n\n // The IpcStreamReader.create() blocks until the first IPC schema arrives\n // on the readable. To avoid deadlock, we must send our first request\n // (the __describe__ call) BEFORE opening the reader. After that, the\n // response bytes are in the pipe buffer and the reader can consume them.\n async function ensureReader(): Promise<IpcStreamReader> {\n if (reader) return reader;\n if (!readerPromise) {\n readerPromise = IpcStreamReader.create(readable);\n }\n reader = await readerPromise;\n return reader;\n }\n\n async function acquireBusy(): Promise<void> {\n // Wait for any pending drain from a previous close()\n if (_drainPromise) {\n await _drainPromise;\n _drainPromise = null;\n }\n if (_busy) {\n throw new Error(\n \"Pipe transport is busy — another call or stream is in progress. \" +\n \"Pipe connections are single-threaded; wait for the current operation to complete.\",\n );\n }\n _busy = true;\n }\n\n function releaseBusy(): void {\n _busy = false;\n }\n\n function setDrainPromise(p: Promise<void>): void {\n _drainPromise = p;\n }\n\n async function ensureMethodCache(): Promise<Map<string, MethodInfo>> {\n if (methodCache) return methodCache;\n\n await acquireBusy();\n try {\n // Send __describe__ request BEFORE opening the reader.\n // IpcStreamReader.create() blocks on reader.open() which reads the\n // first schema message. The server won't write anything until it\n // receives a request. Sending first avoids deadlock.\n const emptySchema = new Schema([]);\n const body = buildRequestIpc(emptySchema, {}, DESCRIBE_METHOD_NAME);\n writeFn(body);\n\n const r = await ensureReader();\n\n // Read response (first IPC stream = describe response schema + batches)\n // ensureReader() consumed the schema via open(). Use readStream()\n // which — on the first call (initialized=false) — returns the current\n // stream without calling reset().\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading __describe__ response\");\n }\n\n const desc = await parseDescribeResponse(response.batches as any, onLog);\n protocolName = desc.protocolName;\n serverProtocolVersion = desc.protocolVersion;\n methodCache = new Map(desc.methods.map((m) => [m.name, m]));\n return methodCache;\n } finally {\n releaseBusy();\n }\n }\n\n return {\n async call(method: string, params?: Record<string, any>): Promise<Record<string, any> | null> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send request\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n writeFn(body);\n\n // Read response\n const response = await r.readStream();\n if (!response) {\n throw new Error(\"EOF reading response\");\n }\n\n // Process batches: dispatch logs, resolve external pointers, find result\n let resultBatch: RecordBatch | null = null;\n for (let batch of response.batches as any[]) {\n if (batch.numRows === 0) {\n if (isExternalLocationBatch(batch)) {\n batch = await resolveExternalLocation(batch, externalConfig);\n } else {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n }\n resultBatch = batch;\n }\n\n if (!resultBatch) {\n return null;\n }\n\n const rows = extractBatchRows(resultBatch);\n if (rows.length === 0) return null;\n\n if (info.resultSchema.fields.length === 0) return null;\n\n return rows[0];\n } finally {\n releaseBusy();\n }\n },\n\n async stream(method: string, params?: Record<string, any>): Promise<StreamSession> {\n const methods = await ensureMethodCache();\n await acquireBusy();\n\n try {\n const info = methods.get(method);\n if (!info) {\n throw new Error(`Unknown method: '${method}'`);\n }\n\n const r = await ensureReader();\n\n // Apply defaults\n const fullParams = { ...(info.defaults ?? {}), ...(params ?? {}) };\n\n // Send init request (params as a complete IPC stream)\n const body = buildRequestIpc(info.paramsSchema, fullParams, method, { protocolVersion: serverProtocolVersion });\n writeFn(body);\n\n // Read header if method has headerSchema\n let header: Record<string, any> | null = null;\n if (info.headerSchema) {\n const headerStream = await r.readStream();\n if (headerStream) {\n for (const batch of headerStream.batches as any[]) {\n if (batch.numRows === 0) {\n dispatchLogOrError(batch, onLog);\n continue;\n }\n const rows = extractBatchRows(batch);\n if (rows.length > 0) {\n header = rows[0];\n }\n }\n }\n }\n\n const outputSchema = info.outputSchema ?? info.resultSchema;\n\n // Don't release busy here — PipeStreamSession owns the lock\n // and will release it when done\n return new PipeStreamSession({\n reader: r,\n writeFn,\n onLog,\n header,\n outputSchema,\n releaseBusy,\n setDrainPromise,\n externalConfig,\n });\n } catch (e) {\n // Init error (e.g., server raised exception during init).\n // Send empty input stream so server's drain unblocks, then\n // drain the server's output stream if needed.\n try {\n const r = await ensureReader();\n const emptySchema = new Schema([]);\n const ipc = serializeIpcStream(emptySchema, []);\n writeFn(ipc);\n // Drain server's output stream (error response + EOS)\n const outStream = await r.readStream();\n // outStream may be null or contain remaining batches — just consume\n void outStream;\n } catch {\n // Suppress errors during cleanup\n }\n releaseBusy();\n throw e;\n }\n },\n\n async describe(): Promise<ServiceDescription> {\n const methods = await ensureMethodCache();\n return {\n protocolName,\n protocolVersion: serverProtocolVersion,\n methods: [...methods.values()],\n };\n },\n\n close(): void {\n if (closed) return;\n closed = true;\n writable.end();\n },\n };\n}\n\n// ---------------------------------------------------------------------------\n// subprocessConnect — spawn a process and wrap with pipeConnect\n// ---------------------------------------------------------------------------\n\n/**\n * Spawn a server process (via `Bun.spawn`) and connect to it over its\n * stdin/stdout using {@link pipeConnect}. The returned client's\n * {@link RpcClient.close} also kills the subprocess.\n */\nexport function subprocessConnect(cmd: string[], options?: SubprocessConnectOptions): RpcClient {\n const proc = Bun.spawn(cmd, {\n stdin: \"pipe\",\n stdout: \"pipe\",\n stderr: options?.stderr ?? \"ignore\",\n cwd: options?.cwd,\n env: options?.env ? { ...process.env, ...options.env } : undefined,\n });\n\n const stdout = proc.stdout as ReadableStream<Uint8Array>;\n\n const writable: PipeWritable = {\n write(data: Uint8Array) {\n (proc.stdin as any).write(data);\n },\n flush() {\n (proc.stdin as any).flush();\n },\n end() {\n (proc.stdin as any).end();\n },\n };\n\n const client = pipeConnect(stdout, writable, {\n onLog: options?.onLog,\n externalLocation: options?.externalLocation,\n });\n\n // Wrap close to also kill the subprocess\n const originalClose = client.close;\n client.close = () => {\n originalClose.call(client);\n try {\n proc.kill();\n } catch {\n // Process may have already exited\n }\n };\n\n return client;\n}\n"
22
22
  ],
23
- "mappings": "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",
23
+ "mappings": "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",
24
24
  "debugId": "BE194B50857FDC5664756E2164756E21",
25
25
  "names": []
26
26
  }