From e570ac6db0f7e17a8fef778e7b87222e80419034 Mon Sep 17 00:00:00 2001 From: Juergen Kunz Date: Thu, 19 Mar 2026 09:29:13 +0000 Subject: [PATCH] feat(readme): document built-in ACME directory server and CA capabilities --- changelog.md | 7 + deno.lock | 370 +++++++++++++++++++-------------------- package.json | 9 +- readme.hints.md | 26 ++- readme.md | 124 ++++++++++++- ts/00_commitinfo_data.ts | 4 +- 6 files changed, 348 insertions(+), 192 deletions(-) diff --git a/changelog.md b/changelog.md index 7966100..765e20f 100644 --- a/changelog.md +++ b/changelog.md @@ -1,5 +1,12 @@ # Changelog +## 2026-03-19 - 9.3.0 - feat(readme) +document built-in ACME directory server and CA capabilities + +- Update package metadata to describe client and server support, including built-in CA functionality +- Add README sections for ACME server quick start, configuration, endpoints, challenge verification, and trust setup +- Expand architecture notes and project hints to cover ts_server modules and tsbuild tsfolders usage + ## 2026-03-19 - 9.2.0 - feat(server) add an embedded ACME directory server and certificate authority with challenge, order, and certificate endpoints diff --git a/deno.lock b/deno.lock index f0df060..b5c201f 100644 --- a/deno.lock +++ b/deno.lock @@ -2,23 +2,23 @@ "version": "5", "specifiers": { "npm:@apiclient.xyz/cloudflare@^7.1.0": "7.1.0", - "npm:@git.zone/tsbuild@^4.1.2": "4.3.0", + "npm:@git.zone/tsbuild@^4.3.0": "4.3.0", "npm:@git.zone/tsrun@^2.0.1": "2.0.1", - "npm:@git.zone/tstest@^3.1.8": "3.3.2", + "npm:@git.zone/tstest@^3.4.0": "3.4.0", "npm:@peculiar/x509@^1.14.3": "1.14.3", - "npm:@push.rocks/lik@^6.2.2": "6.3.1", + "npm:@push.rocks/lik@^6.3.1": "6.3.1", "npm:@push.rocks/qenv@^6.1.3": "6.1.3", - "npm:@push.rocks/smartdata@^7.0.15": "7.1.0", + "npm:@push.rocks/smartdata@^7.1.0": "7.1.0", "npm:@push.rocks/smartdelay@^3.0.5": "3.0.5", - "npm:@push.rocks/smartdns@^7.8.1": "7.9.0", - "npm:@push.rocks/smartlog@^3.1.10": "3.2.1", + "npm:@push.rocks/smartdns@^7.9.0": "7.9.0", + "npm:@push.rocks/smartlog@^3.2.1": "3.2.1", "npm:@push.rocks/smartnetwork@^4.4.0": "4.4.0", "npm:@push.rocks/smartstring@^4.1.0": "4.1.0", "npm:@push.rocks/smarttime@^4.2.3": "4.2.3", "npm:@push.rocks/smartunique@^3.0.9": "3.0.9", "npm:@push.rocks/taskbuffer@^6.1.2": "6.1.2", - "npm:@tsclass/tsclass@^9.3.0": "9.4.0", - "npm:@types/node@^25.2.3": "25.5.0" + "npm:@tsclass/tsclass@^9.5.0": "9.5.0", + "npm:@types/node@^25.5.0": "25.5.0" }, "npm": { "@api.global/typedrequest-interfaces@2.0.2": { @@ -52,7 +52,7 @@ "@push.rocks/smartpromise", "@push.rocks/smartrequest@5.0.1", "@push.rocks/smartstring", - "@tsclass/tsclass@9.4.0", + "@tsclass/tsclass@9.5.0", "cloudflare" ], "tarball": "https://verdaccio.lossless.digital/@apiclient.xyz/cloudflare/-/cloudflare-7.1.0.tgz" @@ -125,8 +125,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@aws-crypto/util/-/util-5.2.0.tgz" }, - "@aws-sdk/client-s3@3.1009.0": { - "integrity": "sha512-luy8CxallkoiGWTqU86ca/BbvkWJjs0oala7uIIRN1JtQxMb5i4Yl/PBZVcQFhbK9kQi0PK0GfD8gIpLkI91fw==", + "@aws-sdk/client-s3@3.1012.0": { + "integrity": "sha512-YB44c/NVLwyLw2x8hYSIdMFRwFJyZRuaq1HCTS2RiUWmHucSGxohuKwQdQn/XWh+NILugB+RnXrBkSqTlR3ypw==", "dependencies": [ "@aws-crypto/sha1-browser", "@aws-crypto/sha256-browser", @@ -184,10 +184,10 @@ "@smithy/util-waiter", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/client-s3/-/client-s3-3.1009.0.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/client-s3/-/client-s3-3.1012.0.tgz" }, - "@aws-sdk/core@3.973.20": { - "integrity": "sha512-i3GuX+lowD892F3IuJf8o6AbyDupMTdyTxQrCJGcn71ni5hTZ82L4nQhcdumxZ7XPJRJJVHS/CR3uYOIIs0PVA==", + "@aws-sdk/core@3.973.21": { + "integrity": "sha512-OTUcDX9Yfz/FLKbHjiMaP9D4Hs44lYJzN7zBcrK2nDmBt0Wr8D6nYt12QoBkZsW0nVMFsTIGaZCrsU9zCcIMXQ==", "dependencies": [ "@aws-sdk/types", "@aws-sdk/xml-builder", @@ -203,7 +203,7 @@ "@smithy/util-utf8@4.2.2", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/core/-/core-3.973.20.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/core/-/core-3.973.21.tgz" }, "@aws-sdk/crc64-nvme@3.972.5": { "integrity": "sha512-2VbTstbjKdT+yKi8m7b3a9CiVac+pL/IY2PHJwsaGkkHmuuqkJZIErPck1h6P3T9ghQMLSdMPyW6Qp7Di5swFg==", @@ -213,8 +213,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@aws-sdk/crc64-nvme/-/crc64-nvme-3.972.5.tgz" }, - "@aws-sdk/credential-provider-env@3.972.18": { - "integrity": "sha512-X0B8AlQY507i5DwjLByeU2Af4ARsl9Vr84koDcXCbAkplmU+1xBFWxEPrWRAoh56waBne/yJqEloSwvRf4x6XA==", + "@aws-sdk/credential-provider-env@3.972.19": { + "integrity": "sha512-33NpkQtmnsjLr9QdZvL3w8bjy+WoBJ+jY8JwuzxIq38rDNi1kwpBWW7Yjh+8bMlksd+ZAWW0fH4S/6OeoAdU5A==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/types", @@ -222,10 +222,10 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.18.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-env/-/credential-provider-env-3.972.19.tgz" }, - "@aws-sdk/credential-provider-http@3.972.20": { - "integrity": "sha512-ey9Lelj001+oOfrbKmS6R2CJAiXX7QKY4Vj9VJv6L2eE6/VjD8DocHIoYqztTm70xDLR4E1jYPTKfIui+eRNDA==", + "@aws-sdk/credential-provider-http@3.972.21": { + "integrity": "sha512-xFke7yjbON4unNOG0TApQwz+o1LH5VhVLgWlUuiLRWNDyBfeHIFje2ck8qHybvJ8Fkm5m3SsN+pvHtVo6PGWlQ==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/types", @@ -238,10 +238,10 @@ "@smithy/util-stream", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.20.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-http/-/credential-provider-http-3.972.21.tgz" }, - "@aws-sdk/credential-provider-ini@3.972.20": { - "integrity": "sha512-5flXSnKHMloObNF+9N0cupKegnH1Z37cdVlpETVgx8/rAhCe+VNlkcZH3HDg2SDn9bI765S+rhNPXGDJJPfbtA==", + "@aws-sdk/credential-provider-ini@3.972.21": { + "integrity": "sha512-fmJN7KhB7CoG65w9fC2LVOd2wZbR2d1yJIpZNe2J5CeDPu7nUHSmavuJAeGEoE3OL5UIBVPNhmK/fV/NQrs3Hw==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/credential-provider-env", @@ -258,10 +258,10 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.20.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.972.21.tgz" }, - "@aws-sdk/credential-provider-login@3.972.20": { - "integrity": "sha512-gEWo54nfqp2jABMu6HNsjVC4hDLpg9HC8IKSJnp0kqWtxIJYHTmiLSsIfI4ScQjxEwpB+jOOH8dOLax1+hy/Hw==", + "@aws-sdk/credential-provider-login@3.972.21": { + "integrity": "sha512-ENU+YCiuQocQjfIf9bPxZ+ZY0wIBkl3SMH22optBQwy8UFpSfonHynXzGT27xQxer4cYTNOpwDqbfo57BusbpQ==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/nested-clients", @@ -272,10 +272,10 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.20.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-login/-/credential-provider-login-3.972.21.tgz" }, - "@aws-sdk/credential-provider-node@3.972.21": { - "integrity": "sha512-hah8if3/B/Q+LBYN5FukyQ1Mym6PLPDsBOBsIgNEYD6wLyZg0UmUF/OKIVC3nX9XH8TfTPuITK+7N/jenVACWA==", + "@aws-sdk/credential-provider-node@3.972.22": { + "integrity": "sha512-VE6i8nkmrRyhKut7nnfCWRbdDf+CfyRr8ixSwdaPDguYlgvkAO2pHu9oK11XzbSuatB0io1ozI/vpYhelXn8Pg==", "dependencies": [ "@aws-sdk/credential-provider-env", "@aws-sdk/credential-provider-http", @@ -290,10 +290,10 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.21.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-node/-/credential-provider-node-3.972.22.tgz" }, - "@aws-sdk/credential-provider-process@3.972.18": { - "integrity": "sha512-Tpl7SRaPoOLT32jbTWchPsn52hYYgJ0kpiFgnwk8pxTANQdUymVSZkzFvv1+oOgZm1CrbQUP9MBeoMZ9IzLZjA==", + "@aws-sdk/credential-provider-process@3.972.19": { + "integrity": "sha512-hjj5bFo4kf5/WzAMjDEFByVOMbq5gZiagIpJexf7Kp9nIDaGzhCphMsx03NCA8s9zUJzHlD1lXazd7MS+e03Lg==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/types", @@ -302,10 +302,10 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.18.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-process/-/credential-provider-process-3.972.19.tgz" }, - "@aws-sdk/credential-provider-sso@3.972.20": { - "integrity": "sha512-p+R+PYR5Z7Gjqf/6pvbCnzEHcqPCpLzR7Yf127HjJ6EAb4hUcD+qsNRnuww1sB/RmSeCLxyay8FMyqREw4p1RA==", + "@aws-sdk/credential-provider-sso@3.972.21": { + "integrity": "sha512-9jWRCuMZpZKlqCZ46bvievqdfswsyB2yPAr9rOiN+FxaGgf8jrR5iYDqJgscvk1jrbAxiK4cIjHv3XjIAWAhzQ==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/nested-clients", @@ -316,10 +316,10 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.20.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.972.21.tgz" }, - "@aws-sdk/credential-provider-web-identity@3.972.20": { - "integrity": "sha512-rWCmh8o7QY4CsUj63qopzMzkDq/yPpkrpb+CnjBEFSOg/02T/we7sSTVg4QsDiVS9uwZ8VyONhq98qt+pIh3KA==", + "@aws-sdk/credential-provider-web-identity@3.972.21": { + "integrity": "sha512-ShWQO/cQVZ+j3zUDK7Kj+m7grPzQCVA2iaZdJ+hJTGvVH5lR32Ip/rgZZ+zBdH6D6wczP9Upa4NMXoqJdGpK1g==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/nested-clients", @@ -329,7 +329,7 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.20.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.972.21.tgz" }, "@aws-sdk/middleware-bucket-endpoint@3.972.8": { "integrity": "sha512-WR525Rr2QJSETa9a050isktyWi/4yIGcmY3BQ1kpHqb0LqUglQHCS8R27dTJxxWNZvQ0RVGtEZjTCbZJpyF3Aw==", @@ -354,8 +354,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.972.8.tgz" }, - "@aws-sdk/middleware-flexible-checksums@3.973.6": { - "integrity": "sha512-0nYEgkJH7Yt9k+nZJyllTghnkKaz17TWFcr5Mi0XMVMzYlF4ytDZADQpF2/iJo36cKL5AYSzRsvlykE4M/ErTA==", + "@aws-sdk/middleware-flexible-checksums@3.974.1": { + "integrity": "sha512-1MQ8czTjW8b8SpM+ZoQ0k5yD4rd19G9ALPlGgbFdRS7bwlm9ArxXWu2M22mUgSjsGJwzDkpV8e9tjUnre6adAw==", "dependencies": [ "@aws-crypto/crc32", "@aws-crypto/crc32c", @@ -372,7 +372,7 @@ "@smithy/util-utf8@4.2.2", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.973.6.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.974.1.tgz" }, "@aws-sdk/middleware-host-header@3.972.8": { "integrity": "sha512-wAr2REfKsqoKQ+OkNqvOShnBoh+nkPurDKW7uAeVSu6kUECnWlSJiPvnoqxGlfousEY/v9LfS9sNc46hjSYDIQ==", @@ -413,8 +413,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.972.8.tgz" }, - "@aws-sdk/middleware-sdk-s3@3.972.20": { - "integrity": "sha512-yhva/xL5H4tWQgsBjwV+RRD0ByCzg0TcByDCLp3GXdn/wlyRNfy8zsswDtCvr1WSKQkSQYlyEzPuWkJG0f5HvQ==", + "@aws-sdk/middleware-sdk-s3@3.972.21": { + "integrity": "sha512-SXkHy8OET88y4NaSui3gMfoTpg4jHvcbAVXYJuP74vsgsJKCv/vzWM+0hVJ1W+EBOghd+qFIud80ZiuPt2RXRw==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/types", @@ -431,7 +431,7 @@ "@smithy/util-utf8@4.2.2", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.20.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.972.21.tgz" }, "@aws-sdk/middleware-ssec@3.972.8": { "integrity": "sha512-wqlK0yO/TxEC2UsY9wIlqeeutF6jjLe0f96Pbm40XscTo57nImUk9lBcw0dPgsm0sppFtAkSlDrfpK+pC30Wqw==", @@ -442,8 +442,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-ssec/-/middleware-ssec-3.972.8.tgz" }, - "@aws-sdk/middleware-user-agent@3.972.21": { - "integrity": "sha512-62XRl1GDYPpkt7cx1AX1SPy9wgNE9Iw/NPuurJu4lmhCWS7sGKO+kS53TQ8eRmIxy3skmvNInnk0ZbWrU5Dpyg==", + "@aws-sdk/middleware-user-agent@3.972.22": { + "integrity": "sha512-pZPNGWZVQvgUIO/P9PXZNz7ciq9mLYb/wQEurg3phKTa3DiBIunIRcgA0eBNwmog6S3oy0KR1bv4EJ4ld9A5sQ==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/types", @@ -454,10 +454,10 @@ "@smithy/util-retry", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.21.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.972.22.tgz" }, - "@aws-sdk/nested-clients@3.996.10": { - "integrity": "sha512-SlDol5Z+C7Ivnc2rKGqiqfSUmUZzY1qHfVs9myt/nxVwswgfpjdKahyTzLTx802Zfq0NFRs7AejwKzzzl5Co2w==", + "@aws-sdk/nested-clients@3.996.11": { + "integrity": "sha512-i7SwoSR4JB/79JoGDUACnFUQOZwXGLWNX35lIb1Pq72nUGlVV+RFZp+BLa8S+mog2pbXU9+6Kc5YwGiMi5bKhQ==", "dependencies": [ "@aws-crypto/sha256-browser", "@aws-crypto/sha256-js", @@ -498,7 +498,7 @@ "@smithy/util-utf8@4.2.2", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/nested-clients/-/nested-clients-3.996.10.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/nested-clients/-/nested-clients-3.996.11.tgz" }, "@aws-sdk/region-config-resolver@3.972.8": { "integrity": "sha512-1eD4uhTDeambO/PNIDVG19A6+v4NdD7xzwLHDutHsUqz0B+i661MwQB2eYO4/crcCvCiQG4SRm1k81k54FEIvw==", @@ -511,8 +511,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@aws-sdk/region-config-resolver/-/region-config-resolver-3.972.8.tgz" }, - "@aws-sdk/signature-v4-multi-region@3.996.8": { - "integrity": "sha512-n1qYFD+tbqZuyskVaxUE+t10AUz9g3qzDw3Tp6QZDKmqsjfDmZBd4GIk2EKJJNtcCBtE5YiUjDYA+3djFAFBBg==", + "@aws-sdk/signature-v4-multi-region@3.996.9": { + "integrity": "sha512-2aAUwudVQ3uNkCfkBLQwNVD2jkfb299NSeDueXsT2NcNdFrWtHRkiQzX3wk47UFYbm87BkdxrsAJcQO7PdQOhA==", "dependencies": [ "@aws-sdk/middleware-sdk-s3", "@aws-sdk/types", @@ -521,10 +521,10 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.996.9.tgz" }, - "@aws-sdk/token-providers@3.1009.0": { - "integrity": "sha512-KCPLuTqN9u0Rr38Arln78fRG9KXpzsPWmof+PZzfAHMMQq2QED6YjQrkrfiH7PDefLWEposY1o4/eGwrmKA4JA==", + "@aws-sdk/token-providers@3.1012.0": { + "integrity": "sha512-vzKwy020zjuiF4WTJzejx5nYcXJnRhHpb6i3lyZHIwfFwXG1yX4bzBVNMWYWF+bz1i2Pp2VhJbPyzpqj4VuJXQ==", "dependencies": [ "@aws-sdk/core", "@aws-sdk/nested-clients", @@ -534,7 +534,7 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/token-providers/-/token-providers-3.1009.0.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/token-providers/-/token-providers-3.1012.0.tgz" }, "@aws-sdk/types@3.973.6": { "integrity": "sha512-Atfcy4E++beKtwJHiDln2Nby8W/mam64opFPTiHEqgsthqeydFS1pY+OUlN1ouNOmf8ArPU/6cDS65anOP3KQw==", @@ -579,8 +579,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.972.8.tgz" }, - "@aws-sdk/util-user-agent-node@3.973.7": { - "integrity": "sha512-Hz6EZMUAEzqUd7e+vZ9LE7mn+5gMbxltXy18v+YSFY+9LBJz15wkNZvw5JqfX3z0FS9n3bgUtz3L5rAsfh4YlA==", + "@aws-sdk/util-user-agent-node@3.973.8": { + "integrity": "sha512-Kvb96TafGPLYo4Z2GRCzQTne77epXgiZEo0DDXwavzkWmgDV/1XD1tMA766gzRcHHFUraWsE+4T8DKtPTZUxgQ==", "dependencies": [ "@aws-sdk/middleware-user-agent", "@aws-sdk/types", @@ -589,16 +589,16 @@ "@smithy/util-config-provider", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.7.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.973.8.tgz" }, - "@aws-sdk/xml-builder@3.972.11": { - "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", + "@aws-sdk/xml-builder@3.972.13": { + "integrity": "sha512-I/+BMxM4WE/6xL0tyV7tAUDOAXmyw/va1oGr/eSly43HmLUcD1G+v96vEKAA8VoLcZ03ZQo/PWzjmN9zQErqPQ==", "dependencies": [ "@smithy/types", "fast-xml-parser", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz" + "tarball": "https://verdaccio.lossless.digital/@aws-sdk/xml-builder/-/xml-builder-3.972.13.tgz" }, "@aws/lambda-invoke-store@0.2.4": { "integrity": "sha512-iY8yvjE0y651BixKNPgmv1WrQc+GZ142sb0z4gYnChDDY2YqI4P/jsSopBWrKfAt7LOJAkOXt7rC/hms+WclQQ==", @@ -927,8 +927,8 @@ "bin": true, "tarball": "https://verdaccio.lossless.digital/@git.zone/tsrun/-/tsrun-2.0.1.tgz" }, - "@git.zone/tstest@3.3.2": { - "integrity": "sha512-1R3VMEg+VMeMlSTIzIYTAsRIHuZMlpWmG1j4Q1cPSSw3jOp79OD7sJxfHkqy4bO/nTTcKMGXs5DD1nhT7Xno8w==", + "@git.zone/tstest@3.4.0": { + "integrity": "sha512-EpIrwlfU8BfhO3na6bb/2RcBB2Zi8rbQfoO+QLY+rc1nj/iHW+mgSeDnXuKQTATI0OQ0xsq3xB4qIZ0tKSYvYw==", "dependencies": [ "@git.zone/tsbundle", "@git.zone/tsrun", @@ -948,9 +948,9 @@ "@push.rocks/smartpath@6.0.0", "@push.rocks/smartpromise", "@push.rocks/smartrequest@5.0.1", - "@push.rocks/smarts3", "@push.rocks/smartserve", "@push.rocks/smartshell", + "@push.rocks/smartstorage", "@push.rocks/smarttime", "@push.rocks/smartwatch", "@types/ws", @@ -958,7 +958,7 @@ "ws" ], "bin": true, - "tarball": "https://verdaccio.lossless.digital/@git.zone/tstest/-/tstest-3.3.2.tgz" + "tarball": "https://verdaccio.lossless.digital/@git.zone/tstest/-/tstest-3.4.0.tgz" }, "@img/colour@1.1.0": { "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", @@ -1834,7 +1834,7 @@ "@push.rocks/smartstring", "@push.rocks/smartunique", "@push.rocks/taskbuffer@3.5.0", - "@tsclass/tsclass@9.4.0" + "@tsclass/tsclass@9.5.0" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/levelcache/-/levelcache-3.2.0.tgz" }, @@ -1860,7 +1860,7 @@ "@push.rocks/smartjson@5.2.0", "@push.rocks/smartpath@6.0.0", "@push.rocks/smartpromise", - "@tsclass/tsclass@9.4.0", + "@tsclass/tsclass@9.5.0", "mongodb@6.21.0" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/mongodump/-/mongodump-1.1.0.tgz" @@ -1876,7 +1876,7 @@ "@push.rocks/smartpromise", "@push.rocks/smartrx", "@push.rocks/taskbuffer@3.5.0", - "@tsclass/tsclass@9.4.0" + "@tsclass/tsclass@9.5.0" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/npmextra/-/npmextra-5.3.3.tgz" }, @@ -1905,7 +1905,7 @@ "@push.rocks/smarturl", "@types/tar-stream", "fflate", - "file-type@21.3.2", + "file-type@21.3.3", "tar-stream" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartarchive/-/smartarchive-4.2.4.tgz" @@ -1931,7 +1931,7 @@ "@push.rocks/smartstream", "@push.rocks/smartstring", "@push.rocks/smartunique", - "@tsclass/tsclass@9.4.0" + "@tsclass/tsclass@9.5.0" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartbucket/-/smartbucket-3.3.10.tgz" }, @@ -1999,7 +1999,7 @@ "@push.rocks/smarttime", "@push.rocks/smartunique", "@push.rocks/taskbuffer@3.5.0", - "@tsclass/tsclass@9.4.0", + "@tsclass/tsclass@9.5.0", "mongodb@6.21.0" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartdata/-/smartdata-5.16.7.tgz" @@ -2017,7 +2017,7 @@ "@push.rocks/smarttime", "@push.rocks/smartunique", "@push.rocks/taskbuffer@3.5.0", - "@tsclass/tsclass@9.4.0", + "@tsclass/tsclass@9.5.0", "mongodb@7.1.0" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartdata/-/smartdata-7.1.0.tgz" @@ -2036,7 +2036,7 @@ "@push.rocks/smartenv@6.0.0", "@push.rocks/smartpromise", "@push.rocks/smartrust", - "@tsclass/tsclass@9.4.0", + "@tsclass/tsclass@9.5.0", "acme-client", "minimatch@10.2.4" ], @@ -2235,7 +2235,7 @@ "@push.rocks/smartpromise", "@push.rocks/smarttime", "@push.rocks/webrequest", - "@tsclass/tsclass@9.4.0" + "@tsclass/tsclass@9.5.0" ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartlog/-/smartlog-3.2.1.tgz" }, @@ -2358,7 +2358,7 @@ "@push.rocks/smartpuppeteer", "@push.rocks/smartserve", "@push.rocks/smartunique", - "@tsclass/tsclass@9.4.0", + "@tsclass/tsclass@9.5.0", "pdf-lib", "pdf2json" ], @@ -2444,16 +2444,6 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartrx/-/smartrx-3.0.10.tgz" }, - "@push.rocks/smarts3@5.3.0": { - "integrity": "sha512-6bo55ovCDEylbTxwPFZYDrZrz2babQEUmxHIexmVcP2j+6LYRHDbGYnWoyKdtqniqDFZ04pFkOoZ85hUzU5xCw==", - "dependencies": [ - "@push.rocks/smartpath@6.0.0", - "@push.rocks/smartrust", - "@tsclass/tsclass@9.4.0" - ], - "deprecated": true, - "tarball": "https://verdaccio.lossless.digital/@push.rocks/smarts3/-/smarts3-5.3.0.tgz" - }, "@push.rocks/smartserve@2.0.1": { "integrity": "sha512-YQb2qexfCzCqOlLWBBXKMg6xG4zahCPAxomz/KEKAwHtW6wMTtuHKSTSkRTQ0vl9jssLMAmRz2OyafiL9XGJXQ==", "dependencies": [ @@ -2499,6 +2489,15 @@ ], "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartstate/-/smartstate-2.2.1.tgz" }, + "@push.rocks/smartstorage@6.0.1": { + "integrity": "sha512-W5PEVwO0J2K9YUZRTbKXadC11h6/IBzzqU+P0TIE/xpJZC4K1duEXwEhxGWcbfhCkPRRa51xH8Z5mAmzzm8qxA==", + "dependencies": [ + "@push.rocks/smartpath@6.0.0", + "@push.rocks/smartrust", + "@tsclass/tsclass@9.5.0" + ], + "tarball": "https://verdaccio.lossless.digital/@push.rocks/smartstorage/-/smartstorage-6.0.1.tgz" + }, "@push.rocks/smartstream@3.4.0": { "integrity": "sha512-kePb44W9n5K96zj2Ms3K4xnYbNXP5AfxDd86zZMDQ1/T10nvkIpL9m5w4lG/VJ4KAsWFs81S87BkkcjhhrY5Kw==", "dependencies": [ @@ -2743,70 +2742,70 @@ "integrity": "sha512-/L0htLJZbaZFL1g9OHOblTxbCYIGefErJjtYOwgl9ZqNx27P3L0SDfjhhHIss32gu5NWgnxuT2a2Hnnv6QGHKA==", "tarball": "https://verdaccio.lossless.digital/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.52.tgz" }, - "@rspack/binding-darwin-arm64@1.7.8": { - "integrity": "sha512-KS6SRc+4VYRdX1cKr1j1HEuMNyEzt7onBS0rkenaiCRRYF0z4WNZNyZqRiuxgM3qZ3TISF7gdmgJQyd4ZB43ig==", + "@rspack/binding-darwin-arm64@1.7.9": { + "integrity": "sha512-64dgstte0If5czi9bA/cpOe0ryY6wC9AIQRtyJ3DlOF6Tt+y9cKkmUoGu3V+WYaYIZRT7HNk8V7kL8amVjFTYw==", "os": ["darwin"], "cpu": ["arm64"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-darwin-arm64/-/binding-darwin-arm64-1.7.9.tgz" }, - "@rspack/binding-darwin-x64@1.7.8": { - "integrity": "sha512-uyXSDKLg2CtqIJrsJDlCqQH80YIPsCUiTToJ59cXAG3v4eke0Qbiv6d/+pV0h/mc0u4inAaSkr5dD18zkMIghw==", + "@rspack/binding-darwin-x64@1.7.9": { + "integrity": "sha512-2QSLs3w4rLy4UUGVnIlkt6IlIKOzR1e0RPsq2FYQW6s3p9JrwRCtOeHohyh7EJSqF54dtfhe9UZSAwba3LqH1Q==", "os": ["darwin"], "cpu": ["x64"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-darwin-x64/-/binding-darwin-x64-1.7.9.tgz" }, - "@rspack/binding-linux-arm64-gnu@1.7.8": { - "integrity": "sha512-dD6gSHA18Uj0eqc1FCwwQ5IO5mIckrpYN4H4kPk9Pjau+1mxWvC4y5Lryz1Z8P/Rh1lnQ/wwGE0XL9nd80+LqQ==", + "@rspack/binding-linux-arm64-gnu@1.7.9": { + "integrity": "sha512-qhUGI/uVfvLmKWts4QkVHGL8yfUyJkblZs+OFD5Upa2y676EOsbQgWsCwX4xGB6Tv+TOzFP0SLh/UfO8ZfdE+w==", "os": ["linux"], "cpu": ["arm64"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.7.9.tgz" }, - "@rspack/binding-linux-arm64-musl@1.7.8": { - "integrity": "sha512-m+uBi9mEVGkZ02PPOAYN2BSmmvc00XGa6v9CjV8qLpolpUXQIMzDNG+i1fD5SHp8LO+XWsZJOHypMsT0MzGTGw==", + "@rspack/binding-linux-arm64-musl@1.7.9": { + "integrity": "sha512-VjfmR1hgO9n3L6MaE5KG+DXSrrLVqHHOkVcOtS2LMq3bjMTwbBywY7ycymcLnX5KJsol8d3ZGYep6IfSOt3lFA==", "os": ["linux"], "cpu": ["arm64"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.7.9.tgz" }, - "@rspack/binding-linux-x64-gnu@1.7.8": { - "integrity": "sha512-IAPp2L3yS33MAEkcGn/I1gO+a+WExJHXz2ZlRlL2oFCUGpYi2ZQHyAcJ3o2tJqkXmdqsTiN+OjEVMd/RcLa24g==", + "@rspack/binding-linux-x64-gnu@1.7.9": { + "integrity": "sha512-0kldV+3WTs/VYDWzxJ7K40hCW26IHtnk8xPK3whKoo1649rgeXXa0EdsU5P7hG8Ef5SWQjHHHZ/fuHYSO3Y6HA==", "os": ["linux"], "cpu": ["x64"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.7.9.tgz" }, - "@rspack/binding-linux-x64-musl@1.7.8": { - "integrity": "sha512-do/QNzb4GWdXCsipblDcroqRDR3BFcbyzpZpAw/3j9ajvEqsOKpdHZpILT2NZX/VahhjqfqB3k0kJVt3uK7UYQ==", + "@rspack/binding-linux-x64-musl@1.7.9": { + "integrity": "sha512-Gi4872cFtc2d83FKATR6Qcf2VBa/tFCqffI/IwRRl6Hx5FulEBqx+tH7gAuRVF693vrbXNxK+FQ+k4iEsEJxrw==", "os": ["linux"], "cpu": ["x64"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-linux-x64-musl/-/binding-linux-x64-musl-1.7.9.tgz" }, - "@rspack/binding-wasm32-wasi@1.7.8": { - "integrity": "sha512-mHtgYTpdhx01i0XNKFYBZyCjtv9YUe/sDfpD1QK4FytPFB+1VpYnmZiaJIMM77VpNsjxGAqWhmUYxi2P6jWifw==", + "@rspack/binding-wasm32-wasi@1.7.9": { + "integrity": "sha512-5QEzqo6EaolpuZmK6w/mgSueorgGnnzp7dJaAvBj6ECFIg/aLXhXXmWCWbxt7Ws2gKvG5/PgaxDqbUxYL51juA==", "dependencies": [ "@napi-rs/wasm-runtime" ], "cpu": ["wasm32"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-wasm32-wasi/-/binding-wasm32-wasi-1.7.9.tgz" }, - "@rspack/binding-win32-arm64-msvc@1.7.8": { - "integrity": "sha512-Mkxg86F7kIT4pM9XvE/1LAGjK5NOQi/GJxKyyiKbUAeKM8XBUizVeNuvKR0avf2V5IDAIRXiH1SX8SpujMJteA==", + "@rspack/binding-win32-arm64-msvc@1.7.9": { + "integrity": "sha512-MMqvcrIc8aOqTuHjWkjdzilvoZ3Hv07Od0Foogiyq3JMudsS3Wcmh7T1dFerGg19MOJcRUeEkrg2NQOMOQ6xDA==", "os": ["win32"], "cpu": ["arm64"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.7.9.tgz" }, - "@rspack/binding-win32-ia32-msvc@1.7.8": { - "integrity": "sha512-VmTOZ/X7M85lKFNwb2qJpCRzr4SgO42vucq/X7Uz1oSoTPAf8UUMNdi7BPnu+D4lgy6l8PwV804ZyHO3gGsvPA==", + "@rspack/binding-win32-ia32-msvc@1.7.9": { + "integrity": "sha512-4kYYS+NZ2CuNbKjq40yB/UEyB51o1PHj5wpr+Y943oOJXpEKWU2Q4vkF8VEohPEcnA9cKVotYCnqStme+02suA==", "os": ["win32"], "cpu": ["ia32"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.7.9.tgz" }, - "@rspack/binding-win32-x64-msvc@1.7.8": { - "integrity": "sha512-BK0I4HAwp/yQLnmdJpUtGHcht3x11e9fZwyaiMzznznFc+Oypbf+FS5h+aBgpb53QnNkPpdG7MfAPoKItOcU8A==", + "@rspack/binding-win32-x64-msvc@1.7.9": { + "integrity": "sha512-1g+QyXXvs+838Un/4GaUvJfARDGHMCs15eXDYWBl5m/Skubyng8djWAgr6ag1+cVoJZXCPOvybTItcblWF3gbQ==", "os": ["win32"], "cpu": ["x64"], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.7.9.tgz" }, - "@rspack/binding@1.7.8": { - "integrity": "sha512-P4fbrQx5hRhAiC8TBTEMCTnNawrIzJLjWwAgrTwRxjgenpjNvimEkQBtSGrXOY+c+MV5Q74P+9wPvVWLKzRkQQ==", + "@rspack/binding@1.7.9": { + "integrity": "sha512-A56e0NdfNwbOSJoilMkxzaPuVYaKCNn1shuiwWnCIBmhV9ix1n9S1XvquDjkGyv+gCdR1+zfJBOa5DMB7htLHw==", "optionalDependencies": [ "@rspack/binding-darwin-arm64", "@rspack/binding-darwin-x64", @@ -2819,16 +2818,16 @@ "@rspack/binding-win32-ia32-msvc", "@rspack/binding-win32-x64-msvc" ], - "tarball": "https://verdaccio.lossless.digital/@rspack/binding/-/binding-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/binding/-/binding-1.7.9.tgz" }, - "@rspack/core@1.7.8": { - "integrity": "sha512-kT6yYo8xjKoDfM7iB8N9AmN9DJIlrs7UmQDbpTu1N4zaZocN1/t2fIAWOKjr5+3eJlZQR2twKZhDVHNLbLPjOw==", + "@rspack/core@1.7.9": { + "integrity": "sha512-VHuSKvRkuv42Ya+TxEGO0LE0r9+8P4tKGokmomj4R1f/Nu2vtS3yoaIMfC4fR6VuHGd3MZ+KTI0cNNwHfFcskw==", "dependencies": [ "@module-federation/runtime-tools", "@rspack/binding", "@rspack/lite-tapable" ], - "tarball": "https://verdaccio.lossless.digital/@rspack/core/-/core-1.7.8.tgz" + "tarball": "https://verdaccio.lossless.digital/@rspack/core/-/core-1.7.9.tgz" }, "@rspack/lite-tapable@1.1.0": { "integrity": "sha512-E2B0JhYFmVAwdDiG14+DW0Di4Ze4Jg10Pc4/lILUrd5DRCaklduz2OvJ5HYQ6G+hd+WTzqQb3QnDNfK4yvAFYw==", @@ -2877,8 +2876,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@smithy/config-resolver/-/config-resolver-4.4.11.tgz" }, - "@smithy/core@3.23.11": { - "integrity": "sha512-952rGf7hBRnhUIaeLp6q4MptKW8sPFe5VvkoZ5qIzFAtx6c/QZ/54FS3yootsyUSf9gJX/NBqEBNdNR7jMIlpQ==", + "@smithy/core@3.23.12": { + "integrity": "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==", "dependencies": [ "@smithy/protocol-http", "@smithy/types", @@ -2891,7 +2890,7 @@ "@smithy/uuid", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/core/-/core-3.23.11.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/core/-/core-3.23.12.tgz" }, "@smithy/credential-provider-imds@4.2.12": { "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", @@ -3029,8 +3028,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@smithy/middleware-content-length/-/middleware-content-length-4.2.12.tgz" }, - "@smithy/middleware-endpoint@4.4.25": { - "integrity": "sha512-dqjLwZs2eBxIUG6Qtw8/YZ4DvzHGIf0DA18wrgtfP6a50UIO7e2nY0FPdcbv5tVJKqWCCU5BmGMOUwT7Puan+A==", + "@smithy/middleware-endpoint@4.4.26": { + "integrity": "sha512-8Qfikvd2GVKSm8S6IbjfwFlRY9VlMrj0Dp4vTwAuhqbX7NhJKE5DQc2bnfJIcY0B+2YKMDBWfvexbSZeejDgeg==", "dependencies": [ "@smithy/core", "@smithy/middleware-serde", @@ -3041,10 +3040,10 @@ "@smithy/util-middleware", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.25.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.26.tgz" }, - "@smithy/middleware-retry@4.4.42": { - "integrity": "sha512-vbwyqHRIpIZutNXZpLAozakzamcINaRCpEy1MYmK6xBeW3xN+TyPRA123GjXnuxZIjc9848MRRCugVMTXxC4Eg==", + "@smithy/middleware-retry@4.4.43": { + "integrity": "sha512-ZwsifBdyuNHrFGmbc7bAfP2b54+kt9J2rhFd18ilQGAB+GDiP4SrawqyExbB7v455QVR7Psyhb2kjULvBPIhvA==", "dependencies": [ "@smithy/node-config-provider", "@smithy/protocol-http", @@ -3056,17 +3055,17 @@ "@smithy/uuid", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/middleware-retry/-/middleware-retry-4.4.42.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/middleware-retry/-/middleware-retry-4.4.43.tgz" }, - "@smithy/middleware-serde@4.2.14": { - "integrity": "sha512-+CcaLoLa5apzSRtloOyG7lQvkUw2ZDml3hRh4QiG9WyEPfW5Ke/3tPOPiPjUneuT59Tpn8+c3RVaUvvkkwqZwg==", + "@smithy/middleware-serde@4.2.15": { + "integrity": "sha512-ExYhcltZSli0pgAKOpQQe1DLFBLryeZ22605y/YS+mQpdNWekum9Ujb/jMKfJKgjtz1AZldtwA/wCYuKJgjjlg==", "dependencies": [ "@smithy/core", "@smithy/protocol-http", "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/middleware-serde/-/middleware-serde-4.2.14.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/middleware-serde/-/middleware-serde-4.2.15.tgz" }, "@smithy/middleware-stack@4.2.12": { "integrity": "sha512-kruC5gRHwsCOuyCd4ouQxYjgRAym2uDlCvQ5acuMtRrcdfg7mFBg6blaxcJ09STpt3ziEkis6bhg1uwrWU7txw==", @@ -3086,8 +3085,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@smithy/node-config-provider/-/node-config-provider-4.3.12.tgz" }, - "@smithy/node-http-handler@4.4.16": { - "integrity": "sha512-ULC8UCS/HivdCB3jhi+kLFYe4B5gxH2gi9vHBfEIiRrT2jfKiZNiETJSlzRtE6B26XbBHjPtc8iZKSNqMol9bw==", + "@smithy/node-http-handler@4.5.0": { + "integrity": "sha512-Rnq9vQWiR1+/I6NZZMNzJHV6pZYyEHt2ZnuV3MG8z2NNenC4i/8Kzttz7CjZiHSmsN5frhXhg17z3Zqjjhmz1A==", "dependencies": [ "@smithy/abort-controller", "@smithy/protocol-http", @@ -3095,7 +3094,7 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/node-http-handler/-/node-http-handler-4.4.16.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/node-http-handler/-/node-http-handler-4.5.0.tgz" }, "@smithy/property-provider@4.2.12": { "integrity": "sha512-jqve46eYU1v7pZ5BM+fmkbq3DerkSluPr5EhvOcHxygxzD05ByDRppRwRPPpFrsFo5yDtCYLKu+kreHKVrvc7A==", @@ -3159,8 +3158,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@smithy/signature-v4/-/signature-v4-5.3.12.tgz" }, - "@smithy/smithy-client@4.12.5": { - "integrity": "sha512-UqwYawyqSr/aog8mnLnfbPurS0gi4G7IYDcD28cUIBhsvWs1+rQcL2IwkUQ+QZ7dibaoRzhNF99fAQ9AUcO00w==", + "@smithy/smithy-client@4.12.6": { + "integrity": "sha512-aib3f0jiMsJ6+cvDnXipBsGDL7ztknYSVqJs1FdN9P+u9tr/VzOR7iygSh6EUOdaBeMCMSh3N0VdyYsG4o91DQ==", "dependencies": [ "@smithy/core", "@smithy/middleware-endpoint", @@ -3170,7 +3169,7 @@ "@smithy/util-stream", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/smithy-client/-/smithy-client-4.12.5.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/smithy-client/-/smithy-client-4.12.6.tgz" }, "@smithy/types@4.13.1": { "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", @@ -3234,18 +3233,18 @@ ], "tarball": "https://verdaccio.lossless.digital/@smithy/util-config-provider/-/util-config-provider-4.2.2.tgz" }, - "@smithy/util-defaults-mode-browser@4.3.41": { - "integrity": "sha512-M1w1Ux0rSVvBOxIIiqbxvZvhnjQ+VUjJrugtORE90BbadSTH+jsQL279KRL3Hv0w69rE7EuYkV/4Lepz/NBW9g==", + "@smithy/util-defaults-mode-browser@4.3.42": { + "integrity": "sha512-0vjwmcvkWAUtikXnWIUOyV6IFHTEeQUYh3JUZcDgcszF+hD/StAsQ3rCZNZEPHgI9kVNcbnyc8P2CBHnwgmcwg==", "dependencies": [ "@smithy/property-provider", "@smithy/smithy-client", "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.41.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.42.tgz" }, - "@smithy/util-defaults-mode-node@4.2.44": { - "integrity": "sha512-YPze3/lD1KmWuZsl9JlfhcgGLX7AXhSoaCDtiPntUjNW5/YY0lOHjkcgxyE9x/h5vvS1fzDifMGjzqnNlNiqOQ==", + "@smithy/util-defaults-mode-node@4.2.45": { + "integrity": "sha512-q5dOqqfTgUcLe38TAGiFn9srToKj2YCHJ34QGOLzM+xYLLA+qRZv7N+33kl1MERVusue36ZHnlNaNEvY/PzSrw==", "dependencies": [ "@smithy/config-resolver", "@smithy/credential-provider-imds", @@ -3255,7 +3254,7 @@ "@smithy/types", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.44.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.45.tgz" }, "@smithy/util-endpoints@3.3.3": { "integrity": "sha512-VACQVe50j0HZPjpwWcjyT51KUQ4AnsvEaQ2lKHOSL4mNLD0G9BjEniQ+yCt1qqfKfiAHRAts26ud7hBjamrwig==", @@ -3290,8 +3289,8 @@ ], "tarball": "https://verdaccio.lossless.digital/@smithy/util-retry/-/util-retry-4.2.12.tgz" }, - "@smithy/util-stream@4.5.19": { - "integrity": "sha512-v4sa+3xTweL1CLO2UP0p7tvIMH/Rq1X4KKOxd568mpe6LSLMQCnDHs4uv7m3ukpl3HvcN2JH6jiCS0SNRXKP/w==", + "@smithy/util-stream@4.5.20": { + "integrity": "sha512-4yXLm5n/B5SRBR2p8cZ90Sbv4zL4NKsgxdzCzp/83cXw2KxLEumt5p+GAVyRNZgQOSrzXn9ARpO0lUe8XSlSDw==", "dependencies": [ "@smithy/fetch-http-handler", "@smithy/node-http-handler", @@ -3302,7 +3301,7 @@ "@smithy/util-utf8@4.2.2", "tslib@2.8.1" ], - "tarball": "https://verdaccio.lossless.digital/@smithy/util-stream/-/util-stream-4.5.19.tgz" + "tarball": "https://verdaccio.lossless.digital/@smithy/util-stream/-/util-stream-4.5.20.tgz" }, "@smithy/util-uri-escape@4.2.2": { "integrity": "sha512-2kAStBlvq+lTXHyAZYfJRb/DfS3rsinLiwb+69SstC9Vb0s9vNWkRwpnj918Pfi85mzi42sOqdV72OLxWAISnw==", @@ -3381,12 +3380,12 @@ ], "tarball": "https://verdaccio.lossless.digital/@tsclass/tsclass/-/tsclass-4.4.4.tgz" }, - "@tsclass/tsclass@9.4.0": { - "integrity": "sha512-VqSafIzAGxKBKQk6Q4t4vy6ldZ71I0q9T1rWnuQjvRwJEVWWL1nW7B3dfOzZq3YhOfUeOl03LGENsl0DUjUlbg==", + "@tsclass/tsclass@9.5.0": { + "integrity": "sha512-HwMVwkrBnEFMjwOsMkGwWN/q+XEczSpf4a/PBAXgkDdV6sXdxAMFXUH1tW8Y5ecuvXFYMvFry4X57MCCT7Dm8A==", "dependencies": [ "type-fest@5.4.4" ], - "tarball": "https://verdaccio.lossless.digital/@tsclass/tsclass/-/tsclass-9.4.0.tgz" + "tarball": "https://verdaccio.lossless.digital/@tsclass/tsclass/-/tsclass-9.5.0.tgz" }, "@tybys/wasm-util@0.10.1": { "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", @@ -3771,8 +3770,8 @@ ], "tarball": "https://verdaccio.lossless.digital/bare-path/-/bare-path-3.0.0.tgz" }, - "bare-stream@2.8.1_bare-events@2.8.2": { - "integrity": "sha512-bSeR8RfvbRwDpD7HWZvn8M3uYNDrk7m9DQjYOFkENZlXW8Ju/MPaqUPQq5LqJ3kyjEm07siTaAQ7wBKCU59oHg==", + "bare-stream@2.9.1_bare-events@2.8.2": { + "integrity": "sha512-S9lqQXbwhTEMffRhb3qTVT74M0qzLDgxt4+uV3wBwWj2e+uSYH49Yv1el9Mw+qPRk0o2f+ntXgTQHP7LypVGMA==", "dependencies": [ "bare-events", "streamx", @@ -3781,7 +3780,7 @@ "optionalPeers": [ "bare-events" ], - "tarball": "https://verdaccio.lossless.digital/bare-stream/-/bare-stream-2.8.1.tgz" + "tarball": "https://verdaccio.lossless.digital/bare-stream/-/bare-stream-2.9.1.tgz" }, "bare-url@2.3.2": { "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", @@ -4331,21 +4330,22 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "tarball": "https://verdaccio.lossless.digital/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" }, - "fast-xml-builder@1.1.3": { - "integrity": "sha512-1o60KoFw2+LWKQu3IdcfcFlGTW4dpqEWmjhYec6H82AYZU2TVBXep6tMl8Z1Y+wM+ZrzCwe3BZ9Vyd9N2rIvmg==", + "fast-xml-builder@1.1.4": { + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", "dependencies": [ "path-expression-matcher" ], - "tarball": "https://verdaccio.lossless.digital/fast-xml-builder/-/fast-xml-builder-1.1.3.tgz" + "tarball": "https://verdaccio.lossless.digital/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz" }, - "fast-xml-parser@5.4.1": { - "integrity": "sha512-BQ30U1mKkvXQXXkAGcuyUA/GA26oEB7NzOtsxCDtyu62sjGw5QraKFhx2Em3WQNjPw9PG6MQ9yuIIgkSDfGu5A==", + "fast-xml-parser@5.5.6": { + "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", "dependencies": [ "fast-xml-builder", + "path-expression-matcher", "strnum" ], "bin": true, - "tarball": "https://verdaccio.lossless.digital/fast-xml-parser/-/fast-xml-parser-5.4.1.tgz" + "tarball": "https://verdaccio.lossless.digital/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz" }, "fault@2.0.1": { "integrity": "sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==", @@ -4391,15 +4391,15 @@ ], "tarball": "https://verdaccio.lossless.digital/file-type/-/file-type-19.6.0.tgz" }, - "file-type@21.3.2": { - "integrity": "sha512-DLkUvGwep3poOV2wpzbHCOnSKGk1LzyXTv+aHFgN2VFl96wnp8YA9YjO2qPzg5PuL8q/SW9Pdi6WTkYOIh995w==", + "file-type@21.3.3": { + "integrity": "sha512-pNwbwz8c3aZ+GvbJnIsCnDjKvgCZLHxkFWLEFxU3RMa+Ey++ZSEfisvsWQMcdys6PpxQjWUOIDi1fifXsW3YRg==", "dependencies": [ "@tokenizer/inflate", "strtok3@10.3.4", "token-types@6.1.2", "uint8array-extras" ], - "tarball": "https://verdaccio.lossless.digital/file-type/-/file-type-21.3.2.tgz" + "tarball": "https://verdaccio.lossless.digital/file-type/-/file-type-21.3.3.tgz" }, "find-cache-dir@3.3.2": { "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", @@ -6158,9 +6158,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "tarball": "https://verdaccio.lossless.digital/safer-buffer/-/safer-buffer-2.1.2.tgz" }, - "sax@1.4.4": { - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", - "tarball": "https://verdaccio.lossless.digital/sax/-/sax-1.4.4.tgz" + "sax@1.6.0": { + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "tarball": "https://verdaccio.lossless.digital/sax/-/sax-1.6.0.tgz" }, "semver@6.3.1": { "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -6239,9 +6239,9 @@ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "tarball": "https://verdaccio.lossless.digital/signal-exit/-/signal-exit-4.1.0.tgz" }, - "simple-xml-to-json@1.2.3": { - "integrity": "sha512-kWJDCr9EWtZ+/EYYM5MareWj2cRnZGF93YDNpH4jQiHB+hBIZnfPFSQiVMzZOdk+zXWqTZ/9fTeQNu2DqeiudA==", - "tarball": "https://verdaccio.lossless.digital/simple-xml-to-json/-/simple-xml-to-json-1.2.3.tgz" + "simple-xml-to-json@1.2.4": { + "integrity": "sha512-3MY16e0ocMHL7N1ufpdObURGyX+lCo0T/A+y6VCwosLdH1HSda4QZl1Sdt/O+2qWp48WFi26XEp5rF0LoaL0Dg==", + "tarball": "https://verdaccio.lossless.digital/simple-xml-to-json/-/simple-xml-to-json-1.2.4.tgz" }, "smart-buffer@4.2.0": { "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", @@ -6295,14 +6295,14 @@ "integrity": "04e6926f662895354f3dd015203633b857297e2c", "tarball": "https://verdaccio.lossless.digital/sprintf-js/-/sprintf-js-1.0.3.tgz" }, - "streamx@2.23.0": { - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "streamx@2.24.0": { + "integrity": "sha512-PmzO9Pf1UnzKM9L7tzRv5idKMHTBlxY+XC3eWXCyM8uuIOs3sQAKJ+N+EJ1KRCWAeI9TTnbs+uTBj7t09cwb6g==", "dependencies": [ "events-universal", "fast-fifo", "text-decoder" ], - "tarball": "https://verdaccio.lossless.digital/streamx/-/streamx-2.23.0.tgz" + "tarball": "https://verdaccio.lossless.digital/streamx/-/streamx-2.24.0.tgz" }, "string-width@4.2.3": { "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", @@ -6339,9 +6339,9 @@ "integrity": "3c531942e908c2697c0ec344858c286c7ca0a60a", "tarball": "https://verdaccio.lossless.digital/strip-json-comments/-/strip-json-comments-2.0.1.tgz" }, - "strnum@2.2.0": { - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", - "tarball": "https://verdaccio.lossless.digital/strnum/-/strnum-2.2.0.tgz" + "strnum@2.2.1": { + "integrity": "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==", + "tarball": "https://verdaccio.lossless.digital/strnum/-/strnum-2.2.1.tgz" }, "strtok3@10.3.4": { "integrity": "sha512-KIy5nylvC5le1OdaaoCJ07L+8iQzJHGH6pWDuzS+d07Cu7n1MZ2x26P8ZKIWfbK02+XIL8Mp4RkWeqdUCrDMfg==", @@ -6829,23 +6829,23 @@ "packageJson": { "dependencies": [ "npm:@apiclient.xyz/cloudflare@^7.1.0", - "npm:@git.zone/tsbuild@^4.1.2", + "npm:@git.zone/tsbuild@^4.3.0", "npm:@git.zone/tsrun@^2.0.1", - "npm:@git.zone/tstest@^3.1.8", + "npm:@git.zone/tstest@^3.4.0", "npm:@peculiar/x509@^1.14.3", - "npm:@push.rocks/lik@^6.2.2", + "npm:@push.rocks/lik@^6.3.1", "npm:@push.rocks/qenv@^6.1.3", - "npm:@push.rocks/smartdata@^7.0.15", + "npm:@push.rocks/smartdata@^7.1.0", "npm:@push.rocks/smartdelay@^3.0.5", - "npm:@push.rocks/smartdns@^7.8.1", - "npm:@push.rocks/smartlog@^3.1.10", + "npm:@push.rocks/smartdns@^7.9.0", + "npm:@push.rocks/smartlog@^3.2.1", "npm:@push.rocks/smartnetwork@^4.4.0", "npm:@push.rocks/smartstring@^4.1.0", "npm:@push.rocks/smarttime@^4.2.3", "npm:@push.rocks/smartunique@^3.0.9", "npm:@push.rocks/taskbuffer@^6.1.2", - "npm:@tsclass/tsclass@^9.3.0", - "npm:@types/node@^25.2.3" + "npm:@tsclass/tsclass@^9.5.0", + "npm:@types/node@^25.5.0" ] } } diff --git a/package.json b/package.json index 66be128..ceafb17 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "@push.rocks/smartacme", "version": "9.2.0", "private": false, - "description": "A TypeScript-based ACME client for LetsEncrypt certificate management with a focus on simplicity and power.", + "description": "A TypeScript-based ACME client and server for certificate management with built-in CA, supporting LetsEncrypt and custom ACME authorities.", "main": "dist_ts/index.js", "typings": "dist_ts/index.d.ts", "type": "module", @@ -20,6 +20,9 @@ "LetsEncrypt", "TypeScript", "certificate management", + "certificate authority", + "ACME server", + "PKI", "DNS challenges", "SSL/TLS", "secure communication", @@ -28,9 +31,11 @@ "crypto", "MongoDB", "dns-01 challenge", + "http-01 challenge", "token-based challenges", "certificate renewal", - "wildcard certificates" + "wildcard certificates", + "RFC 8555" ], "author": "Task Venture Capital GmbH", "license": "MIT", diff --git a/readme.hints.md b/readme.hints.md index 05c511a..2c42788 100644 --- a/readme.hints.md +++ b/readme.hints.md @@ -43,10 +43,34 @@ Key implementation details: - `TaskManager.start()` is called in `SmartAcme.start()` and `TaskManager.stop()` in `SmartAcme.stop()`. - The "no cronjobs specified" log messages during tests come from taskbuffer's internal CronManager polling — harmless noise when no cron tasks are scheduled. +## ACME Directory Server (ts_server/) + +As of v9.2.0, a built-in ACME Directory Server lives under `ts_server/`. This is a full RFC 8555-compliant CA server that allows running your own Certificate Authority. + +Key files: +- `ts_server/server.classes.acmeserver.ts` — Top-level `AcmeServer` facade (start/stop/config) +- `ts_server/server.classes.ca.ts` — Self-signed root CA generation + certificate signing via `@peculiar/x509` +- `ts_server/server.classes.jws.verifier.ts` — JWS signature verification (inverse of `AcmeCrypto.createJws`) +- `ts_server/server.classes.router.ts` — Minimal HTTP router with `:param` support using raw `node:http` +- `ts_server/server.classes.nonce.ts` — Single-use replay nonce management +- `ts_server/server.classes.challenge.verifier.ts` — HTTP-01/DNS-01 verification (with bypass mode) +- `ts_server/server.classes.account.store.ts` — In-memory account storage +- `ts_server/server.classes.order.store.ts` — In-memory order/authz/challenge/cert storage +- `ts_server/server.handlers.*.ts` — Route handlers for each ACME endpoint + +Design decisions: +- Uses raw `node:http` (no framework dependency — `@api.global/typedserver` was explicitly removed in v8.1.0) +- Zero new dependencies: uses `node:crypto`, `@peculiar/x509`, and existing project deps +- Reuses `AcmeCrypto` for JWK thumbprint/base64url, ACME interfaces for response types, `AcmeError` patterns +- `AcmeCrypto.getAlg()` was made public (was private) for use by the JWS verifier +- Storage interfaces (`IServerAccountStore`, `IServerOrderStore`) are pluggable, with in-memory defaults +- `challengeVerification: false` option auto-approves challenges for testing +- `tsbuild tsfolders` automatically compiles `ts_server/` to `dist_ts_server/` + ## Dependency Notes - `acme-client` was replaced with custom implementation in `ts/acme/` + `@peculiar/x509` for CSR generation - `@push.rocks/smartfile`, `@api.global/typedserver`, `@push.rocks/smartrequest`, `@push.rocks/smartpromise` were removed as unused dependencies in v8.1.0 - The `@apiclient.xyz/cloudflare` `convenience` namespace is deprecated but still functional. The `Dns01Handler` accepts an `IConvenientDnsProvider` interface which remains stable. - Test imports use `@git.zone/tstest/tapbundle` (not `@push.rocks/tapbundle`) -- Build uses `tsbuild` (no flags needed, v4+) +- Build uses `tsbuild tsfolders` (v4.3.0+) — auto-discovers and compiles `ts/` and `ts_server/` directories diff --git a/readme.md b/readme.md index 23bfdb2..f695f1b 100644 --- a/readme.md +++ b/readme.md @@ -1,6 +1,6 @@ # @push.rocks/smartacme -A TypeScript-based ACME client for Let's Encrypt certificate management with a focus on simplicity and power. 🔒 +A TypeScript-based ACME client and server for certificate management with a focus on simplicity and power. Includes a full RFC 8555-compliant ACME client for Let's Encrypt and a built-in ACME Directory Server for running your own Certificate Authority. ## Issue Reporting and Security @@ -372,10 +372,117 @@ await smartAcme.stop(); server.close(); ``` +## ACME Directory Server (Built-in CA) + +SmartAcme includes a full RFC 8555-compliant ACME Directory Server, allowing you to run your own Certificate Authority. This is useful for internal PKI, development/testing environments, and air-gapped networks. + +### Quick Start — ACME Server + +```typescript +import { server } from '@push.rocks/smartacme'; + +const acmeServer = new server.AcmeServer({ + port: 14000, + challengeVerification: false, // Auto-approve challenges (for testing) + caOptions: { + commonName: 'My Internal CA', + certValidityDays: 365, + }, +}); + +await acmeServer.start(); +console.log(acmeServer.getDirectoryUrl()); // http://localhost:14000/directory +console.log(acmeServer.getCaCertPem()); // Root CA certificate in PEM format + +// ... use it, then shut down +await acmeServer.stop(); +``` + +### Server Options + +```typescript +interface IAcmeServerOptions { + port?: number; // Default: 14000 + hostname?: string; // Default: '0.0.0.0' + baseUrl?: string; // Auto-built from hostname:port if not provided + challengeVerification?: boolean; // Default: true. Set false to auto-approve challenges + caOptions?: { + commonName?: string; // CA subject CN (default: 'SmartACME Test CA') + validityDays?: number; // Root cert validity in days (default: 3650) + certValidityDays?: number; // Issued cert validity in days (default: 90) + }; +} +``` + +### Using the Server with SmartAcme Client + +Point the SmartAcme client at your own ACME server for a fully self-contained PKI: + +```typescript +import { SmartAcme, certmanagers, handlers, server } from '@push.rocks/smartacme'; + +// 1. Start your own CA +const acmeServer = new server.AcmeServer({ + port: 14000, + challengeVerification: false, +}); +await acmeServer.start(); + +// 2. Set up the client pointing at your CA +const memHandler = new handlers.Http01MemoryHandler(); +const smartAcme = new SmartAcme({ + accountEmail: 'admin@internal.example.com', + certManager: new certmanagers.MemoryCertManager(), + environment: 'integration', + challengeHandlers: [memHandler], + directoryUrl: acmeServer.getDirectoryUrl(), // Use your own CA! +}); + +await smartAcme.start(); +const cert = await smartAcme.getCertificateForDomain('myapp.internal'); +// cert.publicKey — PEM certificate chain signed by your CA +// cert.privateKey — PEM private key + +await smartAcme.stop(); +await acmeServer.stop(); +``` + +### Server Endpoints + +The ACME server implements all RFC 8555 endpoints: + +| Endpoint | Method | Description | +|----------|--------|-------------| +| `/directory` | GET | ACME directory with all endpoint URLs | +| `/new-nonce` | HEAD/GET | Fresh replay nonce | +| `/new-account` | POST | Account registration/lookup | +| `/new-order` | POST | Create certificate order | +| `/order/:id` | POST | Poll order status | +| `/authz/:id` | POST | Get authorization with challenges | +| `/challenge/:id` | POST | Trigger or poll challenge validation | +| `/finalize/:id` | POST | Submit CSR and issue certificate | +| `/cert/:id` | POST | Download PEM certificate chain | + +### Challenge Verification + +By default, the server performs real challenge verification (HTTP-01 fetches the token, DNS-01 queries TXT records). Set `challengeVerification: false` to auto-approve all challenges — useful for testing or internal environments where domain validation isn't needed. + +### Root CA Certificate + +Use `getCaCertPem()` to retrieve the root CA certificate for trust configuration: + +```typescript +import * as fs from 'fs'; +fs.writeFileSync('/usr/local/share/ca-certificates/my-ca.crt', acmeServer.getCaCertPem()); +// Then: sudo update-ca-certificates +``` + ## Architecture Under the hood, SmartAcme uses a fully custom RFC 8555-compliant ACME protocol implementation (no external ACME libraries). Key internal modules: +### Client Modules (`ts/acme/`) + | Module | Purpose | |--------|---------| | `AcmeClient` | Top-level ACME facade — orders, authorizations, finalization | @@ -386,7 +493,20 @@ Under the hood, SmartAcme uses a fully custom RFC 8555-compliant ACME protocol i | `AcmeChallengeManager` | Key authorization computation and challenge completion | | `TaskManager` | Constraint-based concurrency control, rate limiting, and request deduplication via `@push.rocks/taskbuffer` | -All cryptographic operations use `node:crypto`. The only external crypto dependency is `@peculiar/x509` for CSR generation. +### Server Modules (`ts_server/`) + +| Module | Purpose | +|--------|---------| +| `AcmeServer` | Top-level server facade — start, stop, configuration | +| `AcmeServerCA` | Self-signed root CA generation and certificate signing via `@peculiar/x509` | +| `JwsVerifier` | JWS signature verification (inverse of `AcmeCrypto.createJws`) | +| `NonceManager` | Single-use replay nonce generation and validation | +| `ChallengeVerifier` | HTTP-01 and DNS-01 challenge verification (with bypass mode) | +| `AcmeRouter` | Minimal HTTP router with parameterized path support | +| `MemoryAccountStore` | In-memory ACME account storage | +| `MemoryOrderStore` | In-memory order, authorization, challenge, and certificate storage | + +All cryptographic operations use `node:crypto`. The only external crypto dependency is `@peculiar/x509` for CSR generation and certificate signing. ## License and Legal Information diff --git a/ts/00_commitinfo_data.ts b/ts/00_commitinfo_data.ts index 39321c4..a86c8ac 100644 --- a/ts/00_commitinfo_data.ts +++ b/ts/00_commitinfo_data.ts @@ -3,6 +3,6 @@ */ export const commitinfo = { name: '@push.rocks/smartacme', - version: '9.2.0', - description: 'A TypeScript-based ACME client for LetsEncrypt certificate management with a focus on simplicity and power.' + version: '9.3.0', + description: 'A TypeScript-based ACME client and server for certificate management with built-in CA, supporting LetsEncrypt and custom ACME authorities.' }