@antseed/cli 0.1.132 → 0.1.134
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -1
- package/dist/cli/commands/buyer/channel-withdraw.d.ts +7 -0
- package/dist/cli/commands/buyer/channel-withdraw.d.ts.map +1 -0
- package/dist/cli/commands/buyer/channel-withdraw.js +178 -0
- package/dist/cli/commands/buyer/channel-withdraw.js.map +1 -0
- package/dist/cli/commands/buyer/channel-withdraw.test.d.ts +2 -0
- package/dist/cli/commands/buyer/channel-withdraw.test.d.ts.map +1 -0
- package/dist/cli/commands/buyer/channel-withdraw.test.js +45 -0
- package/dist/cli/commands/buyer/channel-withdraw.test.js.map +1 -0
- package/dist/cli/commands/buyer/channels.d.ts.map +1 -1
- package/dist/cli/commands/buyer/channels.js +60 -52
- package/dist/cli/commands/buyer/channels.js.map +1 -1
- package/dist/cli/commands/buyer/emissions.d.ts +3 -0
- package/dist/cli/commands/buyer/emissions.d.ts.map +1 -0
- package/dist/cli/commands/buyer/emissions.js +5 -0
- package/dist/cli/commands/buyer/emissions.js.map +1 -0
- package/dist/cli/commands/buyer/index.d.ts.map +1 -1
- package/dist/cli/commands/buyer/index.js +4 -0
- package/dist/cli/commands/buyer/index.js.map +1 -1
- package/dist/cli/commands/buyer/start.d.ts +1 -0
- package/dist/cli/commands/buyer/start.d.ts.map +1 -1
- package/dist/cli/commands/buyer/start.js +16 -0
- package/dist/cli/commands/buyer/start.js.map +1 -1
- package/dist/cli/commands/buyer/start.test.js +2 -0
- package/dist/cli/commands/buyer/start.test.js.map +1 -1
- package/dist/cli/commands/buyer/sweep.d.ts +3 -0
- package/dist/cli/commands/buyer/sweep.d.ts.map +1 -0
- package/dist/cli/commands/buyer/sweep.js +332 -0
- package/dist/cli/commands/buyer/sweep.js.map +1 -0
- package/dist/cli/commands/buyer/sweep.test.d.ts +2 -0
- package/dist/cli/commands/buyer/sweep.test.d.ts.map +1 -0
- package/dist/cli/commands/buyer/sweep.test.js +46 -0
- package/dist/cli/commands/buyer/sweep.test.js.map +1 -0
- package/dist/cli/commands/emissions.d.ts +10 -0
- package/dist/cli/commands/emissions.d.ts.map +1 -0
- package/dist/cli/commands/emissions.js +91 -0
- package/dist/cli/commands/emissions.js.map +1 -0
- package/dist/cli/commands/emissions.test.d.ts +2 -0
- package/dist/cli/commands/emissions.test.d.ts.map +1 -0
- package/dist/cli/commands/emissions.test.js +16 -0
- package/dist/cli/commands/emissions.test.js.map +1 -0
- package/dist/cli/commands/seller/emissions.d.ts.map +1 -1
- package/dist/cli/commands/seller/emissions.js +2 -77
- package/dist/cli/commands/seller/emissions.js.map +1 -1
- package/dist/cli/commands/seller/start.d.ts.map +1 -1
- package/dist/cli/commands/seller/start.js +5 -0
- package/dist/cli/commands/seller/start.js.map +1 -1
- package/dist/cli/commands/system-proxy/index.d.ts +3 -0
- package/dist/cli/commands/system-proxy/index.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/index.js +14 -0
- package/dist/cli/commands/system-proxy/index.js.map +1 -0
- package/dist/cli/commands/system-proxy/install-ca.d.ts +3 -0
- package/dist/cli/commands/system-proxy/install-ca.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/install-ca.js +43 -0
- package/dist/cli/commands/system-proxy/install-ca.js.map +1 -0
- package/dist/cli/commands/system-proxy/start.d.ts +3 -0
- package/dist/cli/commands/system-proxy/start.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/start.js +151 -0
- package/dist/cli/commands/system-proxy/start.js.map +1 -0
- package/dist/cli/commands/system-proxy/status.d.ts +3 -0
- package/dist/cli/commands/system-proxy/status.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/status.js +60 -0
- package/dist/cli/commands/system-proxy/status.js.map +1 -0
- package/dist/cli/commands/system-proxy/stop.d.ts +3 -0
- package/dist/cli/commands/system-proxy/stop.d.ts.map +1 -0
- package/dist/cli/commands/system-proxy/stop.js +71 -0
- package/dist/cli/commands/system-proxy/stop.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/payment-utils.d.ts +7 -1
- package/dist/cli/payment-utils.d.ts.map +1 -1
- package/dist/cli/payment-utils.js +20 -1
- package/dist/cli/payment-utils.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +5 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/effective.d.ts +1 -0
- package/dist/config/effective.d.ts.map +1 -1
- package/dist/config/effective.js +18 -0
- package/dist/config/effective.js.map +1 -1
- package/dist/config/effective.test.js +10 -0
- package/dist/config/effective.test.js.map +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +9 -0
- package/dist/config/loader.js.map +1 -1
- package/dist/config/loader.test.js +31 -0
- package/dist/config/loader.test.js.map +1 -1
- package/dist/config/types.d.ts +20 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/validation.d.ts.map +1 -1
- package/dist/config/validation.js +17 -0
- package/dist/config/validation.js.map +1 -1
- package/dist/proxy/buyer-proxy.d.ts +2 -0
- package/dist/proxy/buyer-proxy.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.js +89 -16
- package/dist/proxy/buyer-proxy.js.map +1 -1
- package/dist/proxy/buyer-proxy.test.js +190 -1
- package/dist/proxy/buyer-proxy.test.js.map +1 -1
- package/dist/proxy/request-utils.d.ts +1 -1
- package/dist/proxy/request-utils.d.ts.map +1 -1
- package/dist/proxy/request-utils.js +9 -3
- package/dist/proxy/request-utils.js.map +1 -1
- package/dist/proxy/service-api-adapter.d.ts +2 -2
- package/dist/proxy/service-api-adapter.d.ts.map +1 -1
- package/dist/proxy/service-api-adapter.js +1 -1
- package/dist/proxy/service-api-adapter.js.map +1 -1
- package/dist/proxy/service-api-adapter.test.js +21 -12
- package/dist/proxy/service-api-adapter.test.js.map +1 -1
- package/dist/system-proxy/ca-manager.d.ts +21 -0
- package/dist/system-proxy/ca-manager.d.ts.map +1 -0
- package/dist/system-proxy/ca-manager.js +112 -0
- package/dist/system-proxy/ca-manager.js.map +1 -0
- package/dist/system-proxy/ca-manager.test.d.ts +2 -0
- package/dist/system-proxy/ca-manager.test.d.ts.map +1 -0
- package/dist/system-proxy/ca-manager.test.js +64 -0
- package/dist/system-proxy/ca-manager.test.js.map +1 -0
- package/dist/system-proxy/cert-cache.d.ts +16 -0
- package/dist/system-proxy/cert-cache.d.ts.map +1 -0
- package/dist/system-proxy/cert-cache.js +69 -0
- package/dist/system-proxy/cert-cache.js.map +1 -0
- package/dist/system-proxy/cert-cache.test.d.ts +2 -0
- package/dist/system-proxy/cert-cache.test.d.ts.map +1 -0
- package/dist/system-proxy/cert-cache.test.js +52 -0
- package/dist/system-proxy/cert-cache.test.js.map +1 -0
- package/dist/system-proxy/index.d.ts +11 -0
- package/dist/system-proxy/index.d.ts.map +1 -0
- package/dist/system-proxy/index.js +7 -0
- package/dist/system-proxy/index.js.map +1 -0
- package/dist/system-proxy/node-hook.d.ts +3 -0
- package/dist/system-proxy/node-hook.d.ts.map +1 -0
- package/dist/system-proxy/node-hook.js +27 -0
- package/dist/system-proxy/node-hook.js.map +1 -0
- package/dist/system-proxy/profiles.d.ts +13 -0
- package/dist/system-proxy/profiles.d.ts.map +1 -0
- package/dist/system-proxy/profiles.js +150 -0
- package/dist/system-proxy/profiles.js.map +1 -0
- package/dist/system-proxy/profiles.test.d.ts +2 -0
- package/dist/system-proxy/profiles.test.d.ts.map +1 -0
- package/dist/system-proxy/profiles.test.js +66 -0
- package/dist/system-proxy/profiles.test.js.map +1 -0
- package/dist/system-proxy/proxy-server.d.ts +98 -0
- package/dist/system-proxy/proxy-server.d.ts.map +1 -0
- package/dist/system-proxy/proxy-server.js +977 -0
- package/dist/system-proxy/proxy-server.js.map +1 -0
- package/dist/system-proxy/proxy-server.test.d.ts +2 -0
- package/dist/system-proxy/proxy-server.test.d.ts.map +1 -0
- package/dist/system-proxy/proxy-server.test.js +778 -0
- package/dist/system-proxy/proxy-server.test.js.map +1 -0
- package/dist/system-proxy/system-proxy.d.ts +25 -0
- package/dist/system-proxy/system-proxy.d.ts.map +1 -0
- package/dist/system-proxy/system-proxy.js +152 -0
- package/dist/system-proxy/system-proxy.js.map +1 -0
- package/dist/system-proxy/types.d.ts +69 -0
- package/dist/system-proxy/types.d.ts.map +1 -0
- package/dist/system-proxy/types.js +2 -0
- package/dist/system-proxy/types.js.map +1 -0
- package/package.json +8 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-api-adapter.test.js","sourceRoot":"","sources":["../../src/proxy/service-api-adapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"service-api-adapter.test.js","sourceRoot":"","sources":["../../src/proxy/service-api-adapter.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,0BAA0B,CAAA;AAGjC,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAA;AAC7B,MAAM,GAAG,GAAG,IAAI,WAAW,EAAE,CAAA;AAE7B,SAAS,WAAW,CAAC,IAAa,EAAE,IAAI,GAAG,cAAc;IACvD,OAAO;QACL,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,MAAM;QACd,IAAI;QACJ,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE;QAClF,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KACvC,CAAA;AACH,CAAC;AAED,SAAS,wBAAwB,CAAC,OAA8B;IAC9D,OAAO,gBAAgB,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,oBAAoB,EAAE,EAAE,EAAE,yBAAyB,EAAE,CAAC,CAAA;AACjG,CAAC;AAED,SAAS,oBAAoB,CAC3B,IAAwB,EACxB,EAAsB,EACtB,QAAgC,EAChC,UAAwE,EAAE;IAE1E,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAA;IACzE,MAAM,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,CAAA;IAClC,OAAO,WAAY,CAAA;AACrB,CAAC;AAED,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IAClD,MAAM,MAAM,GAAG,wBAAwB,CACrC,WAAW,CAAC,EAAE,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CACrH,CAAA;IACD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAA6C,CAAA;IACrG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAClD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACrE,uEAAuE;IACvE,MAAM,MAAM,GAAG,wBAAwB,CACrC,WAAW,CAAC;QACV,KAAK,EAAE,2BAA2B;QAClC,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;SACpE;QACD,UAAU,EAAE,GAAG;KAChB,CAAC,CACH,CAAA;IACD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAA2D,CAAA;IACnH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;IAC5D,MAAM,CAAC,KAAK,CAAC,OAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IAC9C,MAAM,CAAC,QAAQ,CAAC,OAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;AACtD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;IAC1E,MAAM,MAAM,GAAG,wBAAwB,CACrC,WAAW,CAAC;QACV,KAAK,EAAE,2BAA2B;QAClC,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;oBAClC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE;iBACnC;aACF;SACF;QACD,UAAU,EAAE,GAAG;KAChB,CAAC,CACH,CAAA;IACD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAA2D,CAAA;IACnH,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAA;IAC5D,MAAM,CAAC,KAAK,CAAC,OAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAA;IACpD,MAAM,CAAC,KAAK,CAAC,OAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,CAAA;AACnE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;IAC/E,MAAM,MAAM,GAAG,wBAAwB,CACrC,WAAW,CAAC;QACV,KAAK,EAAE,2BAA2B;QAClC,QAAQ,EAAE;YACR,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE;YAC/B,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;YACxE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE;SAClC;QACD,UAAU,EAAE,GAAG;KAChB,CAAC,CACH,CAAA;IACD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAA2D,CAAA;IACnH,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAA;IACtE,MAAM,CAAC,KAAK,CAAC,YAAa,CAAC,OAAO,EAAE,cAAc,CAAC,CAAA;IACnD,MAAM,CAAC,QAAQ,CAAC,YAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;AAC3D,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAC5C,MAAM,MAAM,GAAG,wBAAwB,CACrC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAC7E,CAAA;IACD,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC7B,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,SAAS,CAAC,CAAA;AACvE,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACjD,MAAM,MAAM,GAAG,wBAAwB,CACrC,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAC7E,CAAA;IACD,MAAM,CAAC,KAAK,CAAC,MAAO,CAAC,OAAO,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAA;AAC5D,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACnD,MAAM,GAAG,GAAG,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,cAAc,CAAC,CAAA;IACzD,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IAC1B,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;AACnD,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,sDAAsD,EAAE,GAAG,EAAE;IAChE,MAAM,OAAO,GAAG;QACd,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QACvF,KAAK,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE;KACnD,CAAA;IACD,MAAM,IAAI,GAA2B;QACnC,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;KAC1C,CAAA;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,yBAAyB,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAA;IACtH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAG9C,CAAA;IACD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAClC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC3C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;AAC/C,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAC9C,MAAM,OAAO,GAAG;QACd,EAAE,EAAE,GAAG;QACP,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC;QACnF,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE;KAClD,CAAA;IACD,MAAM,IAAI,GAA2B;QACnC,SAAS,EAAE,IAAI;QACf,UAAU,EAAE,GAAG;QACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;KAC1C,CAAA;IACD,MAAM,MAAM,GAAG,oBAAoB,CAAC,yBAAyB,EAAE,oBAAoB,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,CAAA;IACtH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAA4B,CAAA;IAC3E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;AAC5C,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface CAKeys {
|
|
3
|
+
certPem: string;
|
|
4
|
+
privateKeyPem: string;
|
|
5
|
+
}
|
|
6
|
+
export interface CAInstallResult {
|
|
7
|
+
target: 'system-keychain' | 'login-keychain' | 'windows-root' | 'linux-system';
|
|
8
|
+
warning?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare class CAManager {
|
|
11
|
+
private readonly dir;
|
|
12
|
+
constructor(dataDir: string);
|
|
13
|
+
private get certPath();
|
|
14
|
+
private get keyPath();
|
|
15
|
+
get certFilePath(): string;
|
|
16
|
+
exists(): Promise<boolean>;
|
|
17
|
+
load(): Promise<CAKeys>;
|
|
18
|
+
generate(): Promise<CAKeys>;
|
|
19
|
+
installToSystemKeychain(): Promise<CAInstallResult>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=ca-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ca-manager.d.ts","sourceRoot":"","sources":["../../src/system-proxy/ca-manager.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAezB,MAAM,WAAW,MAAM;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,iBAAiB,GAAG,gBAAgB,GAAG,cAAc,GAAG,cAAc,CAAA;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAgBD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;gBAEhB,OAAO,EAAE,MAAM;IAI3B,OAAO,KAAK,QAAQ,GAA8C;IAClE,OAAO,KAAK,OAAO,GAA8C;IAEjE,IAAI,YAAY,IAAI,MAAM,CAAyB;IAE7C,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAI1B,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAQvB,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC;IAgC3B,uBAAuB,IAAI,OAAO,CAAC,eAAe,CAAC;CA+C1D"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import * as x509 from '@peculiar/x509';
|
|
3
|
+
import { webcrypto } from 'node:crypto';
|
|
4
|
+
import { readFile, writeFile, mkdir } from 'node:fs/promises';
|
|
5
|
+
import { existsSync } from 'node:fs';
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { execSync, execFileSync } from 'node:child_process';
|
|
8
|
+
import { homedir } from 'node:os';
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
10
|
+
x509.cryptoProvider.set(webcrypto);
|
|
11
|
+
const KEY_ALG = { name: 'ECDSA', namedCurve: 'P-256' };
|
|
12
|
+
const SIGN_ALG = { name: 'ECDSA', hash: 'SHA-256' };
|
|
13
|
+
function pemEncode(label, der) {
|
|
14
|
+
const b64 = Buffer.from(der).toString('base64');
|
|
15
|
+
const lines = b64.match(/.{1,64}/g) ?? [];
|
|
16
|
+
return `-----BEGIN ${label}-----\n${lines.join('\n')}\n-----END ${label}-----\n`;
|
|
17
|
+
}
|
|
18
|
+
function shellQuote(value) {
|
|
19
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
20
|
+
}
|
|
21
|
+
function errorMessage(err) {
|
|
22
|
+
return err instanceof Error ? err.message : String(err);
|
|
23
|
+
}
|
|
24
|
+
export class CAManager {
|
|
25
|
+
dir;
|
|
26
|
+
constructor(dataDir) {
|
|
27
|
+
this.dir = join(dataDir, 'system-proxy');
|
|
28
|
+
}
|
|
29
|
+
get certPath() { return join(this.dir, 'ca.crt'); }
|
|
30
|
+
get keyPath() { return join(this.dir, 'ca.key'); }
|
|
31
|
+
get certFilePath() { return this.certPath; }
|
|
32
|
+
async exists() {
|
|
33
|
+
return existsSync(this.certPath) && existsSync(this.keyPath);
|
|
34
|
+
}
|
|
35
|
+
async load() {
|
|
36
|
+
const [certPem, privateKeyPem] = await Promise.all([
|
|
37
|
+
readFile(this.certPath, 'utf8'),
|
|
38
|
+
readFile(this.keyPath, 'utf8'),
|
|
39
|
+
]);
|
|
40
|
+
return { certPem, privateKeyPem };
|
|
41
|
+
}
|
|
42
|
+
async generate() {
|
|
43
|
+
await mkdir(this.dir, { recursive: true });
|
|
44
|
+
const keyPair = await webcrypto.subtle.generateKey(KEY_ALG, true, ['sign', 'verify']);
|
|
45
|
+
const cert = await x509.X509CertificateGenerator.createSelfSigned({
|
|
46
|
+
serialNumber: '01',
|
|
47
|
+
name: 'CN=AntSeed Local CA, O=AntSeed',
|
|
48
|
+
notBefore: new Date(),
|
|
49
|
+
notAfter: new Date(Date.now() + 10 * 365 * 24 * 60 * 60 * 1000),
|
|
50
|
+
signingAlgorithm: SIGN_ALG,
|
|
51
|
+
keys: keyPair,
|
|
52
|
+
extensions: [
|
|
53
|
+
new x509.BasicConstraintsExtension(true, undefined, true),
|
|
54
|
+
new x509.KeyUsagesExtension(x509.KeyUsageFlags.keyCertSign | x509.KeyUsageFlags.cRLSign, true),
|
|
55
|
+
await x509.SubjectKeyIdentifierExtension.create(keyPair.publicKey),
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
const certPem = cert.toString('pem');
|
|
59
|
+
const keyDer = await webcrypto.subtle.exportKey('pkcs8', keyPair.privateKey);
|
|
60
|
+
const privateKeyPem = pemEncode('PRIVATE KEY', keyDer);
|
|
61
|
+
await writeFile(this.certPath, certPem, 'utf8');
|
|
62
|
+
await writeFile(this.keyPath, privateKeyPem, { encoding: 'utf8', mode: 0o600 });
|
|
63
|
+
return { certPem, privateKeyPem };
|
|
64
|
+
}
|
|
65
|
+
async installToSystemKeychain() {
|
|
66
|
+
const platform = process.platform;
|
|
67
|
+
if (platform === 'darwin') {
|
|
68
|
+
const systemCommand = `security add-trusted-cert -d -r trustRoot -p ssl -k ${shellQuote('/Library/Keychains/System.keychain')} ${shellQuote(this.certPath)}`;
|
|
69
|
+
try {
|
|
70
|
+
execSync(systemCommand, { stdio: 'pipe' });
|
|
71
|
+
return { target: 'system-keychain' };
|
|
72
|
+
}
|
|
73
|
+
catch (systemErr) {
|
|
74
|
+
try {
|
|
75
|
+
execSync(`osascript -e ${shellQuote(`do shell script ${JSON.stringify(systemCommand)} with administrator privileges`)}`, { stdio: 'pipe' });
|
|
76
|
+
return { target: 'system-keychain' };
|
|
77
|
+
}
|
|
78
|
+
catch (adminErr) {
|
|
79
|
+
const keychainPath = join(homedir(), 'Library', 'Keychains', 'login.keychain-db');
|
|
80
|
+
try {
|
|
81
|
+
execSync(`security add-trusted-cert -d -r trustRoot -p ssl -k ${shellQuote(keychainPath)} ${shellQuote(this.certPath)}`, { stdio: 'pipe' });
|
|
82
|
+
return {
|
|
83
|
+
target: 'login-keychain',
|
|
84
|
+
warning: [
|
|
85
|
+
'CA certificate was trusted in the login keychain only.',
|
|
86
|
+
'Some GUI apps may require System keychain trust and a restart.',
|
|
87
|
+
`System keychain install failed: ${errorMessage(adminErr)}`,
|
|
88
|
+
].join(' '),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
catch (loginErr) {
|
|
92
|
+
throw new Error([
|
|
93
|
+
`System keychain install failed: ${errorMessage(systemErr)}`,
|
|
94
|
+
`Admin install failed: ${errorMessage(adminErr)}`,
|
|
95
|
+
`Login keychain install failed: ${errorMessage(loginErr)}`,
|
|
96
|
+
].join(' '));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else if (platform === 'win32') {
|
|
102
|
+
execFileSync('certutil', ['-addstore', '-f', 'Root', this.certPath], { stdio: 'pipe' });
|
|
103
|
+
return { target: 'windows-root' };
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
execFileSync('sudo', ['cp', this.certPath, '/usr/local/share/ca-certificates/antseed-ca.crt'], { stdio: 'pipe' });
|
|
107
|
+
execFileSync('sudo', ['update-ca-certificates'], { stdio: 'pipe' });
|
|
108
|
+
return { target: 'linux-system' };
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=ca-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ca-manager.js","sourceRoot":"","sources":["../../src/system-proxy/ca-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ca-manager.test.d.ts","sourceRoot":"","sources":["../../src/system-proxy/ca-manager.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
import { CAManager } from './ca-manager.js';
|
|
7
|
+
test('CAManager.exists() returns false before generation', async () => {
|
|
8
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'antseed-ca-test-'));
|
|
9
|
+
try {
|
|
10
|
+
const mgr = new CAManager(tmpDir);
|
|
11
|
+
assert.equal(await mgr.exists(), false);
|
|
12
|
+
}
|
|
13
|
+
finally {
|
|
14
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
test('CAManager.generate() creates cert and key files', async () => {
|
|
18
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'antseed-ca-test-'));
|
|
19
|
+
try {
|
|
20
|
+
const mgr = new CAManager(tmpDir);
|
|
21
|
+
const keys = await mgr.generate();
|
|
22
|
+
assert.ok(keys.certPem.includes('BEGIN CERTIFICATE'), 'cert should be PEM');
|
|
23
|
+
assert.ok(keys.privateKeyPem.includes('BEGIN PRIVATE KEY'), 'key should be PKCS8 PEM');
|
|
24
|
+
assert.equal(await mgr.exists(), true);
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
test('CAManager.load() returns the same PEM that was generated', async () => {
|
|
31
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'antseed-ca-test-'));
|
|
32
|
+
try {
|
|
33
|
+
const mgr = new CAManager(tmpDir);
|
|
34
|
+
const generated = await mgr.generate();
|
|
35
|
+
const loaded = await mgr.load();
|
|
36
|
+
assert.equal(loaded.certPem, generated.certPem);
|
|
37
|
+
assert.equal(loaded.privateKeyPem, generated.privateKeyPem);
|
|
38
|
+
}
|
|
39
|
+
finally {
|
|
40
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
test('CAManager.certFilePath points into the system-proxy subdirectory', () => {
|
|
44
|
+
const mgr = new CAManager('/some/data/dir');
|
|
45
|
+
assert.ok(mgr.certFilePath.includes('system-proxy'), 'cert path should be under system-proxy/');
|
|
46
|
+
assert.ok(mgr.certFilePath.endsWith('.crt'), 'cert file should have .crt extension');
|
|
47
|
+
});
|
|
48
|
+
test('CAManager.generate() is idempotent — second call overwrites cleanly', async () => {
|
|
49
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'antseed-ca-test-'));
|
|
50
|
+
try {
|
|
51
|
+
const mgr = new CAManager(tmpDir);
|
|
52
|
+
const first = await mgr.generate();
|
|
53
|
+
const second = await mgr.generate();
|
|
54
|
+
// Both should be valid PEMs; they won't be identical (fresh keys each time)
|
|
55
|
+
assert.ok(second.certPem.includes('BEGIN CERTIFICATE'));
|
|
56
|
+
assert.ok(second.privateKeyPem.includes('BEGIN PRIVATE KEY'));
|
|
57
|
+
// Different runs produce different keys
|
|
58
|
+
assert.notEqual(first.certPem, second.certPem);
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=ca-manager.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ca-manager.test.js","sourceRoot":"","sources":["../../src/system-proxy/ca-manager.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAA;AACvC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,IAAI,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;IACpE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAChE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAA;IACzC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;IACjE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAChE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;QACjC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,oBAAoB,CAAC,CAAA;QAC3E,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,yBAAyB,CAAC,CAAA;QACtF,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;IACxC,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0DAA0D,EAAE,KAAK,IAAI,EAAE;IAC1E,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAChE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;QAC/C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,aAAa,CAAC,CAAA;IAC7D,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,kEAAkE,EAAE,GAAG,EAAE;IAC5E,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,gBAAgB,CAAC,CAAA;IAC3C,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,yCAAyC,CAAC,CAAA;IAC/F,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,sCAAsC,CAAC,CAAA;AACtF,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,qEAAqE,EAAE,KAAK,IAAI,EAAE;IACrF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAChE,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;QAClC,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAA;QACnC,4EAA4E;QAC5E,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAA;QACvD,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAC7D,wCAAwC;QACxC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;IAChD,CAAC;YAAS,CAAC;QACT,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IACpD,CAAC;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface LeafCert {
|
|
3
|
+
certPem: string;
|
|
4
|
+
privateKeyPem: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class CertCache {
|
|
7
|
+
private readonly cache;
|
|
8
|
+
private readonly caKeys;
|
|
9
|
+
constructor(caKeys: {
|
|
10
|
+
certPem: string;
|
|
11
|
+
privateKeyPem: string;
|
|
12
|
+
});
|
|
13
|
+
get(hostname: string): Promise<LeafCert>;
|
|
14
|
+
private generate;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=cert-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cert-cache.d.ts","sourceRoot":"","sources":["../../src/system-proxy/cert-cache.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAA;AAUzB,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,aAAa,EAAE,MAAM,CAAA;CACtB;AAcD,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA8B;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4C;gBAEvD,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE;IAIxD,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;YAkBhC,QAAQ;CAqCvB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import * as x509 from '@peculiar/x509';
|
|
3
|
+
import { webcrypto, randomBytes } from 'node:crypto';
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
x509.cryptoProvider.set(webcrypto);
|
|
6
|
+
const KEY_ALG = { name: 'ECDSA', namedCurve: 'P-256' };
|
|
7
|
+
const SIGN_ALG = { name: 'ECDSA', hash: 'SHA-256' };
|
|
8
|
+
function pemEncode(label, der) {
|
|
9
|
+
const b64 = Buffer.from(der).toString('base64');
|
|
10
|
+
const lines = b64.match(/.{1,64}/g) ?? [];
|
|
11
|
+
return `-----BEGIN ${label}-----\n${lines.join('\n')}\n-----END ${label}-----\n`;
|
|
12
|
+
}
|
|
13
|
+
function pemDecode(pem) {
|
|
14
|
+
return Buffer.from(pem.replace(/-----[^-]+-----/g, '').replace(/\s/g, ''), 'base64');
|
|
15
|
+
}
|
|
16
|
+
const MAX_CACHED_CERTS = 200;
|
|
17
|
+
export class CertCache {
|
|
18
|
+
cache = new Map();
|
|
19
|
+
caKeys;
|
|
20
|
+
constructor(caKeys) {
|
|
21
|
+
this.caKeys = caKeys;
|
|
22
|
+
}
|
|
23
|
+
async get(hostname) {
|
|
24
|
+
const cached = this.cache.get(hostname);
|
|
25
|
+
if (cached) {
|
|
26
|
+
// Move to end for LRU ordering
|
|
27
|
+
this.cache.delete(hostname);
|
|
28
|
+
this.cache.set(hostname, cached);
|
|
29
|
+
return cached;
|
|
30
|
+
}
|
|
31
|
+
const leaf = await this.generate(hostname);
|
|
32
|
+
this.cache.set(hostname, leaf);
|
|
33
|
+
// Evict oldest entry if over cap
|
|
34
|
+
if (this.cache.size > MAX_CACHED_CERTS) {
|
|
35
|
+
const oldest = this.cache.keys().next().value;
|
|
36
|
+
if (oldest !== undefined)
|
|
37
|
+
this.cache.delete(oldest);
|
|
38
|
+
}
|
|
39
|
+
return leaf;
|
|
40
|
+
}
|
|
41
|
+
async generate(hostname) {
|
|
42
|
+
const caCert = new x509.X509Certificate(this.caKeys.certPem);
|
|
43
|
+
const caPrivateKey = await webcrypto.subtle.importKey('pkcs8', pemDecode(this.caKeys.privateKeyPem), KEY_ALG, false, ['sign']);
|
|
44
|
+
const leafKeys = await webcrypto.subtle.generateKey(KEY_ALG, true, ['sign', 'verify']);
|
|
45
|
+
const serialNum = BigInt(Date.now()).toString(16).padStart(12, '0') + randomBytes(4).toString('hex');
|
|
46
|
+
const cert = await x509.X509CertificateGenerator.create({
|
|
47
|
+
serialNumber: serialNum,
|
|
48
|
+
issuer: caCert.subject,
|
|
49
|
+
subject: `CN=${hostname}`,
|
|
50
|
+
notBefore: new Date(),
|
|
51
|
+
notAfter: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000),
|
|
52
|
+
signingAlgorithm: SIGN_ALG,
|
|
53
|
+
publicKey: leafKeys.publicKey,
|
|
54
|
+
signingKey: caPrivateKey,
|
|
55
|
+
extensions: [
|
|
56
|
+
new x509.BasicConstraintsExtension(false),
|
|
57
|
+
new x509.KeyUsagesExtension(x509.KeyUsageFlags.digitalSignature),
|
|
58
|
+
new x509.ExtendedKeyUsageExtension(['1.3.6.1.5.5.7.3.1']),
|
|
59
|
+
new x509.SubjectAlternativeNameExtension([{ type: 'dns', value: hostname }]),
|
|
60
|
+
await x509.SubjectKeyIdentifierExtension.create(leafKeys.publicKey),
|
|
61
|
+
],
|
|
62
|
+
});
|
|
63
|
+
const certPem = cert.toString('pem');
|
|
64
|
+
const keyDer = await webcrypto.subtle.exportKey('pkcs8', leafKeys.privateKey);
|
|
65
|
+
const privateKeyPem = pemEncode('PRIVATE KEY', keyDer);
|
|
66
|
+
return { certPem, privateKeyPem };
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=cert-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cert-cache.js","sourceRoot":"","sources":["../../src/system-proxy/cert-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cert-cache.test.d.ts","sourceRoot":"","sources":["../../src/system-proxy/cert-cache.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import test from 'node:test';
|
|
6
|
+
import { CAManager } from './ca-manager.js';
|
|
7
|
+
import { CertCache } from './cert-cache.js';
|
|
8
|
+
async function makeCA(tmpDir) {
|
|
9
|
+
const mgr = new CAManager(tmpDir);
|
|
10
|
+
return { mgr, keys: await mgr.generate() };
|
|
11
|
+
}
|
|
12
|
+
test('CertCache.get() returns PEM cert and key for a hostname', async () => {
|
|
13
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'antseed-cert-test-'));
|
|
14
|
+
try {
|
|
15
|
+
const { keys } = await makeCA(tmpDir);
|
|
16
|
+
const cache = new CertCache(keys);
|
|
17
|
+
const leaf = await cache.get('api-a.example.test');
|
|
18
|
+
assert.ok(leaf.certPem.includes('BEGIN CERTIFICATE'), 'should be PEM cert');
|
|
19
|
+
assert.ok(leaf.privateKeyPem.includes('BEGIN PRIVATE KEY'), 'should be PKCS8 PEM key');
|
|
20
|
+
}
|
|
21
|
+
finally {
|
|
22
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
test('CertCache.get() returns the same cert on repeated calls (cached)', async () => {
|
|
26
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'antseed-cert-test-'));
|
|
27
|
+
try {
|
|
28
|
+
const { keys } = await makeCA(tmpDir);
|
|
29
|
+
const cache = new CertCache(keys);
|
|
30
|
+
const first = await cache.get('api-b.example.test');
|
|
31
|
+
const second = await cache.get('api-b.example.test');
|
|
32
|
+
assert.equal(first.certPem, second.certPem, 'cached cert should be identical');
|
|
33
|
+
assert.equal(first.privateKeyPem, second.privateKeyPem, 'cached key should be identical');
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
test('CertCache.get() generates different certs for different hostnames', async () => {
|
|
40
|
+
const tmpDir = await mkdtemp(join(tmpdir(), 'antseed-cert-test-'));
|
|
41
|
+
try {
|
|
42
|
+
const { keys } = await makeCA(tmpDir);
|
|
43
|
+
const cache = new CertCache(keys);
|
|
44
|
+
const apiA = await cache.get('api-a.example.test');
|
|
45
|
+
const apiB = await cache.get('api-b.example.test');
|
|
46
|
+
assert.notEqual(apiA.certPem, apiB.certPem, 'different hostnames should get different certs');
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await rm(tmpDir, { recursive: true, force: true });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=cert-cache.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cert-cache.test.js","sourceRoot":"","sources":["../../src/system-proxy/cert-cache.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type { SystemProxyProfile, SystemProxyState } from './types.js';
|
|
2
|
+
export { CONFIGURED_PROFILES, findProfile, resolveProxiedDomains } from './profiles.js';
|
|
3
|
+
export type { CAInstallResult, CAKeys } from './ca-manager.js';
|
|
4
|
+
export { CAManager } from './ca-manager.js';
|
|
5
|
+
export type { LeafCert } from './cert-cache.js';
|
|
6
|
+
export { CertCache } from './cert-cache.js';
|
|
7
|
+
export type { SystemProxyConfig } from './proxy-server.js';
|
|
8
|
+
export { SystemProxyServer } from './proxy-server.js';
|
|
9
|
+
export { setSystemProxy, clearSystemProxy } from './system-proxy.js';
|
|
10
|
+
export { writeNodeProxyHook, hookPath } from './node-hook.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/system-proxy/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AACtE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACvF,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { CONFIGURED_PROFILES, findProfile, resolveProxiedDomains } from './profiles.js';
|
|
2
|
+
export { CAManager } from './ca-manager.js';
|
|
3
|
+
export { CertCache } from './cert-cache.js';
|
|
4
|
+
export { SystemProxyServer } from './proxy-server.js';
|
|
5
|
+
export { setSystemProxy, clearSystemProxy } from './system-proxy.js';
|
|
6
|
+
export { writeNodeProxyHook, hookPath } from './node-hook.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/system-proxy/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AAEvF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-hook.d.ts","sourceRoot":"","sources":["../../src/system-proxy/node-hook.ts"],"names":[],"mappings":"AAGA,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAqBvF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { writeFile, mkdir } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
export function hookPath(dataDir) {
|
|
4
|
+
return join(dataDir, 'system-proxy', 'node-proxy-hook.cjs');
|
|
5
|
+
}
|
|
6
|
+
export async function writeNodeProxyHook(dataDir, port) {
|
|
7
|
+
await mkdir(join(dataDir, 'system-proxy'), { recursive: true });
|
|
8
|
+
const path = hookPath(dataDir);
|
|
9
|
+
const caPath = join(dataDir, 'system-proxy', 'ca.crt').replace(/\\/g, '\\\\');
|
|
10
|
+
// CJS — --require only supports CommonJS
|
|
11
|
+
const content = `'use strict';
|
|
12
|
+
// AntSeed System Proxy hook - auto-generated
|
|
13
|
+
try {
|
|
14
|
+
const { setGlobalDispatcher, ProxyAgent } = require('undici');
|
|
15
|
+
const fs = require('node:fs');
|
|
16
|
+
let ca;
|
|
17
|
+
try { ca = fs.readFileSync(${JSON.stringify(caPath)}); } catch (_) {}
|
|
18
|
+
setGlobalDispatcher(new ProxyAgent({
|
|
19
|
+
uri: 'http://127.0.0.1:${port}',
|
|
20
|
+
connect: ca ? { ca } : undefined,
|
|
21
|
+
}));
|
|
22
|
+
} catch (_) { /* undici unavailable or old Node.js — skip */ }
|
|
23
|
+
`;
|
|
24
|
+
await writeFile(path, content, 'utf8');
|
|
25
|
+
return path;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=node-hook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-hook.js","sourceRoot":"","sources":["../../src/system-proxy/node-hook.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAA;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe,EAAE,IAAY;IACpE,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,cAAc,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;IAE7E,yCAAyC;IACzC,MAAM,OAAO,GAAG;;;;;;+BAMa,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;;6BAExB,IAAI;;;;CAIhC,CAAA;IACC,MAAM,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;IACtC,OAAO,IAAI,CAAA;AACb,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { SystemProxyForwardRule, SystemProxyProfile } from './types.js';
|
|
2
|
+
export declare function loadSystemProxyProfiles(env?: NodeJS.ProcessEnv): readonly SystemProxyProfile[];
|
|
3
|
+
export declare const CONFIGURED_PROFILES: readonly SystemProxyProfile[];
|
|
4
|
+
export declare function findProfile(name: string): SystemProxyProfile | undefined;
|
|
5
|
+
export declare function isConfigPatchProfile(name: string): boolean;
|
|
6
|
+
export declare function partitionProfiles(profileNames: string[]): {
|
|
7
|
+
proxy: string[];
|
|
8
|
+
configPatch: string[];
|
|
9
|
+
};
|
|
10
|
+
export declare function resolveProxiedDomains(profileNames: string[]): Set<string>;
|
|
11
|
+
export declare function resolveProxiedPathPrefixes(profileNames: string[]): Map<string, Set<string>>;
|
|
12
|
+
export declare function resolveSystemProxyForwardRules(profileNames: string[]): Map<string, SystemProxyForwardRule>;
|
|
13
|
+
//# sourceMappingURL=profiles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../../src/system-proxy/profiles.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA0B,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAKpG,wBAAgB,uBAAuB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,SAAS,kBAAkB,EAAE,CAY3G;AAED,eAAO,MAAM,mBAAmB,EAAE,SAAS,kBAAkB,EAA8B,CAAA;AAiF3F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAExE;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAA;CAAE,CAQpG;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAUzE;AAED,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAc3F;AAED,wBAAgB,8BAA8B,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAU1G"}
|