sliccy 3.40.1 → 3.40.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/node-server/_shared/index.d.ts +2 -0
- package/dist/node-server/_shared/index.d.ts.map +1 -1
- package/dist/node-server/_shared/index.js +2 -0
- package/dist/node-server/_shared/index.js.map +1 -1
- package/dist/node-server/_shared/sign-and-forward.d.ts +75 -0
- package/dist/node-server/_shared/sign-and-forward.d.ts.map +1 -0
- package/dist/node-server/_shared/sign-and-forward.js +278 -0
- package/dist/node-server/_shared/sign-and-forward.js.map +1 -0
- package/dist/node-server/_shared/sigv4.d.ts +26 -0
- package/dist/node-server/_shared/sigv4.d.ts.map +1 -0
- package/dist/node-server/{secrets/signing-s3.js → _shared/sigv4.js} +8 -16
- package/dist/node-server/_shared/sigv4.js.map +1 -0
- package/dist/node-server/secrets/sign-and-forward.d.ts +6 -26
- package/dist/node-server/secrets/sign-and-forward.js +40 -247
- package/dist/ui/assets/__vite-browser-external-CM3Eme-n.js +1 -0
- package/dist/ui/assets/adobe-9MnG5h7i.js +2 -0
- package/dist/ui/assets/{adobe-BuddmT1_.js → adobe-BCOGa4JO.js} +1 -1
- package/dist/ui/assets/agent-bridge-DrtqeACp.js +1 -0
- package/dist/ui/assets/agent-message-to-chat-BadHh_U6.js +7 -0
- package/dist/ui/assets/{anthropic-BgHKqajT.js → anthropic-DOdK4eXe.js} +4 -4
- package/dist/ui/assets/{anthropic-CtzKOYSY.js → anthropic-DVQtRZtV.js} +2 -2
- package/dist/ui/assets/{apps-DUrh4PEK.js → apps-D6zYxCJj.js} +2 -2
- package/dist/ui/assets/azure-openai-Cr3DISar.js +1 -0
- package/dist/ui/assets/azure-openai-DX23xqSp.js +1 -0
- package/dist/ui/assets/azure-openai-responses-DXY_e5sT.js +1 -0
- package/dist/ui/assets/azure-openai-responses-KQPM7_wG.js +1 -0
- package/dist/ui/assets/backend-local-CMfz45hs.js +9 -0
- package/dist/ui/assets/bedrock-camp-CWvhREqw.js +4 -0
- package/dist/ui/assets/bedrock-camp-Cg_vY0Xg.js +5 -0
- package/dist/ui/assets/biome_wasm-DEjrJMqV.js +1 -0
- package/dist/ui/assets/{bsh-watchdog-x1NhC21S.js → bsh-watchdog-DVEMoD1Q.js} +1 -1
- package/dist/ui/assets/{cdp-CIf67Kji.js → cdp-lOc6_BAx.js} +4 -4
- package/dist/ui/assets/cdp-ws-page-bridge-D_PY6ku1.js +1 -0
- package/dist/ui/assets/chunk-CMxvf4Kt.js +1 -0
- package/dist/ui/assets/chunk-aKtaBQYM.js +1 -0
- package/dist/ui/assets/clipboard-C2cR8flR.js +1 -0
- package/dist/ui/assets/clipboard-DgFtRQbq.js +1 -0
- package/dist/ui/assets/common-ewBM5he1.js +1 -0
- package/dist/ui/assets/{connect-surface-D4wcacvR.js → connect-surface-DoTyR_ZG.js} +1 -1
- package/dist/ui/assets/cost-command-CThcmGZA.js +1 -0
- package/dist/ui/assets/diagnostics-DRDFDs4d.js +1 -0
- package/dist/ui/assets/diagnostics-mI-AnKx_.js +1 -0
- package/dist/ui/assets/{dist-CUdWMJvw.js → dist-BrPNw_vU.js} +4 -4
- package/dist/ui/assets/{dist-CU640e2s.js → dist-C9EWpOKG.js} +1 -1
- package/dist/ui/assets/{dist-CrZ60vIK.js → dist-Cu5Yqq5d2.js} +1 -1
- package/dist/ui/assets/{dist-CXh0a315.js → dist-DbTbRU9p2.js} +4 -4
- package/dist/ui/assets/{es-BCqpNDbf.js → es-Do-6wb2C.js} +5 -5
- package/dist/ui/assets/{esp32-z35G3TbR.js → esp32-BTVUAltJ.js} +1 -1
- package/dist/ui/assets/esp32-CatgC_Vd.js +1 -0
- package/dist/ui/assets/{esp32c2-gLxOsZif.js → esp32c2-CpROmlB0.js} +1 -1
- package/dist/ui/assets/{esp32c2-pl5qy6El.js → esp32c2-Cvhq9547.js} +1 -1
- package/dist/ui/assets/{esp32c3-P3fd2u0V.js → esp32c3-D9lOBWYZ.js} +1 -1
- package/dist/ui/assets/esp32c3-heViyR1Q.js +1 -0
- package/dist/ui/assets/{esp32c5-B1WV7eXo.js → esp32c5-D2poFXyG.js} +1 -1
- package/dist/ui/assets/{esp32c5-VtJmrubf.js → esp32c5-KJSqwo2Q.js} +1 -1
- package/dist/ui/assets/{esp32c6-B-u1dpSJ.js → esp32c6-BMEnOhZ6.js} +1 -1
- package/dist/ui/assets/{esp32c6-roW5XaV9.js → esp32c6-Ct3LxBMw.js} +1 -1
- package/dist/ui/assets/{esp32c61-BEqxfS6j.js → esp32c61-BsudQf3e.js} +1 -1
- package/dist/ui/assets/{esp32c61-e_DudgN9.js → esp32c61-sRp43nbI.js} +1 -1
- package/dist/ui/assets/{esp32h2-BNSoMBaR.js → esp32h2-BKv-WORi.js} +1 -1
- package/dist/ui/assets/{esp32h2-DfHWoI2F.js → esp32h2-CPO25efF.js} +1 -1
- package/dist/ui/assets/{esp32p4-B28QO5xI.js → esp32p4-GHiT8voO.js} +1 -1
- package/dist/ui/assets/{esp32p4-oT03skoL.js → esp32p4-g1tFG0sh.js} +1 -1
- package/dist/ui/assets/{esp32s2-PvYKf6wY.js → esp32s2-BE2gO68i.js} +1 -1
- package/dist/ui/assets/{esp32s2-B4ccaXVM.js → esp32s2-DrH4e7iJ.js} +1 -1
- package/dist/ui/assets/{esp32s3-BEGROUfT.js → esp32s3-BHbeScNz.js} +1 -1
- package/dist/ui/assets/{esp32s3-BR5mq9LB.js → esp32s3-CjMu3q4c.js} +1 -1
- package/dist/ui/assets/esp8266-BPLrOmN4.js +1 -0
- package/dist/ui/assets/esp8266-DNz2CP4r.js +1 -0
- package/dist/ui/assets/esptool-operations-CiX8mbpu.js +12 -0
- package/dist/ui/assets/{esptool-operations-BmdDP4Te.js → esptool-operations-SV6FPHJC.js} +2 -2
- package/dist/ui/assets/{follower-sprinkle-bridge-DhhhEoEw.js → follower-sprinkle-bridge-DTufY-0i.js} +1 -1
- package/dist/ui/assets/fs-DqDo5o60.js +1 -0
- package/dist/ui/assets/github-CNn2NQAt.js +1 -0
- package/dist/ui/assets/github-DBywtHRG.js +2 -0
- package/dist/ui/assets/github-copilot-8wjbN6nq.js +1 -0
- package/dist/ui/assets/github-copilot-Dy9dkbr7.js +2 -0
- package/dist/ui/assets/google-BbVPHS50.js +1 -0
- package/dist/ui/assets/google-Dl6In6_I.js +1 -0
- package/dist/ui/assets/google-shared-BgawM9oG.js +11 -0
- package/dist/ui/assets/{google-shared-BqepQLFX.js → google-shared-BmpiIO3m.js} +3 -3
- package/dist/ui/assets/google-vertex-DGjVDVSA.js +1 -0
- package/dist/ui/assets/google-vertex-uZ8N77ah.js +1 -0
- package/dist/ui/assets/hid-device-registry-D2LsJCRr.js +1 -0
- package/dist/ui/assets/hosted-config-apply-uAym2aS5.js +1 -0
- package/dist/ui/assets/intercepted-oauth-tLpKagkf.js +1 -0
- package/dist/ui/assets/json-parse-BIGBjpLL.js +3 -0
- package/dist/ui/assets/json-parse-BUunmmNl.js +3 -0
- package/dist/ui/assets/kernel-worker-Cb8hTQlK.js +9547 -0
- package/dist/ui/assets/lick-ws-bridge-BiG3e_g1.js +1 -0
- package/dist/ui/assets/{local-llm-BSBAbQIB.js → local-llm-BazZFDj_.js} +2 -2
- package/dist/ui/assets/logger-DDBAeTLF.js +1 -0
- package/dist/ui/assets/logger-LESFN7Hj.js +1 -0
- package/dist/ui/assets/magick-wasm-DKLq0X9v.js +1 -0
- package/dist/ui/assets/main-cherry-_7zmLxgg.js +1 -0
- package/dist/ui/assets/main-yZCsVpFH.js +1813 -0
- package/dist/ui/assets/migration-run-CXbSDDok.js +1 -0
- package/dist/ui/assets/mime-types-B9LIwKG5.js +1 -0
- package/dist/ui/assets/mime-types-BG9Gw1bq.js +1 -0
- package/dist/ui/assets/{mistral-BgklU_Dp.js → mistral-CMJILYv2.js} +4 -4
- package/dist/ui/assets/{mistral-DzTfCccO.js → mistral-DGtcP1BQ.js} +4 -4
- package/dist/ui/assets/mount-C3YOm4Wn.js +1 -0
- package/dist/ui/assets/mount-id-nJcx05eu.js +1 -0
- package/dist/ui/assets/mount-picker-popup-DncaR5N8.js +1 -0
- package/dist/ui/assets/mount-table-store-CQJEV6Ij.js +1 -0
- package/dist/ui/assets/nodejs-BQ9Oov1A.js +1 -0
- package/dist/ui/assets/{nuke-command-B02fs5G-.js → nuke-command-Dmc-Sve3.js} +1 -1
- package/dist/ui/assets/oauth-Czw-MuuR.js +1 -0
- package/dist/ui/assets/oauth-bootstrap-C_DI66X8.js +2 -0
- package/dist/ui/assets/oauth-service-CFSmb2Xq.js +1 -0
- package/dist/ui/assets/oauth-service-CSJo71ct.js +1 -0
- package/dist/ui/assets/offscreen-client-Bn2ErFJg.js +1 -0
- package/dist/ui/assets/onboarding-orchestrator-DbSXIbPW.js +1 -0
- package/dist/ui/assets/openai-codex-BehcTqf4.js +1 -0
- package/dist/ui/assets/openai-codex-Df_T8mMz.js +1 -0
- package/dist/ui/assets/openai-codex-responses-Dpn8XW3b.js +7 -0
- package/dist/ui/assets/openai-codex-responses-bUy20doI.js +7 -0
- package/dist/ui/assets/openai-completions-B_5Ph3h0.js +5 -0
- package/dist/ui/assets/openai-completions-CoYClIFl.js +5 -0
- package/dist/ui/assets/openai-i4HWKCeW.js +16 -0
- package/dist/ui/assets/openai-responses-BQOBB5px.js +1 -0
- package/dist/ui/assets/openai-responses-DqkDb9a5.js +1 -0
- package/dist/ui/assets/{openai-responses-shared-CsK-8CQH.js → openai-responses-shared-CZOJCHE4.js} +4 -4
- package/dist/ui/assets/{openai-responses-shared-DYSAljRs.js → openai-responses-shared-D4pZ3bEY.js} +4 -4
- package/dist/ui/assets/openrouter-QETwrep8.js +1 -0
- package/dist/ui/assets/panel-rpc-Bcvr75SR.js +1 -0
- package/dist/ui/assets/panel-rpc-handlers-Bb_hIEUP.js +2 -0
- package/dist/ui/assets/path-utils-DU6QhF_k.js +1 -0
- package/dist/ui/assets/picker-approval-tzbkMw-e.js +9 -0
- package/dist/ui/assets/preload-helper-zJ_50EbN.js +1 -0
- package/dist/ui/assets/provider-Ba-IW-kd.js +2 -0
- package/dist/ui/assets/provider-CZ54o1eC.js +1 -0
- package/dist/ui/assets/provider-settings-CY5NYsC9.js +99 -0
- package/dist/ui/assets/provider-store-access-DV4kHL4p.js +1 -0
- package/dist/ui/assets/provider-store-access-xEJhUgjR.js +1 -0
- package/dist/ui/assets/providers-B-C_YTn6.js +1 -0
- package/dist/ui/assets/{proxied-fetch-CW9YdsrT.js → proxied-fetch-Bhc4pqzp.js} +1 -1
- package/dist/ui/assets/pyodide-BvA4c-59.js +3 -0
- package/dist/ui/assets/remote-cache-_bhYZSLy.js +1 -0
- package/dist/ui/assets/{remote-terminal-view-ChqlFNm7.js → remote-terminal-view-C1K2ToGt.js} +3 -3
- package/dist/ui/assets/{remote-vfs-client-Cc4yBMI0.js → remote-vfs-client-BwJhhtIV.js} +1 -1
- package/dist/ui/assets/secret-env-DcfTe28K.js +1 -0
- package/dist/ui/assets/slicc-editor-BdfBeQCF.js +12 -0
- package/dist/ui/assets/{spawn-7Vgp-lrm.js → spawn-D6ZYDHli.js} +1 -1
- package/dist/ui/assets/{sql-wasm-BbdRW4or.js → sql-wasm-Cu5Uk_6k.js} +1 -1
- package/dist/ui/assets/{src-BV-fJ2mM.js → src-CcMujGBk.js} +2 -2
- package/dist/ui/assets/src-CpdsjHiA.js +1 -0
- package/dist/ui/assets/store-BHgxxLww.js +1 -0
- package/dist/ui/assets/{sudo-CYttizEB.js → sudo-Dflnt4_G.js} +1 -1
- package/dist/ui/assets/tool-ui-N76-EdVc.js +1 -0
- package/dist/ui/assets/tool-ui-YOPqzMmL.js +1 -0
- package/dist/ui/assets/transform-messages-B3Q-Bwv-.js +1 -0
- package/dist/ui/assets/transform-messages-C1X1O3BY.js +1 -0
- package/dist/ui/assets/{tray-leave-runtime-BYZH2LNU.js → tray-leave-runtime-BhHEXpRy.js} +1 -1
- package/dist/ui/assets/tray-runtime-config-BRnpyDNS.js +1 -0
- package/dist/ui/assets/types-idfTVsM8.js +1 -0
- package/dist/ui/assets/{typescript-DY6vxmmv.js → typescript-qBO0Z4wm.js} +15 -15
- package/dist/ui/assets/upgrade-detection-B04kAu_0.js +1 -0
- package/dist/ui/assets/web-BMWiUYJ-.js +1 -0
- package/dist/ui/assets/{writable-vfs-client-lsN1qOSV.js → writable-vfs-client-DMYsajEE.js} +1 -1
- package/dist/ui/assets/ws-subscribers-Dzuxa2F7.js +1 -0
- package/dist/ui/assets/xai-grok-B6Nl7COG.js +1 -0
- package/dist/ui/assets/xai-grok-i7HD-5Tv.js +1 -0
- package/dist/ui/index.html +15 -1
- package/dist/ui/packages/webapp/index.html +15 -1
- package/package.json +6 -5
- package/dist/node-server/secrets/signing-s3.d.ts +0 -34
- package/dist/ui/assets/adobe-DwuDVWKR.js +0 -2
- package/dist/ui/assets/agent-bridge-CQ_WHXpS.js +0 -1
- package/dist/ui/assets/agent-message-to-chat-Bk83dal6.js +0 -7
- package/dist/ui/assets/azure-openai-589UnBaE.js +0 -1
- package/dist/ui/assets/azure-openai-BVD3rRyh.js +0 -1
- package/dist/ui/assets/azure-openai-responses-DDoPpQfz.js +0 -1
- package/dist/ui/assets/azure-openai-responses-DvPlhYRg.js +0 -1
- package/dist/ui/assets/biome_wasm-2BIO-fFD.js +0 -1
- package/dist/ui/assets/cdp-ws-page-bridge-D48c5VHQ.js +0 -1
- package/dist/ui/assets/common-DJglxtI9.js +0 -1
- package/dist/ui/assets/cost-command-Dqjx5BJ4.js +0 -1
- package/dist/ui/assets/esp32-UFl3lGuU.js +0 -1
- package/dist/ui/assets/esp32c3-CtBZCzN8.js +0 -1
- package/dist/ui/assets/esp8266-Cg5dZq5p.js +0 -1
- package/dist/ui/assets/esp8266-MLobtggU.js +0 -1
- package/dist/ui/assets/esptool-operations-PyMOLbEo.js +0 -12
- package/dist/ui/assets/github-BmiOv8pZ.js +0 -1
- package/dist/ui/assets/github-H8WCUoaG.js +0 -2
- package/dist/ui/assets/github-copilot-CFrKRCIh.js +0 -2
- package/dist/ui/assets/github-copilot-LZq-2nbm.js +0 -1
- package/dist/ui/assets/google-Bwhr3ElU.js +0 -1
- package/dist/ui/assets/google-CDEKJo6s.js +0 -1
- package/dist/ui/assets/google-shared-DUInnTRv.js +0 -11
- package/dist/ui/assets/google-vertex-DOk_o4Vo.js +0 -1
- package/dist/ui/assets/google-vertex-Dy07djME.js +0 -1
- package/dist/ui/assets/hosted-config-apply-CIYq4OE-.js +0 -1
- package/dist/ui/assets/intercepted-oauth-DYoA2kA8.js +0 -1
- package/dist/ui/assets/kernel-worker-xMdP33ug.js +0 -9678
- package/dist/ui/assets/lick-ws-bridge-DLXsmZ6H.js +0 -1
- package/dist/ui/assets/magick-wasm-BpDug9Pm.js +0 -1
- package/dist/ui/assets/main-BxzufWem.js +0 -1825
- package/dist/ui/assets/main-cherry-CV5ItRlu.js +0 -1
- package/dist/ui/assets/migration-run-195D_oov.js +0 -1
- package/dist/ui/assets/nodejs-156RsPtl.js +0 -1
- package/dist/ui/assets/oauth-DSEOvfNU.js +0 -1
- package/dist/ui/assets/oauth-bootstrap-CCTPtyS_.js +0 -2
- package/dist/ui/assets/oauth-service-Ctr2_Obu.js +0 -1
- package/dist/ui/assets/oauth-service-LEczdutD.js +0 -1
- package/dist/ui/assets/offscreen-client-Dswx1Ljm.js +0 -1
- package/dist/ui/assets/onboarding-orchestrator-8SmCagx8.js +0 -1
- package/dist/ui/assets/openai-codex-CYM3h5BG.js +0 -1
- package/dist/ui/assets/openai-codex-D-QWKpWb.js +0 -1
- package/dist/ui/assets/openai-codex-responses-CbtdwhQL.js +0 -7
- package/dist/ui/assets/openai-codex-responses-CnQXtoLP.js +0 -7
- package/dist/ui/assets/openai-completions-CbUcQcuU.js +0 -5
- package/dist/ui/assets/openai-responses-DBGxMDFy.js +0 -1
- package/dist/ui/assets/openai-responses-DomGQu-u.js +0 -1
- package/dist/ui/assets/openrouter-i7KtgZt3.js +0 -1
- package/dist/ui/assets/panel-rpc-handlers-BeUo4K-9.js +0 -2
- package/dist/ui/assets/provider-CuOCGXmD.js +0 -1
- package/dist/ui/assets/provider-U8Br2pQO.js +0 -2
- package/dist/ui/assets/provider-store-access-CRMelzXC.js +0 -1
- package/dist/ui/assets/provider-store-access-D9JW2Z9f.js +0 -1
- package/dist/ui/assets/pyodide-BQVwxCA4.js +0 -3
- package/dist/ui/assets/secret-env-mFCaJWuD.js +0 -1
- package/dist/ui/assets/slicc-editor-Bn_0-CZl.js +0 -12
- package/dist/ui/assets/store-DUcHEhum.js +0 -1
- package/dist/ui/assets/upgrade-detection-BmNgOg4g.js +0 -1
- package/dist/ui/assets/web-DRaGEaSq.js +0 -1
- package/dist/ui/assets/ws-subscribers-CxhSakhG.js +0 -1
- package/dist/ui/assets/xai-grok-C0UPkvUi.js +0 -1
- package/dist/ui/assets/xai-grok-DEapxZue.js +0 -1
package/README.md
CHANGED
|
@@ -11,7 +11,7 @@ If this scares, confuses, or excites you, keep reading.
|
|
|
11
11
|
|
|
12
12
|
# slicc — Self-Licking Ice Cream Cone
|
|
13
13
|
|
|
14
|
-
[](https://github.com/ai-ecoverse/vibe-coded-badge-action)
|
|
15
15
|
|
|
16
16
|
[](https://www.npmjs.com/package/sliccy)
|
|
17
17
|
|
|
@@ -3,4 +3,6 @@ export * from './oauth-extra-domains-storage.js';
|
|
|
3
3
|
export * from './secret-masking.js';
|
|
4
4
|
export * from './secrets-pipeline.js';
|
|
5
5
|
export * from './session-secret-store.js';
|
|
6
|
+
export * from './sign-and-forward.js';
|
|
7
|
+
export * from './sigv4.js';
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC"}
|
|
@@ -4,4 +4,6 @@ export * from './oauth-extra-domains-storage.js';
|
|
|
4
4
|
export * from './secret-masking.js';
|
|
5
5
|
export * from './secrets-pipeline.js';
|
|
6
6
|
export * from './session-secret-store.js';
|
|
7
|
+
export * from './sign-and-forward.js';
|
|
8
|
+
export * from './sigv4.js';
|
|
7
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iFAAiF;AAEjF,cAAc,uBAAuB,CAAC;AACtC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared sign-and-forward orchestration for S3 and Adobe da.live mounts.
|
|
3
|
+
*
|
|
4
|
+
* The browser-side mount backends never compute SigV4 signatures or hold
|
|
5
|
+
* credentials. They post envelopes through a transport (CLI: HTTP POST to
|
|
6
|
+
* node-server's `/api/s3-sign-and-forward`; extension: `chrome.runtime`
|
|
7
|
+
* message to the service worker). All transports ultimately call into this
|
|
8
|
+
* module, which validates the envelope, resolves credentials via a pluggable
|
|
9
|
+
* async secret getter, signs (S3) or attaches a Bearer token (DA), forwards
|
|
10
|
+
* to upstream, and returns a JSON-cloneable reply.
|
|
11
|
+
*
|
|
12
|
+
* `executeS3SignAndForward` / `executeDaSignAndForward` are consumed by:
|
|
13
|
+
* - `packages/chrome-extension/src/service-worker.ts` (extension path,
|
|
14
|
+
* reads from `chrome.storage.local`)
|
|
15
|
+
* - `packages/node-server/src/secrets/sign-and-forward.ts` (CLI path,
|
|
16
|
+
* wraps these in Express handlers via a SecretStore adapter)
|
|
17
|
+
* - tests in `packages/shared-ts/tests/sign-and-forward.test.ts`
|
|
18
|
+
*/
|
|
19
|
+
declare const ALLOWED_METHODS: readonly ["GET", "PUT", "POST", "DELETE", "HEAD"];
|
|
20
|
+
type SignedMethod = (typeof ALLOWED_METHODS)[number];
|
|
21
|
+
export interface S3SignAndForwardEnvelope {
|
|
22
|
+
profile: string;
|
|
23
|
+
method: SignedMethod;
|
|
24
|
+
bucket: string;
|
|
25
|
+
key: string;
|
|
26
|
+
query?: Record<string, string>;
|
|
27
|
+
headers?: Record<string, string>;
|
|
28
|
+
bodyBase64?: string | null;
|
|
29
|
+
}
|
|
30
|
+
export interface DaSignAndForwardEnvelope {
|
|
31
|
+
imsToken: string;
|
|
32
|
+
method: SignedMethod;
|
|
33
|
+
/** Path including leading slash, e.g. `/source/<org>/<repo>/<key>`. */
|
|
34
|
+
path: string;
|
|
35
|
+
query?: Record<string, string>;
|
|
36
|
+
headers?: Record<string, string>;
|
|
37
|
+
bodyBase64?: string | null;
|
|
38
|
+
}
|
|
39
|
+
export type SignAndForwardErrorCode = 'invalid_profile' | 'invalid_request' | 'profile_not_configured' | 'fetch_failed' | 'internal';
|
|
40
|
+
export interface SignAndForwardSuccess {
|
|
41
|
+
ok: true;
|
|
42
|
+
status: number;
|
|
43
|
+
headers: Record<string, string>;
|
|
44
|
+
bodyBase64: string;
|
|
45
|
+
}
|
|
46
|
+
export interface SignAndForwardFailure {
|
|
47
|
+
ok: false;
|
|
48
|
+
error: string;
|
|
49
|
+
errorCode: SignAndForwardErrorCode;
|
|
50
|
+
}
|
|
51
|
+
export type SignAndForwardReply = SignAndForwardSuccess | SignAndForwardFailure;
|
|
52
|
+
/**
|
|
53
|
+
* Async secret getter — async to support `chrome.storage.local` directly.
|
|
54
|
+
* Returns `undefined` for missing keys.
|
|
55
|
+
*/
|
|
56
|
+
export interface SecretGetter {
|
|
57
|
+
get(key: string): Promise<string | undefined>;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* S3 sign-and-forward. See module header for the architecture context.
|
|
61
|
+
*
|
|
62
|
+
* @param env Validated envelope from a transport layer.
|
|
63
|
+
* @param store Async secret getter (chrome.storage in SW; mock in tests).
|
|
64
|
+
* @param fetchImpl Injectable fetch — defaults to `globalThis.fetch`.
|
|
65
|
+
*/
|
|
66
|
+
export declare function executeS3SignAndForward(env: Partial<S3SignAndForwardEnvelope> | undefined, store: SecretGetter, fetchImpl?: typeof fetch): Promise<SignAndForwardReply>;
|
|
67
|
+
/**
|
|
68
|
+
* DA sign-and-forward. The IMS bearer token is passed transiently in the
|
|
69
|
+
* envelope (the browser already holds it via the existing Adobe LLM
|
|
70
|
+
* provider OAuth flow). Routing through this module gives architectural
|
|
71
|
+
* parity with S3 and a clean migration point for v2 server-side OAuth.
|
|
72
|
+
*/
|
|
73
|
+
export declare function executeDaSignAndForward(env: Partial<DaSignAndForwardEnvelope> | undefined, fetchImpl?: typeof fetch): Promise<SignAndForwardReply>;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=sign-and-forward.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-and-forward.d.ts","sourceRoot":"","sources":["../src/sign-and-forward.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAMH,QAAA,MAAM,eAAe,mDAAoD,CAAC;AAC1E,KAAK,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC;AAiBrD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,MAAM,MAAM,uBAAuB,GAC/B,iBAAiB,GACjB,iBAAiB,GACjB,wBAAwB,GACxB,cAAc,GACd,UAAU,CAAC;AAEf,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,IAAI,CAAC;IACT,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,KAAK,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,uBAAuB,CAAC;CACpC;AAED,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,GAAG,qBAAqB,CAAC;AAEhF;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC/C;AA2ID;;;;;;GAMG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,SAAS,EAClD,KAAK,EAAE,YAAY,EACnB,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAsF9B;AAED;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,SAAS,EAClD,SAAS,GAAE,OAAO,KAAa,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CA6D9B"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared sign-and-forward orchestration for S3 and Adobe da.live mounts.
|
|
3
|
+
*
|
|
4
|
+
* The browser-side mount backends never compute SigV4 signatures or hold
|
|
5
|
+
* credentials. They post envelopes through a transport (CLI: HTTP POST to
|
|
6
|
+
* node-server's `/api/s3-sign-and-forward`; extension: `chrome.runtime`
|
|
7
|
+
* message to the service worker). All transports ultimately call into this
|
|
8
|
+
* module, which validates the envelope, resolves credentials via a pluggable
|
|
9
|
+
* async secret getter, signs (S3) or attaches a Bearer token (DA), forwards
|
|
10
|
+
* to upstream, and returns a JSON-cloneable reply.
|
|
11
|
+
*
|
|
12
|
+
* `executeS3SignAndForward` / `executeDaSignAndForward` are consumed by:
|
|
13
|
+
* - `packages/chrome-extension/src/service-worker.ts` (extension path,
|
|
14
|
+
* reads from `chrome.storage.local`)
|
|
15
|
+
* - `packages/node-server/src/secrets/sign-and-forward.ts` (CLI path,
|
|
16
|
+
* wraps these in Express handlers via a SecretStore adapter)
|
|
17
|
+
* - tests in `packages/shared-ts/tests/sign-and-forward.test.ts`
|
|
18
|
+
*/
|
|
19
|
+
import { signSigV4 } from './sigv4.js';
|
|
20
|
+
// ---------------- envelope contract ----------------
|
|
21
|
+
const ALLOWED_METHODS = ['GET', 'PUT', 'POST', 'DELETE', 'HEAD'];
|
|
22
|
+
const PROFILE_NAME_REGEX = /^[a-zA-Z0-9._-]+$/;
|
|
23
|
+
const HOP_BY_HOP = new Set([
|
|
24
|
+
'connection',
|
|
25
|
+
'keep-alive',
|
|
26
|
+
'proxy-authenticate',
|
|
27
|
+
'proxy-authorization',
|
|
28
|
+
'te',
|
|
29
|
+
'trailer',
|
|
30
|
+
'transfer-encoding',
|
|
31
|
+
'upgrade',
|
|
32
|
+
]);
|
|
33
|
+
const DA_ORIGIN = 'https://admin.da.live';
|
|
34
|
+
function nodeBuffer() {
|
|
35
|
+
return globalThis.Buffer;
|
|
36
|
+
}
|
|
37
|
+
function decodeBase64(b64) {
|
|
38
|
+
// Node fast-path: Buffer.from decodes the multi-MB S3 mount payloads the CLI
|
|
39
|
+
// float moves far faster than the per-byte atob loop. Feature-detected so the
|
|
40
|
+
// browser and extension service-worker bundles (no Buffer global) fall back to
|
|
41
|
+
// the universal path. Buffer extends Uint8Array, so the return type holds.
|
|
42
|
+
const B = nodeBuffer();
|
|
43
|
+
if (B) {
|
|
44
|
+
return B.from(b64, 'base64');
|
|
45
|
+
}
|
|
46
|
+
// atob is a global in browsers, extension service workers, and Node 22+.
|
|
47
|
+
const binary = atob(b64);
|
|
48
|
+
const bytes = new Uint8Array(binary.length);
|
|
49
|
+
for (let i = 0; i < binary.length; i++) {
|
|
50
|
+
bytes[i] = binary.charCodeAt(i);
|
|
51
|
+
}
|
|
52
|
+
return bytes;
|
|
53
|
+
}
|
|
54
|
+
function encodeBase64(bytes) {
|
|
55
|
+
// Node fast-path — see decodeBase64.
|
|
56
|
+
const B = nodeBuffer();
|
|
57
|
+
if (B) {
|
|
58
|
+
return B.from(bytes).toString('base64');
|
|
59
|
+
}
|
|
60
|
+
let binary = '';
|
|
61
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
62
|
+
binary += String.fromCharCode(bytes[i]);
|
|
63
|
+
}
|
|
64
|
+
return btoa(binary);
|
|
65
|
+
}
|
|
66
|
+
function isAllowedMethod(m) {
|
|
67
|
+
return typeof m === 'string' && ALLOWED_METHODS.includes(m);
|
|
68
|
+
}
|
|
69
|
+
class ProfileNotConfiguredError extends Error {
|
|
70
|
+
constructor(message) {
|
|
71
|
+
super(message);
|
|
72
|
+
this.name = 'ProfileNotConfiguredError';
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async function resolveS3Profile(name, store) {
|
|
76
|
+
const accessKeyId = await store.get(`s3.${name}.access_key_id`);
|
|
77
|
+
const secretAccessKey = await store.get(`s3.${name}.secret_access_key`);
|
|
78
|
+
if (!accessKeyId) {
|
|
79
|
+
throw new ProfileNotConfiguredError(`profile '${name}' missing required field 'access_key_id'. ` +
|
|
80
|
+
`Set it via: secret set s3.${name}.access_key_id <value>`);
|
|
81
|
+
}
|
|
82
|
+
if (!secretAccessKey) {
|
|
83
|
+
throw new ProfileNotConfiguredError(`profile '${name}' missing required field 'secret_access_key'. ` +
|
|
84
|
+
`Set it via: secret set s3.${name}.secret_access_key <value>`);
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
accessKeyId,
|
|
88
|
+
secretAccessKey,
|
|
89
|
+
sessionToken: await store.get(`s3.${name}.session_token`),
|
|
90
|
+
region: (await store.get(`s3.${name}.region`)) ?? 'us-east-1',
|
|
91
|
+
endpoint: await store.get(`s3.${name}.endpoint`),
|
|
92
|
+
pathStyle: (await store.get(`s3.${name}.path_style`)) === 'true',
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function buildS3Url(profile, bucket, key, query) {
|
|
96
|
+
let host;
|
|
97
|
+
if (profile.endpoint) {
|
|
98
|
+
try {
|
|
99
|
+
host = new URL(profile.endpoint).host;
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
throw new Error(`profile endpoint is not a valid URL: ${profile.endpoint}`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
host = `s3.${profile.region}.amazonaws.com`;
|
|
107
|
+
}
|
|
108
|
+
const encodedKey = key.split('/').map(encodeURIComponent).join('/');
|
|
109
|
+
const encodedBucket = encodeURIComponent(bucket);
|
|
110
|
+
const pathPart = profile.pathStyle ? `${encodedBucket}/${encodedKey}` : encodedKey;
|
|
111
|
+
const hostPart = profile.pathStyle ? host : `${encodedBucket}.${host}`;
|
|
112
|
+
const url = new URL(`https://${hostPart}/${pathPart}`);
|
|
113
|
+
if (query) {
|
|
114
|
+
for (const [k, v] of Object.entries(query)) {
|
|
115
|
+
url.searchParams.set(k, v);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return url;
|
|
119
|
+
}
|
|
120
|
+
function passthroughHeaders(upstream) {
|
|
121
|
+
const out = {};
|
|
122
|
+
upstream.headers.forEach((value, key) => {
|
|
123
|
+
if (!HOP_BY_HOP.has(key.toLowerCase())) {
|
|
124
|
+
out[key] = value;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
return out;
|
|
128
|
+
}
|
|
129
|
+
// ---------------- orchestrators ----------------
|
|
130
|
+
/**
|
|
131
|
+
* S3 sign-and-forward. See module header for the architecture context.
|
|
132
|
+
*
|
|
133
|
+
* @param env Validated envelope from a transport layer.
|
|
134
|
+
* @param store Async secret getter (chrome.storage in SW; mock in tests).
|
|
135
|
+
* @param fetchImpl Injectable fetch — defaults to `globalThis.fetch`.
|
|
136
|
+
*/
|
|
137
|
+
export async function executeS3SignAndForward(env, store, fetchImpl = fetch) {
|
|
138
|
+
if (typeof env?.profile !== 'string' ||
|
|
139
|
+
env.profile.length === 0 ||
|
|
140
|
+
!PROFILE_NAME_REGEX.test(env.profile)) {
|
|
141
|
+
return {
|
|
142
|
+
ok: false,
|
|
143
|
+
error: 'invalid profile name (allowed: alphanumeric, dot, underscore, hyphen)',
|
|
144
|
+
errorCode: 'invalid_profile',
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
if (!isAllowedMethod(env.method)) {
|
|
148
|
+
return { ok: false, error: 'invalid method', errorCode: 'invalid_request' };
|
|
149
|
+
}
|
|
150
|
+
if (typeof env.bucket !== 'string' || env.bucket.length === 0) {
|
|
151
|
+
return { ok: false, error: 'invalid bucket', errorCode: 'invalid_request' };
|
|
152
|
+
}
|
|
153
|
+
if (typeof env.key !== 'string') {
|
|
154
|
+
return { ok: false, error: 'invalid key', errorCode: 'invalid_request' };
|
|
155
|
+
}
|
|
156
|
+
let profile;
|
|
157
|
+
try {
|
|
158
|
+
profile = await resolveS3Profile(env.profile, store);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
if (err instanceof ProfileNotConfiguredError) {
|
|
162
|
+
return { ok: false, error: err.message, errorCode: 'profile_not_configured' };
|
|
163
|
+
}
|
|
164
|
+
throw err;
|
|
165
|
+
}
|
|
166
|
+
let url;
|
|
167
|
+
try {
|
|
168
|
+
url = buildS3Url(profile, env.bucket, env.key, env.query);
|
|
169
|
+
}
|
|
170
|
+
catch (err) {
|
|
171
|
+
return {
|
|
172
|
+
ok: false,
|
|
173
|
+
error: err instanceof Error ? err.message : 'failed to build URL',
|
|
174
|
+
errorCode: 'invalid_request',
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
const body = typeof env.bodyBase64 === 'string' && env.bodyBase64.length > 0
|
|
178
|
+
? decodeBase64(env.bodyBase64)
|
|
179
|
+
: undefined;
|
|
180
|
+
const signed = await signSigV4({
|
|
181
|
+
method: env.method,
|
|
182
|
+
url,
|
|
183
|
+
headers: { ...(env.headers ?? {}), Host: url.host },
|
|
184
|
+
body,
|
|
185
|
+
}, {
|
|
186
|
+
accessKeyId: profile.accessKeyId,
|
|
187
|
+
secretAccessKey: profile.secretAccessKey,
|
|
188
|
+
sessionToken: profile.sessionToken,
|
|
189
|
+
}, profile.region, 's3');
|
|
190
|
+
let upstream;
|
|
191
|
+
try {
|
|
192
|
+
upstream = await fetchImpl(url.toString(), {
|
|
193
|
+
method: signed.method,
|
|
194
|
+
headers: signed.headers,
|
|
195
|
+
body: signed.body,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
return {
|
|
200
|
+
ok: false,
|
|
201
|
+
error: `S3 fetch failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
202
|
+
errorCode: 'fetch_failed',
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const upstreamBody = new Uint8Array(await upstream.arrayBuffer());
|
|
206
|
+
return {
|
|
207
|
+
ok: true,
|
|
208
|
+
status: upstream.status,
|
|
209
|
+
headers: passthroughHeaders(upstream),
|
|
210
|
+
bodyBase64: encodeBase64(upstreamBody),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* DA sign-and-forward. The IMS bearer token is passed transiently in the
|
|
215
|
+
* envelope (the browser already holds it via the existing Adobe LLM
|
|
216
|
+
* provider OAuth flow). Routing through this module gives architectural
|
|
217
|
+
* parity with S3 and a clean migration point for v2 server-side OAuth.
|
|
218
|
+
*/
|
|
219
|
+
export async function executeDaSignAndForward(env, fetchImpl = fetch) {
|
|
220
|
+
if (typeof env?.imsToken !== 'string' || env.imsToken.length === 0) {
|
|
221
|
+
return { ok: false, error: 'imsToken is required', errorCode: 'invalid_request' };
|
|
222
|
+
}
|
|
223
|
+
if (!isAllowedMethod(env.method)) {
|
|
224
|
+
return { ok: false, error: 'invalid method', errorCode: 'invalid_request' };
|
|
225
|
+
}
|
|
226
|
+
if (typeof env.path !== 'string' || !env.path.startsWith('/')) {
|
|
227
|
+
return {
|
|
228
|
+
ok: false,
|
|
229
|
+
error: 'path must be a string starting with /',
|
|
230
|
+
errorCode: 'invalid_request',
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
let url;
|
|
234
|
+
try {
|
|
235
|
+
url = new URL(DA_ORIGIN + env.path);
|
|
236
|
+
if (env.query) {
|
|
237
|
+
for (const [k, v] of Object.entries(env.query)) {
|
|
238
|
+
url.searchParams.set(k, v);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch (err) {
|
|
243
|
+
return {
|
|
244
|
+
ok: false,
|
|
245
|
+
error: err instanceof Error ? err.message : 'failed to build URL',
|
|
246
|
+
errorCode: 'invalid_request',
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
const body = typeof env.bodyBase64 === 'string' && env.bodyBase64.length > 0
|
|
250
|
+
? decodeBase64(env.bodyBase64)
|
|
251
|
+
: undefined;
|
|
252
|
+
let upstream;
|
|
253
|
+
try {
|
|
254
|
+
upstream = await fetchImpl(url.toString(), {
|
|
255
|
+
method: env.method,
|
|
256
|
+
headers: {
|
|
257
|
+
...(env.headers ?? {}),
|
|
258
|
+
Authorization: `Bearer ${env.imsToken}`,
|
|
259
|
+
},
|
|
260
|
+
body: body,
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
return {
|
|
265
|
+
ok: false,
|
|
266
|
+
error: `DA fetch failed: ${err instanceof Error ? err.message : String(err)}`,
|
|
267
|
+
errorCode: 'fetch_failed',
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
const upstreamBody = new Uint8Array(await upstream.arrayBuffer());
|
|
271
|
+
return {
|
|
272
|
+
ok: true,
|
|
273
|
+
status: upstream.status,
|
|
274
|
+
headers: passthroughHeaders(upstream),
|
|
275
|
+
bodyBase64: encodeBase64(upstreamBody),
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
//# sourceMappingURL=sign-and-forward.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sign-and-forward.js","sourceRoot":"","sources":["../src/sign-and-forward.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AWS SigV4 v4 signing — single platform-agnostic implementation.
|
|
3
|
+
*
|
|
4
|
+
* Pure function — given a request + credentials + region + service + clock,
|
|
5
|
+
* produces the same request with an `Authorization` header attached. Uses
|
|
6
|
+
* Web Crypto (`crypto.subtle`) which works in browsers, extension service
|
|
7
|
+
* workers, extension offscreen documents, and Node 22+ (where it lives on
|
|
8
|
+
* `globalThis.crypto`).
|
|
9
|
+
*
|
|
10
|
+
* Consumed via `@slicc/shared-ts` by the webapp/extension mount backends and
|
|
11
|
+
* the node-server sign-and-forward handlers. Verified against the canonical
|
|
12
|
+
* AWS SigV4 v4 test vectors in `packages/shared-ts/tests/sigv4.test.ts`.
|
|
13
|
+
*/
|
|
14
|
+
export interface SigV4Request {
|
|
15
|
+
method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'HEAD';
|
|
16
|
+
url: URL;
|
|
17
|
+
headers: Record<string, string>;
|
|
18
|
+
body?: Uint8Array;
|
|
19
|
+
}
|
|
20
|
+
export interface SigV4Credentials {
|
|
21
|
+
accessKeyId: string;
|
|
22
|
+
secretAccessKey: string;
|
|
23
|
+
sessionToken?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function signSigV4(req: SigV4Request, creds: SigV4Credentials, region: string, service?: string, now?: Date): Promise<SigV4Request>;
|
|
26
|
+
//# sourceMappingURL=sigv4.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sigv4.d.ts","sourceRoot":"","sources":["../src/sigv4.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACnD,GAAG,EAAE,GAAG,CAAC;IACT,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAyGD,wBAAsB,SAAS,CAC7B,GAAG,EAAE,YAAY,EACjB,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,MAAa,EACtB,GAAG,GAAE,IAAiB,GACrB,OAAO,CAAC,YAAY,CAAC,CA8DvB"}
|
|
@@ -1,24 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AWS SigV4 v4 signing —
|
|
3
|
-
*
|
|
4
|
-
* **Mirrored from `packages/webapp/src/fs/mount/signing-s3.ts`.** Both files
|
|
5
|
-
* are byte-for-byte equivalent in behavior and must stay in sync. The reason
|
|
6
|
-
* for two copies is that `tsconfig.cli.json` pins `rootDir` to
|
|
7
|
-
* `packages/node-server/src`, so cross-importing the webapp source under
|
|
8
|
-
* NodeNext resolution is rejected by the compiler. Sharing via a workspace
|
|
9
|
-
* package is a larger change than this PR's scope.
|
|
10
|
-
*
|
|
11
|
-
* Drift between the two copies is caught by both test suites running the
|
|
12
|
-
* same canonical AWS test vectors:
|
|
13
|
-
* - `packages/webapp/tests/fs/mount/signing-s3.test.ts`
|
|
14
|
-
* - `packages/node-server/tests/secrets/signing-s3.test.ts`
|
|
15
|
-
*
|
|
16
|
-
* If you change one, change the other and verify both test suites pass.
|
|
2
|
+
* AWS SigV4 v4 signing — single platform-agnostic implementation.
|
|
17
3
|
*
|
|
18
4
|
* Pure function — given a request + credentials + region + service + clock,
|
|
19
5
|
* produces the same request with an `Authorization` header attached. Uses
|
|
20
6
|
* Web Crypto (`crypto.subtle`) which works in browsers, extension service
|
|
21
|
-
* workers, and Node 22+ (where it lives on
|
|
7
|
+
* workers, extension offscreen documents, and Node 22+ (where it lives on
|
|
8
|
+
* `globalThis.crypto`).
|
|
9
|
+
*
|
|
10
|
+
* Consumed via `@slicc/shared-ts` by the webapp/extension mount backends and
|
|
11
|
+
* the node-server sign-and-forward handlers. Verified against the canonical
|
|
12
|
+
* AWS SigV4 v4 test vectors in `packages/shared-ts/tests/sigv4.test.ts`.
|
|
22
13
|
*/
|
|
23
14
|
const SIGNED_ALGORITHM = 'AWS4-HMAC-SHA256';
|
|
24
15
|
const EMPTY_BODY_HASH = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
|
|
@@ -139,3 +130,4 @@ export async function signSigV4(req, creds, region, service = 's3', now = new Da
|
|
|
139
130
|
},
|
|
140
131
|
};
|
|
141
132
|
}
|
|
133
|
+
//# sourceMappingURL=sigv4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sigv4.js","sourceRoot":"","sources":["../src/sigv4.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,36 +11,17 @@
|
|
|
11
11
|
* 4. Sign with SigV4 v4 (S3) or attach `Authorization: Bearer` (DA).
|
|
12
12
|
* 5. Forward to the upstream and return the response as a JSON envelope.
|
|
13
13
|
*
|
|
14
|
+
* The validate → resolve → sign → forward pipeline is shared with the
|
|
15
|
+
* extension service worker via `@slicc/shared-ts`. These handlers are thin
|
|
16
|
+
* Express adapters: they bridge the node-server `SecretStore` to the shared
|
|
17
|
+
* async `SecretGetter`, then map the structured reply onto an HTTP response.
|
|
18
|
+
*
|
|
14
19
|
* Logging contract: never log envelope contents — request bodies or the
|
|
15
20
|
* `imsToken` may contain credential material.
|
|
16
21
|
*/
|
|
17
22
|
import type { Request, Response } from 'express';
|
|
18
23
|
import type { SecretStore } from './types.js';
|
|
19
|
-
|
|
20
|
-
declare const ALLOWED_METHODS: readonly ["GET", "PUT", "POST", "DELETE", "HEAD"];
|
|
21
|
-
type SignedMethod = (typeof ALLOWED_METHODS)[number];
|
|
22
|
-
export interface S3SignAndForwardEnvelope {
|
|
23
|
-
profile: string;
|
|
24
|
-
method: SignedMethod;
|
|
25
|
-
bucket: string;
|
|
26
|
-
/** S3 key (the prefix is already baked in by the backend). */
|
|
27
|
-
key: string;
|
|
28
|
-
query?: Record<string, string>;
|
|
29
|
-
/** Extra headers from the backend (If-Match, Content-Type, ...). */
|
|
30
|
-
headers?: Record<string, string>;
|
|
31
|
-
/** Request body, base64-encoded. Null/absent for GET/HEAD/DELETE/listing. */
|
|
32
|
-
bodyBase64?: string | null;
|
|
33
|
-
}
|
|
34
|
-
export interface DaSignAndForwardEnvelope {
|
|
35
|
-
/** IMS bearer token, passed transiently. Never persisted server-side. */
|
|
36
|
-
imsToken: string;
|
|
37
|
-
method: SignedMethod;
|
|
38
|
-
/** Path including leading slash, e.g. `/source/<org>/<repo>/<key>`. */
|
|
39
|
-
path: string;
|
|
40
|
-
query?: Record<string, string>;
|
|
41
|
-
headers?: Record<string, string>;
|
|
42
|
-
bodyBase64?: string | null;
|
|
43
|
-
}
|
|
24
|
+
export type { DaSignAndForwardEnvelope, S3SignAndForwardEnvelope } from '../_shared/index.js';
|
|
44
25
|
/**
|
|
45
26
|
* Handle a `POST /api/s3-sign-and-forward` request. Validates the envelope,
|
|
46
27
|
* resolves credentials, signs, forwards, returns a JSON envelope.
|
|
@@ -60,4 +41,3 @@ export declare function handleS3SignAndForward(req: Request, res: Response, secr
|
|
|
60
41
|
* place to tighten the threat model in v2 (server-side OAuth).
|
|
61
42
|
*/
|
|
62
43
|
export declare function handleDaSignAndForward(req: Request, res: Response): Promise<void>;
|
|
63
|
-
export {};
|