@uns-kit/core 1.0.44 → 1.0.45

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 (68) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +102 -102
  3. package/dist/app-config.d.ts.map +1 -0
  4. package/dist/app-config.js.map +1 -0
  5. package/dist/base-path.js.map +1 -1
  6. package/dist/config/app-config.js.map +1 -1
  7. package/dist/config/project.config.extension.js.map +1 -1
  8. package/dist/config-file.js.map +1 -1
  9. package/dist/graphql/schema.js.map +1 -1
  10. package/dist/index.js.map +1 -1
  11. package/dist/logger.js.map +1 -1
  12. package/dist/tools/auth/auth-client.js.map +1 -1
  13. package/dist/tools/auth/index.js.map +1 -1
  14. package/dist/tools/auth/secure-store.js.map +1 -1
  15. package/dist/tools/base-path.js.map +1 -1
  16. package/dist/tools/generate-config-schema.js.map +1 -1
  17. package/dist/tools/generate-uns-dictionary.js +7 -7
  18. package/dist/tools/generate-uns-dictionary.js.map +1 -1
  19. package/dist/tools/generate-uns-measurements.js +7 -7
  20. package/dist/tools/generate-uns-measurements.js.map +1 -1
  21. package/dist/tools/generate-uns-reference.js +9 -9
  22. package/dist/tools/generate-uns-reference.js.map +1 -1
  23. package/dist/tools/pull-request.js.map +1 -1
  24. package/dist/tools/refresh-uns.js +50 -50
  25. package/dist/tools/refresh-uns.js.map +1 -1
  26. package/dist/tools/schema.js.map +1 -1
  27. package/dist/uns/handover-manager-event-emitter.js.map +1 -1
  28. package/dist/uns/handover-manager.js.map +1 -1
  29. package/dist/uns/process-config.js.map +1 -1
  30. package/dist/uns/process-name-service.js.map +1 -1
  31. package/dist/uns/status-monitor.js.map +1 -1
  32. package/dist/uns/uns-asset.js.map +1 -1
  33. package/dist/uns/uns-attributes.js.map +1 -1
  34. package/dist/uns/uns-dictionary-registry.js.map +1 -1
  35. package/dist/uns/uns-dictionary.generated.js.map +1 -1
  36. package/dist/uns/uns-event-emitter.js.map +1 -1
  37. package/dist/uns/uns-interfaces.js.map +1 -1
  38. package/dist/uns/uns-measurements.generated.js.map +1 -1
  39. package/dist/uns/uns-measurements.js.map +1 -1
  40. package/dist/uns/uns-object.js.map +1 -1
  41. package/dist/uns/uns-packet.js.map +1 -1
  42. package/dist/uns/uns-proxy-process.js.map +1 -1
  43. package/dist/uns/uns-proxy.js.map +1 -1
  44. package/dist/uns/uns-tags.js.map +1 -1
  45. package/dist/uns/uns-topic-matcher.js.map +1 -1
  46. package/dist/uns/uns-topics.js.map +1 -1
  47. package/dist/uns-config/config-schema.js.map +1 -1
  48. package/dist/uns-config/host-placeholders.js.map +1 -1
  49. package/dist/uns-config/schema-tolls.js.map +1 -1
  50. package/dist/uns-config/schema-tools.js.map +1 -1
  51. package/dist/uns-config/secret-placeholders.js.map +1 -1
  52. package/dist/uns-config/secret-resolver.js.map +1 -1
  53. package/dist/uns-config/uns-core-schema.d.ts +608 -0
  54. package/dist/uns-config/uns-core-schema.d.ts.map +1 -1
  55. package/dist/uns-config/uns-core-schema.js +1 -1
  56. package/dist/uns-config/uns-core-schema.js.map +1 -1
  57. package/dist/uns-grpc/uns-gateway-cli.js.map +1 -1
  58. package/dist/uns-grpc/uns-gateway-server.js.map +1 -1
  59. package/dist/uns-grpc/uns-gateway.proto +104 -104
  60. package/dist/uns-mqtt/mqtt-interfaces.js.map +1 -1
  61. package/dist/uns-mqtt/mqtt-proxy.js.map +1 -1
  62. package/dist/uns-mqtt/mqtt-topic-builder.js.map +1 -1
  63. package/dist/uns-mqtt/mqtt-worker-init.js.map +1 -1
  64. package/dist/uns-mqtt/mqtt-worker.js.map +1 -1
  65. package/dist/uns-mqtt/throttled-queue.js.map +1 -1
  66. package/dist/uns-mqtt/uns-mqtt-proxy.js.map +1 -1
  67. package/dist/uns-mqtt/ws-proxy.js.map +1 -1
  68. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"uns-packet.js","sourceRoot":"","sources":["../../src/uns/uns-packet.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,MAAM,MAAM,cAAc,CAAC;AAClC,OAAO,EAKL,aAAa,EAKd,MAAM,qBAAqB,CAAC;AAE7B,gCAAgC;AAChC,MAAM,gBAAgB,GAAG,OAAO,CAAC;AAEjC,MAAM,OAAO,SAAS;IACpB;;;;;;;;;OASG;IACI,MAAM,CAAC,eAAe,CAAC,UAAkB,EAAE,YAAqB;QACrE,IAAI,CAAC;YACH,MAAM,gBAAgB,GAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;YAErD,mBAAmB;YACnB,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,OAAO,EAAE,CAAC;gBACjD,MAAM,OAAO,GAAG,gBAAgB,CAAC,OAAO,CAAC;gBACzC,MAAM,IAAI,GAAiC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC;gBACzE,MAAM,KAAK,GAA0B,gBAAgB,CAAC,OAAO,CAAC,KAAK,CAAC;gBACpE,MAAM,SAAS,GACb,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC;gBACrC,MAAM,SAAS,GACb,gBAAgB,CAAC,OAAO,CAAC,SAAS,CAAC;gBAErC,kCAAkC;gBAClC,SAAS,CAAC,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAEjD,MAAM,OAAO,GAAwB;oBACnC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;oBACnC,GAAG,CAAC,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC;oBACrC,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;oBAC7C,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;iBAC9C,CAAC;gBACF,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,gBAAgB,CAAC;gBAE3D,MAAM,QAAQ,GAAuB,gBAAgB,CAAC,QAAQ,CAAC;gBAE/D,MAAM,SAAS,GAAe;oBAC5B,OAAO;oBACP,gBAAgB;oBAChB,OAAO;oBACP,QAAQ;iBACT,CAAC;gBAEF,OAAO,SAAS,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,YAAY,EAAE,CAAC;gBACjB,MAAM,CAAC,KAAK,CAAC,GAAG,YAAY,8BAA8B,KAAK,EAAE,CAAC,CAAC;YACrE,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,2BAA2B,KAAK,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,MAAM,CAAC,yBAAyB,CAAC,IAAe,EAAE,KAAiB;QACzE,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC5C,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC,CAAC;gBACzH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,IAAI,CAAC,IAAI;gBACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC3B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACzD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACnD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACpE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;oBAC7C,MAAM,IAAI,KAAK,CAAC,qGAAqG,CAAC,CAAC;gBACzH,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;YACxD,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;YACzC,CAAC;YACD,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC/D,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,CAAC;YACD,IAAI,KAAK,CAAC,WAAW,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;YAChD,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACrD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,IAAI,KAAK,CAAC,SAAS,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACvD,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBACtE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;YAC7D,CAAC;YAED,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;gBACtC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,mBAAmB,KAAK,oBAAoB,CAAC,CAAC;gBAChE,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACjB,MAAM,IAAI,KAAK,CAAC,WAAW,MAAM,CAAC,IAAI,6BAA6B,CAAC,CAAC;gBACvE,CAAC;gBACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC3B,IACE,OAAO,KAAK,KAAK,QAAQ;oBACzB,OAAO,KAAK,KAAK,QAAQ;oBACzB,KAAK,KAAK,IAAI,EACd,CAAC;oBACD,MAAM,IAAI,KAAK,CACb,qBAAqB,MAAM,CAAC,IAAI,mCAAmC,CACpE,CAAC;gBACJ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,uBAAuB,CAClC,OAAoB,EACpB,mBAA0C;QAE1C,IAAI,CAAC;YACH,iCAAiC;YACjC,IAAI,SAAS,CAAC,yBAAyB,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAErE,OAAO;gBACP,8BAA8B;gBAC9B,iCAAiC;gBACjC,iDAAiD;gBACjD,qEAAqE;gBAErE,kCAAkC;gBAClC,aAAa;gBACb,gCAAgC;gBAChC,8BAA8B;gBAC9B,KAAK;gBAEL,IAAI,IAAI,GAAqB,SAAS,CAAC;gBAEvC,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBACrD,IAAI,GAAG;wBACL,GAAG,OAAO,CAAC,IAAI;wBACf,SAAS,EAAE,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK;qBACrC,CAAA;gBACH,CAAC;gBAAA,CAAC;gBAEF,MAAM,eAAe,GAAwB;oBAC3C,IAAI;oBACJ,KAAK,EAAE,OAAO,CAAC,KAAK;oBACpB,SAAS,EAAE,OAAO,CAAC,SAAS;oBAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;iBAC7B,CAAC;gBAEF,MAAM,SAAS,GAAe;oBAC5B,OAAO,EAAE,eAAe;oBACxB,OAAO,EAAE,gBAAgB;iBAC1B,CAAC;gBAEF,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,yCAAyC,KAAK,EAAE,CAAC,CAAC;QACjE,CAAC;IAEH,CAAC;IAEO,MAAM,CAAC,YAAY,CACzB,SAAiB,EACjB,GAAW,EACX,IAAY;QAEZ,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,IAAU;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACvD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC1D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACxE,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,KAAK,IAAI,OAAO,IAAI,OAAO,IAAI,YAAY,GAAG,CAAC;IACnF,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,KAAa;QACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBAClC,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBAC/C,OAAO,CAAC,YAAY,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mDAAmD;IAC3C,MAAM,CAAC,gBAAgB,CAAC,gBAAwB;QACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,uCAAuC;YACvC,MAAM,gBAAgB,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;YAEjE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE;gBAC7C,IAAI,GAAG,EAAE,CAAC;oBACR,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;gBAC7B,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import * as crypto from \"crypto\";\nimport * as zlib from \"zlib\";\nimport logger from '../logger.js';\nimport {\n IUnsPacket,\n ISO8601, \n IUnsData,\n IUnsMessage,\n isIOS8601Type,\n IUnsPackatParameters,\n IUnsExtendedMessage,\n IUnsExtendedData,\n IUnsTable\n} from \"./uns-interfaces.js\";\n\n// Version of the packet library\nconst unsPacketVersion = \"1.3.0\";\n\nexport class UnsPacket {\n /**\n * The given TypeScript function parseMqttPacket is used to parse an MQTT packet,\n * which is presumed to be in JSON format. The goal is to transform this string into\n * a structured object that adheres to the IUnsPacket interface, or return null\n * if parsing fails.\n *\n * @param mqttPacket\n * @param instanceName \n * @returns IUnsPacket\n */\n public static parseMqttPacket(mqttPacket: string, instanceName?: string): IUnsPacket | null {\n try {\n const parsedMqttPacket: any = JSON.parse(mqttPacket);\n\n // Check uns packet\n if (parsedMqttPacket && parsedMqttPacket.version) {\n const version = parsedMqttPacket.version;\n const data: IUnsExtendedData | undefined = parsedMqttPacket.message.data;\n const table: IUnsTable | undefined = parsedMqttPacket.message.table;\n const expiresAt: ISO8601 | undefined =\n parsedMqttPacket.message.expiresAt;\n const createdAt: ISO8601 | undefined =\n parsedMqttPacket.message.createdAt;\n\n // Validate data and table objects\n UnsPacket.validateMessageComponents(data, table);\n\n const message: IUnsExtendedMessage = {\n ...(data !== undefined && { data }),\n ...(table !== undefined && { table }),\n ...(expiresAt !== undefined && { expiresAt }),\n ...(createdAt !== undefined && { createdAt }),\n };\n const messageSignature = parsedMqttPacket.messageSignature;\n\n const interval: number | undefined = parsedMqttPacket.interval;\n\n const unsPacket: IUnsPacket = {\n message,\n messageSignature,\n version,\n interval\n };\n\n return unsPacket;\n } else {\n logger.debug(\"Version number not specified in the mqtt packet\");\n }\n } catch (error) {\n if (instanceName) {\n logger.error(`${instanceName} - Could not parse packet: ${error}`);\n } else {\n logger.error(`Could not parse packet: ${error}`);\n }\n }\n }\n\n /**\n * Validates the data and table objects to ensure they have the required properties\n * and that those properties have the correct types.\n * \n * @param data - The data object to validate\n * @param table - The table object to validate\n * @returns boolean | null\n */\n private static validateMessageComponents(data?: IUnsData, table?: IUnsTable): boolean | null {\n if (data) {\n if (data.dataGroup) {\n if (!/^[A-Za-z0-9_]+$/.test(data.dataGroup)) {\n throw new Error(`dataGroup must be a valid name (alphanumeric and underscores only, no spaces or special characters)`);\n }\n }\n\n if (!data.time)\n throw new Error(`Time is not defined in data object`);\n if (!isIOS8601Type(data.time))\n throw new Error(`Time is not ISO8601`);\n if (data.intervalStart && !isIOS8601Type(data.intervalStart)) {\n throw new Error(`intervalStart is not ISO8601`);\n }\n if (data.intervalEnd && !isIOS8601Type(data.intervalEnd)) {\n throw new Error(`intervalEnd is not ISO8601`);\n }\n if (data.lastSeen && !isIOS8601Type(data.lastSeen)) {\n throw new Error(`lastSeen is not ISO8601`);\n }\n if (data.deletedAt && !isIOS8601Type(data.deletedAt)) {\n throw new Error(`deletedAt is not ISO8601`);\n }\n if (data.eventId && typeof data.eventId !== \"string\") {\n throw new Error(`eventId must be a string`);\n }\n if (data.deleted !== undefined && typeof data.deleted !== \"boolean\") {\n throw new Error(`deleted must be a boolean`);\n }\n }\n\n // Check table object\n if (table) {\n if (table.dataGroup) {\n if (!/^[A-Za-z0-9_]+$/.test(table.dataGroup)) {\n throw new Error(`dataGroup must be a valid name (alphanumeric and underscores only, no spaces or special characters)`);\n }\n }\n\n if (!table.time) {\n throw new Error(`Time is not defined in data object`);\n }\n if (!isIOS8601Type(table.time)) {\n throw new Error(`Time is not ISO8601`);\n }\n if (table.intervalStart && !isIOS8601Type(table.intervalStart)) {\n throw new Error(`intervalStart is not ISO8601`);\n }\n if (table.intervalEnd && !isIOS8601Type(table.intervalEnd)) {\n throw new Error(`intervalEnd is not ISO8601`);\n }\n if (table.lastSeen && !isIOS8601Type(table.lastSeen)) {\n throw new Error(`lastSeen is not ISO8601`);\n }\n if (table.deletedAt && !isIOS8601Type(table.deletedAt)) {\n throw new Error(`deletedAt is not ISO8601`);\n }\n if (table.eventId && typeof table.eventId !== \"string\") {\n throw new Error(`eventId must be a string`);\n }\n if (table.deleted !== undefined && typeof table.deleted !== \"boolean\") {\n throw new Error(`deleted must be a boolean`);\n }\n\n if (!Array.isArray(table.columns) || table.columns.length === 0) {\n throw new Error(`Table.columns must be a non-empty array`);\n }\n\n table.columns.forEach((column, index) => {\n if (!column.name) {\n throw new Error(`Column at index ${index} is missing a name`);\n }\n if (!column.type) {\n throw new Error(`Column '${column.name}' is missing a QuestDB type`);\n }\n const value = column.value;\n if (\n typeof value !== \"number\" &&\n typeof value !== \"string\" &&\n value !== null\n ) {\n throw new Error(\n `Value for column '${column.name}' must be number, string, or null`\n );\n }\n });\n }\n\n return true;\n }\n\n static async unsPacketFromUnsMessage(\n message: IUnsMessage,\n unsPackatParameters?: IUnsPackatParameters,\n ): Promise<IUnsPacket> {\n try {\n // Validate the packet in message\n if (UnsPacket.validateMessageComponents(message.data, message.table)) {\n\n // HMAC\n // const algorithm = \"sha256\";\n // const key = \"your-secret-key\";\n // const packetMessage = JSON.stringify(message);\n // const hmacHash = this.generateHmac(algorithm, key, packetMessage);\n \n // const unsPacket: IUnsPacket = {\n // message,\n // messageSignature: hmacHash,\n // version: unsPacketVersion\n // };\n\n let data: IUnsExtendedData = undefined;\n\n if (message.data && message.data.value !== undefined) {\n data = {\n ...message.data,\n valueType: typeof message.data.value\n }\n };\n\n const extendedMessage: IUnsExtendedMessage = {\n data,\n table: message.table,\n expiresAt: message.expiresAt,\n createdAt: message.createdAt,\n };\n\n const unsPacket: IUnsPacket = {\n message: extendedMessage,\n version: unsPacketVersion,\n };\n \n return unsPacket; \n }\n } catch (error) {\n logger.error(`Could not create packet from message: ${error}`);\n }\n\n }\n\n private static generateHmac(\n algorithm: string,\n key: string,\n data: string,\n ): string {\n const hmac = crypto.createHmac(algorithm, key);\n hmac.update(data);\n return hmac.digest(\"hex\");\n }\n\n static formatToISO8601(date: Date): ISO8601 {\n const year = date.getUTCFullYear();\n const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(date.getUTCDate()).padStart(2, \"0\");\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n const seconds = String(date.getUTCSeconds()).padStart(2, \"0\");\n const milliseconds = String(date.getUTCMilliseconds()).padStart(3, \"0\");\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}Z`;\n }\n\n private static compressString(input: string): Promise<string> {\n return new Promise((resolve, reject) => {\n zlib.deflate(input, (err, buffer) => {\n if (err) {\n reject(err);\n } else {\n const base64String = buffer.toString(\"base64\");\n resolve(base64String);\n }\n });\n });\n }\n\n // Function to decompress a Buffer back to a string\n private static decompressString(base64Compressed: string): Promise<string> {\n return new Promise((resolve, reject) => {\n // Decode the base64 string to a Buffer\n const compressedBuffer = Buffer.from(base64Compressed, \"base64\");\n\n zlib.inflate(compressedBuffer, (err, buffer) => {\n if (err) {\n reject(err);\n } else {\n resolve(buffer.toString());\n }\n });\n });\n }\n}\n"]}
1
+ {"version":3,"file":"uns-packet.js","sourceRoot":"","sources":["../../src/uns/uns-packet.ts"],"names":[],"mappings":"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","sourcesContent":["import * as crypto from \"crypto\";\r\nimport * as zlib from \"zlib\";\r\nimport logger from '../logger.js';\r\nimport {\r\n IUnsPacket,\r\n ISO8601, \r\n IUnsData,\r\n IUnsMessage,\r\n isIOS8601Type,\r\n IUnsPackatParameters,\r\n IUnsExtendedMessage,\r\n IUnsExtendedData,\r\n IUnsTable\r\n} from \"./uns-interfaces.js\";\r\n\r\n// Version of the packet library\r\nconst unsPacketVersion = \"1.3.0\";\r\n\r\nexport class UnsPacket {\r\n /**\r\n * The given TypeScript function parseMqttPacket is used to parse an MQTT packet,\r\n * which is presumed to be in JSON format. The goal is to transform this string into\r\n * a structured object that adheres to the IUnsPacket interface, or return null\r\n * if parsing fails.\r\n *\r\n * @param mqttPacket\r\n * @param instanceName \r\n * @returns IUnsPacket\r\n */\r\n public static parseMqttPacket(mqttPacket: string, instanceName?: string): IUnsPacket | null {\r\n try {\r\n const parsedMqttPacket: any = JSON.parse(mqttPacket);\r\n\r\n // Check uns packet\r\n if (parsedMqttPacket && parsedMqttPacket.version) {\r\n const version = parsedMqttPacket.version;\r\n const data: IUnsExtendedData | undefined = parsedMqttPacket.message.data;\r\n const table: IUnsTable | undefined = parsedMqttPacket.message.table;\r\n const expiresAt: ISO8601 | undefined =\r\n parsedMqttPacket.message.expiresAt;\r\n const createdAt: ISO8601 | undefined =\r\n parsedMqttPacket.message.createdAt;\r\n\r\n // Validate data and table objects\r\n UnsPacket.validateMessageComponents(data, table);\r\n\r\n const message: IUnsExtendedMessage = {\r\n ...(data !== undefined && { data }),\r\n ...(table !== undefined && { table }),\r\n ...(expiresAt !== undefined && { expiresAt }),\r\n ...(createdAt !== undefined && { createdAt }),\r\n };\r\n const messageSignature = parsedMqttPacket.messageSignature;\r\n\r\n const interval: number | undefined = parsedMqttPacket.interval;\r\n\r\n const unsPacket: IUnsPacket = {\r\n message,\r\n messageSignature,\r\n version,\r\n interval\r\n };\r\n\r\n return unsPacket;\r\n } else {\r\n logger.debug(\"Version number not specified in the mqtt packet\");\r\n }\r\n } catch (error) {\r\n if (instanceName) {\r\n logger.error(`${instanceName} - Could not parse packet: ${error}`);\r\n } else {\r\n logger.error(`Could not parse packet: ${error}`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Validates the data and table objects to ensure they have the required properties\r\n * and that those properties have the correct types.\r\n * \r\n * @param data - The data object to validate\r\n * @param table - The table object to validate\r\n * @returns boolean | null\r\n */\r\n private static validateMessageComponents(data?: IUnsData, table?: IUnsTable): boolean | null {\r\n if (data) {\r\n if (data.dataGroup) {\r\n if (!/^[A-Za-z0-9_]+$/.test(data.dataGroup)) {\r\n throw new Error(`dataGroup must be a valid name (alphanumeric and underscores only, no spaces or special characters)`);\r\n }\r\n }\r\n\r\n if (!data.time)\r\n throw new Error(`Time is not defined in data object`);\r\n if (!isIOS8601Type(data.time))\r\n throw new Error(`Time is not ISO8601`);\r\n if (data.intervalStart && !isIOS8601Type(data.intervalStart)) {\r\n throw new Error(`intervalStart is not ISO8601`);\r\n }\r\n if (data.intervalEnd && !isIOS8601Type(data.intervalEnd)) {\r\n throw new Error(`intervalEnd is not ISO8601`);\r\n }\r\n if (data.lastSeen && !isIOS8601Type(data.lastSeen)) {\r\n throw new Error(`lastSeen is not ISO8601`);\r\n }\r\n if (data.deletedAt && !isIOS8601Type(data.deletedAt)) {\r\n throw new Error(`deletedAt is not ISO8601`);\r\n }\r\n if (data.eventId && typeof data.eventId !== \"string\") {\r\n throw new Error(`eventId must be a string`);\r\n }\r\n if (data.deleted !== undefined && typeof data.deleted !== \"boolean\") {\r\n throw new Error(`deleted must be a boolean`);\r\n }\r\n }\r\n\r\n // Check table object\r\n if (table) {\r\n if (table.dataGroup) {\r\n if (!/^[A-Za-z0-9_]+$/.test(table.dataGroup)) {\r\n throw new Error(`dataGroup must be a valid name (alphanumeric and underscores only, no spaces or special characters)`);\r\n }\r\n }\r\n\r\n if (!table.time) {\r\n throw new Error(`Time is not defined in data object`);\r\n }\r\n if (!isIOS8601Type(table.time)) {\r\n throw new Error(`Time is not ISO8601`);\r\n }\r\n if (table.intervalStart && !isIOS8601Type(table.intervalStart)) {\r\n throw new Error(`intervalStart is not ISO8601`);\r\n }\r\n if (table.intervalEnd && !isIOS8601Type(table.intervalEnd)) {\r\n throw new Error(`intervalEnd is not ISO8601`);\r\n }\r\n if (table.lastSeen && !isIOS8601Type(table.lastSeen)) {\r\n throw new Error(`lastSeen is not ISO8601`);\r\n }\r\n if (table.deletedAt && !isIOS8601Type(table.deletedAt)) {\r\n throw new Error(`deletedAt is not ISO8601`);\r\n }\r\n if (table.eventId && typeof table.eventId !== \"string\") {\r\n throw new Error(`eventId must be a string`);\r\n }\r\n if (table.deleted !== undefined && typeof table.deleted !== \"boolean\") {\r\n throw new Error(`deleted must be a boolean`);\r\n }\r\n\r\n if (!Array.isArray(table.columns) || table.columns.length === 0) {\r\n throw new Error(`Table.columns must be a non-empty array`);\r\n }\r\n\r\n table.columns.forEach((column, index) => {\r\n if (!column.name) {\r\n throw new Error(`Column at index ${index} is missing a name`);\r\n }\r\n if (!column.type) {\r\n throw new Error(`Column '${column.name}' is missing a QuestDB type`);\r\n }\r\n const value = column.value;\r\n if (\r\n typeof value !== \"number\" &&\r\n typeof value !== \"string\" &&\r\n value !== null\r\n ) {\r\n throw new Error(\r\n `Value for column '${column.name}' must be number, string, or null`\r\n );\r\n }\r\n });\r\n }\r\n\r\n return true;\r\n }\r\n\r\n static async unsPacketFromUnsMessage(\r\n message: IUnsMessage,\r\n unsPackatParameters?: IUnsPackatParameters,\r\n ): Promise<IUnsPacket> {\r\n try {\r\n // Validate the packet in message\r\n if (UnsPacket.validateMessageComponents(message.data, message.table)) {\r\n\r\n // HMAC\r\n // const algorithm = \"sha256\";\r\n // const key = \"your-secret-key\";\r\n // const packetMessage = JSON.stringify(message);\r\n // const hmacHash = this.generateHmac(algorithm, key, packetMessage);\r\n \r\n // const unsPacket: IUnsPacket = {\r\n // message,\r\n // messageSignature: hmacHash,\r\n // version: unsPacketVersion\r\n // };\r\n\r\n let data: IUnsExtendedData = undefined;\r\n\r\n if (message.data && message.data.value !== undefined) {\r\n data = {\r\n ...message.data,\r\n valueType: typeof message.data.value\r\n }\r\n };\r\n\r\n const extendedMessage: IUnsExtendedMessage = {\r\n data,\r\n table: message.table,\r\n expiresAt: message.expiresAt,\r\n createdAt: message.createdAt,\r\n };\r\n\r\n const unsPacket: IUnsPacket = {\r\n message: extendedMessage,\r\n version: unsPacketVersion,\r\n };\r\n \r\n return unsPacket; \r\n }\r\n } catch (error) {\r\n logger.error(`Could not create packet from message: ${error}`);\r\n }\r\n\r\n }\r\n\r\n private static generateHmac(\r\n algorithm: string,\r\n key: string,\r\n data: string,\r\n ): string {\r\n const hmac = crypto.createHmac(algorithm, key);\r\n hmac.update(data);\r\n return hmac.digest(\"hex\");\r\n }\r\n\r\n static formatToISO8601(date: Date): ISO8601 {\r\n const year = date.getUTCFullYear();\r\n const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\r\n const day = String(date.getUTCDate()).padStart(2, \"0\");\r\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\r\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\r\n const seconds = String(date.getUTCSeconds()).padStart(2, \"0\");\r\n const milliseconds = String(date.getUTCMilliseconds()).padStart(3, \"0\");\r\n return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}Z`;\r\n }\r\n\r\n private static compressString(input: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n zlib.deflate(input, (err, buffer) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n const base64String = buffer.toString(\"base64\");\r\n resolve(base64String);\r\n }\r\n });\r\n });\r\n }\r\n\r\n // Function to decompress a Buffer back to a string\r\n private static decompressString(base64Compressed: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n // Decode the base64 string to a Buffer\r\n const compressedBuffer = Buffer.from(base64Compressed, \"base64\");\r\n\r\n zlib.inflate(compressedBuffer, (err, buffer) => {\r\n if (err) {\r\n reject(err);\r\n } else {\r\n resolve(buffer.toString());\r\n }\r\n });\r\n });\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"uns-proxy-process.js","sourceRoot":"","sources":["../../src/uns/uns-proxy-process.ts"],"names":[],"mappings":"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","sourcesContent":["import logger from \"../logger.js\";\nimport { randomBytes } from \"crypto\";\nimport { IUnsMessage, IUnsParameters, IUnsProcessParameters, UnsEvents } from \"./uns-interfaces.js\";\nimport { IMqttParameters } from \"../uns-mqtt/mqtt-interfaces.js\";\nimport MqttProxy from \"../uns-mqtt/mqtt-proxy.js\";\nimport UnsMqttProxy from \"../uns-mqtt/uns-mqtt-proxy.js\";\nimport { HandoverManager } from \"./handover-manager.js\";\n\n// Import configuration and initialization modules.\nimport { PACKAGE_INFO, MQTT_UPDATE_INTERVAL } from \"./process-config.js\";\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\nimport { StatusMonitor } from \"./status-monitor.js\";\nimport { UnsPacket } from \"./uns-packet.js\";\n\n\n/**\n * UnsProxyProcess is responsible for managing the process lifecycle,\n * configuring MQTT (subscriptions and publishing for status updates), and\n * handling UNS proxy instances.\n *\n * It leverages HandoverManager for handover events and StatusMonitor for health reporting.\n */\nexport type UnsProxyProcessPluginMethod = (this: UnsProxyProcess, ...args: unknown[]) => unknown;\n\nexport type UnsProxyProcessPluginMethods = Record<string, UnsProxyProcessPluginMethod>;\n\nexport interface UnsProxyProcessPluginApi {\n version: number;\n define(methods: UnsProxyProcessPluginMethods): void;\n UnsProxyProcess: typeof UnsProxyProcess;\n}\n\nexport type UnsProxyProcessPlugin = (api: UnsProxyProcessPluginApi) => void;\n\nclass UnsProxyProcess {\n private active: boolean = false;\n private processStatusTopic: string;\n private processName: string;\n private processId: string;\n private unsMqttProxies: UnsMqttProxy[];\n private unsApiProxies: unknown[];\n private unsTemporalProxies: unknown[];\n private processMqttProxy: MqttProxy;\n private handoverManager: HandoverManager;\n private statusMonitor: StatusMonitor;\n\n // Plugin\n static pluginApiVersion = 1;\n private static registered = new Set<UnsProxyProcessPlugin>();\n private static registeredMethodNames = new Set<string>();\n private static applied = false;\n\n static use(plugin: UnsProxyProcessPlugin) {\n if (this.registered.has(plugin)) return this;\n this.registered.add(plugin);\n if (this.applied) this.applyPlugin(plugin);\n return this;\n }\n\n private static applyPlugin(plugin: UnsProxyProcessPlugin) {\n const define: UnsProxyProcessPluginApi[\"define\"] = (methods) => {\n for (const [name, fn] of Object.entries(methods)) {\n if (typeof fn !== \"function\") {\n throw new TypeError(`UnsProxyProcess plugin attempted to register non-function member \\\"${name}\\\".`);\n }\n if (this.registeredMethodNames.has(name) || Reflect.has(this.prototype, name)) {\n throw new Error(`UnsProxyProcess plugin attempted to overwrite existing member \\\"${name}\\\".`);\n }\n Object.defineProperty(this.prototype, name, {\n value: fn,\n writable: true,\n configurable: true,\n enumerable: false,\n });\n this.registeredMethodNames.add(name);\n }\n };\n\n plugin({\n define,\n version: this.pluginApiVersion,\n UnsProxyProcess: this,\n });\n }\n\n private static applyAll() {\n if (this.applied) return;\n this.applied = true;\n for (const p of this.registered) this.applyPlugin(p);\n }\n\n // References for cleanup.\n private mqttInputHandler: (event: any) => void;\n\n constructor(mqttHost: string, unsProxyProcessParameters: IUnsProcessParameters) {\n (this.constructor as typeof UnsProxyProcess).applyAll(); // Activate all the plugins\n\n this.unsMqttProxies = [];\n this.unsApiProxies = [];\n this.unsTemporalProxies = [];\n if (!unsProxyProcessParameters?.processName) {\n throw new Error(\"UnsProxyProcess requires a processName in configuration.\");\n }\n this.processName = unsProxyProcessParameters.processName;\n this.processId = randomBytes(16).toString(\"hex\");\n const { name: packageName, version } = PACKAGE_INFO;\n\n // Instantiate the topic builder.\n const topicBuilder = new MqttTopicBuilder(`uns-infra/${MqttTopicBuilder.sanitizeTopicPart(packageName)}/${MqttTopicBuilder.sanitizeTopicPart(version)}/${MqttTopicBuilder.sanitizeTopicPart(this.processName)}/`);\n\n // Generate topics.\n const processStatusTopic = topicBuilder.getProcessStatusTopic();\n const handoverTopic = topicBuilder.getHandoverTopic();\n const wildcardActiveTopic = topicBuilder.getWildcardActiveTopic();\n\n this.processStatusTopic = processStatusTopic;\n\n // Configure MQTT topics for subscription.\n const mqttSubToTopics = unsProxyProcessParameters?.mqttSubToTopics ?? [\n wildcardActiveTopic,\n handoverTopic,\n ];\n const mqttParameters: IMqttParameters = {\n mqttSubToTopics,\n username: unsProxyProcessParameters?.username ?? \"\",\n password: unsProxyProcessParameters?.password ?? \"\",\n mqttSSL: unsProxyProcessParameters?.mqttSSL ?? false,\n statusTopic: this.processStatusTopic,\n clientId: unsProxyProcessParameters?.clientId ?? `${this.processName}-${this.processId}`,\n hosts: unsProxyProcessParameters?.hosts,\n servers: unsProxyProcessParameters?.servers,\n port: unsProxyProcessParameters?.port,\n protocol: unsProxyProcessParameters?.protocol,\n keepalive: unsProxyProcessParameters?.keepalive,\n clean: unsProxyProcessParameters?.clean,\n connectTimeout: unsProxyProcessParameters?.connectTimeout,\n reconnectPeriod: unsProxyProcessParameters?.reconnectPeriod,\n reconnectOnConnackError: unsProxyProcessParameters?.reconnectOnConnackError,\n resubscribe: unsProxyProcessParameters?.resubscribe,\n queueQoSZero: unsProxyProcessParameters?.queueQoSZero,\n rejectUnauthorized: unsProxyProcessParameters?.rejectUnauthorized ?? false,\n properties: unsProxyProcessParameters?.properties,\n ca: unsProxyProcessParameters?.ca,\n cert: unsProxyProcessParameters?.cert,\n key: unsProxyProcessParameters?.key,\n servername: unsProxyProcessParameters?.servername,\n };\n\n // Initialize MQTT proxy and start connection.\n this.processMqttProxy = new MqttProxy(mqttHost, this.processName, mqttParameters);\n this.processMqttProxy.start();\n\n // Instantiate and start the StatusMonitor for memory and status updates.\n this.statusMonitor = new StatusMonitor(\n this.processMqttProxy,\n this.processStatusTopic,\n () => this.active,\n MQTT_UPDATE_INTERVAL,\n MQTT_UPDATE_INTERVAL,\n { processName: this.processName, processId: this.processId },\n );\n this.statusMonitor.start();\n }\n\n /**\n * Initializes the HandoverManager instance and sets up event listeners for handover and MQTT input events.\n * Determines handover and force start modes based on process arguments.\n */\n private initHandoverManager(instanceMode: string, handover: boolean) {\n\n const handoverRequestEnabled = instanceMode == \"handover\" ? true : false;\n const forceStartEnabled = instanceMode == \"force\" ? true : false;\n\n this.handoverManager = new HandoverManager(\n this.processName,\n this.processId,\n this.processMqttProxy,\n this.unsMqttProxies,\n handoverRequestEnabled,\n handover ?? true,\n forceStartEnabled\n );\n\n // Listen for handover events.\n this.handoverManager.event.on(\"handoverManager\", (event) => {\n this.active = event.active;\n });\n\n // Delegate MQTT events to the HandoverManager.\n this.mqttInputHandler = async (event: UnsEvents[\"input\"]) => {\n await this.handoverManager.handleMqttMessage(event);\n };\n this.processMqttProxy.event.on(\"input\", this.mqttInputHandler);\n }\n\n /**\n * Creates a new UNS proxy instance and stores it for future management.\n */\n public async createUnsMqttProxy(\n mqttHost: string, \n instanceName: string,\n instanceMode: string,\n handover: boolean,\n unsParameters?: IUnsParameters): Promise<UnsMqttProxy> {\n // Wait until the MQTT connection is established before proceeding.\n await this.waitForProcessConnection();\n\n // Currently handover manager can handle only mqtt events\n if (!this.handoverManager) {\n this.initHandoverManager(instanceMode, handover);\n }\n\n const resolvedUnsParameters: IUnsParameters = {\n ...(unsParameters ?? {}),\n clientId: unsParameters?.clientId ?? `${this.processName}-${instanceName}-${this.processId}`,\n };\n const unsMqttProxy = new UnsMqttProxy(mqttHost, this.processName, instanceName, resolvedUnsParameters);\n \n // Listen for UNS proxy producing topics and publish them via MQTT.\n unsMqttProxy.event.on(\"unsProxyProducedTopics\", (event) => {\n this.processMqttProxy.publish(\n event.statusTopic,\n JSON.stringify(event.producedTopics),\n {\n retain: true,\n properties: { messageExpiryInterval: 120000 },\n },\n );\n });\n\n // Listen for UNS proxy status events and publish them via MQTT.\n unsMqttProxy.event.on(\"mqttProxyStatus\", (event) => {\n const time = UnsPacket.formatToISO8601(new Date());\n const unsMessage: IUnsMessage = { data: { time, value: event.value, uom: event.uom } };\n UnsPacket.unsPacketFromUnsMessage(unsMessage).then((packet) => {\n this.processMqttProxy.publish(\n event.statusTopic,\n JSON.stringify(packet),\n );\n });\n });\n\n this.unsMqttProxies.push(unsMqttProxy);\n return unsMqttProxy;\n }\n\n public async waitForProcessConnection(): Promise<void> {\n while (!this.processMqttProxy?.isConnected) {\n await new Promise((resolve) => setTimeout(resolve, 100));\n }\n }\n\n /**\n * Shuts down the process by clearing intervals, timeouts, and removing\n * MQTT event listeners, and stopping the StatusMonitor.\n */\n public shutdown(): void {\n logger.info(`${this.processName} - Shutting down UnsProxyProcess...`);\n try {\n this.statusMonitor.stop();\n } catch (e: any) {\n logger.error(`${this.processName} - Error stopping StatusMonitor: ${e.message}`);\n }\n \n if (this.mqttInputHandler) {\n this.processMqttProxy.event.off(\"input\", this.mqttInputHandler);\n }\n \n try {\n if (typeof this.processMqttProxy.stop === \"function\") {\n this.processMqttProxy.stop();\n }\n } catch (e: any) {\n logger.error(`${this.processName} - Error stopping MQTT proxy: ${e.message}`);\n }\n \n logger.info(`${this.processName} - Shutdown complete.`);\n }\n \n}\n\ninterface UnsProxyProcess {}\n\nexport default UnsProxyProcess;\nexport { UnsProxyProcess };\n"]}
1
+ {"version":3,"file":"uns-proxy-process.js","sourceRoot":"","sources":["../../src/uns/uns-proxy-process.ts"],"names":[],"mappings":"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","sourcesContent":["import logger from \"../logger.js\";\r\nimport { randomBytes } from \"crypto\";\r\nimport { IUnsMessage, IUnsParameters, IUnsProcessParameters, UnsEvents } from \"./uns-interfaces.js\";\r\nimport { IMqttParameters } from \"../uns-mqtt/mqtt-interfaces.js\";\r\nimport MqttProxy from \"../uns-mqtt/mqtt-proxy.js\";\r\nimport UnsMqttProxy from \"../uns-mqtt/uns-mqtt-proxy.js\";\r\nimport { HandoverManager } from \"./handover-manager.js\";\r\n\r\n// Import configuration and initialization modules.\r\nimport { PACKAGE_INFO, MQTT_UPDATE_INTERVAL } from \"./process-config.js\";\r\nimport { MqttTopicBuilder } from \"../uns-mqtt/mqtt-topic-builder.js\";\r\nimport { StatusMonitor } from \"./status-monitor.js\";\r\nimport { UnsPacket } from \"./uns-packet.js\";\r\n\r\n\r\n/**\r\n * UnsProxyProcess is responsible for managing the process lifecycle,\r\n * configuring MQTT (subscriptions and publishing for status updates), and\r\n * handling UNS proxy instances.\r\n *\r\n * It leverages HandoverManager for handover events and StatusMonitor for health reporting.\r\n */\r\nexport type UnsProxyProcessPluginMethod = (this: UnsProxyProcess, ...args: unknown[]) => unknown;\r\n\r\nexport type UnsProxyProcessPluginMethods = Record<string, UnsProxyProcessPluginMethod>;\r\n\r\nexport interface UnsProxyProcessPluginApi {\r\n version: number;\r\n define(methods: UnsProxyProcessPluginMethods): void;\r\n UnsProxyProcess: typeof UnsProxyProcess;\r\n}\r\n\r\nexport type UnsProxyProcessPlugin = (api: UnsProxyProcessPluginApi) => void;\r\n\r\nclass UnsProxyProcess {\r\n private active: boolean = false;\r\n private processStatusTopic: string;\r\n private processName: string;\r\n private processId: string;\r\n private unsMqttProxies: UnsMqttProxy[];\r\n private unsApiProxies: unknown[];\r\n private unsTemporalProxies: unknown[];\r\n private processMqttProxy: MqttProxy;\r\n private handoverManager: HandoverManager;\r\n private statusMonitor: StatusMonitor;\r\n\r\n // Plugin\r\n static pluginApiVersion = 1;\r\n private static registered = new Set<UnsProxyProcessPlugin>();\r\n private static registeredMethodNames = new Set<string>();\r\n private static applied = false;\r\n\r\n static use(plugin: UnsProxyProcessPlugin) {\r\n if (this.registered.has(plugin)) return this;\r\n this.registered.add(plugin);\r\n if (this.applied) this.applyPlugin(plugin);\r\n return this;\r\n }\r\n\r\n private static applyPlugin(plugin: UnsProxyProcessPlugin) {\r\n const define: UnsProxyProcessPluginApi[\"define\"] = (methods) => {\r\n for (const [name, fn] of Object.entries(methods)) {\r\n if (typeof fn !== \"function\") {\r\n throw new TypeError(`UnsProxyProcess plugin attempted to register non-function member \\\"${name}\\\".`);\r\n }\r\n if (this.registeredMethodNames.has(name) || Reflect.has(this.prototype, name)) {\r\n throw new Error(`UnsProxyProcess plugin attempted to overwrite existing member \\\"${name}\\\".`);\r\n }\r\n Object.defineProperty(this.prototype, name, {\r\n value: fn,\r\n writable: true,\r\n configurable: true,\r\n enumerable: false,\r\n });\r\n this.registeredMethodNames.add(name);\r\n }\r\n };\r\n\r\n plugin({\r\n define,\r\n version: this.pluginApiVersion,\r\n UnsProxyProcess: this,\r\n });\r\n }\r\n\r\n private static applyAll() {\r\n if (this.applied) return;\r\n this.applied = true;\r\n for (const p of this.registered) this.applyPlugin(p);\r\n }\r\n\r\n // References for cleanup.\r\n private mqttInputHandler: (event: any) => void;\r\n\r\n constructor(mqttHost: string, unsProxyProcessParameters: IUnsProcessParameters) {\r\n (this.constructor as typeof UnsProxyProcess).applyAll(); // Activate all the plugins\r\n\r\n this.unsMqttProxies = [];\r\n this.unsApiProxies = [];\r\n this.unsTemporalProxies = [];\r\n if (!unsProxyProcessParameters?.processName) {\r\n throw new Error(\"UnsProxyProcess requires a processName in configuration.\");\r\n }\r\n this.processName = unsProxyProcessParameters.processName;\r\n this.processId = randomBytes(16).toString(\"hex\");\r\n const { name: packageName, version } = PACKAGE_INFO;\r\n\r\n // Instantiate the topic builder.\r\n const topicBuilder = new MqttTopicBuilder(`uns-infra/${MqttTopicBuilder.sanitizeTopicPart(packageName)}/${MqttTopicBuilder.sanitizeTopicPart(version)}/${MqttTopicBuilder.sanitizeTopicPart(this.processName)}/`);\r\n\r\n // Generate topics.\r\n const processStatusTopic = topicBuilder.getProcessStatusTopic();\r\n const handoverTopic = topicBuilder.getHandoverTopic();\r\n const wildcardActiveTopic = topicBuilder.getWildcardActiveTopic();\r\n\r\n this.processStatusTopic = processStatusTopic;\r\n\r\n // Configure MQTT topics for subscription.\r\n const mqttSubToTopics = unsProxyProcessParameters?.mqttSubToTopics ?? [\r\n wildcardActiveTopic,\r\n handoverTopic,\r\n ];\r\n const mqttParameters: IMqttParameters = {\r\n mqttSubToTopics,\r\n username: unsProxyProcessParameters?.username ?? \"\",\r\n password: unsProxyProcessParameters?.password ?? \"\",\r\n mqttSSL: unsProxyProcessParameters?.mqttSSL ?? false,\r\n statusTopic: this.processStatusTopic,\r\n clientId: unsProxyProcessParameters?.clientId ?? `${this.processName}-${this.processId}`,\r\n hosts: unsProxyProcessParameters?.hosts,\r\n servers: unsProxyProcessParameters?.servers,\r\n port: unsProxyProcessParameters?.port,\r\n protocol: unsProxyProcessParameters?.protocol,\r\n keepalive: unsProxyProcessParameters?.keepalive,\r\n clean: unsProxyProcessParameters?.clean,\r\n connectTimeout: unsProxyProcessParameters?.connectTimeout,\r\n reconnectPeriod: unsProxyProcessParameters?.reconnectPeriod,\r\n reconnectOnConnackError: unsProxyProcessParameters?.reconnectOnConnackError,\r\n resubscribe: unsProxyProcessParameters?.resubscribe,\r\n queueQoSZero: unsProxyProcessParameters?.queueQoSZero,\r\n rejectUnauthorized: unsProxyProcessParameters?.rejectUnauthorized ?? false,\r\n properties: unsProxyProcessParameters?.properties,\r\n ca: unsProxyProcessParameters?.ca,\r\n cert: unsProxyProcessParameters?.cert,\r\n key: unsProxyProcessParameters?.key,\r\n servername: unsProxyProcessParameters?.servername,\r\n };\r\n\r\n // Initialize MQTT proxy and start connection.\r\n this.processMqttProxy = new MqttProxy(mqttHost, this.processName, mqttParameters);\r\n this.processMqttProxy.start();\r\n\r\n // Instantiate and start the StatusMonitor for memory and status updates.\r\n this.statusMonitor = new StatusMonitor(\r\n this.processMqttProxy,\r\n this.processStatusTopic,\r\n () => this.active,\r\n MQTT_UPDATE_INTERVAL,\r\n MQTT_UPDATE_INTERVAL,\r\n { processName: this.processName, processId: this.processId },\r\n );\r\n this.statusMonitor.start();\r\n }\r\n\r\n /**\r\n * Initializes the HandoverManager instance and sets up event listeners for handover and MQTT input events.\r\n * Determines handover and force start modes based on process arguments.\r\n */\r\n private initHandoverManager(instanceMode: string, handover: boolean) {\r\n\r\n const handoverRequestEnabled = instanceMode == \"handover\" ? true : false;\r\n const forceStartEnabled = instanceMode == \"force\" ? true : false;\r\n\r\n this.handoverManager = new HandoverManager(\r\n this.processName,\r\n this.processId,\r\n this.processMqttProxy,\r\n this.unsMqttProxies,\r\n handoverRequestEnabled,\r\n handover ?? true,\r\n forceStartEnabled\r\n );\r\n\r\n // Listen for handover events.\r\n this.handoverManager.event.on(\"handoverManager\", (event) => {\r\n this.active = event.active;\r\n });\r\n\r\n // Delegate MQTT events to the HandoverManager.\r\n this.mqttInputHandler = async (event: UnsEvents[\"input\"]) => {\r\n await this.handoverManager.handleMqttMessage(event);\r\n };\r\n this.processMqttProxy.event.on(\"input\", this.mqttInputHandler);\r\n }\r\n\r\n /**\r\n * Creates a new UNS proxy instance and stores it for future management.\r\n */\r\n public async createUnsMqttProxy(\r\n mqttHost: string, \r\n instanceName: string,\r\n instanceMode: string,\r\n handover: boolean,\r\n unsParameters?: IUnsParameters): Promise<UnsMqttProxy> {\r\n // Wait until the MQTT connection is established before proceeding.\r\n await this.waitForProcessConnection();\r\n\r\n // Currently handover manager can handle only mqtt events\r\n if (!this.handoverManager) {\r\n this.initHandoverManager(instanceMode, handover);\r\n }\r\n\r\n const resolvedUnsParameters: IUnsParameters = {\r\n ...(unsParameters ?? {}),\r\n clientId: unsParameters?.clientId ?? `${this.processName}-${instanceName}-${this.processId}`,\r\n };\r\n const unsMqttProxy = new UnsMqttProxy(mqttHost, this.processName, instanceName, resolvedUnsParameters);\r\n \r\n // Listen for UNS proxy producing topics and publish them via MQTT.\r\n unsMqttProxy.event.on(\"unsProxyProducedTopics\", (event) => {\r\n this.processMqttProxy.publish(\r\n event.statusTopic,\r\n JSON.stringify(event.producedTopics),\r\n {\r\n retain: true,\r\n properties: { messageExpiryInterval: 120000 },\r\n },\r\n );\r\n });\r\n\r\n // Listen for UNS proxy status events and publish them via MQTT.\r\n unsMqttProxy.event.on(\"mqttProxyStatus\", (event) => {\r\n const time = UnsPacket.formatToISO8601(new Date());\r\n const unsMessage: IUnsMessage = { data: { time, value: event.value, uom: event.uom } };\r\n UnsPacket.unsPacketFromUnsMessage(unsMessage).then((packet) => {\r\n this.processMqttProxy.publish(\r\n event.statusTopic,\r\n JSON.stringify(packet),\r\n );\r\n });\r\n });\r\n\r\n this.unsMqttProxies.push(unsMqttProxy);\r\n return unsMqttProxy;\r\n }\r\n\r\n public async waitForProcessConnection(): Promise<void> {\r\n while (!this.processMqttProxy?.isConnected) {\r\n await new Promise((resolve) => setTimeout(resolve, 100));\r\n }\r\n }\r\n\r\n /**\r\n * Shuts down the process by clearing intervals, timeouts, and removing\r\n * MQTT event listeners, and stopping the StatusMonitor.\r\n */\r\n public shutdown(): void {\r\n logger.info(`${this.processName} - Shutting down UnsProxyProcess...`);\r\n try {\r\n this.statusMonitor.stop();\r\n } catch (e: any) {\r\n logger.error(`${this.processName} - Error stopping StatusMonitor: ${e.message}`);\r\n }\r\n \r\n if (this.mqttInputHandler) {\r\n this.processMqttProxy.event.off(\"input\", this.mqttInputHandler);\r\n }\r\n \r\n try {\r\n if (typeof this.processMqttProxy.stop === \"function\") {\r\n this.processMqttProxy.stop();\r\n }\r\n } catch (e: any) {\r\n logger.error(`${this.processName} - Error stopping MQTT proxy: ${e.message}`);\r\n }\r\n \r\n logger.info(`${this.processName} - Shutdown complete.`);\r\n }\r\n \r\n}\r\n\r\ninterface UnsProxyProcess {}\r\n\r\nexport default UnsProxyProcess;\r\nexport { UnsProxyProcess };\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"uns-proxy.js","sourceRoot":"","sources":["../../src/uns/uns-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { IApiObject, ITopicObject, UnsEvents } from \"./uns-interfaces.js\";\nimport logger from \"../logger.js\";\nimport { UnsEventEmitter } from \"./uns-event-emitter.js\";\nimport { UnsPacket } from \"./uns-packet.js\";\nimport { UnsAsset } from \"./uns-asset.js\";\nimport { UnsObjectId, UnsObjectType } from \"./uns-object.js\";\nimport { IApiCatchallMapping } from \"./uns-interfaces.js\";\n\nexport default class UnsProxy {\n private publishInterval: NodeJS.Timeout | null = null;\n public event: UnsEventEmitter<UnsEvents> = new UnsEventEmitter<UnsEvents>();\n protected instanceStatusTopic: string;\n protected instanceNameWithSuffix: string; //was prot\n private producedTopics: Map<string, ITopicObject> = new Map();\n private producedApiEndpoints: Map<string, IApiObject> = new Map();\n private producedApiCatchall: Map<string, IApiCatchallMapping> = new Map();\n\n constructor() {\n // Set up interval to publish produced topics every 60 seconds.\n this.publishInterval = setInterval(() => {\n this.emitProducedTopics();\n this.emitProducedApiEndpoints();\n this.emitProducedApiCatchall();\n }, 60000); \n }\n \n /**\n * Publishes the list of produced topics to the MQTT broker.\n */\n private async emitProducedTopics(): Promise<void> {\n if (this.instanceStatusTopic !== \"\") {\n const topicsArray = [...this.producedTopics.values()];\n if (topicsArray.length > 0) {\n try {\n if (topicsArray.length > 0) {\n this.event.emit(\"unsProxyProducedTopics\", { producedTopics: topicsArray, statusTopic: this.instanceStatusTopic + \"topics\" });\n }\n } catch (error) {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing produced topics: ${error.message}`);\n }\n logger.debug(`${this.instanceNameWithSuffix} - Published produced topics.`);\n }\n }\n }\n\n /**\n * Publishes the list of produced API endpoints to the MQTT broker.\n */\n private async emitProducedApiEndpoints(): Promise<void> {\n if (this.instanceStatusTopic !== \"\") {\n const apiEndpointsArray = [...this.producedApiEndpoints.values()];\n if (apiEndpointsArray.length > 0) {\n try {\n if (apiEndpointsArray.length > 0) {\n this.event.emit(\"unsProxyProducedApiEndpoints\", { producedApiEndpoints: apiEndpointsArray, statusTopic: this.instanceStatusTopic + \"api-endpoints\" });\n }\n } catch (error) {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing produced API endpoints: ${error.message}`);\n }\n logger.debug(`${this.instanceNameWithSuffix} - Published produced API endpoints.`);\n }\n }\n }\n\n /**\n * Publishes the list of catch-all API mappings to the MQTT broker.\n */\n private async emitProducedApiCatchall(): Promise<void> {\n if (this.instanceStatusTopic !== \"\") {\n const catchallArray = [...this.producedApiCatchall.values()];\n if (catchallArray.length > 0) {\n try {\n this.event.emit(\"unsProxyProducedApiCatchAll\", {\n producedCatchall: catchallArray,\n statusTopic: this.instanceStatusTopic + \"api-catchall\",\n });\n } catch (error: any) {\n logger.error(`${this.instanceNameWithSuffix} - Error publishing catch-all API mappings: ${error.message}`);\n }\n logger.debug(`${this.instanceNameWithSuffix} - Published catch-all API mappings.`);\n }\n }\n }\n\n /**\n * Registers a unique topic so that it is tracked and published only once.\n *\n * @param topicObject - The object containing topic details.\n */\n protected registerUniqueTopic(topicObject: ITopicObject): void {\n if (this.instanceStatusTopic !== \"\") {\n const fullTopic = `${topicObject.topic}${topicObject.asset}/${topicObject.objectType}/${topicObject.objectId}/${topicObject.attribute}`;\n if (!this.producedTopics.has(fullTopic)) {\n this.producedTopics.set(fullTopic, {\n timestamp: topicObject.timestamp,\n topic: topicObject.topic,\n attribute: topicObject.attribute,\n attributeType: topicObject.attributeType,\n description: topicObject.description,\n tags: topicObject.tags,\n attributeNeedsPersistence: topicObject.attributeNeedsPersistence ?? true,\n dataGroup: topicObject.dataGroup ?? \"\",\n asset: topicObject.asset,\n assetDescription: topicObject.assetDescription,\n objectType: topicObject.objectType,\n objectTypeDescription: topicObject.objectTypeDescription,\n objectId: topicObject.objectId\n });\n this.emitProducedTopics();\n logger.info(`${this.instanceNameWithSuffix} - Registered new topic: ${fullTopic}`);\n }\n }\n } \n\n /**\n * Registers an API endpoint to handle requests for a specific topic and attribute.\n */\n protected registerApiEndpoint(apiObject: IApiObject): void {\n if (this.instanceStatusTopic !== \"\") {\n const fullTopic = `${apiObject.topic}${apiObject.asset}/${apiObject.objectType}/${apiObject.objectId}/${apiObject.attribute}`;\n if (!this.producedApiEndpoints.has(fullTopic)) {\n const time = UnsPacket.formatToISO8601(new Date());\n this.producedApiEndpoints.set(fullTopic, {\n timestamp: time,\n topic: apiObject.topic,\n attribute: apiObject.attribute,\n apiHost: apiObject.apiHost,\n apiEndpoint: apiObject.apiEndpoint,\n apiMethod: apiObject.apiMethod,\n apiQueryParams: apiObject.apiQueryParams,\n apiDescription: apiObject.apiDescription,\n attributeType: apiObject.attributeType,\n apiSwaggerEndpoint: apiObject.apiSwaggerEndpoint,\n asset: apiObject.asset,\n objectType: apiObject.objectType,\n objectId: apiObject.objectId\n });\n this.emitProducedApiEndpoints();\n logger.info(`${this.instanceNameWithSuffix} - Registered new api endpoint: /${fullTopic}`);\n }\n }\n }\n\n protected registerApiCatchAll(mapping: IApiCatchallMapping): void {\n if (this.instanceStatusTopic !== \"\") {\n const key = mapping.topic.replace(/\\/+$/, \"\");\n if (!this.producedApiCatchall.has(key)) {\n this.producedApiCatchall.set(key, mapping);\n } else {\n this.producedApiCatchall.set(key, { ...this.producedApiCatchall.get(key)!, ...mapping });\n }\n this.emitProducedApiCatchall();\n logger.info(`${this.instanceNameWithSuffix} - Registered catch-all API mapping: ${key}`);\n }\n }\n\n protected unregisterApiEndpoint(topic: string, asset:UnsAsset, objectType: UnsObjectType, objectId: UnsObjectId, attribute: string): void {\n const fullTopic = `${topic}/${asset}/${objectType}/${objectId}/${attribute}`;\n if (this.producedApiEndpoints.has(fullTopic)) {\n this.producedApiEndpoints.delete(fullTopic);\n this.emitProducedApiEndpoints();\n logger.info(`${this.instanceNameWithSuffix} - Unregistered API endpoint: ${fullTopic}`);\n }\n }\n public async stop() {\n // Clear the publishing interval.\n if (this.publishInterval) {\n clearInterval(this.publishInterval);\n this.publishInterval = null;\n }\n\n }\n\n}\n"]}
1
+ {"version":3,"file":"uns-proxy.js","sourceRoot":"","sources":["../../src/uns/uns-proxy.ts"],"names":[],"mappings":"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","sourcesContent":["import { IApiObject, ITopicObject, UnsEvents } from \"./uns-interfaces.js\";\r\nimport logger from \"../logger.js\";\r\nimport { UnsEventEmitter } from \"./uns-event-emitter.js\";\r\nimport { UnsPacket } from \"./uns-packet.js\";\r\nimport { UnsAsset } from \"./uns-asset.js\";\r\nimport { UnsObjectId, UnsObjectType } from \"./uns-object.js\";\r\nimport { IApiCatchallMapping } from \"./uns-interfaces.js\";\r\n\r\nexport default class UnsProxy {\r\n private publishInterval: NodeJS.Timeout | null = null;\r\n public event: UnsEventEmitter<UnsEvents> = new UnsEventEmitter<UnsEvents>();\r\n protected instanceStatusTopic: string;\r\n protected instanceNameWithSuffix: string; //was prot\r\n private producedTopics: Map<string, ITopicObject> = new Map();\r\n private producedApiEndpoints: Map<string, IApiObject> = new Map();\r\n private producedApiCatchall: Map<string, IApiCatchallMapping> = new Map();\r\n\r\n constructor() {\r\n // Set up interval to publish produced topics every 60 seconds.\r\n this.publishInterval = setInterval(() => {\r\n this.emitProducedTopics();\r\n this.emitProducedApiEndpoints();\r\n this.emitProducedApiCatchall();\r\n }, 60000); \r\n }\r\n \r\n /**\r\n * Publishes the list of produced topics to the MQTT broker.\r\n */\r\n private async emitProducedTopics(): Promise<void> {\r\n if (this.instanceStatusTopic !== \"\") {\r\n const topicsArray = [...this.producedTopics.values()];\r\n if (topicsArray.length > 0) {\r\n try {\r\n if (topicsArray.length > 0) {\r\n this.event.emit(\"unsProxyProducedTopics\", { producedTopics: topicsArray, statusTopic: this.instanceStatusTopic + \"topics\" });\r\n }\r\n } catch (error) {\r\n logger.error(`${this.instanceNameWithSuffix} - Error publishing produced topics: ${error.message}`);\r\n }\r\n logger.debug(`${this.instanceNameWithSuffix} - Published produced topics.`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Publishes the list of produced API endpoints to the MQTT broker.\r\n */\r\n private async emitProducedApiEndpoints(): Promise<void> {\r\n if (this.instanceStatusTopic !== \"\") {\r\n const apiEndpointsArray = [...this.producedApiEndpoints.values()];\r\n if (apiEndpointsArray.length > 0) {\r\n try {\r\n if (apiEndpointsArray.length > 0) {\r\n this.event.emit(\"unsProxyProducedApiEndpoints\", { producedApiEndpoints: apiEndpointsArray, statusTopic: this.instanceStatusTopic + \"api-endpoints\" });\r\n }\r\n } catch (error) {\r\n logger.error(`${this.instanceNameWithSuffix} - Error publishing produced API endpoints: ${error.message}`);\r\n }\r\n logger.debug(`${this.instanceNameWithSuffix} - Published produced API endpoints.`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Publishes the list of catch-all API mappings to the MQTT broker.\r\n */\r\n private async emitProducedApiCatchall(): Promise<void> {\r\n if (this.instanceStatusTopic !== \"\") {\r\n const catchallArray = [...this.producedApiCatchall.values()];\r\n if (catchallArray.length > 0) {\r\n try {\r\n this.event.emit(\"unsProxyProducedApiCatchAll\", {\r\n producedCatchall: catchallArray,\r\n statusTopic: this.instanceStatusTopic + \"api-catchall\",\r\n });\r\n } catch (error: any) {\r\n logger.error(`${this.instanceNameWithSuffix} - Error publishing catch-all API mappings: ${error.message}`);\r\n }\r\n logger.debug(`${this.instanceNameWithSuffix} - Published catch-all API mappings.`);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Registers a unique topic so that it is tracked and published only once.\r\n *\r\n * @param topicObject - The object containing topic details.\r\n */\r\n protected registerUniqueTopic(topicObject: ITopicObject): void {\r\n if (this.instanceStatusTopic !== \"\") {\r\n const fullTopic = `${topicObject.topic}${topicObject.asset}/${topicObject.objectType}/${topicObject.objectId}/${topicObject.attribute}`;\r\n if (!this.producedTopics.has(fullTopic)) {\r\n this.producedTopics.set(fullTopic, {\r\n timestamp: topicObject.timestamp,\r\n topic: topicObject.topic,\r\n attribute: topicObject.attribute,\r\n attributeType: topicObject.attributeType,\r\n description: topicObject.description,\r\n tags: topicObject.tags,\r\n attributeNeedsPersistence: topicObject.attributeNeedsPersistence ?? true,\r\n dataGroup: topicObject.dataGroup ?? \"\",\r\n asset: topicObject.asset,\r\n assetDescription: topicObject.assetDescription,\r\n objectType: topicObject.objectType,\r\n objectTypeDescription: topicObject.objectTypeDescription,\r\n objectId: topicObject.objectId\r\n });\r\n this.emitProducedTopics();\r\n logger.info(`${this.instanceNameWithSuffix} - Registered new topic: ${fullTopic}`);\r\n }\r\n }\r\n } \r\n\r\n /**\r\n * Registers an API endpoint to handle requests for a specific topic and attribute.\r\n */\r\n protected registerApiEndpoint(apiObject: IApiObject): void {\r\n if (this.instanceStatusTopic !== \"\") {\r\n const fullTopic = `${apiObject.topic}${apiObject.asset}/${apiObject.objectType}/${apiObject.objectId}/${apiObject.attribute}`;\r\n if (!this.producedApiEndpoints.has(fullTopic)) {\r\n const time = UnsPacket.formatToISO8601(new Date());\r\n this.producedApiEndpoints.set(fullTopic, {\r\n timestamp: time,\r\n topic: apiObject.topic,\r\n attribute: apiObject.attribute,\r\n apiHost: apiObject.apiHost,\r\n apiEndpoint: apiObject.apiEndpoint,\r\n apiMethod: apiObject.apiMethod,\r\n apiQueryParams: apiObject.apiQueryParams,\r\n apiDescription: apiObject.apiDescription,\r\n attributeType: apiObject.attributeType,\r\n apiSwaggerEndpoint: apiObject.apiSwaggerEndpoint,\r\n asset: apiObject.asset,\r\n objectType: apiObject.objectType,\r\n objectId: apiObject.objectId\r\n });\r\n this.emitProducedApiEndpoints();\r\n logger.info(`${this.instanceNameWithSuffix} - Registered new api endpoint: /${fullTopic}`);\r\n }\r\n }\r\n }\r\n\r\n protected registerApiCatchAll(mapping: IApiCatchallMapping): void {\r\n if (this.instanceStatusTopic !== \"\") {\r\n const key = mapping.topic.replace(/\\/+$/, \"\");\r\n if (!this.producedApiCatchall.has(key)) {\r\n this.producedApiCatchall.set(key, mapping);\r\n } else {\r\n this.producedApiCatchall.set(key, { ...this.producedApiCatchall.get(key)!, ...mapping });\r\n }\r\n this.emitProducedApiCatchall();\r\n logger.info(`${this.instanceNameWithSuffix} - Registered catch-all API mapping: ${key}`);\r\n }\r\n }\r\n\r\n protected unregisterApiEndpoint(topic: string, asset:UnsAsset, objectType: UnsObjectType, objectId: UnsObjectId, attribute: string): void {\r\n const fullTopic = `${topic}/${asset}/${objectType}/${objectId}/${attribute}`;\r\n if (this.producedApiEndpoints.has(fullTopic)) {\r\n this.producedApiEndpoints.delete(fullTopic);\r\n this.emitProducedApiEndpoints();\r\n logger.info(`${this.instanceNameWithSuffix} - Unregistered API endpoint: ${fullTopic}`);\r\n }\r\n }\r\n public async stop() {\r\n // Clear the publishing interval.\r\n if (this.publishInterval) {\r\n clearInterval(this.publishInterval);\r\n this.publishInterval = null;\r\n }\r\n\r\n }\r\n\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"uns-tags.js","sourceRoot":"","sources":["../../src/uns/uns-tags.ts"],"names":[],"mappings":"","sourcesContent":["export type UnsTags = \"\" |\n(string & {});"]}
1
+ {"version":3,"file":"uns-tags.js","sourceRoot":"","sources":["../../src/uns/uns-tags.ts"],"names":[],"mappings":"","sourcesContent":["export type UnsTags = \"\" |\r\n(string & {});"]}
@@ -1 +1 @@
1
- {"version":3,"file":"uns-topic-matcher.js","sourceRoot":"","sources":["../../src/uns/uns-topic-matcher.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAC1B;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,WAAmB,EAAE,KAAa;QAC/C,0DAA0D;QAC1D,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAExC,qBAAqB;YACrB,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,CAAC,sCAAsC;YACrD,CAAC;YAED,qBAAqB;YACrB,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;gBAC1B,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;oBACnC,OAAO,KAAK,CAAC,CAAC,qCAAqC;gBACrD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,uBAAuB;gBACvB,IAAI,aAAa,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,OAAO,cAAc,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC;IACxD,CAAC;CACF","sourcesContent":["export class UnsTopicMatcher {\n /**\n * Matches a topic with a topic filter, using MQTT rules.\n * @param topicFilter The MQTT topic filter (may contain `#` or `+` wildcards).\n * @param topic The topic to test against the filter.\n * @returns `true` if the topic matches the filter, `false` otherwise.\n */\n static matches(topicFilter: string, topic: string): boolean {\n // Normalize leading/trailing slashes and collapse empties\n const filterSegments = topicFilter.split('/').filter(Boolean);\n const topicSegments = topic.split('/').filter(Boolean);\n\n for (let i = 0; i < filterSegments.length; i++) {\n const filterSegment = filterSegments[i];\n\n // Match `#` wildcard\n if (filterSegment === '#') {\n return true; // `#` matches everything that follows\n }\n\n // Match `+` wildcard\n if (filterSegment === '+') {\n if (topicSegments[i] === undefined) {\n return false; // `+` should match exactly one level\n }\n } else {\n // Exact match required\n if (filterSegment !== topicSegments[i]) {\n return false;\n }\n }\n }\n\n // Ensure there are no unmatched segments in the topic\n return filterSegments.length === topicSegments.length;\n }\n}\n"]}
1
+ {"version":3,"file":"uns-topic-matcher.js","sourceRoot":"","sources":["../../src/uns/uns-topic-matcher.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAe;IAC1B;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,WAAmB,EAAE,KAAa;QAC/C,0DAA0D;QAC1D,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,aAAa,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;YAExC,qBAAqB;YACrB,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;gBAC1B,OAAO,IAAI,CAAC,CAAC,sCAAsC;YACrD,CAAC;YAED,qBAAqB;YACrB,IAAI,aAAa,KAAK,GAAG,EAAE,CAAC;gBAC1B,IAAI,aAAa,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;oBACnC,OAAO,KAAK,CAAC,CAAC,qCAAqC;gBACrD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,uBAAuB;gBACvB,IAAI,aAAa,KAAK,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;oBACvC,OAAO,KAAK,CAAC;gBACf,CAAC;YACH,CAAC;QACH,CAAC;QAED,sDAAsD;QACtD,OAAO,cAAc,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,CAAC;IACxD,CAAC;CACF","sourcesContent":["export class UnsTopicMatcher {\r\n /**\r\n * Matches a topic with a topic filter, using MQTT rules.\r\n * @param topicFilter The MQTT topic filter (may contain `#` or `+` wildcards).\r\n * @param topic The topic to test against the filter.\r\n * @returns `true` if the topic matches the filter, `false` otherwise.\r\n */\r\n static matches(topicFilter: string, topic: string): boolean {\r\n // Normalize leading/trailing slashes and collapse empties\r\n const filterSegments = topicFilter.split('/').filter(Boolean);\r\n const topicSegments = topic.split('/').filter(Boolean);\r\n\r\n for (let i = 0; i < filterSegments.length; i++) {\r\n const filterSegment = filterSegments[i];\r\n\r\n // Match `#` wildcard\r\n if (filterSegment === '#') {\r\n return true; // `#` matches everything that follows\r\n }\r\n\r\n // Match `+` wildcard\r\n if (filterSegment === '+') {\r\n if (topicSegments[i] === undefined) {\r\n return false; // `+` should match exactly one level\r\n }\r\n } else {\r\n // Exact match required\r\n if (filterSegment !== topicSegments[i]) {\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n // Ensure there are no unmatched segments in the topic\r\n return filterSegments.length === topicSegments.length;\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"uns-topics.js","sourceRoot":"","sources":["../../src/uns/uns-topics.ts"],"names":[],"mappings":"","sourcesContent":["export type UnsTopics = \"\" |\n(string & {});"]}
1
+ {"version":3,"file":"uns-topics.js","sourceRoot":"","sources":["../../src/uns/uns-topics.ts"],"names":[],"mappings":"","sourcesContent":["export type UnsTopics = \"\" |\r\n(string & {});"]}
@@ -1 +1 @@
1
- {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/uns-config/config-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC,MAAM,EAAE,CAAC","sourcesContent":["import { z } from \"zod\";\nimport { composeConfigSchema } from \"./schema-tools.js\";\nimport { unsCoreSchema } from \"./uns-core-schema.js\";\nimport { projectExtrasSchema } from \"../config/project.config.extension.js\";\n\n// Plain strict object for generators (no Effects, no dynamic imports)\nexport const baseSchema = composeConfigSchema(unsCoreSchema, projectExtrasSchema).strict();\n\n// Optional: export type from here too (handy for other libs)\nexport type AppConfigFromZod = z.infer<typeof baseSchema>;\n"]}
1
+ {"version":3,"file":"config-schema.js","sourceRoot":"","sources":["../../src/uns-config/config-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE5E,sEAAsE;AACtE,MAAM,CAAC,MAAM,UAAU,GAAG,mBAAmB,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAC,MAAM,EAAE,CAAC","sourcesContent":["import { z } from \"zod\";\r\nimport { composeConfigSchema } from \"./schema-tools.js\";\r\nimport { unsCoreSchema } from \"./uns-core-schema.js\";\r\nimport { projectExtrasSchema } from \"../config/project.config.extension.js\";\r\n\r\n// Plain strict object for generators (no Effects, no dynamic imports)\r\nexport const baseSchema = composeConfigSchema(unsCoreSchema, projectExtrasSchema).strict();\r\n\r\n// Optional: export type from here too (handy for other libs)\r\nexport type AppConfigFromZod = z.infer<typeof baseSchema>;\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"host-placeholders.js","sourceRoot":"","sources":["../../src/uns-config/host-placeholders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gFAAgF;AAChF,0EAA0E;AAC1E,iFAAiF;AACjF,6CAA6C;AAE7C,MAAM,gBAAgB,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC9E,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;SACnC,QAAQ,CAAC,kDAAkD,CAAC;CAChE,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,kDAAkD,CAAC,CAAC;AAEhE,MAAM,kBAAkB,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACtF,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;SACvC,QAAQ,CAAC,mEAAmE,CAAC;IAChF,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,2EAA2E,CAAC;IACxF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;CACtF,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,8FAA8F,CAAC,CAAC;AAE5G,MAAM,gBAAgB,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IACzF,MAAM,EAAE,CAAC;SACN,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;SAC7C,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,oDAAoD,CAAC;IACjE,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;IACvF,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;IACrF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kEAAkE,CAAC;CAChF,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,wDAAwD,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE;IACpE,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,CAAC;SACE,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;SACnC,QAAQ,CAAC,uDAAuD,CAAC;IACpE,qBAAqB;CACtB,CAAC,CAAC;AAQH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AACxD,CAAC","sourcesContent":["import { z } from \"zod\";\n\n// Host placeholders allow configuration values such as MQTT brokers or database\n// hosts to be defined dynamically. They support in-line values as well as\n// externally resolved entries so projects can avoid storing environment-specific\n// hosts directly inside shared config files.\n\nconst inlineHostSchema = z\n .object({\n provider: z.literal(\"inline\").describe(\"Use the supplied host or IP address.\"),\n value: z\n .string()\n .min(1, \"Host/IP value is required\")\n .describe(\"Host or IP address that should be used directly.\"),\n })\n .strict()\n .describe(\"Host placeholder resolved from an in-line value.\");\n\nconst externalHostSchema = z\n .object({\n provider: z.literal(\"external\").describe(\"Resolve the host from an external mapping.\"),\n key: z\n .string()\n .min(1, \"External host key is required\")\n .describe(\"Identifier used when resolving the host from HostResolverOptions.\"),\n optional: z\n .boolean()\n .optional()\n .describe(\"Allow the external host to be missing without throwing during resolution.\"),\n default: z\n .string()\n .optional()\n .describe(\"Fallback host when optional is true and the external entry is missing.\"),\n })\n .strict()\n .describe(\"Host placeholder resolved via HostResolverOptions.externalHosts or resolveExternal function.\");\n\nconst systemHostSchema = z\n .object({\n provider: z.literal(\"system\").describe(\"Resolve the host from local network interfaces.\"),\n family: z\n .union([z.literal(\"IPv4\"), z.literal(\"IPv6\")])\n .default(\"IPv4\")\n .describe(\"Address family to return when scanning interfaces.\"),\n interfaceName: z\n .string()\n .optional()\n .describe(\"Specific interface to read (falls back to the first match when omitted).\"),\n optional: z\n .boolean()\n .optional()\n .describe(\"Allow the interface lookup to fail without throwing during resolution.\"),\n default: z\n .string()\n .optional()\n .describe(\"Fallback host/IP when optional is true and no interface matches.\"),\n })\n .strict()\n .describe(\"Host placeholder resolved from os.networkInterfaces().\");\n\nexport const hostPlaceholderSchema = z.discriminatedUnion(\"provider\", [\n inlineHostSchema,\n externalHostSchema,\n systemHostSchema,\n]);\n\nexport const hostValueSchema = z.union([\n z\n .string()\n .min(1, \"Host/IP value is required\")\n .describe(\"Host or IP address used directly without placeholder.\"),\n hostPlaceholderSchema,\n]);\n\nexport type HostPlaceholder = z.infer<typeof hostPlaceholderSchema>;\nexport type HostValue = z.infer<typeof hostValueSchema>;\nexport type InlineHostPlaceholder = z.infer<typeof inlineHostSchema>;\nexport type ExternalHostPlaceholder = z.infer<typeof externalHostSchema>;\nexport type SystemHostPlaceholder = z.infer<typeof systemHostSchema>;\n\nexport function isHostPlaceholder(value: unknown): value is HostPlaceholder {\n return hostPlaceholderSchema.safeParse(value).success;\n}\n"]}
1
+ {"version":3,"file":"host-placeholders.js","sourceRoot":"","sources":["../../src/uns-config/host-placeholders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,gFAAgF;AAChF,0EAA0E;AAC1E,iFAAiF;AACjF,6CAA6C;AAE7C,MAAM,gBAAgB,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,sCAAsC,CAAC;IAC9E,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;SACnC,QAAQ,CAAC,kDAAkD,CAAC;CAChE,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,kDAAkD,CAAC,CAAC;AAEhE,MAAM,kBAAkB,GAAG,CAAC;KACzB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;IACtF,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;SACvC,QAAQ,CAAC,mEAAmE,CAAC;IAChF,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,2EAA2E,CAAC;IACxF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;CACtF,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,8FAA8F,CAAC,CAAC;AAE5G,MAAM,gBAAgB,GAAG,CAAC;KACvB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,QAAQ,CAAC,iDAAiD,CAAC;IACzF,MAAM,EAAE,CAAC;SACN,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;SAC7C,OAAO,CAAC,MAAM,CAAC;SACf,QAAQ,CAAC,oDAAoD,CAAC;IACjE,aAAa,EAAE,CAAC;SACb,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,0EAA0E,CAAC;IACvF,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,wEAAwE,CAAC;IACrF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,kEAAkE,CAAC;CAChF,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,wDAAwD,CAAC,CAAC;AAEtE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE;IACpE,gBAAgB;IAChB,kBAAkB;IAClB,gBAAgB;CACjB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,CAAC;SACE,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,2BAA2B,CAAC;SACnC,QAAQ,CAAC,uDAAuD,CAAC;IACpE,qBAAqB;CACtB,CAAC,CAAC;AAQH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AACxD,CAAC","sourcesContent":["import { z } from \"zod\";\r\n\r\n// Host placeholders allow configuration values such as MQTT brokers or database\r\n// hosts to be defined dynamically. They support in-line values as well as\r\n// externally resolved entries so projects can avoid storing environment-specific\r\n// hosts directly inside shared config files.\r\n\r\nconst inlineHostSchema = z\r\n .object({\r\n provider: z.literal(\"inline\").describe(\"Use the supplied host or IP address.\"),\r\n value: z\r\n .string()\r\n .min(1, \"Host/IP value is required\")\r\n .describe(\"Host or IP address that should be used directly.\"),\r\n })\r\n .strict()\r\n .describe(\"Host placeholder resolved from an in-line value.\");\r\n\r\nconst externalHostSchema = z\r\n .object({\r\n provider: z.literal(\"external\").describe(\"Resolve the host from an external mapping.\"),\r\n key: z\r\n .string()\r\n .min(1, \"External host key is required\")\r\n .describe(\"Identifier used when resolving the host from HostResolverOptions.\"),\r\n optional: z\r\n .boolean()\r\n .optional()\r\n .describe(\"Allow the external host to be missing without throwing during resolution.\"),\r\n default: z\r\n .string()\r\n .optional()\r\n .describe(\"Fallback host when optional is true and the external entry is missing.\"),\r\n })\r\n .strict()\r\n .describe(\"Host placeholder resolved via HostResolverOptions.externalHosts or resolveExternal function.\");\r\n\r\nconst systemHostSchema = z\r\n .object({\r\n provider: z.literal(\"system\").describe(\"Resolve the host from local network interfaces.\"),\r\n family: z\r\n .union([z.literal(\"IPv4\"), z.literal(\"IPv6\")])\r\n .default(\"IPv4\")\r\n .describe(\"Address family to return when scanning interfaces.\"),\r\n interfaceName: z\r\n .string()\r\n .optional()\r\n .describe(\"Specific interface to read (falls back to the first match when omitted).\"),\r\n optional: z\r\n .boolean()\r\n .optional()\r\n .describe(\"Allow the interface lookup to fail without throwing during resolution.\"),\r\n default: z\r\n .string()\r\n .optional()\r\n .describe(\"Fallback host/IP when optional is true and no interface matches.\"),\r\n })\r\n .strict()\r\n .describe(\"Host placeholder resolved from os.networkInterfaces().\");\r\n\r\nexport const hostPlaceholderSchema = z.discriminatedUnion(\"provider\", [\r\n inlineHostSchema,\r\n externalHostSchema,\r\n systemHostSchema,\r\n]);\r\n\r\nexport const hostValueSchema = z.union([\r\n z\r\n .string()\r\n .min(1, \"Host/IP value is required\")\r\n .describe(\"Host or IP address used directly without placeholder.\"),\r\n hostPlaceholderSchema,\r\n]);\r\n\r\nexport type HostPlaceholder = z.infer<typeof hostPlaceholderSchema>;\r\nexport type HostValue = z.infer<typeof hostValueSchema>;\r\nexport type InlineHostPlaceholder = z.infer<typeof inlineHostSchema>;\r\nexport type ExternalHostPlaceholder = z.infer<typeof externalHostSchema>;\r\nexport type SystemHostPlaceholder = z.infer<typeof systemHostSchema>;\r\n\r\nexport function isHostPlaceholder(value: unknown): value is HostPlaceholder {\r\n return hostPlaceholderSchema.safeParse(value).success;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"schema-tolls.js","sourceRoot":"","sources":["../../src/uns-config/schema-tolls.ts"],"names":[],"mappings":"AAEA,qDAAqD;AACrD,MAAM,UAAU,mBAAmB,CAGjC,CAAI,EAAE,CAAI;IACV,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,CAAC;AAC3B,CAAC","sourcesContent":["import { z } from \"zod\";\n\n// Shallow merge of two ZodObjects into one ZodObject\nexport function composeConfigSchema<\n A extends z.AnyZodObject,\n B extends z.AnyZodObject\n>(a: A, b: B): z.ZodObject<A[\"shape\"] & B[\"shape\"]> {\n return a.merge(b) as any;\n}\n"]}
1
+ {"version":3,"file":"schema-tolls.js","sourceRoot":"","sources":["../../src/uns-config/schema-tolls.ts"],"names":[],"mappings":"AAEA,qDAAqD;AACrD,MAAM,UAAU,mBAAmB,CAGjC,CAAI,EAAE,CAAI;IACV,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,CAAC;AAC3B,CAAC","sourcesContent":["import { z } from \"zod\";\r\n\r\n// Shallow merge of two ZodObjects into one ZodObject\r\nexport function composeConfigSchema<\r\n A extends z.AnyZodObject,\r\n B extends z.AnyZodObject\r\n>(a: A, b: B): z.ZodObject<A[\"shape\"] & B[\"shape\"]> {\r\n return a.merge(b) as any;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"schema-tools.js","sourceRoot":"","sources":["../../src/uns-config/schema-tools.ts"],"names":[],"mappings":"AAEA,gCAAgC;AAChC,SAAS,SAAS,CAAC,GAAmB;IACpC,MAAM,KAAK,GAAI,GAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,mBAAmB,CACjC,IAAoB,EACpB,GAAG,MAAwB;IAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["import { z } from \"zod\";\n\n// Helper functions in camelCase\nfunction shapeKeys(obj: z.AnyZodObject) {\n const shape = (obj as any)?._def?.shape();\n return Object.keys(shape ?? {});\n}\n\n// Function in camelCase is fine\nexport function composeConfigSchema(\n core: z.AnyZodObject,\n ...extras: z.AnyZodObject[]\n): z.AnyZodObject {\n const coreKeys = new Set(shapeKeys(core));\n for (const ext of extras) {\n const keys = shapeKeys(ext);\n const overlaps = keys.filter(k => coreKeys.has(k));\n if (overlaps.length) {\n throw new Error(`Project extras overlap UNS core keys: ${overlaps.join(\", \")}`);\n }\n keys.forEach(k => coreKeys.add(k));\n }\n return extras.reduce((acc, ext) => acc.merge(ext), core);\n}\n"]}
1
+ {"version":3,"file":"schema-tools.js","sourceRoot":"","sources":["../../src/uns-config/schema-tools.ts"],"names":[],"mappings":"AAEA,gCAAgC;AAChC,SAAS,SAAS,CAAC,GAAmB;IACpC,MAAM,KAAK,GAAI,GAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;AAClC,CAAC;AAED,gCAAgC;AAChC,MAAM,UAAU,mBAAmB,CACjC,IAAoB,EACpB,GAAG,MAAwB;IAE3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,yCAAyC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AAC3D,CAAC","sourcesContent":["import { z } from \"zod\";\r\n\r\n// Helper functions in camelCase\r\nfunction shapeKeys(obj: z.AnyZodObject) {\r\n const shape = (obj as any)?._def?.shape();\r\n return Object.keys(shape ?? {});\r\n}\r\n\r\n// Function in camelCase is fine\r\nexport function composeConfigSchema(\r\n core: z.AnyZodObject,\r\n ...extras: z.AnyZodObject[]\r\n): z.AnyZodObject {\r\n const coreKeys = new Set(shapeKeys(core));\r\n for (const ext of extras) {\r\n const keys = shapeKeys(ext);\r\n const overlaps = keys.filter(k => coreKeys.has(k));\r\n if (overlaps.length) {\r\n throw new Error(`Project extras overlap UNS core keys: ${overlaps.join(\", \")}`);\r\n }\r\n keys.forEach(k => coreKeys.add(k));\r\n }\r\n return extras.reduce((acc, ext) => acc.merge(ext), core);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"secret-placeholders.js","sourceRoot":"","sources":["../../src/uns-config/secret-placeholders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,uFAAuF;AACvF,sFAAsF;AACtF,qFAAqF;AACrF,8EAA8E;AAE9E,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACpF,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC;SAC9C,QAAQ,CAAC,2CAA2C,CAAC;IACxD,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,qEAAqE,CAAC;IAClF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;CACjF,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,+CAA+C,CAAC,CAAC;AAE7D,MAAM,qBAAqB,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC5E,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;SACjC,QAAQ,CAAC,wDAAwD,CAAC;IACrE,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;SAChC,QAAQ,CAAC,wCAAwC,CAAC;IACrD,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;IAChF,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,uEAAuE,CAAC;IACpF,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;IAChF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+EAA+E,CAAC;CAC7F,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,6CAA6C,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE;IACtE,eAAe;IACf,qBAAqB;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC;IACvC,CAAC,CAAC,MAAM,EAAE;IACV,uBAAuB;CACxB,CAAC,CAAC;AAOH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAC1D,CAAC","sourcesContent":["import { z } from \"zod\";\n\n// A SecretPlaceholder marks values that should be resolved from external secret stores\n// instead of being stored in plain text within config files. It supports loading from\n// environment variables (\"env\") and Infisical (\"infisical\"). The union below is kept\n// minimal so the same shape can be reused across core/project config schemas.\n\nconst envSecretSchema = z\n .object({\n provider: z.literal(\"env\").describe(\"Load the secret from an environment variable.\"),\n key: z\n .string()\n .min(1, \"Environment variable key is required\")\n .describe(\"Name of the environment variable to read.\"),\n optional: z\n .boolean()\n .optional()\n .describe(\"Allow the variable to be absent without throwing during resolution.\"),\n default: z\n .string()\n .optional()\n .describe(\"Fallback value when optional is true and the variable is missing.\"),\n })\n .strict()\n .describe(\"Secret placeholder resolved from process.env.\");\n\nconst infisicalSecretSchema = z\n .object({\n provider: z.literal(\"infisical\").describe(\"Load the secret from Infisical.\"),\n path: z\n .string()\n .min(1, \"Secret path is required\")\n .describe(\"Secret folder path in Infisical, e.g. '/app/database'.\"),\n key: z\n .string()\n .min(1, \"Secret key is required\")\n .describe(\"Secret key/name inside the given path.\"),\n optional: z\n .boolean()\n .optional()\n .describe(\"Allow the secret to be absent without throwing during resolution.\"),\n environment: z\n .string()\n .optional()\n .describe(\"Infisical environment override (defaults to current mode if omitted).\"),\n projectId: z\n .string()\n .optional()\n .describe(\"Optional Infisical project identifier when not using the default.\"),\n default: z\n .string()\n .optional()\n .describe(\"Fallback value when the secret is missing and optional resolution is allowed.\"),\n })\n .strict()\n .describe(\"Secret placeholder resolved from Infisical.\");\n\nexport const secretPlaceholderSchema = z.discriminatedUnion(\"provider\", [\n envSecretSchema,\n infisicalSecretSchema,\n]);\n\nexport const secretValueSchema = z.union([\n z.string(),\n secretPlaceholderSchema,\n]);\n\nexport type SecretPlaceholder = z.infer<typeof secretPlaceholderSchema>;\nexport type SecretValue = z.infer<typeof secretValueSchema>;\nexport type EnvSecretPlaceholder = z.infer<typeof envSecretSchema>;\nexport type InfisicalSecretPlaceholder = z.infer<typeof infisicalSecretSchema>;\n\nexport function isSecretPlaceholder(value: unknown): value is SecretPlaceholder {\n return secretPlaceholderSchema.safeParse(value).success;\n}\n"]}
1
+ {"version":3,"file":"secret-placeholders.js","sourceRoot":"","sources":["../../src/uns-config/secret-placeholders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,uFAAuF;AACvF,sFAAsF;AACtF,qFAAqF;AACrF,8EAA8E;AAE9E,MAAM,eAAe,GAAG,CAAC;KACtB,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,+CAA+C,CAAC;IACpF,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,sCAAsC,CAAC;SAC9C,QAAQ,CAAC,2CAA2C,CAAC;IACxD,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,qEAAqE,CAAC;IAClF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;CACjF,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,+CAA+C,CAAC,CAAC;AAE7D,MAAM,qBAAqB,GAAG,CAAC;KAC5B,MAAM,CAAC;IACN,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;IAC5E,IAAI,EAAE,CAAC;SACJ,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;SACjC,QAAQ,CAAC,wDAAwD,CAAC;IACrE,GAAG,EAAE,CAAC;SACH,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,wBAAwB,CAAC;SAChC,QAAQ,CAAC,wCAAwC,CAAC;IACrD,QAAQ,EAAE,CAAC;SACR,OAAO,EAAE;SACT,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;IAChF,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,uEAAuE,CAAC;IACpF,SAAS,EAAE,CAAC;SACT,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,mEAAmE,CAAC;IAChF,OAAO,EAAE,CAAC;SACP,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,QAAQ,CAAC,+EAA+E,CAAC;CAC7F,CAAC;KACD,MAAM,EAAE;KACR,QAAQ,CAAC,6CAA6C,CAAC,CAAC;AAE3D,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,CAAC,kBAAkB,CAAC,UAAU,EAAE;IACtE,eAAe;IACf,qBAAqB;CACtB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC;IACvC,CAAC,CAAC,MAAM,EAAE;IACV,uBAAuB;CACxB,CAAC,CAAC;AAOH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;AAC1D,CAAC","sourcesContent":["import { z } from \"zod\";\r\n\r\n// A SecretPlaceholder marks values that should be resolved from external secret stores\r\n// instead of being stored in plain text within config files. It supports loading from\r\n// environment variables (\"env\") and Infisical (\"infisical\"). The union below is kept\r\n// minimal so the same shape can be reused across core/project config schemas.\r\n\r\nconst envSecretSchema = z\r\n .object({\r\n provider: z.literal(\"env\").describe(\"Load the secret from an environment variable.\"),\r\n key: z\r\n .string()\r\n .min(1, \"Environment variable key is required\")\r\n .describe(\"Name of the environment variable to read.\"),\r\n optional: z\r\n .boolean()\r\n .optional()\r\n .describe(\"Allow the variable to be absent without throwing during resolution.\"),\r\n default: z\r\n .string()\r\n .optional()\r\n .describe(\"Fallback value when optional is true and the variable is missing.\"),\r\n })\r\n .strict()\r\n .describe(\"Secret placeholder resolved from process.env.\");\r\n\r\nconst infisicalSecretSchema = z\r\n .object({\r\n provider: z.literal(\"infisical\").describe(\"Load the secret from Infisical.\"),\r\n path: z\r\n .string()\r\n .min(1, \"Secret path is required\")\r\n .describe(\"Secret folder path in Infisical, e.g. '/app/database'.\"),\r\n key: z\r\n .string()\r\n .min(1, \"Secret key is required\")\r\n .describe(\"Secret key/name inside the given path.\"),\r\n optional: z\r\n .boolean()\r\n .optional()\r\n .describe(\"Allow the secret to be absent without throwing during resolution.\"),\r\n environment: z\r\n .string()\r\n .optional()\r\n .describe(\"Infisical environment override (defaults to current mode if omitted).\"),\r\n projectId: z\r\n .string()\r\n .optional()\r\n .describe(\"Optional Infisical project identifier when not using the default.\"),\r\n default: z\r\n .string()\r\n .optional()\r\n .describe(\"Fallback value when the secret is missing and optional resolution is allowed.\"),\r\n })\r\n .strict()\r\n .describe(\"Secret placeholder resolved from Infisical.\");\r\n\r\nexport const secretPlaceholderSchema = z.discriminatedUnion(\"provider\", [\r\n envSecretSchema,\r\n infisicalSecretSchema,\r\n]);\r\n\r\nexport const secretValueSchema = z.union([\r\n z.string(),\r\n secretPlaceholderSchema,\r\n]);\r\n\r\nexport type SecretPlaceholder = z.infer<typeof secretPlaceholderSchema>;\r\nexport type SecretValue = z.infer<typeof secretValueSchema>;\r\nexport type EnvSecretPlaceholder = z.infer<typeof envSecretSchema>;\r\nexport type InfisicalSecretPlaceholder = z.infer<typeof infisicalSecretSchema>;\r\n\r\nexport function isSecretPlaceholder(value: unknown): value is SecretPlaceholder {\r\n return secretPlaceholderSchema.safeParse(value).success;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"secret-resolver.js","sourceRoot":"","sources":["../../src/uns-config/secret-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\nimport os from \"node:os\";\nimport type { NetworkInterfaceInfo } from \"node:os\";\nimport type { AppConfig } from \"../config/app-config.js\";\nimport {\n isSecretPlaceholder,\n type EnvSecretPlaceholder,\n type InfisicalSecretPlaceholder,\n type SecretPlaceholder,\n} from \"./secret-placeholders.js\";\nimport {\n isHostPlaceholder,\n type HostPlaceholder,\n type SystemHostPlaceholder,\n} from \"./host-placeholders.js\";\n\nexport type SecretValueResolved = string | undefined;\nexport type HostValueResolved = string | undefined;\n\ntype SecretPlaceholderCandidate =\n | { provider: \"env\"; key: string }\n | { provider: \"infisical\"; key: string; path: string };\n\ntype HostPlaceholderCandidate = HostPlaceholder;\n\nexport type ResolvedConfig<T> = T extends SecretPlaceholderCandidate\n ? SecretValueResolved\n : T extends HostPlaceholderCandidate\n ? HostValueResolved\n : T extends (infer U)[]\n ? ResolvedConfig<U>[]\n : T extends Record<string, unknown>\n ? { [K in keyof T]: ResolvedConfig<T[K]> }\n : T;\n\nexport type ResolvedAppConfig = ResolvedConfig<AppConfig>;\n\nexport interface InfisicalFetchRequest {\n path: string;\n key: string;\n environment?: string;\n projectId?: string;\n type?: \"shared\" | \"personal\";\n}\n\nexport type InfisicalFetcher = (\n request: InfisicalFetchRequest\n) => Promise<string | undefined>;\n\nexport interface InfisicalResolverOptions {\n /**\n * Provide a custom fetcher. If omitted, the resolver tries to lazily instantiate\n * an Infisical client using @infisical/sdk based on the supplied token/siteUrl/options.\n */\n fetchSecret?: InfisicalFetcher;\n /**\n * Machine token or personal token used when creating the default Infisical client.\n * Falls back to the INFISICAL_TOKEN or INFISICAL_PERSONAL_TOKEN environment variables.\n */\n token?: string;\n /** Optional Infisical site URL override. Defaults to INFISICAL_SITE_URL when present. */\n siteUrl?: string;\n /** Default environment used when a placeholder does not specify one explicitly. */\n environment?: string;\n /** Default project id used when a placeholder does not provide one. */\n projectId?: string;\n /** Default secret type. Shared secrets are used by default. */\n type?: \"shared\" | \"personal\";\n /** Disable in-memory caching when set to false. Enabled by default. */\n cache?: boolean;\n}\n\nexport interface SecretResolverOptions {\n /** Environment map used for `env` placeholders. Defaults to process.env. */\n env?: NodeJS.ProcessEnv;\n /** Configuration for resolving Infisical placeholders. */\n infisical?: InfisicalResolverOptions;\n /** Callback invoked before throwing when a required secret cannot be resolved. */\n onMissingSecret?: (placeholder: SecretPlaceholder, source: \"env\" | \"infisical\") => void;\n /** Configuration for resolving host placeholders. */\n hosts?: HostResolverOptions;\n}\n\nexport interface HostResolverOptions {\n /** Optional environment map used when falling back to process.env lookups. */\n env?: NodeJS.ProcessEnv;\n /** Static mapping of external host keys to concrete host strings. */\n externalHosts?: Record<string, string | undefined>;\n /**\n * Custom resolver invoked when an external host needs to be resolved.\n * It can return synchronously or asynchronously.\n */\n resolveExternal?: (key: string) => string | undefined | Promise<string | undefined>;\n /** Override for os.networkInterfaces (handy for tests). */\n networkInterfaces?: () => Record<string, NetworkInterfaceInfo[] | undefined>;\n /** Callback invoked before throwing when a required host cannot be resolved. */\n onMissingHost?: (placeholder: HostPlaceholder) => void;\n}\n\nconst INFISICAL_TOKEN_FILE = \"/run/secrets/infisical_token\";\nconst INFISICAL_PROJECT_ID_FILE = \"/run/secrets/infisical_project_id\";\nconst INFISICAL_SITE_URL_FILE = \"/run/secrets/infisical_site_url\";\nconst INFISICAL_TOKEN_FILE_ALT = \"/var/lib/uns/secrets/infisical_token\";\nconst INFISICAL_PROJECT_ID_FILE_ALT = \"/var/lib/uns/secrets/infisical_project_id\";\nconst INFISICAL_SITE_URL_FILE_ALT = \"/var/lib/uns/secrets/infisical_site_url\";\n\nconst envCache = new Map<string, string | undefined>();\nconst infisicalCache = new Map<string, Promise<string | undefined>>();\n\nasync function readSecretFile(filePath: string): Promise<string | undefined> {\n try {\n const content = await fs.readFile(filePath, \"utf8\");\n const trimmed = content.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw new Error(\n `Failed to read Infisical secret file '${filePath}': ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: error as Error }\n );\n }\n}\n\nasync function resolveInfisicalToken(\n options?: InfisicalResolverOptions\n): Promise<string | undefined> {\n const candidate =\n options?.token ??\n process.env[\"INFISICAL_TOKEN\"] ??\n process.env[\"INFISICAL_PERSONAL_TOKEN\"] ??\n (await readSecretFile(INFISICAL_TOKEN_FILE)) ??\n (await readSecretFile(INFISICAL_TOKEN_FILE_ALT));\n\n return candidate?.trim() || undefined;\n}\n\nasync function resolveInfisicalSiteUrl(\n options?: InfisicalResolverOptions\n): Promise<string | undefined> {\n const candidate =\n options?.siteUrl ??\n process.env[\"INFISICAL_SITE_URL\"] ??\n (await readSecretFile(INFISICAL_SITE_URL_FILE)) ??\n (await readSecretFile(INFISICAL_SITE_URL_FILE_ALT));\n\n return candidate?.trim() || undefined;\n}\n\nasync function resolveInfisicalProjectId(\n options?: InfisicalResolverOptions\n): Promise<string | undefined> {\n const candidate =\n options?.projectId ??\n process.env[\"INFISICAL_PROJECT_ID\"] ??\n (await readSecretFile(INFISICAL_PROJECT_ID_FILE)) ??\n (await readSecretFile(INFISICAL_PROJECT_ID_FILE_ALT));\n\n return candidate?.trim() || undefined;\n}\n\nconst structuredCloneFallback = <T>(value: T): T =>\n typeof structuredClone === \"function\"\n ? structuredClone(value)\n : (JSON.parse(JSON.stringify(value)) as T);\n\nexport async function resolveConfigSecrets(\n config: AppConfig,\n options: SecretResolverOptions = {}\n): Promise<ResolvedAppConfig> {\n const working = structuredCloneFallback(config);\n await resolveNode(working, options);\n return working;\n}\n\nexport function clearSecretResolverCaches(): void {\n envCache.clear();\n infisicalCache.clear();\n defaultInfisicalFetcherCache.clear();\n}\n\nexport async function resolveInfisicalConfig(\n options?: InfisicalResolverOptions\n): Promise<{\n token: string | undefined;\n projectId: string | undefined;\n siteUrl: string | undefined;\n}> {\n const [token, projectId, siteUrl] = await Promise.all([\n resolveInfisicalToken(options),\n resolveInfisicalProjectId(options),\n resolveInfisicalSiteUrl(options),\n ]);\n\n return { token, projectId, siteUrl };\n}\n\nasync function resolveNode(node: unknown, options: SecretResolverOptions): Promise<unknown> {\n if (isSecretPlaceholder(node)) {\n return resolveSecretValue(node, options);\n }\n\n if (isHostPlaceholder(node)) {\n return resolveHostValue(node, options.hosts);\n }\n\n if (Array.isArray(node)) {\n const resolvedArray = await Promise.all(node.map(item => resolveNode(item, options)));\n return resolvedArray;\n }\n\n if (node && typeof node === \"object\") {\n const obj = node as Record<string, unknown>;\n\n for (const key of Object.keys(obj)) {\n const current = obj[key];\n\n if (isSecretPlaceholder(current)) {\n const resolved = await resolveSecretValue(current, options);\n if (resolved === undefined) {\n delete obj[key];\n } else {\n obj[key] = resolved;\n }\n continue;\n }\n\n if (isHostPlaceholder(current)) {\n const resolved = await resolveHostValue(current, options.hosts);\n if (resolved === undefined) {\n delete obj[key];\n } else {\n obj[key] = resolved;\n }\n continue;\n }\n\n const resolvedChild = await resolveNode(current, options);\n obj[key] = resolvedChild;\n }\n\n return obj;\n }\n\n return node;\n}\n\nasync function resolveSecretValue(\n placeholder: SecretPlaceholder,\n options: SecretResolverOptions\n): Promise<SecretValueResolved> {\n switch (placeholder.provider) {\n case \"env\":\n return resolveEnvSecret(placeholder, options);\n case \"infisical\":\n return resolveInfisicalSecret(placeholder, options);\n default:\n // Exhaustive check to guard future provider additions.\n return assertNeverProvider(placeholder);\n }\n}\n\nfunction assertNeverProvider(x: never): never {\n throw new Error(`Unsupported secret provider: ${JSON.stringify(x)}`);\n}\n\nasync function resolveHostValue(\n placeholder: HostPlaceholder,\n options?: HostResolverOptions\n): Promise<HostValueResolved> {\n const effectiveOptions = options ?? {};\n\n switch (placeholder.provider) {\n case \"inline\":\n return placeholder.value;\n case \"external\": {\n const envMap = effectiveOptions.env ?? process.env;\n\n let resolved = await maybeResolveExternal(\n placeholder.key,\n effectiveOptions.resolveExternal\n );\n\n if (resolved === undefined) {\n resolved = effectiveOptions.externalHosts?.[placeholder.key];\n }\n\n if (resolved === undefined) {\n resolved = envMap?.[placeholder.key];\n }\n\n if (resolved === undefined) {\n if (placeholder.default !== undefined) {\n return placeholder.default;\n }\n if (placeholder.optional) {\n return undefined;\n }\n\n effectiveOptions.onMissingHost?.(placeholder);\n throw new Error(`External host '${placeholder.key}' could not be resolved.`);\n }\n\n return resolved;\n }\n case \"system\":\n return resolveSystemHost(placeholder, effectiveOptions);\n default:\n return assertNeverHostProvider(placeholder);\n }\n}\n\nasync function maybeResolveExternal(\n key: string,\n resolver?: (key: string) => string | undefined | Promise<string | undefined>\n): Promise<string | undefined> {\n if (!resolver) {\n return undefined;\n }\n\n try {\n return await resolver(key);\n } catch (error) {\n throw new Error(\n `Failed to resolve external host '${key}' via custom resolver: ${\n error instanceof Error ? error.message : String(error)\n }`,\n { cause: error }\n );\n }\n}\n\nfunction assertNeverHostProvider(x: never): never {\n throw new Error(`Unsupported host provider: ${JSON.stringify(x)}`);\n}\n\nfunction resolveSystemHost(\n placeholder: SystemHostPlaceholder,\n options: HostResolverOptions\n): HostValueResolved {\n const getInterfaces = options.networkInterfaces ?? os.networkInterfaces;\n const interfaces = getInterfaces();\n const family = placeholder.family ?? \"IPv4\";\n const targetName = placeholder.interfaceName;\n\n const interfaceEntries: Array<readonly [string, NetworkInterfaceInfo[] | undefined]> = targetName\n ? [[targetName, interfaces[targetName]]]\n : Object.entries(interfaces);\n\n for (const [, ifaceList] of interfaceEntries) {\n if (!ifaceList) {\n continue;\n }\n for (const iface of ifaceList) {\n if (\n iface &&\n iface.family === family &&\n iface.internal !== true &&\n typeof iface.address === \"string\" &&\n iface.address.length > 0\n ) {\n return iface.address;\n }\n }\n\n if (targetName) {\n break;\n }\n }\n\n if (placeholder.default !== undefined) {\n return placeholder.default;\n }\n\n if (placeholder.optional) {\n return undefined;\n }\n\n options.onMissingHost?.(placeholder);\n const targetDescription = targetName ? `interface '${targetName}'` : \"available interfaces\";\n throw new Error(\n `System host lookup failed for ${targetDescription} (family ${family}).`\n );\n}\n\nfunction resolveEnvSecret(\n placeholder: EnvSecretPlaceholder,\n options: SecretResolverOptions\n): SecretValueResolved {\n const envMap = options.env ?? process.env;\n const cacheKey = placeholder.key;\n\n if (envCache.has(cacheKey)) {\n return envCache.get(cacheKey) ?? undefined;\n }\n\n const value = envMap[cacheKey];\n\n if (value === undefined || value === null) {\n if (placeholder.default !== undefined) {\n envCache.set(cacheKey, placeholder.default);\n return placeholder.default;\n }\n if (placeholder.optional) {\n envCache.set(cacheKey, undefined);\n return undefined;\n }\n\n options.onMissingSecret?.(placeholder, \"env\");\n throw new Error(`Required environment variable '${cacheKey}' is not set.`);\n }\n\n envCache.set(cacheKey, value);\n return value;\n}\n\nasync function resolveInfisicalSecret(\n placeholder: InfisicalSecretPlaceholder,\n options: SecretResolverOptions\n): Promise<SecretValueResolved> {\n const infisicalOptions = options.infisical;\n const fetcher = await getInfisicalFetcher(infisicalOptions);\n\n const environment = placeholder.environment ?? infisicalOptions?.environment ?? process.env[\"INFISICAL_ENVIRONMENT\"];\n const projectId = placeholder.projectId ?? (await resolveInfisicalProjectId(infisicalOptions));\n const type = infisicalOptions?.type ?? \"shared\";\n\n const cacheKey = JSON.stringify({\n path: placeholder.path,\n key: placeholder.key,\n environment,\n projectId,\n type,\n });\n\n const useCache = infisicalOptions?.cache !== false;\n const cached = useCache ? infisicalCache.get(cacheKey) : undefined;\n\n if (!fetcher) {\n if (cached) {\n console.warn(\n `Infisical fetcher unavailable; using cached secret for ${placeholder.path}:${placeholder.key}.`\n );\n return cached;\n }\n\n const fallback =\n placeholder.default !== undefined\n ? placeholder.default\n : placeholder.optional\n ? undefined\n : undefined;\n\n console.warn(\n `Infisical fetcher unavailable; returning ${fallback === undefined ? \"undefined\" : \"default\"} for ${placeholder.path}:${placeholder.key}.`\n );\n if (fallback === undefined && !placeholder.optional) {\n options.onMissingSecret?.(placeholder, \"infisical\");\n }\n\n return fallback;\n }\n\n if (!environment) {\n throw new Error(\n `Infisical secret '${placeholder.path}:${placeholder.key}' is missing an environment. ` +\n \"Set it on the placeholder, pass SecretResolverOptions.infisical.environment, or define INFISICAL_ENVIRONMENT.\"\n );\n }\n\n if (!projectId) {\n throw new Error(\n `Infisical secret '${placeholder.path}:${placeholder.key}' is missing a project id. ` +\n \"Set it on the placeholder, pass SecretResolverOptions.infisical.projectId, define INFISICAL_PROJECT_ID, \" +\n \"or provide /run/secrets/infisical_project_id (also /var/lib/uns/secrets/infisical_project_id).\"\n );\n }\n\n if (cached) {\n return cached ?? undefined;\n }\n\n const fetchPromise = fetcher({\n path: placeholder.path,\n key: placeholder.key,\n environment,\n projectId,\n type,\n }).then(secret => {\n if (secret === undefined || secret === null) {\n if (placeholder.default !== undefined) {\n return placeholder.default;\n }\n if (placeholder.optional) {\n return undefined;\n }\n options.onMissingSecret?.(placeholder, \"infisical\");\n throw new Error(\n `Secret '${placeholder.path}:${placeholder.key}' not found in Infisical.`\n );\n }\n return secret;\n }).catch(error => {\n if (cached) {\n console.warn(\n `Infisical fetch failed (${error instanceof Error ? error.message : String(error)}); using cached secret for ${placeholder.path}:${placeholder.key}.`\n );\n return cached;\n }\n\n const fallback =\n placeholder.default !== undefined\n ? placeholder.default\n : placeholder.optional\n ? undefined\n : undefined;\n\n console.warn(\n `Infisical fetch failed (${error instanceof Error ? error.message : String(error)}); returning ${fallback === undefined ? \"undefined\" : \"default\"} for ${placeholder.path}:${placeholder.key}.`\n );\n\n if (fallback === undefined && !placeholder.optional) {\n options.onMissingSecret?.(placeholder, \"infisical\");\n throw new Error(\n `Failed to fetch Infisical secret ${placeholder.path}:${placeholder.key}: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n\n return fallback;\n });\n\n const guardedPromise = fetchPromise.then(\n value => value,\n error => {\n if (useCache) {\n infisicalCache.delete(cacheKey);\n }\n throw error;\n }\n );\n\n if (useCache) {\n infisicalCache.set(cacheKey, guardedPromise);\n }\n\n return guardedPromise;\n}\n\nasync function getInfisicalFetcher(\n options?: InfisicalResolverOptions\n): Promise<InfisicalFetcher | undefined> {\n const effectiveOptions = options ?? {};\n\n if (effectiveOptions.fetchSecret) {\n return effectiveOptions.fetchSecret;\n }\n\n const token = await resolveInfisicalToken(effectiveOptions);\n\n if (!token) {\n return undefined;\n }\n\n const siteUrl = await resolveInfisicalSiteUrl(effectiveOptions);\n const cacheKey = `${token}::${siteUrl ?? \"\"}`;\n\n if (!defaultInfisicalFetcherCache.has(cacheKey)) {\n defaultInfisicalFetcherCache.set(\n cacheKey,\n createDefaultInfisicalFetcher(token, siteUrl)\n );\n }\n\n const baseFetcher = await defaultInfisicalFetcherCache.get(cacheKey)!;\n return baseFetcher;\n}\n\nconst defaultInfisicalFetcherCache = new Map<string, Promise<InfisicalFetcher>>();\n\nasync function createDefaultInfisicalFetcher(\n token: string,\n siteUrl?: string\n): Promise<InfisicalFetcher> {\n try {\n const sdkModule = await import(\"@infisical/sdk\");\n const { InfisicalSDK, SecretType } = sdkModule;\n if (!InfisicalSDK) {\n throw new Error(\"@infisical/sdk does not export InfisicalSDK\");\n }\n\n const sdkInstance = new InfisicalSDK({ siteUrl: siteUrl ?? \"\" });\n const authenticatedSdk = sdkInstance.auth().accessToken(token);\n\n return async ({ path, key, environment, projectId, type = \"shared\" }: InfisicalFetchRequest) => {\n if (!environment) {\n throw new Error(\n `Infisical secret '${path}:${key}' is missing an environment.`\n );\n }\n if (!projectId) {\n throw new Error(\n `Infisical secret '${path}:${key}' is missing a project id.`\n );\n }\n\n const secret = await authenticatedSdk\n .secrets()\n .getSecret({\n secretName: key,\n secretPath: path,\n environment,\n projectId,\n viewSecretValue: true,\n type: type === \"personal\" ? SecretType.Personal : SecretType.Shared,\n });\n\n return secret?.secretValue ?? undefined;\n };\n } catch (error) {\n throw new Error(\n \"Failed to initialize @infisical/sdk. Install the package or provide SecretResolverOptions.infisical.fetchSecret.\",\n { cause: error as Error }\n );\n }\n}\n"]}
1
+ {"version":3,"file":"secret-resolver.js","sourceRoot":"","sources":["../../src/uns-config/secret-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import fs from \"node:fs/promises\";\r\nimport os from \"node:os\";\r\nimport type { NetworkInterfaceInfo } from \"node:os\";\r\nimport type { AppConfig } from \"../config/app-config.js\";\r\nimport {\r\n isSecretPlaceholder,\r\n type EnvSecretPlaceholder,\r\n type InfisicalSecretPlaceholder,\r\n type SecretPlaceholder,\r\n} from \"./secret-placeholders.js\";\r\nimport {\r\n isHostPlaceholder,\r\n type HostPlaceholder,\r\n type SystemHostPlaceholder,\r\n} from \"./host-placeholders.js\";\r\n\r\nexport type SecretValueResolved = string | undefined;\r\nexport type HostValueResolved = string | undefined;\r\n\r\ntype SecretPlaceholderCandidate =\r\n | { provider: \"env\"; key: string }\r\n | { provider: \"infisical\"; key: string; path: string };\r\n\r\ntype HostPlaceholderCandidate = HostPlaceholder;\r\n\r\nexport type ResolvedConfig<T> = T extends SecretPlaceholderCandidate\r\n ? SecretValueResolved\r\n : T extends HostPlaceholderCandidate\r\n ? HostValueResolved\r\n : T extends (infer U)[]\r\n ? ResolvedConfig<U>[]\r\n : T extends Record<string, unknown>\r\n ? { [K in keyof T]: ResolvedConfig<T[K]> }\r\n : T;\r\n\r\nexport type ResolvedAppConfig = ResolvedConfig<AppConfig>;\r\n\r\nexport interface InfisicalFetchRequest {\r\n path: string;\r\n key: string;\r\n environment?: string;\r\n projectId?: string;\r\n type?: \"shared\" | \"personal\";\r\n}\r\n\r\nexport type InfisicalFetcher = (\r\n request: InfisicalFetchRequest\r\n) => Promise<string | undefined>;\r\n\r\nexport interface InfisicalResolverOptions {\r\n /**\r\n * Provide a custom fetcher. If omitted, the resolver tries to lazily instantiate\r\n * an Infisical client using @infisical/sdk based on the supplied token/siteUrl/options.\r\n */\r\n fetchSecret?: InfisicalFetcher;\r\n /**\r\n * Machine token or personal token used when creating the default Infisical client.\r\n * Falls back to the INFISICAL_TOKEN or INFISICAL_PERSONAL_TOKEN environment variables.\r\n */\r\n token?: string;\r\n /** Optional Infisical site URL override. Defaults to INFISICAL_SITE_URL when present. */\r\n siteUrl?: string;\r\n /** Default environment used when a placeholder does not specify one explicitly. */\r\n environment?: string;\r\n /** Default project id used when a placeholder does not provide one. */\r\n projectId?: string;\r\n /** Default secret type. Shared secrets are used by default. */\r\n type?: \"shared\" | \"personal\";\r\n /** Disable in-memory caching when set to false. Enabled by default. */\r\n cache?: boolean;\r\n}\r\n\r\nexport interface SecretResolverOptions {\r\n /** Environment map used for `env` placeholders. Defaults to process.env. */\r\n env?: NodeJS.ProcessEnv;\r\n /** Configuration for resolving Infisical placeholders. */\r\n infisical?: InfisicalResolverOptions;\r\n /** Callback invoked before throwing when a required secret cannot be resolved. */\r\n onMissingSecret?: (placeholder: SecretPlaceholder, source: \"env\" | \"infisical\") => void;\r\n /** Configuration for resolving host placeholders. */\r\n hosts?: HostResolverOptions;\r\n}\r\n\r\nexport interface HostResolverOptions {\r\n /** Optional environment map used when falling back to process.env lookups. */\r\n env?: NodeJS.ProcessEnv;\r\n /** Static mapping of external host keys to concrete host strings. */\r\n externalHosts?: Record<string, string | undefined>;\r\n /**\r\n * Custom resolver invoked when an external host needs to be resolved.\r\n * It can return synchronously or asynchronously.\r\n */\r\n resolveExternal?: (key: string) => string | undefined | Promise<string | undefined>;\r\n /** Override for os.networkInterfaces (handy for tests). */\r\n networkInterfaces?: () => Record<string, NetworkInterfaceInfo[] | undefined>;\r\n /** Callback invoked before throwing when a required host cannot be resolved. */\r\n onMissingHost?: (placeholder: HostPlaceholder) => void;\r\n}\r\n\r\nconst INFISICAL_TOKEN_FILE = \"/run/secrets/infisical_token\";\r\nconst INFISICAL_PROJECT_ID_FILE = \"/run/secrets/infisical_project_id\";\r\nconst INFISICAL_SITE_URL_FILE = \"/run/secrets/infisical_site_url\";\r\nconst INFISICAL_TOKEN_FILE_ALT = \"/var/lib/uns/secrets/infisical_token\";\r\nconst INFISICAL_PROJECT_ID_FILE_ALT = \"/var/lib/uns/secrets/infisical_project_id\";\r\nconst INFISICAL_SITE_URL_FILE_ALT = \"/var/lib/uns/secrets/infisical_site_url\";\r\n\r\nconst envCache = new Map<string, string | undefined>();\r\nconst infisicalCache = new Map<string, Promise<string | undefined>>();\r\n\r\nasync function readSecretFile(filePath: string): Promise<string | undefined> {\r\n try {\r\n const content = await fs.readFile(filePath, \"utf8\");\r\n const trimmed = content.trim();\r\n return trimmed.length > 0 ? trimmed : undefined;\r\n } catch (error) {\r\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\r\n return undefined;\r\n }\r\n throw new Error(\r\n `Failed to read Infisical secret file '${filePath}': ${\r\n error instanceof Error ? error.message : String(error)\r\n }`,\r\n { cause: error as Error }\r\n );\r\n }\r\n}\r\n\r\nasync function resolveInfisicalToken(\r\n options?: InfisicalResolverOptions\r\n): Promise<string | undefined> {\r\n const candidate =\r\n options?.token ??\r\n process.env[\"INFISICAL_TOKEN\"] ??\r\n process.env[\"INFISICAL_PERSONAL_TOKEN\"] ??\r\n (await readSecretFile(INFISICAL_TOKEN_FILE)) ??\r\n (await readSecretFile(INFISICAL_TOKEN_FILE_ALT));\r\n\r\n return candidate?.trim() || undefined;\r\n}\r\n\r\nasync function resolveInfisicalSiteUrl(\r\n options?: InfisicalResolverOptions\r\n): Promise<string | undefined> {\r\n const candidate =\r\n options?.siteUrl ??\r\n process.env[\"INFISICAL_SITE_URL\"] ??\r\n (await readSecretFile(INFISICAL_SITE_URL_FILE)) ??\r\n (await readSecretFile(INFISICAL_SITE_URL_FILE_ALT));\r\n\r\n return candidate?.trim() || undefined;\r\n}\r\n\r\nasync function resolveInfisicalProjectId(\r\n options?: InfisicalResolverOptions\r\n): Promise<string | undefined> {\r\n const candidate =\r\n options?.projectId ??\r\n process.env[\"INFISICAL_PROJECT_ID\"] ??\r\n (await readSecretFile(INFISICAL_PROJECT_ID_FILE)) ??\r\n (await readSecretFile(INFISICAL_PROJECT_ID_FILE_ALT));\r\n\r\n return candidate?.trim() || undefined;\r\n}\r\n\r\nconst structuredCloneFallback = <T>(value: T): T =>\r\n typeof structuredClone === \"function\"\r\n ? structuredClone(value)\r\n : (JSON.parse(JSON.stringify(value)) as T);\r\n\r\nexport async function resolveConfigSecrets(\r\n config: AppConfig,\r\n options: SecretResolverOptions = {}\r\n): Promise<ResolvedAppConfig> {\r\n const working = structuredCloneFallback(config);\r\n await resolveNode(working, options);\r\n return working;\r\n}\r\n\r\nexport function clearSecretResolverCaches(): void {\r\n envCache.clear();\r\n infisicalCache.clear();\r\n defaultInfisicalFetcherCache.clear();\r\n}\r\n\r\nexport async function resolveInfisicalConfig(\r\n options?: InfisicalResolverOptions\r\n): Promise<{\r\n token: string | undefined;\r\n projectId: string | undefined;\r\n siteUrl: string | undefined;\r\n}> {\r\n const [token, projectId, siteUrl] = await Promise.all([\r\n resolveInfisicalToken(options),\r\n resolveInfisicalProjectId(options),\r\n resolveInfisicalSiteUrl(options),\r\n ]);\r\n\r\n return { token, projectId, siteUrl };\r\n}\r\n\r\nasync function resolveNode(node: unknown, options: SecretResolverOptions): Promise<unknown> {\r\n if (isSecretPlaceholder(node)) {\r\n return resolveSecretValue(node, options);\r\n }\r\n\r\n if (isHostPlaceholder(node)) {\r\n return resolveHostValue(node, options.hosts);\r\n }\r\n\r\n if (Array.isArray(node)) {\r\n const resolvedArray = await Promise.all(node.map(item => resolveNode(item, options)));\r\n return resolvedArray;\r\n }\r\n\r\n if (node && typeof node === \"object\") {\r\n const obj = node as Record<string, unknown>;\r\n\r\n for (const key of Object.keys(obj)) {\r\n const current = obj[key];\r\n\r\n if (isSecretPlaceholder(current)) {\r\n const resolved = await resolveSecretValue(current, options);\r\n if (resolved === undefined) {\r\n delete obj[key];\r\n } else {\r\n obj[key] = resolved;\r\n }\r\n continue;\r\n }\r\n\r\n if (isHostPlaceholder(current)) {\r\n const resolved = await resolveHostValue(current, options.hosts);\r\n if (resolved === undefined) {\r\n delete obj[key];\r\n } else {\r\n obj[key] = resolved;\r\n }\r\n continue;\r\n }\r\n\r\n const resolvedChild = await resolveNode(current, options);\r\n obj[key] = resolvedChild;\r\n }\r\n\r\n return obj;\r\n }\r\n\r\n return node;\r\n}\r\n\r\nasync function resolveSecretValue(\r\n placeholder: SecretPlaceholder,\r\n options: SecretResolverOptions\r\n): Promise<SecretValueResolved> {\r\n switch (placeholder.provider) {\r\n case \"env\":\r\n return resolveEnvSecret(placeholder, options);\r\n case \"infisical\":\r\n return resolveInfisicalSecret(placeholder, options);\r\n default:\r\n // Exhaustive check to guard future provider additions.\r\n return assertNeverProvider(placeholder);\r\n }\r\n}\r\n\r\nfunction assertNeverProvider(x: never): never {\r\n throw new Error(`Unsupported secret provider: ${JSON.stringify(x)}`);\r\n}\r\n\r\nasync function resolveHostValue(\r\n placeholder: HostPlaceholder,\r\n options?: HostResolverOptions\r\n): Promise<HostValueResolved> {\r\n const effectiveOptions = options ?? {};\r\n\r\n switch (placeholder.provider) {\r\n case \"inline\":\r\n return placeholder.value;\r\n case \"external\": {\r\n const envMap = effectiveOptions.env ?? process.env;\r\n\r\n let resolved = await maybeResolveExternal(\r\n placeholder.key,\r\n effectiveOptions.resolveExternal\r\n );\r\n\r\n if (resolved === undefined) {\r\n resolved = effectiveOptions.externalHosts?.[placeholder.key];\r\n }\r\n\r\n if (resolved === undefined) {\r\n resolved = envMap?.[placeholder.key];\r\n }\r\n\r\n if (resolved === undefined) {\r\n if (placeholder.default !== undefined) {\r\n return placeholder.default;\r\n }\r\n if (placeholder.optional) {\r\n return undefined;\r\n }\r\n\r\n effectiveOptions.onMissingHost?.(placeholder);\r\n throw new Error(`External host '${placeholder.key}' could not be resolved.`);\r\n }\r\n\r\n return resolved;\r\n }\r\n case \"system\":\r\n return resolveSystemHost(placeholder, effectiveOptions);\r\n default:\r\n return assertNeverHostProvider(placeholder);\r\n }\r\n}\r\n\r\nasync function maybeResolveExternal(\r\n key: string,\r\n resolver?: (key: string) => string | undefined | Promise<string | undefined>\r\n): Promise<string | undefined> {\r\n if (!resolver) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n return await resolver(key);\r\n } catch (error) {\r\n throw new Error(\r\n `Failed to resolve external host '${key}' via custom resolver: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`,\r\n { cause: error }\r\n );\r\n }\r\n}\r\n\r\nfunction assertNeverHostProvider(x: never): never {\r\n throw new Error(`Unsupported host provider: ${JSON.stringify(x)}`);\r\n}\r\n\r\nfunction resolveSystemHost(\r\n placeholder: SystemHostPlaceholder,\r\n options: HostResolverOptions\r\n): HostValueResolved {\r\n const getInterfaces = options.networkInterfaces ?? os.networkInterfaces;\r\n const interfaces = getInterfaces();\r\n const family = placeholder.family ?? \"IPv4\";\r\n const targetName = placeholder.interfaceName;\r\n\r\n const interfaceEntries: Array<readonly [string, NetworkInterfaceInfo[] | undefined]> = targetName\r\n ? [[targetName, interfaces[targetName]]]\r\n : Object.entries(interfaces);\r\n\r\n for (const [, ifaceList] of interfaceEntries) {\r\n if (!ifaceList) {\r\n continue;\r\n }\r\n for (const iface of ifaceList) {\r\n if (\r\n iface &&\r\n iface.family === family &&\r\n iface.internal !== true &&\r\n typeof iface.address === \"string\" &&\r\n iface.address.length > 0\r\n ) {\r\n return iface.address;\r\n }\r\n }\r\n\r\n if (targetName) {\r\n break;\r\n }\r\n }\r\n\r\n if (placeholder.default !== undefined) {\r\n return placeholder.default;\r\n }\r\n\r\n if (placeholder.optional) {\r\n return undefined;\r\n }\r\n\r\n options.onMissingHost?.(placeholder);\r\n const targetDescription = targetName ? `interface '${targetName}'` : \"available interfaces\";\r\n throw new Error(\r\n `System host lookup failed for ${targetDescription} (family ${family}).`\r\n );\r\n}\r\n\r\nfunction resolveEnvSecret(\r\n placeholder: EnvSecretPlaceholder,\r\n options: SecretResolverOptions\r\n): SecretValueResolved {\r\n const envMap = options.env ?? process.env;\r\n const cacheKey = placeholder.key;\r\n\r\n if (envCache.has(cacheKey)) {\r\n return envCache.get(cacheKey) ?? undefined;\r\n }\r\n\r\n const value = envMap[cacheKey];\r\n\r\n if (value === undefined || value === null) {\r\n if (placeholder.default !== undefined) {\r\n envCache.set(cacheKey, placeholder.default);\r\n return placeholder.default;\r\n }\r\n if (placeholder.optional) {\r\n envCache.set(cacheKey, undefined);\r\n return undefined;\r\n }\r\n\r\n options.onMissingSecret?.(placeholder, \"env\");\r\n throw new Error(`Required environment variable '${cacheKey}' is not set.`);\r\n }\r\n\r\n envCache.set(cacheKey, value);\r\n return value;\r\n}\r\n\r\nasync function resolveInfisicalSecret(\r\n placeholder: InfisicalSecretPlaceholder,\r\n options: SecretResolverOptions\r\n): Promise<SecretValueResolved> {\r\n const infisicalOptions = options.infisical;\r\n const fetcher = await getInfisicalFetcher(infisicalOptions);\r\n\r\n const environment = placeholder.environment ?? infisicalOptions?.environment ?? process.env[\"INFISICAL_ENVIRONMENT\"];\r\n const projectId = placeholder.projectId ?? (await resolveInfisicalProjectId(infisicalOptions));\r\n const type = infisicalOptions?.type ?? \"shared\";\r\n\r\n const cacheKey = JSON.stringify({\r\n path: placeholder.path,\r\n key: placeholder.key,\r\n environment,\r\n projectId,\r\n type,\r\n });\r\n\r\n const useCache = infisicalOptions?.cache !== false;\r\n const cached = useCache ? infisicalCache.get(cacheKey) : undefined;\r\n\r\n if (!fetcher) {\r\n if (cached) {\r\n console.warn(\r\n `Infisical fetcher unavailable; using cached secret for ${placeholder.path}:${placeholder.key}.`\r\n );\r\n return cached;\r\n }\r\n\r\n const fallback =\r\n placeholder.default !== undefined\r\n ? placeholder.default\r\n : placeholder.optional\r\n ? undefined\r\n : undefined;\r\n\r\n console.warn(\r\n `Infisical fetcher unavailable; returning ${fallback === undefined ? \"undefined\" : \"default\"} for ${placeholder.path}:${placeholder.key}.`\r\n );\r\n if (fallback === undefined && !placeholder.optional) {\r\n options.onMissingSecret?.(placeholder, \"infisical\");\r\n }\r\n\r\n return fallback;\r\n }\r\n\r\n if (!environment) {\r\n throw new Error(\r\n `Infisical secret '${placeholder.path}:${placeholder.key}' is missing an environment. ` +\r\n \"Set it on the placeholder, pass SecretResolverOptions.infisical.environment, or define INFISICAL_ENVIRONMENT.\"\r\n );\r\n }\r\n\r\n if (!projectId) {\r\n throw new Error(\r\n `Infisical secret '${placeholder.path}:${placeholder.key}' is missing a project id. ` +\r\n \"Set it on the placeholder, pass SecretResolverOptions.infisical.projectId, define INFISICAL_PROJECT_ID, \" +\r\n \"or provide /run/secrets/infisical_project_id (also /var/lib/uns/secrets/infisical_project_id).\"\r\n );\r\n }\r\n\r\n if (cached) {\r\n return cached ?? undefined;\r\n }\r\n\r\n const fetchPromise = fetcher({\r\n path: placeholder.path,\r\n key: placeholder.key,\r\n environment,\r\n projectId,\r\n type,\r\n }).then(secret => {\r\n if (secret === undefined || secret === null) {\r\n if (placeholder.default !== undefined) {\r\n return placeholder.default;\r\n }\r\n if (placeholder.optional) {\r\n return undefined;\r\n }\r\n options.onMissingSecret?.(placeholder, \"infisical\");\r\n throw new Error(\r\n `Secret '${placeholder.path}:${placeholder.key}' not found in Infisical.`\r\n );\r\n }\r\n return secret;\r\n }).catch(error => {\r\n if (cached) {\r\n console.warn(\r\n `Infisical fetch failed (${error instanceof Error ? error.message : String(error)}); using cached secret for ${placeholder.path}:${placeholder.key}.`\r\n );\r\n return cached;\r\n }\r\n\r\n const fallback =\r\n placeholder.default !== undefined\r\n ? placeholder.default\r\n : placeholder.optional\r\n ? undefined\r\n : undefined;\r\n\r\n console.warn(\r\n `Infisical fetch failed (${error instanceof Error ? error.message : String(error)}); returning ${fallback === undefined ? \"undefined\" : \"default\"} for ${placeholder.path}:${placeholder.key}.`\r\n );\r\n\r\n if (fallback === undefined && !placeholder.optional) {\r\n options.onMissingSecret?.(placeholder, \"infisical\");\r\n throw new Error(\r\n `Failed to fetch Infisical secret ${placeholder.path}:${placeholder.key}: ${\r\n error instanceof Error ? error.message : String(error)\r\n }`\r\n );\r\n }\r\n\r\n return fallback;\r\n });\r\n\r\n const guardedPromise = fetchPromise.then(\r\n value => value,\r\n error => {\r\n if (useCache) {\r\n infisicalCache.delete(cacheKey);\r\n }\r\n throw error;\r\n }\r\n );\r\n\r\n if (useCache) {\r\n infisicalCache.set(cacheKey, guardedPromise);\r\n }\r\n\r\n return guardedPromise;\r\n}\r\n\r\nasync function getInfisicalFetcher(\r\n options?: InfisicalResolverOptions\r\n): Promise<InfisicalFetcher | undefined> {\r\n const effectiveOptions = options ?? {};\r\n\r\n if (effectiveOptions.fetchSecret) {\r\n return effectiveOptions.fetchSecret;\r\n }\r\n\r\n const token = await resolveInfisicalToken(effectiveOptions);\r\n\r\n if (!token) {\r\n return undefined;\r\n }\r\n\r\n const siteUrl = await resolveInfisicalSiteUrl(effectiveOptions);\r\n const cacheKey = `${token}::${siteUrl ?? \"\"}`;\r\n\r\n if (!defaultInfisicalFetcherCache.has(cacheKey)) {\r\n defaultInfisicalFetcherCache.set(\r\n cacheKey,\r\n createDefaultInfisicalFetcher(token, siteUrl)\r\n );\r\n }\r\n\r\n const baseFetcher = await defaultInfisicalFetcherCache.get(cacheKey)!;\r\n return baseFetcher;\r\n}\r\n\r\nconst defaultInfisicalFetcherCache = new Map<string, Promise<InfisicalFetcher>>();\r\n\r\nasync function createDefaultInfisicalFetcher(\r\n token: string,\r\n siteUrl?: string\r\n): Promise<InfisicalFetcher> {\r\n try {\r\n const sdkModule = await import(\"@infisical/sdk\");\r\n const { InfisicalSDK, SecretType } = sdkModule;\r\n if (!InfisicalSDK) {\r\n throw new Error(\"@infisical/sdk does not export InfisicalSDK\");\r\n }\r\n\r\n const sdkInstance = new InfisicalSDK({ siteUrl: siteUrl ?? \"\" });\r\n const authenticatedSdk = sdkInstance.auth().accessToken(token);\r\n\r\n return async ({ path, key, environment, projectId, type = \"shared\" }: InfisicalFetchRequest) => {\r\n if (!environment) {\r\n throw new Error(\r\n `Infisical secret '${path}:${key}' is missing an environment.`\r\n );\r\n }\r\n if (!projectId) {\r\n throw new Error(\r\n `Infisical secret '${path}:${key}' is missing a project id.`\r\n );\r\n }\r\n\r\n const secret = await authenticatedSdk\r\n .secrets()\r\n .getSecret({\r\n secretName: key,\r\n secretPath: path,\r\n environment,\r\n projectId,\r\n viewSecretValue: true,\r\n type: type === \"personal\" ? SecretType.Personal : SecretType.Shared,\r\n });\r\n\r\n return secret?.secretValue ?? undefined;\r\n };\r\n } catch (error) {\r\n throw new Error(\r\n \"Failed to initialize @infisical/sdk. Install the package or provide SecretResolverOptions.infisical.fetchSecret.\",\r\n { cause: error as Error }\r\n );\r\n }\r\n}\r\n"]}