feat(readme): document built-in ACME directory server and CA capabilities

This commit is contained in:
2026-03-19 09:29:13 +00:00
parent 47168408cc
commit e570ac6db0
6 changed files with 348 additions and 192 deletions

View File

@@ -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

370
deno.lock generated
View File

@@ -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"
]
}
}

View File

@@ -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",

View File

@@ -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

124
readme.md
View File

@@ -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

View File

@@ -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.'
}