orpc-fn 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +28 -8
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +56 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/create-fn.d.ts +3 -3
  7. package/dist/create-fn.d.ts.map +1 -1
  8. package/dist/create-fn.js +2 -7
  9. package/dist/create-fn.js.map +1 -1
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/live/fn-live.d.ts +9 -5
  15. package/dist/live/fn-live.d.ts.map +1 -1
  16. package/dist/live/fn-live.js.map +1 -1
  17. package/dist/live/pub-sub.d.ts +5 -1
  18. package/dist/live/pub-sub.d.ts.map +1 -1
  19. package/dist/live/pub-sub.js +29 -14
  20. package/dist/live/pub-sub.js.map +1 -1
  21. package/dist/mcp/core.d.ts +41 -0
  22. package/dist/mcp/core.d.ts.map +1 -0
  23. package/dist/mcp/core.js +61 -0
  24. package/dist/mcp/core.js.map +1 -0
  25. package/dist/mcp/sdk.d.ts +8 -16
  26. package/dist/mcp/sdk.d.ts.map +1 -1
  27. package/dist/mcp/sdk.js +10 -78
  28. package/dist/mcp/sdk.js.map +1 -1
  29. package/dist/mcp/server.d.ts +11 -0
  30. package/dist/mcp/server.d.ts.map +1 -0
  31. package/dist/mcp/server.js +13 -0
  32. package/dist/mcp/server.js.map +1 -0
  33. package/dist/otel.d.ts +5 -0
  34. package/dist/otel.d.ts.map +1 -1
  35. package/dist/otel.js +7 -0
  36. package/dist/otel.js.map +1 -1
  37. package/dist/router.d.ts +8 -0
  38. package/dist/router.d.ts.map +1 -1
  39. package/dist/router.js +13 -0
  40. package/dist/router.js.map +1 -1
  41. package/dist/types.d.ts +16 -6
  42. package/dist/types.d.ts.map +1 -1
  43. package/dist/types.js.map +1 -1
  44. package/package.json +15 -3
  45. package/src/cli.ts +68 -0
  46. package/src/create-fn.ts +5 -10
  47. package/src/index.ts +2 -1
  48. package/src/live/fn-live.ts +9 -5
  49. package/src/live/pub-sub.ts +38 -19
  50. package/src/mcp/core.ts +102 -0
  51. package/src/mcp/sdk.ts +20 -102
  52. package/src/mcp/server.ts +35 -0
  53. package/src/otel.ts +8 -0
  54. package/src/router.ts +19 -0
  55. package/src/types.ts +24 -42
@@ -1 +1 @@
1
- {"version":3,"file":"fn-live.js","sourceRoot":"","sources":["../../src/live/fn-live.ts"],"names":[],"mappings":"AACA,OAAO,EAAqB,SAAS,EAAE,MAAM,cAAc,CAAA;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE1D,OAAO,EAAE,cAAc,EAAiB,MAAM,YAAY,CAAA;AAoB1D,wEAAwE;AACxE,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,CAAA;AAEjC,MAAM,iBAAiB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAA;AAchD,MAAM,UAAU,WAAW,CAC1B,KAAc,EACd,IAAW;IAEX,OAAO,EAAE,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AAClD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACpC,OAAO,CACN,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,iBAAiB,IAAI,KAAK,CACzE,CAAA;AACF,CAAC;AAqND;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CACxC,GAAY,EACZ,QAAgB,EAChB,MAA+B;AAC/B,kEAAkE;AAClE,UAAU,GAAgC,CAAC,KAAK,EAAE,EAAE,CACnD,KAAK,YAAY,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;IAEjD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;YAC9C,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC;SACxB,CAAC,CAAA;IACH,CAAC;IACD,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;AACrC,CAAC;AAED,kFAAkF;AAClF,SAAS,eAAe,CACvB,GAAY,EACZ,QAAgB;IAEhB,IAAI,GAAG,YAAY,SAAS;QAAE,OAAO,GAAG,CAAA;IACxC,OAAO,IAAI,SAAS,CAAC,uBAAuB,EAAE;QAC7C,OAAO,EAAE,uCAAuC,QAAQ,EAAE;QAC1D,KAAK,EAAE,GAAG;KACV,CAAC,CAAA;AACH,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,mBAAmB,CAIxC,IAcD;IACA,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,IAAI,CAAA;IACnD,MAAM,YAAY,GAAG,eAAe,CACnC,IAAI,CAAC,YAAY,IAAI,IAAI,EACzB,cAAc,CACd,CAAA;IACD,IACC,UAAU,KAAK,SAAS;QACxB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,CAAC;QAEhD,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAA;IAE3E,IAAI,OAAO,GAA2C,IAAI,CAAA;IAC1D,MAAM,QAAQ,GAAG,GAAG,EAAE;QACrB,MAAM,IAAI,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,CAAA;QACrC,OAAO,GAAG,IAAI,CAAA;QACd,OAAO,IAAI,CAAA;IACZ,CAAC,CAAA;IAED,IAAI,QAAQ,GAAG,OAAO,CAAA;IACtB,MAAM,QAAQ,CAAA;IAEd,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,MAAM,QAAQ,EAAE,CAAA;QAChC,IAAI,OAAO,CAAC,IAAI;YAAE,MAAK;QAEvB,MAAM,KAAK,GAAa,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAEvC,IAAI,UAAU,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,UAAU,CAAA;YACrC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,CAAC,MAAM,GAAG,YAAY,EAAE,CAAC;gBAC1D,MAAM,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;gBACtC,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAA;gBACvB,IAAI,KAAgD,CAAA;gBACpD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBACjC,IAAI;oBACJ,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,EAAE;wBACvC,KAAK,GAAG,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;oBAClD,CAAC,CAAC;iBACF,CAAC,CAAA;gBACF,YAAY,CAAC,KAAK,CAAC,CAAA;gBAEnB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;oBACxB,mEAAmE;oBACnE,gEAAgE;oBAChE,OAAO,GAAG,IAAI,CAAA;oBACd,MAAK;gBACN,CAAC;gBAED,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBACjB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;oBACjC,MAAK;gBACN,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACzB,CAAC;QACF,CAAC;QAED,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YACnD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACxB,QAAQ,GAAG,IAAI,CAAA;gBACf,MAAM,QAAQ,CAAA;YACf,CAAC;YACD,SAAQ;QACT,CAAC;QACD,IAAI,OAAO,GAAG,KAAK,CAAA;QACnB,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YACzC,IAAI,IAAI,KAAK,SAAS;gBAAE,SAAQ;YAChC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,IAAI,OAAO,EAAE,CAAC;oBACb,MAAM,QAAQ,CAAA;oBACd,OAAO,GAAG,KAAK,CAAA;gBAChB,CAAC;gBACD,QAAQ,GAAG,IAAI,CAAC,KAAgB,CAAA;gBAChC,MAAM,IAAI,CAAC,IAAa,CAAA;gBACxB,SAAQ;YACT,CAAC;YACD,QAAQ,GAAG,IAAI,CAAA;YACf,OAAO,GAAG,IAAI,CAAA;QACf,CAAC;QACD,IAAI,OAAO;YAAE,MAAM,QAAQ,CAAA;IAC5B,CAAC;AACF,CAAC;AA0BD;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,OAM5B;IACA,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;IAE7D,OAAO,CACN,OAU2B,EAC1B,EAAE;QACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,WAAW,EAAE,GAAG,OAAO,CAAA;QACtE,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,WAAW;YAC1C,MAAM,IAAI,SAAS,CAClB,mEAAmE,CACnE,CAAA;QACF,IACC,IAAI,CAAC,UAAU,KAAK,SAAS;YAC7B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YAE1D,MAAM,IAAI,UAAU,CAAC,oDAAoD,CAAC,CAAA;QAC3E,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;YAClC,eAAe,CAAC,IAAI,CAAC,YAAY,EAAE,cAAc,CAAC,CAAA;QACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,IAAI,OAAO,CAAA;QAC5C,MAAM,WAAW,GAChB,IAAI,CAAC,OAAO,IAAI,mBAAmB,WAAW,CAAC,OAAO,IAAI,IAAI,EAAE,CAAA;QACjE,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,CAAA;QAEnE,kEAAkE;QAClE,MAAM,OAAO,GAAG,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAA;QAE1D,MAAM,OAAO,GAAG,KAAK,EAAE,KAAc,EAAE,EAAE;YACxC,IAAI,CAAC,IAAI,CAAC,WAAW;gBAAE,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACpD,IAAI,CAAC;gBACJ,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC7B,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,uEAAuE;gBACvE,4CAA4C;gBAC5C,UAAU,CAAC,KAAK,CAAC,uBAAuB,EAAE;oBACzC,IAAI,EAAE,QAAQ;oBACd,GAAG,EAAE,cAAc,CAAC,GAAG,CAAC;iBACxB,CAAC,CAAA;YACH,CAAC;QACF,CAAC,CAAA;QAED,MAAM,UAAU,GAAG,CAAC,MAAqB,EAAE,EAAE,CAC5C,OAAO,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,CAAC,CAAA;QAEhC,MAAM,SAAS,GAAG,EAAE,CAAC;YACpB,GAAG,WAAW;YACd,IAAI;YACJ,KAAK;YACL,MAAM;YACN,OAAO,EAAE,UAAU;SACnB,CAAC,CAAA;QAEF,MAAM,QAAQ,GAAG,KAAK,EAAE,MAAiB,EAAE,KAAc,EAAE,EAAE;YAC5D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;YACxD,IAAI,MAAM,CAAC,MAAM;gBAChB,MAAM,IAAI,SAAS,CAAC,uBAAuB,EAAE;oBAC5C,OAAO,EAAE,6BAA6B;oBACtC,KAAK,EAAE,MAAM,CAAC,MAAM;iBACpB,CAAC,CAAA;YACH,OAAO,MAAM,CAAC,KAAK,CAAA;QACpB,CAAC,CAAA;QACD,MAAM,WAAW,GAAG,CAAC,MAAqB,EAAE,EAAE,CAC7C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,CAAC,CAAA;QAC1C,wFAAwF;QAExF,MAAM,YAAY,GAAG,MAAM,CAAC,WAAW,CACtC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CACjE,CAAA;QACD,MAAM,SAAS,GAAG,EAAE,CAAC;YACpB,GAAG,YAAY;YACf,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,MAAM,EAAE,WAAW,CAAC,MAAM;YAC1B,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,WAAW,CAAC,SAAS;YAChC,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,IAAI,EAAE,QAAQ;YACd,MAAM,EAAE,KAAK;YACb,KAAK;YACL,OAAO,EAAE,WAAW;YACpB,WAAW,EAAE,eAAe;YAC5B,OAAO,EAAE,KAAK,SAAS,CAAC,EAAE,MAAqB;gBAC9C,oEAAoE;gBACpE,gEAAgE;gBAChE,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBACvC,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,MAAM,CAAC,MAAM;oBACrB,WAAW,EAAE,IAAI;iBACjB,CAAC,CAAA;gBACF,IAAI,CAAC;oBACJ,IAAI,YAAY,CAAC,QAAQ,EAAE;wBAAE,OAAM;oBACnC,IAAI,OAAgB,CAAA;oBACpB,IAAI,CAAC;wBACJ,OAAO,GAAG,MAAM,WAAW,CAAC,MAAM,CAAC,CAAA;oBACpC,CAAC;oBAAC,OAAO,GAAG,EAAE,CAAC;wBACd,gEAAgE;wBAChE,MAAM,eAAe,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;oBACrC,CAAC;oBAED,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;oBACvC,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;wBAC5B,IACC,IAAI,CAAC,WAAW;4BAChB,IAAI,CAAC,WAAW,KAAK,IAAI;4BACzB,CAAC,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC;gCACxB,KAAK,EAAE,MAAM,CAAC,KAAK;gCACnB,GAAG,EAAE,MAAM,CAAC,OAAO;6BACnB,CAAC,CAAC;4BAEH,MAAM,IAAI,SAAS,CAAC,WAAW,CAAC,CAAA;oBAClC,CAAC,CAAA;oBACD,MAAM,KAAK,GAAG,KAAK,EAAE,KAAc,EAAE,QAAiB,EAAE,EAAE;wBACzD,MAAM,SAAS,EAAE,CAAA;wBACjB,IAAI,KAAK,KAAK,QAAQ;4BAAE,OAAO,KAAK,EAAE,CAAA;wBACtC,IACC,IAAI,CAAC,YAAY;4BACjB,CAAC,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;4BAE1D,OAAO,SAAS,CAAA;wBACjB,IAAI,CAAC,IAAI,CAAC,aAAa;4BAAE,OAAO,KAAK,EAAE,CAAA;wBACvC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC;4BACrC,GAAG,MAAM;4BACT,KAAK;4BACL,QAAQ;4BACR,KAAK;yBACL,CAAC,CAAA;wBACF,IAAI,IAAI,KAAK,SAAS;4BAAE,OAAO,SAAS,CAAA;wBACxC,IAAI,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;4BACzB,IAAI,CAAC,IAAI,CAAC,UAAU;gCACnB,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAA;4BAChE,OAAO,WAAW,CACjB,MAAM,QAAQ,CAAC,IAAI,CAAC,WAAwB,EAAE,IAAI,CAAC,KAAK,CAAC,EACzD,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,CAC1C,CAAA;wBACF,CAAC;wBACD,OAAO,QAAQ,CAAC,IAAI,CAAC,WAAwB,EAAE,IAAI,CAAC,CAAA;oBACrD,CAAC,CAAA;oBACD,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa;wBACpC,CAAC,CAAC,SAAS;wBACX,CAAC,CAAC,KAAK,EAAE,MAA0B,EAAE,QAAiB,EAAE,EAAE;4BACxD,MAAM,SAAS,EAAE,CAAA;4BACjB,IAAI,WAAW,GAAG,KAAK,CAAA;4BACvB,KAAK,MAAM,KAAK,IAAI,MAAM;gCACzB,IACC,KAAK,KAAK,QAAQ;oCAClB,CAAC,IAAI,CAAC,YAAY;oCAClB,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;oCAEzD,WAAW,GAAG,IAAI,CAAA;4BACpB,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAA;wBACzC,CAAC,CAAA;oBAEH,KAAK,CAAC,CAAC,mBAAmB,CAAC;wBAC1B,MAAM,EAAE,YAAY,CAAC,MAAM;wBAC3B,OAAO;wBACP,UAAU,EAAE,IAAI,CAAC,UAAU;wBAC3B,GAAG,CAAC,IAAI,CAAC,YAAY,KAAK,SAAS;4BAClC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;4BACrC,CAAC,CAAC,EAAE,CAAC;wBACN,KAAK;wBACL,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;qBACrC,CAAC,CAAA;gBACH,CAAC;wBAAS,CAAC;oBACV,YAAY,CAAC,KAAK,EAAE,CAAA;gBACrB,CAAC;YACF,CAAC;SACD,CAAC,CAAA;QAEF,OAAO;YACN,SAAS;YACT,SAAS;YACT,OAAO;YACP,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,0BAA0B,EAAE,OAAO,CAAC,0BAA0B;YAC9D,qBAAqB,EAAE,OAAO,CAAC,qBAAqB;SACpD,CAAA;IACF,CAAC,CAAA;AACF,CAAC","sourcesContent":["import type { AnySchema, ErrorMap, Schema } from '@orpc/contract'\nimport { type AnyProcedure, ORPCError } from '@orpc/server'\nimport type { ZodType, z } from 'zod'\nimport { RAW_INPUT } from '../timing.js'\nimport { LIVE_GAP, positiveInteger } from './lifecycle.js'\nimport type { FnLogger } from '../logger.js'\nimport { errorMessageOf, type SpanLike } from '../otel.js'\nimport type {\n\tFnContext,\n\tFnDefinition,\n\tFnProcedure,\n\tFnRouteOptions,\n\tHandlerParams,\n\tMaybePromise,\n\tProcedureKey\n} from '../types.js'\nimport type {\n\tAuthFn,\n\tChannel,\n\tChannelDefinition,\n\tChannelOptions,\n\tChannelQueueOptions,\n\tObjectSchema,\n\tPublisherConfig\n} from './pub-sub.js'\n\n/** Marks a coalesce window that ended before the next event arrived. */\nconst TIMEOUT = Symbol('timeout')\n\nconst fnLivePatchMarker = Symbol('fnLive.patch')\n\n/**\n * Transformer result that splits the internal accumulator from the wire\n * payload: `state` becomes the `previous` snapshot for later events while only\n * `emit` is sent to the subscriber. Lets high-frequency streams avoid\n * re-serializing the full snapshot per event.\n */\nexport type FnLivePatch<TOutput, TEmit> = {\n\t[fnLivePatchMarker]: true\n\tstate: TOutput\n\temit: TEmit\n}\n\nexport function fnLivePatch<TOutput, TEmit>(\n\tstate: TOutput,\n\temit: TEmit\n): FnLivePatch<TOutput, TEmit> {\n\treturn { [fnLivePatchMarker]: true, state, emit }\n}\n\nfunction isFnLivePatch(value: unknown): value is FnLivePatch<unknown, unknown> {\n\treturn (\n\t\ttypeof value === 'object' && value !== null && fnLivePatchMarker in value\n\t)\n}\n\nexport type FnLiveConfig<\n\tTDef extends FnDefinition,\n\tTInput,\n\tTEventSchema extends ZodType,\n\tTOutput,\n\tTKey extends ProcedureKey<TDef>,\n\tTEmit = never,\n\tTErrors extends ErrorMap = Record<never, never>\n> = Omit<PublisherConfig, 'name'> &\n\tChannelQueueOptions & {\n\t\t/** Subscribe route name; default `${name}.live`. */\n\t\tname?: string\n\t\t/** Validates parsed reducer state without reapplying an output transform. Required with a transformer. */\n\t\tstateSchema?: Schema<TOutput, TOutput>\n\t\t/** Validates patch payloads. Required when a transformer returns fnLivePatch. */\n\t\temitSchema?: Schema<TEmit, TEmit>\n\t\t/** Optional access check before each update; idle streams keep their initial authorization. */\n\t\treauthorize?: AuthFn<TInput, FnContext<TDef, TKey>>\n\t\teventSchema: TEventSchema\n\t\tchannel: ChannelDefinition<\n\t\t\tTInput,\n\t\t\tz.output<TEventSchema>,\n\t\t\tFnContext<TDef, TKey>\n\t\t>\n\t\t/** Fold an event into the snapshot; without it every event re-runs the handler. */\n\t\ttransformerFn?: FnLiveConfigTransformer<\n\t\t\tTDef,\n\t\t\tTInput,\n\t\t\tTEventSchema,\n\t\t\tTOutput,\n\t\t\tTKey,\n\t\t\tTEmit,\n\t\t\tTErrors\n\t\t>\n\t\t/** Return false to skip an event. */\n\t\tshouldUpdate?: (\n\t\t\tparams: HandlerParams<TDef, TInput, TKey, TErrors> & {\n\t\t\t\tevent: z.output<TEventSchema>\n\t\t\t\tprevious: TOutput\n\t\t\t}\n\t\t) => MaybePromise<boolean>\n\t\tauthFn?: AuthFn<TInput, FnContext<TDef, TKey>>\n\t\t/** Log publish failures instead of throwing them into the publishing route. */\n\t\tsafePublish?: boolean\n\t\t/** Batch events arriving within this window into one snapshot update. */\n\t\tcoalesceMs?: number\n\t\t/** Maximum events collected in one coalescing batch (default 1000). */\n\t\tmaxBatchSize?: number\n\t\t/**\n\t\t * When a slow subscriber's queue overflows (drop-oldest), this marker is\n\t\t * enqueued INSTEAD of the dropped event so the client resyncs. Return\n\t\t * `null` to skip.\n\t\t */\n\t\toverflowMarker?: (input: TInput) => z.output<TEventSchema> | null\n\t\tsummary?: string\n\t\tdescription?: string\n\t} & (\n\t\t| { transformerFn?: undefined }\n\t\t| {\n\t\t\t\ttransformerFn: FnLiveConfigTransformer<\n\t\t\t\t\tTDef,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTEventSchema,\n\t\t\t\t\tTOutput,\n\t\t\t\t\tTKey,\n\t\t\t\t\tTEmit,\n\t\t\t\t\tTErrors\n\t\t\t\t>\n\t\t\t\tstateSchema: Schema<TOutput, TOutput>\n\t\t }\n\t) &\n\t([TEmit] extends [never] ? object : { emitSchema: Schema<TEmit, TEmit> })\n\ntype FnLiveConfigTransformer<\n\tTDef extends FnDefinition,\n\tTInput,\n\tTEventSchema extends ZodType,\n\tTOutput,\n\tTKey extends ProcedureKey<TDef>,\n\tTEmit,\n\tTErrors extends ErrorMap\n> = (\n\tparams: HandlerParams<TDef, TInput, TKey, TErrors> & {\n\t\tevent: z.output<TEventSchema>\n\t\tprevious: TOutput\n\t\trerun: () => Promise<TOutput>\n\t}\n) => MaybePromise<TOutput | FnLivePatch<TOutput, TEmit> | undefined>\n\nexport type FnLiveReturn<\n\tTDef extends FnDefinition,\n\tTKey extends ProcedureKey<TDef>,\n\tTInput extends ObjectSchema,\n\tTOutputSchema extends Schema<unknown, unknown>,\n\tTOutput,\n\tTEventSchema extends ZodType,\n\tTEmit = never,\n\tTErrors extends ErrorMap = Record<never, never>\n> = {\n\tprocedure: FnProcedure<TDef, TKey, TInput, TOutputSchema, TErrors>\n\tsubscribe: FnProcedure<\n\t\tTDef,\n\t\tTKey,\n\t\tTInput,\n\t\tSchema<AsyncGenerator<TOutput | TEmit>, AsyncGenerator<TOutput | TEmit>>,\n\t\tTErrors\n\t>\n\tpublish: (event: z.input<TEventSchema>) => Promise<void>\n\tgetSubscriptionChannelName: (params: {\n\t\tinput: z.output<TInput>\n\t\tcontext: FnContext<TDef, TKey>\n\t}) => string\n\tgetPublishChannelName: (event: z.output<TEventSchema>) => string\n\t/** @deprecated Prefer the separate required-input resolver methods. */\n\tgetChannelName: (\n\t\tparams: Partial<z.output<TInput>> | Partial<z.output<TEventSchema>>,\n\t\tcontext?: FnContext<TDef, TKey>\n\t) => string\n}\n\n/**\n * A route plus a subscribe route that streams its result: the initial\n * snapshot, then an update for every event published on the channel.\n */\nexport interface FnLive<TDef extends FnDefinition> {\n\t<\n\t\tTInput extends ObjectSchema,\n\t\tTOutputSchema extends ZodType,\n\t\tTEventSchema extends ZodType,\n\t\tTKey extends ProcedureKey<TDef> = TDef['default'],\n\t\tTEmit = never,\n\t\tTErrors extends ErrorMap = Record<never, never>\n\t>(\n\t\toptions: {\n\t\t\tinput: TInput\n\t\t\toutput: TOutputSchema\n\t\t\thandler: (\n\t\t\t\tparams: HandlerParams<\n\t\t\t\t\tTDef,\n\t\t\t\t\tz.output<TInput>,\n\t\t\t\t\tNoInfer<TKey>,\n\t\t\t\t\tTErrors\n\t\t\t\t> & {\n\t\t\t\t\tpublish: (event: z.input<TEventSchema>) => Promise<void>\n\t\t\t\t}\n\t\t\t\t// The output schema parses what the handler returns: its input type.\n\t\t\t) => MaybePromise<z.input<TOutputSchema>>\n\t\t\tlive: FnLiveConfig<\n\t\t\t\tTDef,\n\t\t\t\tz.output<TInput>,\n\t\t\t\tTEventSchema,\n\t\t\t\tz.output<TOutputSchema>,\n\t\t\t\tNoInfer<TKey>,\n\t\t\t\tTEmit,\n\t\t\t\tTErrors\n\t\t\t>\n\t\t} & FnRouteOptions<TDef, TKey, z.output<TInput>, TErrors>\n\t): FnLiveReturn<\n\t\tTDef,\n\t\tTKey,\n\t\tTInput,\n\t\tTOutputSchema,\n\t\tz.output<TOutputSchema>,\n\t\tTEventSchema,\n\t\tTEmit,\n\t\tTErrors\n\t>\n\n\t<\n\t\tTInput extends ObjectSchema,\n\t\tTOutput,\n\t\tTEventSchema extends ZodType,\n\t\tTKey extends ProcedureKey<TDef> = TDef['default'],\n\t\tTEmit = never,\n\t\tTErrors extends ErrorMap = Record<never, never>\n\t>(\n\t\toptions: {\n\t\t\tinput: TInput\n\t\t\toutput?: undefined\n\t\t\thandler: (\n\t\t\t\tparams: HandlerParams<\n\t\t\t\t\tTDef,\n\t\t\t\t\tz.output<TInput>,\n\t\t\t\t\tNoInfer<TKey>,\n\t\t\t\t\tTErrors\n\t\t\t\t> & {\n\t\t\t\t\tpublish: (event: z.input<TEventSchema>) => Promise<void>\n\t\t\t\t}\n\t\t\t) => MaybePromise<TOutput>\n\t\t\tlive: FnLiveConfig<\n\t\t\t\tTDef,\n\t\t\t\tz.output<TInput>,\n\t\t\t\tTEventSchema,\n\t\t\t\tTOutput,\n\t\t\t\tNoInfer<TKey>,\n\t\t\t\tTEmit,\n\t\t\t\tTErrors\n\t\t\t>\n\t\t} & FnRouteOptions<TDef, TKey, z.output<TInput>, TErrors>\n\t): FnLiveReturn<\n\t\tTDef,\n\t\tTKey,\n\t\tTInput,\n\t\tSchema<TOutput, TOutput>,\n\t\tTOutput,\n\t\tTEventSchema,\n\t\tTEmit,\n\t\tTErrors\n\t>\n}\n\n/**\n * Fail a live subscription whose initial snapshot could not be built.\n *\n * An expected client failure - an `ORPCError` with a 4xx status, e.g. the\n * subscribed resource was not found or access was refused - reaches the\n * subscriber unchanged and is NOT logged as a server fault. Only 5xx and\n * unknown failures are logged. Unknown errors are wrapped as\n * `INTERNAL_SERVER_ERROR`.\n */\nexport function throwInitialSnapshotError(\n\terr: unknown,\n\tliveName: string,\n\tlogger: Pick<FnLogger, 'error'>,\n\t/** `createFn`'s `isExpectedError`; default: a 4xx `ORPCError`. */\n\tisExpected: (error: unknown) => boolean = (error) =>\n\t\terror instanceof ORPCError && error.status < 500\n): never {\n\tif (!isExpected(err)) {\n\t\tlogger.error('fnLive initial snapshot failed', {\n\t\t\tname: liveName,\n\t\t\terr: errorMessageOf(err)\n\t\t})\n\t}\n\tthrow toSnapshotError(err, liveName)\n}\n\n/** An `ORPCError` passes through; anything else becomes INTERNAL_SERVER_ERROR. */\nfunction toSnapshotError(\n\terr: unknown,\n\tliveName: string\n): ORPCError<string, unknown> {\n\tif (err instanceof ORPCError) return err\n\treturn new ORPCError('INTERNAL_SERVER_ERROR', {\n\t\tmessage: `Failed to load initial snapshot for ${liveName}`,\n\t\tcause: err\n\t})\n}\n\n/**\n * Drives a live subscription: yields the initial snapshot, then folds each\n * inbound event into the running snapshot via `apply`, yielding after every\n * change. With `coalesceMs`, events arriving within that window are batched so\n * bursty streams apply together.\n *\n * `apply` may return an {@link FnLivePatch} to keep the full snapshot as the\n * internal accumulator while yielding only the lighter `emit` payload.\n *\n * Invariant: there is never more than one outstanding `source.next()` read. On\n * a coalesce-window timeout the still-pending read is stashed in `pending` and\n * reused by the next `readNext()` - issuing a second concurrent read would\n * strand the in-flight event behind the next one (delivering it \"one behind\").\n */\nexport async function* streamLiveSnapshots<\n\tTEvent,\n\tTOutput,\n\tTEmit = never\n>(opts: {\n\tsource: AsyncIterator<TEvent>\n\t/** Maximum events retained in one coalescing batch. */\n\tmaxBatchSize?: number\n\tapplyBatch?: (\n\t\tevents: readonly TEvent[],\n\t\tprevious: TOutput\n\t) => MaybePromise<TOutput | undefined>\n\tinitial: TOutput\n\tcoalesceMs?: number | undefined\n\tapply: (\n\t\tevent: TEvent,\n\t\tprevious: TOutput\n\t) => MaybePromise<TOutput | FnLivePatch<TOutput, TEmit> | undefined>\n}): AsyncGenerator<TOutput | TEmit> {\n\tconst { source, initial, coalesceMs, apply } = opts\n\tconst maxBatchSize = positiveInteger(\n\t\topts.maxBatchSize ?? 1000,\n\t\t'maxBatchSize'\n\t)\n\tif (\n\t\tcoalesceMs !== undefined &&\n\t\t(!Number.isFinite(coalesceMs) || coalesceMs < 0)\n\t)\n\t\tthrow new RangeError('orpc-fn: coalesceMs must be finite and nonnegative')\n\n\tlet pending: Promise<IteratorResult<TEvent>> | null = null\n\tconst readNext = () => {\n\t\tconst read = pending ?? source.next()\n\t\tpending = null\n\t\treturn read\n\t}\n\n\tlet previous = initial\n\tyield previous\n\n\twhile (true) {\n\t\tconst current = await readNext()\n\t\tif (current.done) break\n\n\t\tconst batch: TEvent[] = [current.value]\n\n\t\tif (coalesceMs) {\n\t\t\tconst endAt = Date.now() + coalesceMs\n\t\t\twhile (Date.now() < endAt && batch.length < maxBatchSize) {\n\t\t\t\tconst remainingMs = endAt - Date.now()\n\t\t\t\tconst read = readNext()\n\t\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined\n\t\t\t\tconst result = await Promise.race([\n\t\t\t\t\tread,\n\t\t\t\t\tnew Promise<typeof TIMEOUT>((resolve) => {\n\t\t\t\t\t\ttimer = setTimeout(resolve, remainingMs, TIMEOUT)\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t\tclearTimeout(timer)\n\n\t\t\t\tif (result === TIMEOUT) {\n\t\t\t\t\t// Reuse the SAME in-flight read next iteration instead of starting\n\t\t\t\t\t// a new one - this is what prevents the \"one behind\" stranding.\n\t\t\t\t\tpending = read\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tif (result.done) {\n\t\t\t\t\tpending = Promise.resolve(result)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tbatch.push(result.value)\n\t\t\t}\n\t\t}\n\n\t\tif (opts.applyBatch) {\n\t\t\tconst next = await opts.applyBatch(batch, previous)\n\t\t\tif (next !== undefined) {\n\t\t\t\tprevious = next\n\t\t\t\tyield previous\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tlet changed = false\n\t\tfor (const event of batch) {\n\t\t\tconst next = await apply(event, previous)\n\t\t\tif (next === undefined) continue\n\t\t\tif (isFnLivePatch(next)) {\n\t\t\t\tif (changed) {\n\t\t\t\t\tyield previous\n\t\t\t\t\tchanged = false\n\t\t\t\t}\n\t\t\t\tprevious = next.state as TOutput\n\t\t\t\tyield next.emit as TEmit\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprevious = next\n\t\t\tchanged = true\n\t\t}\n\t\tif (changed) yield previous\n\t}\n}\n\ntype RuntimeParams = Record<string, unknown> & {\n\tinput: Record<string, unknown>\n\tcontext: unknown\n\tsignal: AbortSignal | undefined\n\tlogger: FnLogger\n\tcall: (procedure: AnyProcedure, input: unknown) => Promise<unknown>\n\t[RAW_INPUT]: unknown\n}\n\n/** `FnLiveConfig` with the generics erased: what the implementation reads. */\ntype RuntimeLiveConfig = Omit<ChannelOptions, 'name'> & {\n\tname?: string\n\tstateSchema?: AnySchema\n\temitSchema?: AnySchema\n\treauthorize?: AuthFn<Record<string, unknown>, unknown>\n\ttransformerFn?: (params: RuntimeParams & Record<string, unknown>) => unknown\n\tshouldUpdate?: (params: RuntimeParams & Record<string, unknown>) => unknown\n\tsafePublish?: boolean\n\tcoalesceMs?: number\n\tmaxBatchSize?: number\n\tsummary?: string\n\tdescription?: string\n}\n\n/**\n * @internal Wires `fnLive` onto an `fn` and channel runtime of the same\n * instance. `createFn` returns it typed as {@link FnLive}.\n */\nexport function createFnLive(runtime: {\n\t// biome-ignore lint/suspicious/noExplicitAny: runtime half of the typed `Fn`\n\tfn: (options: any) => AnyProcedure\n\tcreateChannel: (options: ChannelOptions) => Channel\n\tcreateLogger: (scope: string, span: SpanLike | undefined) => FnLogger\n\tisGuard: (option: string) => boolean\n}) {\n\tconst { fn, createChannel, isGuard } = runtime\n\tconst liveLogger = runtime.createLogger('fn-live', undefined)\n\n\treturn (\n\t\toptions: {\n\t\t\tlive: RuntimeLiveConfig\n\t\t\thandler: (params: RuntimeParams) => unknown\n\t\t\tinput: ZodType\n\t\t\toutput?: ZodType\n\t\t\tname: string\n\t\t\tprocedure?: string\n\t\t\tsummary?: string\n\t\t\tdescription?: string\n\t\t\ttags?: string[]\n\t\t} & Record<string, unknown>\n\t) => {\n\t\tconst { live, handler, input, output, name, ...routeConfig } = options\n\t\tif (live.transformerFn && !live.stateSchema)\n\t\t\tthrow new TypeError(\n\t\t\t\t'orpc-fn: live transformers require a stateSchema for parsed state'\n\t\t\t)\n\t\tif (\n\t\t\tlive.coalesceMs !== undefined &&\n\t\t\t(!Number.isFinite(live.coalesceMs) || live.coalesceMs < 0)\n\t\t)\n\t\t\tthrow new RangeError('orpc-fn: coalesceMs must be finite and nonnegative')\n\t\tif (live.maxBatchSize !== undefined)\n\t\t\tpositiveInteger(live.maxBatchSize, 'maxBatchSize')\n\t\tconst liveName = live.name ?? `${name}.live`\n\t\tconst liveSummary =\n\t\t\tlive.summary ?? `Live updates of ${routeConfig.summary ?? name}`\n\t\tconst liveDescription = live.description ?? routeConfig.description\n\n\t\t// `createChannel` reads only the channel keys of the live config.\n\t\tconst channel = createChannel({ ...live, name: liveName })\n\n\t\tconst publish = async (event: unknown) => {\n\t\t\tif (!live.safePublish) return channel.publish(event)\n\t\t\ttry {\n\t\t\t\tawait channel.publish(event)\n\t\t\t} catch (err) {\n\t\t\t\t// Live update failures must not roll back the route that emitted them,\n\t\t\t\t// but they should still be visible in logs.\n\t\t\t\tliveLogger.error('fnLive publish failed', {\n\t\t\t\t\tname: liveName,\n\t\t\t\t\terr: errorMessageOf(err)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst runHandler = (params: RuntimeParams) =>\n\t\t\thandler({ ...params, publish })\n\n\t\tconst procedure = fn({\n\t\t\t...routeConfig,\n\t\t\tname,\n\t\t\tinput,\n\t\t\toutput,\n\t\t\thandler: runHandler\n\t\t})\n\n\t\tconst validate = async (schema: AnySchema, value: unknown) => {\n\t\t\tconst result = await schema['~standard'].validate(value)\n\t\t\tif (result.issues)\n\t\t\t\tthrow new ORPCError('INTERNAL_SERVER_ERROR', {\n\t\t\t\t\tmessage: 'Invalid live state or patch',\n\t\t\t\t\tcause: result.issues\n\t\t\t\t})\n\t\t\treturn result.value\n\t\t}\n\t\tconst runSnapshot = (params: RuntimeParams) =>\n\t\t\tparams.call(procedure, params[RAW_INPUT])\n\t\t// Generated streams inherit access policies and metadata; tool adapters reject streams.\n\n\t\tconst guardOptions = Object.fromEntries(\n\t\t\tObject.entries(routeConfig).filter(([option]) => isGuard(option))\n\t\t)\n\t\tconst subscribe = fn({\n\t\t\t...guardOptions,\n\t\t\tguardResolvers: routeConfig.guardResolvers,\n\t\t\terrors: routeConfig.errors,\n\t\t\tmeta: routeConfig.meta,\n\t\t\tstream: true,\n\t\t\tprocedure: routeConfig.procedure,\n\t\t\ttags: routeConfig.tags,\n\t\t\tname: liveName,\n\t\t\tmethod: 'GET',\n\t\t\tinput,\n\t\t\tsummary: liveSummary,\n\t\t\tdescription: liveDescription,\n\t\t\thandler: async function* (params: RuntimeParams) {\n\t\t\t\t// Authorize and subscribe before the snapshot: a refused subscriber\n\t\t\t\t// gets nothing, and events published while it loads are queued.\n\t\t\t\tconst subscription = await channel.open({\n\t\t\t\t\tinput: params.input,\n\t\t\t\t\tcontext: params.context,\n\t\t\t\t\tsignal: params.signal,\n\t\t\t\t\trecoverGaps: true\n\t\t\t\t})\n\t\t\t\ttry {\n\t\t\t\t\tif (subscription.isClosed()) return\n\t\t\t\t\tlet initial: unknown\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinitial = await runSnapshot(params)\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t// `fn.completed` logs it, at the level `isExpectedError` picks.\n\t\t\t\t\t\tthrow toSnapshotError(err, liveName)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rerun = () => runSnapshot(params)\n\t\t\t\t\tconst authorize = async () => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlive.reauthorize &&\n\t\t\t\t\t\t\tlive.reauthorize !== true &&\n\t\t\t\t\t\t\t!(await live.reauthorize({\n\t\t\t\t\t\t\t\tinput: params.input,\n\t\t\t\t\t\t\t\tctx: params.context\n\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthrow new ORPCError('FORBIDDEN')\n\t\t\t\t\t}\n\t\t\t\t\tconst apply = async (event: unknown, previous: unknown) => {\n\t\t\t\t\t\tawait authorize()\n\t\t\t\t\t\tif (event === LIVE_GAP) return rerun()\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlive.shouldUpdate &&\n\t\t\t\t\t\t\t!(await live.shouldUpdate({ ...params, event, previous }))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\tif (!live.transformerFn) return rerun()\n\t\t\t\t\t\tconst next = await live.transformerFn({\n\t\t\t\t\t\t\t...params,\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\tprevious,\n\t\t\t\t\t\t\trerun\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif (next === undefined) return undefined\n\t\t\t\t\t\tif (isFnLivePatch(next)) {\n\t\t\t\t\t\t\tif (!live.emitSchema)\n\t\t\t\t\t\t\t\tthrow new TypeError('orpc-fn: live patches require emitSchema')\n\t\t\t\t\t\t\treturn fnLivePatch(\n\t\t\t\t\t\t\t\tawait validate(live.stateSchema as AnySchema, next.state),\n\t\t\t\t\t\t\t\tawait validate(live.emitSchema, next.emit)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn validate(live.stateSchema as AnySchema, next)\n\t\t\t\t\t}\n\t\t\t\t\tconst applyBatch = live.transformerFn\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: async (events: readonly unknown[], previous: unknown) => {\n\t\t\t\t\t\t\t\tawait authorize()\n\t\t\t\t\t\t\t\tlet invalidated = false\n\t\t\t\t\t\t\t\tfor (const event of events)\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tevent === LIVE_GAP ||\n\t\t\t\t\t\t\t\t\t\t!live.shouldUpdate ||\n\t\t\t\t\t\t\t\t\t\t(await live.shouldUpdate({ ...params, event, previous }))\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tinvalidated = true\n\t\t\t\t\t\t\t\treturn invalidated ? rerun() : undefined\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\tyield* streamLiveSnapshots({\n\t\t\t\t\t\tsource: subscription.events,\n\t\t\t\t\t\tinitial,\n\t\t\t\t\t\tcoalesceMs: live.coalesceMs,\n\t\t\t\t\t\t...(live.maxBatchSize !== undefined\n\t\t\t\t\t\t\t? { maxBatchSize: live.maxBatchSize }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\tapply,\n\t\t\t\t\t\t...(applyBatch ? { applyBatch } : {})\n\t\t\t\t\t})\n\t\t\t\t} finally {\n\t\t\t\t\tsubscription.close()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\tprocedure,\n\t\t\tsubscribe,\n\t\t\tpublish,\n\t\t\tgetChannelName: channel.getChannelName,\n\t\t\tgetSubscriptionChannelName: channel.getSubscriptionChannelName,\n\t\t\tgetPublishChannelName: channel.getPublishChannelName\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"fn-live.js","sourceRoot":"","sources":["../../src/live/fn-live.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnySchema, ErrorMap, Schema } from '@orpc/contract'\nimport { type AnyProcedure, ORPCError } from '@orpc/server'\nimport type { ZodType, z } from 'zod'\nimport { RAW_INPUT } from '../timing.js'\nimport { LIVE_GAP, positiveInteger } from './lifecycle.js'\nimport type { FnLogger } from '../logger.js'\nimport { errorMessageOf, type SpanLike } from '../otel.js'\nimport type {\n\tFnContext,\n\tFnDefinition,\n\tFnProcedure,\n\tFnRouteOptions,\n\tHandlerParams,\n\tMaybePromise,\n\tProcedureKey\n} from '../types.js'\nimport type {\n\tAuthFn,\n\tChannel,\n\tChannelDefinition,\n\tChannelOptions,\n\tChannelQueueOptions,\n\tObjectSchema,\n\tPublisherConfig\n} from './pub-sub.js'\n\n/** Marks a coalesce window that ended before the next event arrived. */\nconst TIMEOUT = Symbol('timeout')\n\nconst fnLivePatchMarker = Symbol('fnLive.patch')\n\n/**\n * Transformer result that splits the internal accumulator from the wire\n * payload: `state` becomes the `previous` snapshot for later events while only\n * `emit` is sent to the subscriber. Lets high-frequency streams avoid\n * re-serializing the full snapshot per event.\n */\nexport type FnLivePatch<TOutput, TEmit> = {\n\t[fnLivePatchMarker]: true\n\tstate: TOutput\n\temit: TEmit\n}\n\nexport function fnLivePatch<TOutput, TEmit>(\n\tstate: TOutput,\n\temit: TEmit\n): FnLivePatch<TOutput, TEmit> {\n\treturn { [fnLivePatchMarker]: true, state, emit }\n}\n\nfunction isFnLivePatch(value: unknown): value is FnLivePatch<unknown, unknown> {\n\treturn (\n\t\ttypeof value === 'object' && value !== null && fnLivePatchMarker in value\n\t)\n}\n\nexport type FnLiveConfig<\n\tTDef extends FnDefinition,\n\tTInput,\n\tTEventSchema extends ZodType,\n\tTOutput,\n\tTKey extends ProcedureKey<TDef>,\n\tTEmit = never,\n\tTErrors extends ErrorMap = Record<never, never>\n> = Omit<PublisherConfig, 'name'> &\n\tChannelQueueOptions & {\n\t\t/** Subscribe route name; default `${name}.live`. */\n\t\tname?: string\n\t\t/**\n\t\t * Validates reducer state without reapplying an output transform. Required with a\n\t\t * transformer. Its input may be looser than its output (e.g. branded IDs); it is\n\t\t * checked at runtime.\n\t\t */\n\t\tstateSchema?: Schema<unknown, TOutput>\n\t\t/** Validates patch payloads. Required when a transformer returns fnLivePatch. */\n\t\temitSchema?: Schema<unknown, TEmit>\n\t\t/** Optional access check before each update; idle streams keep their initial authorization. */\n\t\treauthorize?: AuthFn<TInput, FnContext<TDef, TKey>>\n\t\teventSchema: TEventSchema\n\t\tchannel: ChannelDefinition<\n\t\t\tTInput,\n\t\t\tz.output<TEventSchema>,\n\t\t\tFnContext<TDef, TKey>\n\t\t>\n\t\t/** Fold an event into the snapshot; without it every event re-runs the handler. */\n\t\ttransformerFn?: FnLiveConfigTransformer<\n\t\t\tTDef,\n\t\t\tTInput,\n\t\t\tTEventSchema,\n\t\t\tTOutput,\n\t\t\tTKey,\n\t\t\tTEmit,\n\t\t\tTErrors\n\t\t>\n\t\t/** Return false to skip an event. */\n\t\tshouldUpdate?: (\n\t\t\tparams: HandlerParams<TDef, TInput, TKey, TErrors> & {\n\t\t\t\tevent: z.output<TEventSchema>\n\t\t\t\tprevious: TOutput\n\t\t\t}\n\t\t) => MaybePromise<boolean>\n\t\tauthFn?: AuthFn<TInput, FnContext<TDef, TKey>>\n\t\t/** Log publish failures instead of throwing them into the publishing route. */\n\t\tsafePublish?: boolean\n\t\t/** Batch events arriving within this window into one snapshot update. */\n\t\tcoalesceMs?: number\n\t\t/** Maximum events collected in one coalescing batch (default 1000). */\n\t\tmaxBatchSize?: number\n\t\t/**\n\t\t * When a slow subscriber's queue overflows (drop-oldest), this marker is\n\t\t * enqueued INSTEAD of the dropped event so the client resyncs. Return\n\t\t * `null` to skip.\n\t\t */\n\t\toverflowMarker?: (input: TInput) => z.output<TEventSchema> | null\n\t\tsummary?: string\n\t\tdescription?: string\n\t} & (\n\t\t| { transformerFn?: undefined }\n\t\t| {\n\t\t\t\ttransformerFn: FnLiveConfigTransformer<\n\t\t\t\t\tTDef,\n\t\t\t\t\tTInput,\n\t\t\t\t\tTEventSchema,\n\t\t\t\t\tTOutput,\n\t\t\t\t\tTKey,\n\t\t\t\t\tTEmit,\n\t\t\t\t\tTErrors\n\t\t\t\t>\n\t\t\t\tstateSchema: Schema<unknown, TOutput>\n\t\t }\n\t) &\n\t([TEmit] extends [never] ? object : { emitSchema: Schema<unknown, TEmit> })\n\ntype FnLiveConfigTransformer<\n\tTDef extends FnDefinition,\n\tTInput,\n\tTEventSchema extends ZodType,\n\tTOutput,\n\tTKey extends ProcedureKey<TDef>,\n\tTEmit,\n\tTErrors extends ErrorMap\n> = (\n\tparams: HandlerParams<TDef, TInput, TKey, TErrors> & {\n\t\tevent: z.output<TEventSchema>\n\t\tprevious: TOutput\n\t\trerun: () => Promise<TOutput>\n\t}\n) => MaybePromise<TOutput | FnLivePatch<TOutput, TEmit> | undefined>\n\nexport type FnLiveReturn<\n\tTDef extends FnDefinition,\n\tTKey extends ProcedureKey<TDef>,\n\tTInput extends ObjectSchema,\n\tTOutputSchema extends Schema<unknown, unknown>,\n\tTOutput,\n\tTEventSchema extends ZodType,\n\tTEmit = never,\n\tTErrors extends ErrorMap = Record<never, never>\n> = {\n\tprocedure: FnProcedure<TDef, TKey, TInput, TOutputSchema, TErrors>\n\tsubscribe: FnProcedure<\n\t\tTDef,\n\t\tTKey,\n\t\tTInput,\n\t\tSchema<AsyncGenerator<TOutput | TEmit>, AsyncGenerator<TOutput | TEmit>>,\n\t\tTErrors\n\t>\n\tpublish: (event: z.input<TEventSchema>) => Promise<void>\n\tgetSubscriptionChannelName: (params: {\n\t\tinput: z.output<TInput>\n\t\tcontext: FnContext<TDef, TKey>\n\t}) => string\n\tgetPublishChannelName: (event: z.output<TEventSchema>) => string\n\t/** @deprecated Prefer the separate required-input resolver methods. */\n\tgetChannelName: (\n\t\tparams: Partial<z.output<TInput>> | Partial<z.output<TEventSchema>>,\n\t\tcontext?: FnContext<TDef, TKey>\n\t) => string\n}\n\n/**\n * A route plus a subscribe route that streams its result: the initial\n * snapshot, then an update for every event published on the channel.\n */\nexport interface FnLive<TDef extends FnDefinition> {\n\t<\n\t\tTInput extends ObjectSchema,\n\t\tTOutputSchema extends ZodType,\n\t\tTEventSchema extends ZodType,\n\t\tTKey extends ProcedureKey<TDef> = TDef['default'],\n\t\tTEmit = never,\n\t\tTErrors extends ErrorMap = Record<never, never>\n\t>(\n\t\toptions: {\n\t\t\tinput: TInput\n\t\t\toutput: TOutputSchema\n\t\t\thandler: (\n\t\t\t\tparams: HandlerParams<\n\t\t\t\t\tTDef,\n\t\t\t\t\tz.output<TInput>,\n\t\t\t\t\tNoInfer<TKey>,\n\t\t\t\t\tTErrors\n\t\t\t\t> & {\n\t\t\t\t\tpublish: (event: z.input<TEventSchema>) => Promise<void>\n\t\t\t\t}\n\t\t\t\t// The output schema parses what the handler returns: its input type.\n\t\t\t) => MaybePromise<z.input<TOutputSchema>>\n\t\t\tlive: FnLiveConfig<\n\t\t\t\tTDef,\n\t\t\t\tz.output<TInput>,\n\t\t\t\tTEventSchema,\n\t\t\t\tz.output<TOutputSchema>,\n\t\t\t\tNoInfer<TKey>,\n\t\t\t\tTEmit,\n\t\t\t\tTErrors\n\t\t\t>\n\t\t} & FnRouteOptions<TDef, TKey, z.output<TInput>, TErrors>\n\t): FnLiveReturn<\n\t\tTDef,\n\t\tTKey,\n\t\tTInput,\n\t\tTOutputSchema,\n\t\tz.output<TOutputSchema>,\n\t\tTEventSchema,\n\t\tTEmit,\n\t\tTErrors\n\t>\n\n\t<\n\t\tTInput extends ObjectSchema,\n\t\tTOutput,\n\t\tTEventSchema extends ZodType,\n\t\tTKey extends ProcedureKey<TDef> = TDef['default'],\n\t\tTEmit = never,\n\t\tTErrors extends ErrorMap = Record<never, never>\n\t>(\n\t\toptions: {\n\t\t\tinput: TInput\n\t\t\toutput?: undefined\n\t\t\thandler: (\n\t\t\t\tparams: HandlerParams<\n\t\t\t\t\tTDef,\n\t\t\t\t\tz.output<TInput>,\n\t\t\t\t\tNoInfer<TKey>,\n\t\t\t\t\tTErrors\n\t\t\t\t> & {\n\t\t\t\t\tpublish: (event: z.input<TEventSchema>) => Promise<void>\n\t\t\t\t}\n\t\t\t) => MaybePromise<TOutput>\n\t\t\tlive: FnLiveConfig<\n\t\t\t\tTDef,\n\t\t\t\tz.output<TInput>,\n\t\t\t\tTEventSchema,\n\t\t\t\tTOutput,\n\t\t\t\tNoInfer<TKey>,\n\t\t\t\tTEmit,\n\t\t\t\tTErrors\n\t\t\t>\n\t\t} & FnRouteOptions<TDef, TKey, z.output<TInput>, TErrors>\n\t): FnLiveReturn<\n\t\tTDef,\n\t\tTKey,\n\t\tTInput,\n\t\tSchema<TOutput, TOutput>,\n\t\tTOutput,\n\t\tTEventSchema,\n\t\tTEmit,\n\t\tTErrors\n\t>\n}\n\n/**\n * Fail a live subscription whose initial snapshot could not be built.\n *\n * An expected client failure - an `ORPCError` with a 4xx status, e.g. the\n * subscribed resource was not found or access was refused - reaches the\n * subscriber unchanged and is NOT logged as a server fault. Only 5xx and\n * unknown failures are logged. Unknown errors are wrapped as\n * `INTERNAL_SERVER_ERROR`.\n */\nexport function throwInitialSnapshotError(\n\terr: unknown,\n\tliveName: string,\n\tlogger: Pick<FnLogger, 'error'>,\n\t/** `createFn`'s `isExpectedError`; default: a 4xx `ORPCError`. */\n\tisExpected: (error: unknown) => boolean = (error) =>\n\t\terror instanceof ORPCError && error.status < 500\n): never {\n\tif (!isExpected(err)) {\n\t\tlogger.error('fnLive initial snapshot failed', {\n\t\t\tname: liveName,\n\t\t\terr: errorMessageOf(err)\n\t\t})\n\t}\n\tthrow toSnapshotError(err, liveName)\n}\n\n/** An `ORPCError` passes through; anything else becomes INTERNAL_SERVER_ERROR. */\nfunction toSnapshotError(\n\terr: unknown,\n\tliveName: string\n): ORPCError<string, unknown> {\n\tif (err instanceof ORPCError) return err\n\treturn new ORPCError('INTERNAL_SERVER_ERROR', {\n\t\tmessage: `Failed to load initial snapshot for ${liveName}`,\n\t\tcause: err\n\t})\n}\n\n/**\n * Drives a live subscription: yields the initial snapshot, then folds each\n * inbound event into the running snapshot via `apply`, yielding after every\n * change. With `coalesceMs`, events arriving within that window are batched so\n * bursty streams apply together.\n *\n * `apply` may return an {@link FnLivePatch} to keep the full snapshot as the\n * internal accumulator while yielding only the lighter `emit` payload.\n *\n * Invariant: there is never more than one outstanding `source.next()` read. On\n * a coalesce-window timeout the still-pending read is stashed in `pending` and\n * reused by the next `readNext()` - issuing a second concurrent read would\n * strand the in-flight event behind the next one (delivering it \"one behind\").\n */\nexport async function* streamLiveSnapshots<\n\tTEvent,\n\tTOutput,\n\tTEmit = never\n>(opts: {\n\tsource: AsyncIterator<TEvent>\n\t/** Maximum events retained in one coalescing batch. */\n\tmaxBatchSize?: number\n\tapplyBatch?: (\n\t\tevents: readonly TEvent[],\n\t\tprevious: TOutput\n\t) => MaybePromise<TOutput | undefined>\n\tinitial: TOutput\n\tcoalesceMs?: number | undefined\n\tapply: (\n\t\tevent: TEvent,\n\t\tprevious: TOutput\n\t) => MaybePromise<TOutput | FnLivePatch<TOutput, TEmit> | undefined>\n}): AsyncGenerator<TOutput | TEmit> {\n\tconst { source, initial, coalesceMs, apply } = opts\n\tconst maxBatchSize = positiveInteger(\n\t\topts.maxBatchSize ?? 1000,\n\t\t'maxBatchSize'\n\t)\n\tif (\n\t\tcoalesceMs !== undefined &&\n\t\t(!Number.isFinite(coalesceMs) || coalesceMs < 0)\n\t)\n\t\tthrow new RangeError('orpc-fn: coalesceMs must be finite and nonnegative')\n\n\tlet pending: Promise<IteratorResult<TEvent>> | null = null\n\tconst readNext = () => {\n\t\tconst read = pending ?? source.next()\n\t\tpending = null\n\t\treturn read\n\t}\n\n\tlet previous = initial\n\tyield previous\n\n\twhile (true) {\n\t\tconst current = await readNext()\n\t\tif (current.done) break\n\n\t\tconst batch: TEvent[] = [current.value]\n\n\t\tif (coalesceMs) {\n\t\t\tconst endAt = Date.now() + coalesceMs\n\t\t\twhile (Date.now() < endAt && batch.length < maxBatchSize) {\n\t\t\t\tconst remainingMs = endAt - Date.now()\n\t\t\t\tconst read = readNext()\n\t\t\t\tlet timer: ReturnType<typeof setTimeout> | undefined\n\t\t\t\tconst result = await Promise.race([\n\t\t\t\t\tread,\n\t\t\t\t\tnew Promise<typeof TIMEOUT>((resolve) => {\n\t\t\t\t\t\ttimer = setTimeout(resolve, remainingMs, TIMEOUT)\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t\tclearTimeout(timer)\n\n\t\t\t\tif (result === TIMEOUT) {\n\t\t\t\t\t// Reuse the SAME in-flight read next iteration instead of starting\n\t\t\t\t\t// a new one - this is what prevents the \"one behind\" stranding.\n\t\t\t\t\tpending = read\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tif (result.done) {\n\t\t\t\t\tpending = Promise.resolve(result)\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tbatch.push(result.value)\n\t\t\t}\n\t\t}\n\n\t\tif (opts.applyBatch) {\n\t\t\tconst next = await opts.applyBatch(batch, previous)\n\t\t\tif (next !== undefined) {\n\t\t\t\tprevious = next\n\t\t\t\tyield previous\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tlet changed = false\n\t\tfor (const event of batch) {\n\t\t\tconst next = await apply(event, previous)\n\t\t\tif (next === undefined) continue\n\t\t\tif (isFnLivePatch(next)) {\n\t\t\t\tif (changed) {\n\t\t\t\t\tyield previous\n\t\t\t\t\tchanged = false\n\t\t\t\t}\n\t\t\t\tprevious = next.state as TOutput\n\t\t\t\tyield next.emit as TEmit\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tprevious = next\n\t\t\tchanged = true\n\t\t}\n\t\tif (changed) yield previous\n\t}\n}\n\ntype RuntimeParams = Record<string, unknown> & {\n\tinput: Record<string, unknown>\n\tcontext: unknown\n\tsignal: AbortSignal | undefined\n\tlogger: FnLogger\n\tcall: (procedure: AnyProcedure, input: unknown) => Promise<unknown>\n\t[RAW_INPUT]: unknown\n}\n\n/** `FnLiveConfig` with the generics erased: what the implementation reads. */\ntype RuntimeLiveConfig = Omit<ChannelOptions, 'name'> & {\n\tname?: string\n\tstateSchema?: AnySchema\n\temitSchema?: AnySchema\n\treauthorize?: AuthFn<Record<string, unknown>, unknown>\n\ttransformerFn?: (params: RuntimeParams & Record<string, unknown>) => unknown\n\tshouldUpdate?: (params: RuntimeParams & Record<string, unknown>) => unknown\n\tsafePublish?: boolean\n\tcoalesceMs?: number\n\tmaxBatchSize?: number\n\tsummary?: string\n\tdescription?: string\n}\n\n/**\n * @internal Wires `fnLive` onto an `fn` and channel runtime of the same\n * instance. `createFn` returns it typed as {@link FnLive}.\n */\nexport function createFnLive(runtime: {\n\t// biome-ignore lint/suspicious/noExplicitAny: runtime half of the typed `Fn`\n\tfn: (options: any) => AnyProcedure\n\tcreateChannel: (options: ChannelOptions) => Channel\n\tcreateLogger: (scope: string, span: SpanLike | undefined) => FnLogger\n\tisGuard: (option: string) => boolean\n}) {\n\tconst { fn, createChannel, isGuard } = runtime\n\tconst liveLogger = runtime.createLogger('fn-live', undefined)\n\n\treturn (\n\t\toptions: {\n\t\t\tlive: RuntimeLiveConfig\n\t\t\thandler: (params: RuntimeParams) => unknown\n\t\t\tinput: ZodType\n\t\t\toutput?: ZodType\n\t\t\tname: string\n\t\t\tprocedure?: string\n\t\t\tsummary?: string\n\t\t\tdescription?: string\n\t\t\ttags?: string[]\n\t\t} & Record<string, unknown>\n\t) => {\n\t\tconst { live, handler, input, output, name, ...routeConfig } = options\n\t\tif (live.transformerFn && !live.stateSchema)\n\t\t\tthrow new TypeError(\n\t\t\t\t'orpc-fn: live transformers require a stateSchema for parsed state'\n\t\t\t)\n\t\tif (\n\t\t\tlive.coalesceMs !== undefined &&\n\t\t\t(!Number.isFinite(live.coalesceMs) || live.coalesceMs < 0)\n\t\t)\n\t\t\tthrow new RangeError('orpc-fn: coalesceMs must be finite and nonnegative')\n\t\tif (live.maxBatchSize !== undefined)\n\t\t\tpositiveInteger(live.maxBatchSize, 'maxBatchSize')\n\t\tconst liveName = live.name ?? `${name}.live`\n\t\tconst liveSummary =\n\t\t\tlive.summary ?? `Live updates of ${routeConfig.summary ?? name}`\n\t\tconst liveDescription = live.description ?? routeConfig.description\n\n\t\t// `createChannel` reads only the channel keys of the live config.\n\t\tconst channel = createChannel({ ...live, name: liveName })\n\n\t\tconst publish = async (event: unknown) => {\n\t\t\tif (!live.safePublish) return channel.publish(event)\n\t\t\ttry {\n\t\t\t\tawait channel.publish(event)\n\t\t\t} catch (err) {\n\t\t\t\t// Live update failures must not roll back the route that emitted them,\n\t\t\t\t// but they should still be visible in logs.\n\t\t\t\tliveLogger.error('fnLive publish failed', {\n\t\t\t\t\tname: liveName,\n\t\t\t\t\terr: errorMessageOf(err)\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\n\t\tconst runHandler = (params: RuntimeParams) =>\n\t\t\thandler({ ...params, publish })\n\n\t\tconst procedure = fn({\n\t\t\t...routeConfig,\n\t\t\tname,\n\t\t\tinput,\n\t\t\toutput,\n\t\t\thandler: runHandler\n\t\t})\n\n\t\tconst validate = async (schema: AnySchema, value: unknown) => {\n\t\t\tconst result = await schema['~standard'].validate(value)\n\t\t\tif (result.issues)\n\t\t\t\tthrow new ORPCError('INTERNAL_SERVER_ERROR', {\n\t\t\t\t\tmessage: 'Invalid live state or patch',\n\t\t\t\t\tcause: result.issues\n\t\t\t\t})\n\t\t\treturn result.value\n\t\t}\n\t\tconst runSnapshot = (params: RuntimeParams) =>\n\t\t\tparams.call(procedure, params[RAW_INPUT])\n\t\t// Generated streams inherit access policies and metadata; tool adapters reject streams.\n\n\t\tconst guardOptions = Object.fromEntries(\n\t\t\tObject.entries(routeConfig).filter(([option]) => isGuard(option))\n\t\t)\n\t\tconst subscribe = fn({\n\t\t\t...guardOptions,\n\t\t\tguardResolvers: routeConfig.guardResolvers,\n\t\t\terrors: routeConfig.errors,\n\t\t\tmeta: routeConfig.meta,\n\t\t\tstream: true,\n\t\t\tprocedure: routeConfig.procedure,\n\t\t\ttags: routeConfig.tags,\n\t\t\tname: liveName,\n\t\t\tmethod: 'GET',\n\t\t\tinput,\n\t\t\tsummary: liveSummary,\n\t\t\tdescription: liveDescription,\n\t\t\thandler: async function* (params: RuntimeParams) {\n\t\t\t\t// Authorize and subscribe before the snapshot: a refused subscriber\n\t\t\t\t// gets nothing, and events published while it loads are queued.\n\t\t\t\tconst subscription = await channel.open({\n\t\t\t\t\tinput: params.input,\n\t\t\t\t\tcontext: params.context,\n\t\t\t\t\tsignal: params.signal,\n\t\t\t\t\trecoverGaps: true\n\t\t\t\t})\n\t\t\t\ttry {\n\t\t\t\t\tif (subscription.isClosed()) return\n\t\t\t\t\tlet initial: unknown\n\t\t\t\t\ttry {\n\t\t\t\t\t\tinitial = await runSnapshot(params)\n\t\t\t\t\t} catch (err) {\n\t\t\t\t\t\t// `fn.completed` logs it, at the level `isExpectedError` picks.\n\t\t\t\t\t\tthrow toSnapshotError(err, liveName)\n\t\t\t\t\t}\n\n\t\t\t\t\tconst rerun = () => runSnapshot(params)\n\t\t\t\t\tconst authorize = async () => {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlive.reauthorize &&\n\t\t\t\t\t\t\tlive.reauthorize !== true &&\n\t\t\t\t\t\t\t!(await live.reauthorize({\n\t\t\t\t\t\t\t\tinput: params.input,\n\t\t\t\t\t\t\t\tctx: params.context\n\t\t\t\t\t\t\t}))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\tthrow new ORPCError('FORBIDDEN')\n\t\t\t\t\t}\n\t\t\t\t\tconst apply = async (event: unknown, previous: unknown) => {\n\t\t\t\t\t\tawait authorize()\n\t\t\t\t\t\tif (event === LIVE_GAP) return rerun()\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tlive.shouldUpdate &&\n\t\t\t\t\t\t\t!(await live.shouldUpdate({ ...params, event, previous }))\n\t\t\t\t\t\t)\n\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\tif (!live.transformerFn) return rerun()\n\t\t\t\t\t\tconst next = await live.transformerFn({\n\t\t\t\t\t\t\t...params,\n\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\tprevious,\n\t\t\t\t\t\t\trerun\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif (next === undefined) return undefined\n\t\t\t\t\t\tif (isFnLivePatch(next)) {\n\t\t\t\t\t\t\tif (!live.emitSchema)\n\t\t\t\t\t\t\t\tthrow new TypeError('orpc-fn: live patches require emitSchema')\n\t\t\t\t\t\t\treturn fnLivePatch(\n\t\t\t\t\t\t\t\tawait validate(live.stateSchema as AnySchema, next.state),\n\t\t\t\t\t\t\t\tawait validate(live.emitSchema, next.emit)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn validate(live.stateSchema as AnySchema, next)\n\t\t\t\t\t}\n\t\t\t\t\tconst applyBatch = live.transformerFn\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: async (events: readonly unknown[], previous: unknown) => {\n\t\t\t\t\t\t\t\tawait authorize()\n\t\t\t\t\t\t\t\tlet invalidated = false\n\t\t\t\t\t\t\t\tfor (const event of events)\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tevent === LIVE_GAP ||\n\t\t\t\t\t\t\t\t\t\t!live.shouldUpdate ||\n\t\t\t\t\t\t\t\t\t\t(await live.shouldUpdate({ ...params, event, previous }))\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\tinvalidated = true\n\t\t\t\t\t\t\t\treturn invalidated ? rerun() : undefined\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\tyield* streamLiveSnapshots({\n\t\t\t\t\t\tsource: subscription.events,\n\t\t\t\t\t\tinitial,\n\t\t\t\t\t\tcoalesceMs: live.coalesceMs,\n\t\t\t\t\t\t...(live.maxBatchSize !== undefined\n\t\t\t\t\t\t\t? { maxBatchSize: live.maxBatchSize }\n\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\tapply,\n\t\t\t\t\t\t...(applyBatch ? { applyBatch } : {})\n\t\t\t\t\t})\n\t\t\t\t} finally {\n\t\t\t\t\tsubscription.close()\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\treturn {\n\t\t\tprocedure,\n\t\t\tsubscribe,\n\t\t\tpublish,\n\t\t\tgetChannelName: channel.getChannelName,\n\t\t\tgetSubscriptionChannelName: channel.getSubscriptionChannelName,\n\t\t\tgetPublishChannelName: channel.getPublishChannelName\n\t\t}\n\t}\n}\n"]}
@@ -128,7 +128,11 @@ export type CreatePublisher = <TEventSchema extends ZodType>(options: PublisherO
128
128
  export type PubSubRuntimeOptions = {
129
129
  /** Queue depths, drops, successful reconnects and parse failures. */
130
130
  onMetric?: (event: PubSubMetric) => void;
131
- transport: PubSubTransport;
131
+ /**
132
+ * The broker, or a function creating it on first use so importing routes
133
+ * opens no connection: `transport: () => bunRedisTransport(getRedis())`.
134
+ */
135
+ transport: PubSubTransport | (() => PubSubTransport);
132
136
  /**
133
137
  * Called per event dropped from ingress, replay or delivery queues.
134
138
  * Delivery drops count events before subscriber filtering.
@@ -1 +1 @@
1
- {"version":3,"file":"pub-sub.d.ts","sourceRoot":"","sources":["../../src/live/pub-sub.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pub-sub.d.ts","sourceRoot":"","sources":["../../src/live/pub-sub.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAE5C,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAGN,KAAK,QAAQ,EACb,KAAK,OAAO,EACZ,MAAM,YAAY,CAAA;AACnB,OAAO,KAAK,EACX,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,MAAM,aAAa,CAAA;AAGpB,OAAO,KAAK,EAGX,eAAe,EACf,MAAM,gBAAgB,CAAA;AAUvB,wFAAwF;AACxF,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAA;AAE1E;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,OAAO,IACjE,MAAM,GACN;IACA,SAAS,EAAE,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,QAAQ,CAAA;KAAE,KAAK,MAAM,CAAA;IACnE,OAAO,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,CAAA;CACrC,GACD,CAAC,CACD,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,EAC7C,OAAO,CAAC,EAAE,QAAQ,KACb,MAAM,CAAC,CAAA;AAEf,wDAAwD;AACxD,MAAM,MAAM,QAAQ,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;IACnD,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,UAAU,CAAA;CAChB,KAAK,YAAY,CAAC,OAAO,CAAC,CAAA;AAE3B;;;GAGG;AACH,MAAM,MAAM,MAAM,CAAC,MAAM,EAAE,QAAQ,IAChC,CAAC,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,QAAQ,CAAA;CAAE,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GACrE,IAAI,CAAA;AAEP,MAAM,MAAM,eAAe,GAAG;IAC7B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAAG;IACjC,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,CAC5D;IACA,IAAI,EAAE,OAAO,CAAA;IACb,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAA;IACxC,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;CACZ,GACD;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GACrB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CACrE,CAAA;AAED,MAAM,MAAM,aAAa,CACxB,IAAI,SAAS,YAAY,EACzB,YAAY,SAAS,YAAY,EACjC,YAAY,SAAS,OAAO,EAC5B,IAAI,SAAS,YAAY,CAAC,IAAI,CAAC,IAC5B,eAAe,GAClB,mBAAmB,GAAG;IACrB,OAAO,EAAE,iBAAiB,CACzB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EACtB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EACtB,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CACrB,CAAA;IACD,oCAAoC;IACpC,WAAW,EAAE,YAAY,CAAA;IACzB,2BAA2B;IAC3B,WAAW,EAAE,YAAY,CAAA;IACzB,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAA;IAC9D;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAChB,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KACzB,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAA;IAClC,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;CACpB,CAAA;AAEF,MAAM,MAAM,MAAM,CACjB,IAAI,SAAS,YAAY,EACzB,YAAY,SAAS,YAAY,EACjC,YAAY,SAAS,OAAO,EAC5B,IAAI,SAAS,YAAY,CAAC,IAAI,CAAC,IAC5B;IACH,SAAS,EAAE,WAAW,CACrB,IAAI,EACJ,IAAI,EACJ,YAAY,EACZ,MAAM,CACL,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,EACrD,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,CACrD,CACD,CAAA;IACD,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,qFAAqF;IACrF,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,0BAA0B,EAAE,CAAC,MAAM,EAAE;QACpC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAA;QAC7B,OAAO,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;KAC9B,KAAK,MAAM,CAAA;IACZ,qBAAqB,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,MAAM,CAAA;IAChE,uEAAuE;IACvE,cAAc,EAAE,CACf,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EACzE,OAAO,CAAC,EAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAC3B,MAAM,CAAA;CACX,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,YAAY,IAAI,CACrD,YAAY,SAAS,YAAY,EACjC,YAAY,SAAS,OAAO,EAC5B,IAAI,SAAS,YAAY,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAEjD,OAAO,EAAE,aAAa,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GACtE,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAC5B,IAAI,CACH,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,EAClD,MAAM,GAAG,gBAAgB,CACzB;AACD,2DAA2D,CAAC,eAAe,CAC1E,IAAI,EACJ,IAAI,CACJ,KACE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,YAAY,EAAE,IAAI,CAAC,CAAA;AAEnD,MAAM,MAAM,gBAAgB,CAAC,YAAY,SAAS,OAAO,IAAI,eAAe,GAAG;IAC9E,2EAA2E;IAC3E,OAAO,EAAE,MAAM,GAAG,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,MAAM,CAAC,CAAA;IACvE,WAAW,EAAE,YAAY,CAAA;CACzB,CAAA;AAED,MAAM,MAAM,SAAS,CAAC,YAAY,SAAS,OAAO,IAAI;IACrD,OAAO,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvE,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,MAAM,CAAA;CACnE,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,YAAY,SAAS,OAAO,EAC1D,OAAO,EAAE,gBAAgB,CAAC,YAAY,CAAC,KACnC,SAAS,CAAC,YAAY,CAAC,CAAA;AAE5B,MAAM,MAAM,oBAAoB,GAAG;IAClC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACxC;;;OAGG;IACH,SAAS,EAAE,eAAe,GAAG,CAAC,MAAM,eAAe,CAAC,CAAA;IACpD;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IACzE,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,qEAAqE;IACrE,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,4CAA4C;IAC5C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,oEAAoE;IACpE,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAChC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,gBAAgB;AAChB,MAAM,MAAM,kBAAkB,GAAG;IAChC,EAAE,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,cAAc,EAAE,YAAY,CAAA;IAC7E,OAAO,EAAE,OAAO,CAAA;IAChB,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,KAAK,QAAQ,CAAA;IACrE,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAA;CACzC,CAAA;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,IAAI,EAAE;IAChD,OAAO,EAAE,MAAM,CAAA;IACf,oBAAoB,CAAC,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IACrC,0DAA0D;IAC1D,MAAM,CAAC,EAAE,MAAM,IAAI,CAAA;IACnB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;aAQK,MAAM;IAGV,OAAO,OAAO,CAAC,GAAG,IAAI;IAgCtB,OAAO,IAAI,CAAC,GAAG,SAAS;EASzB;AAED;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,OAAO,EAAE;IACpD,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAA;IACzD,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;IAC7C,aAAa,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACvC,MAAM,EAAE,MAAM,IAAI,CAAA;IAClB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CACjC;IA2CC,IAAI,OAAO,CAAC;IAKZ,MAAM;IACN,mDAAmD;IACnD,KAAK,SAAS,OAAO;EAQtB;AAqBD,KAAK,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAgBpC,mEAAmE;AACnE,MAAM,MAAM,gBAAgB,GAAG;IAC9B,0EAA0E;IAC1E,MAAM,EAAE,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IAC9C,iFAAiF;IACjF,KAAK,EAAE,MAAM,IAAI,CAAA;IACjB,QAAQ,EAAE,MAAM,OAAO,CAAA;CACvB,CAAA;AAED,uEAAuE;AACvE,MAAM,MAAM,cAAc,GAAG,eAAe,GAC3C,mBAAmB,GAAG;IACrB,OAAO,EAAE,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC1C,WAAW,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC/B,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,OAAO,CAAA;CAC1C,CAAA;AAEF,gBAAgB;AAChB,MAAM,MAAM,OAAO,GAAG;IACrB,sEAAsE;IACtE,IAAI,EAAE,CAAC,OAAO,EAAE;QACf,KAAK,EAAE,KAAK,CAAA;QACZ,OAAO,EAAE,OAAO,CAAA;QAChB,MAAM,EAAE,WAAW,GAAG,SAAS,CAAA;QAC/B,WAAW,CAAC,EAAE,OAAO,CAAA;KACrB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC/B,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzC,WAAW,EAAE,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACzD,cAAc,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,MAAM,CAAA;IAC5D,0BAA0B,EAAE,CAAC,MAAM,EAAE;QACpC,KAAK,EAAE,KAAK,CAAA;QACZ,OAAO,EAAE,OAAO,CAAA;KAChB,KAAK,MAAM,CAAA;IACZ,qBAAqB,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAA;CAC/C,CAAA;AAeD,gBAAgB;AAChB,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,kBAAkB;oCAkXrB,cAAc,KAAG,OAAO;;kCA0U/C,cAAc,GAAG;QAC/B,WAAW,EAAE,OAAO,CAAA;QACpB,SAAS,CAAC,EAAE,MAAM,CAAA;QAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;KACpB;;wBA1tBc,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC;6BACpB,SAAS,OAAO,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC;iCAChC,KAAK,YAAY,OAAO,KAAK,MAAM;6CACvB;YACpC,KAAK,EAAE,KAAK,CAAA;YACZ,OAAO,EAAE,OAAO,CAAA;SAChB,KAAK,MAAM;uCACmB,KAAK,KAAK,MAAM;;wCAuwBJ,gBAAgB,CAAC,OAAO,CAAC;wBApnBlD,OAAO;6BACI,SAAS,OAAO,EAAE;iCAonBd,KAAK;;IAyBrC,oEAAoE;;IAEpE,iEAAiE;;EAiBlE"}
@@ -1,5 +1,5 @@
1
1
  import { ORPCError } from '@orpc/server';
2
- import { errorMessageOf } from '../otel.js';
2
+ import { errorAttributes, errorMessageOf } from '../otel.js';
3
3
  import { decodeMessage, encodePayload } from './codec.js';
4
4
  import { LIVE_GAP, positiveInteger, safely, waitFor } from './lifecycle.js';
5
5
  // ═══════════════════════════════════════════════════════════════════════════
@@ -203,11 +203,18 @@ export function createLiveRuntime(options) {
203
203
  // with the process: the generator returns, oRPC closes the SSE response and
204
204
  // the client's backoff reconnects to the new deployment.
205
205
  const activeSubscriberCleanups = new Set();
206
+ let transport;
206
207
  const requireTransport = () => {
207
208
  if (!options.pubsub) {
208
209
  throw new Error('orpc-fn: live routes need a transport, pass createFn({ pubsub: { transport } })');
209
210
  }
210
- return options.pubsub.transport;
211
+ if (transport)
212
+ return transport;
213
+ // A lazy transport is never created during or after shutdown.
214
+ assertOpen();
215
+ const configured = options.pubsub.transport;
216
+ transport = typeof configured === 'function' ? configured() : configured;
217
+ return transport;
211
218
  };
212
219
  /**
213
220
  * Shared publish pipeline: validate the raw event, resolve the channel from
@@ -354,8 +361,9 @@ export function createLiveRuntime(options) {
354
361
  name: config.name,
355
362
  channel
356
363
  });
357
- logger.warn(`Dropped malformed message on ${channel}`, {
358
- error: errorMessageOf(error)
364
+ logger.warn('pubsub.message_dropped', {
365
+ channel,
366
+ ...errorAttributes(error)
359
367
  });
360
368
  }
361
369
  }
@@ -370,7 +378,8 @@ export function createLiveRuntime(options) {
370
378
  return;
371
379
  const delayMs = getResubscribeDelayMs(attempt);
372
380
  attempt++;
373
- logger.warn(`Scheduling resubscribe for ${channel}`, {
381
+ logger.warn('pubsub.resubscribe_scheduled', {
382
+ channel,
374
383
  reason,
375
384
  attempt,
376
385
  delayMs
@@ -396,8 +405,9 @@ export function createLiveRuntime(options) {
396
405
  connected = false;
397
406
  markPending();
398
407
  }
399
- logger.error(`Subscription to ${channel} lost`, {
400
- error: error.message
408
+ logger.error('pubsub.subscription_lost', {
409
+ channel,
410
+ ...errorAttributes(error)
401
411
  });
402
412
  scheduleResubscribe('lost');
403
413
  }, {
@@ -433,11 +443,12 @@ export function createLiveRuntime(options) {
433
443
  connectedOnce = true;
434
444
  markReady();
435
445
  attempt = 0;
436
- logger.info(`Subscribed to ${channel}`);
446
+ logger.debug('pubsub.subscribed', { channel });
437
447
  }
438
448
  catch (error) {
439
- logger.error(`Failed to subscribe to ${channel}`, {
440
- error: errorMessageOf(error)
449
+ logger.error('pubsub.subscribe_failed', {
450
+ channel,
451
+ ...errorAttributes(error)
441
452
  });
442
453
  scheduleResubscribe('subscribe-failed');
443
454
  }
@@ -534,7 +545,7 @@ export function createLiveRuntime(options) {
534
545
  tracing.end(span, error);
535
546
  throw error;
536
547
  }
537
- subscriberLogger.info(`Subscribing to ${channelName}`);
548
+ subscriberLogger.debug('pubsub.subscribing', { channel: channelName });
538
549
  let messageCount = 0;
539
550
  let droppedCount = 0;
540
551
  const delivery = createSubscriberDelivery({
@@ -648,7 +659,8 @@ export function createLiveRuntime(options) {
648
659
  span?.setAttribute('pubsub.message_count', messageCount);
649
660
  span?.setAttribute('pubsub.dropped_count', droppedCount);
650
661
  tracing.end(span, ...error);
651
- subscriberLogger.info(`Unsubscribed from ${channelName}`, {
662
+ subscriberLogger.debug('pubsub.unsubscribed', {
663
+ channel: channelName,
652
664
  messageCount,
653
665
  droppedCount,
654
666
  durationMs: Math.round(durationMs)
@@ -697,7 +709,10 @@ export function createLiveRuntime(options) {
697
709
  }
698
710
  catch (error) {
699
711
  replayGap = true;
700
- subscriberLogger.warn(`Failed to replay backlog for ${channelName}`, { error: errorMessageOf(error) });
712
+ subscriberLogger.warn('pubsub.replay_failed', {
713
+ channel: channelName,
714
+ ...errorAttributes(error)
715
+ });
701
716
  }
702
717
  }
703
718
  for (const { data, id } of replaying ?? [])
@@ -803,7 +818,7 @@ export function createLiveRuntime(options) {
803
818
  await Promise.allSettled([...pendingOpens]);
804
819
  await Promise.all([...releases]);
805
820
  if (options.pubsub?.ownsTransport)
806
- await options.pubsub.transport.close?.();
821
+ await transport?.close?.();
807
822
  })();
808
823
  return shutdownPromise;
809
824
  },