@geekmidas/cli 10.0.0-alpha.124 → 10.0.0-alpha.126
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/dist/{EndpointGenerator-B2MUa4M2.cjs → EndpointGenerator-BGxf9jWE.cjs} +8 -4
- package/dist/{EndpointGenerator-B2MUa4M2.cjs.map → EndpointGenerator-BGxf9jWE.cjs.map} +1 -1
- package/dist/{EndpointGenerator-Z_BUTocT.mjs → EndpointGenerator-errMeldx.mjs} +8 -4
- package/dist/{EndpointGenerator-Z_BUTocT.mjs.map → EndpointGenerator-errMeldx.mjs.map} +1 -1
- package/dist/{GoDaddyProvider-55x4o-4z.mjs → GoDaddyProvider-CvRVmN4W.mjs} +2 -2
- package/dist/{GoDaddyProvider-55x4o-4z.mjs.map → GoDaddyProvider-CvRVmN4W.mjs.map} +1 -1
- package/dist/{GoDaddyProvider-0z5RAN1k.cjs → GoDaddyProvider-DFfpzCOP.cjs} +2 -2
- package/dist/{GoDaddyProvider-0z5RAN1k.cjs.map → GoDaddyProvider-DFfpzCOP.cjs.map} +1 -1
- package/dist/{LegacyStateStore-DRpB-yC5.cjs → LegacyStateStore-BFrCHrFQ.cjs} +3 -3
- package/dist/{LegacyStateStore-DRpB-yC5.cjs.map → LegacyStateStore-BFrCHrFQ.cjs.map} +1 -1
- package/dist/{LegacyStateStore-C-vumKSN.mjs → LegacyStateStore-CgfENrXF.mjs} +3 -3
- package/dist/{LegacyStateStore-C-vumKSN.mjs.map → LegacyStateStore-CgfENrXF.mjs.map} +1 -1
- package/dist/{LocalStateStore-C3ummuDT.cjs → LocalStateStore-BU5z_IOE.cjs} +2 -2
- package/dist/{LocalStateStore-C3ummuDT.cjs.map → LocalStateStore-BU5z_IOE.cjs.map} +1 -1
- package/dist/{LocalStateStore-CtOjpV1w.mjs → LocalStateStore-DxoNpiBg.mjs} +2 -2
- package/dist/{LocalStateStore-CtOjpV1w.mjs.map → LocalStateStore-DxoNpiBg.mjs.map} +1 -1
- package/dist/{OpenApiTsGenerator-MtnMQL_g.mjs → OpenApiTsGenerator-W_HRXH1X.mjs} +2 -2
- package/dist/{OpenApiTsGenerator-MtnMQL_g.mjs.map → OpenApiTsGenerator-W_HRXH1X.mjs.map} +1 -1
- package/dist/{OpenApiTsGenerator-t3_E98Fi.cjs → OpenApiTsGenerator-cQgtxWQo.cjs} +2 -2
- package/dist/{OpenApiTsGenerator-t3_E98Fi.cjs.map → OpenApiTsGenerator-cQgtxWQo.cjs.map} +1 -1
- package/dist/{S3StateStore-BC4Jm3Tw.mjs → S3StateStore-CGMSDilh.mjs} +2 -2
- package/dist/{S3StateStore-BC4Jm3Tw.mjs.map → S3StateStore-CGMSDilh.mjs.map} +1 -1
- package/dist/{S3StateStore-BeArp0aF.cjs → S3StateStore-DiekMLpn.cjs} +2 -2
- package/dist/{S3StateStore-BeArp0aF.cjs.map → S3StateStore-DiekMLpn.cjs.map} +1 -1
- package/dist/{SSMStateStore-DcstR6cW.cjs → SSMStateStore-BDCOFdKq.cjs} +2 -2
- package/dist/{SSMStateStore-DcstR6cW.cjs.map → SSMStateStore-BDCOFdKq.cjs.map} +1 -1
- package/dist/{SSMStateStore-Crl76aYZ.mjs → SSMStateStore-Cq2H9MlF.mjs} +2 -2
- package/dist/{SSMStateStore-Crl76aYZ.mjs.map → SSMStateStore-Cq2H9MlF.mjs.map} +1 -1
- package/dist/{SubscriberGenerator-COAVPgM-.mjs → SubscriberGenerator-BALddfuW.mjs} +4 -62
- package/dist/SubscriberGenerator-BALddfuW.mjs.map +1 -0
- package/dist/{SubscriberGenerator-C3QTae-R.cjs → SubscriberGenerator-LgyTxZ8r.cjs} +3 -91
- package/dist/SubscriberGenerator-LgyTxZ8r.cjs.map +1 -0
- package/dist/{add-BFjb6mMq.cjs → add-BsiBYkAW.cjs} +6 -6
- package/dist/{add-BFjb6mMq.cjs.map → add-BsiBYkAW.cjs.map} +1 -1
- package/dist/{add-CIjmgzkb.mjs → add-CamA9Uqv.mjs} +6 -6
- package/dist/{add-CIjmgzkb.mjs.map → add-CamA9Uqv.mjs.map} +1 -1
- package/dist/{bundler-D6KFNpQk.mjs → bundler-2V2PR_E-.mjs} +5 -5
- package/dist/{bundler-D6KFNpQk.mjs.map → bundler-2V2PR_E-.mjs.map} +1 -1
- package/dist/{bundler-CiUoIsku.cjs → bundler-CijtdIZ2.cjs} +5 -5
- package/dist/{bundler-CiUoIsku.cjs.map → bundler-CijtdIZ2.cjs.map} +1 -1
- package/dist/{cli-r4eUr98C.cjs → cli-7gc1QG8X.cjs} +3 -3
- package/dist/{cli-r4eUr98C.cjs.map → cli-7gc1QG8X.cjs.map} +1 -1
- package/dist/{cli-DNtSTtMc.mjs → cli-PiyYqHGx.mjs} +3 -3
- package/dist/{cli-DNtSTtMc.mjs.map → cli-PiyYqHGx.mjs.map} +1 -1
- package/dist/{compose-BfXXWJSp.cjs → compose-8e2xJ61E.cjs} +236 -39
- package/dist/compose-8e2xJ61E.cjs.map +1 -0
- package/dist/{compose-DJvvmF3X.mjs → compose-CvHIjMDd.mjs} +235 -38
- package/dist/compose-CvHIjMDd.mjs.map +1 -0
- package/dist/{config-IgK6YaGp.d.cts → config-CdytFgSR.d.cts} +3 -3
- package/dist/{config-IgK6YaGp.d.cts.map → config-CdytFgSR.d.cts.map} +1 -1
- package/dist/{config-kE-p5hxq.d.mts → config-_y1FGBWR.d.mts} +3 -3
- package/dist/{config-kE-p5hxq.d.mts.map → config-_y1FGBWR.d.mts.map} +1 -1
- package/dist/config.cjs +2 -2
- package/dist/config.d.cts +3 -3
- package/dist/config.d.mts +3 -3
- package/dist/config.mjs +2 -2
- package/dist/{credentialSchemas-AhIBuQxQ.cjs → credentialSchemas-DFxvGEwa.cjs} +2 -2
- package/dist/{credentialSchemas-AhIBuQxQ.cjs.map → credentialSchemas-DFxvGEwa.cjs.map} +1 -1
- package/dist/{credentialSchemas-DLKbxYBy.mjs → credentialSchemas-DaMpt-Dx.mjs} +2 -2
- package/dist/{credentialSchemas-DLKbxYBy.mjs.map → credentialSchemas-DaMpt-Dx.mjs.map} +1 -1
- package/dist/{databases-BPOgTn1u.mjs → databases-6GD0tI2F.mjs} +65 -3
- package/dist/databases-6GD0tI2F.mjs.map +1 -0
- package/dist/{databases-fOaoBInm.cjs → databases-CuVGf7-M.cjs} +75 -1
- package/dist/databases-CuVGf7-M.cjs.map +1 -0
- package/dist/deploy/public.cjs +8 -8
- package/dist/deploy/public.d.cts +3 -3
- package/dist/deploy/public.d.cts.map +1 -1
- package/dist/deploy/public.d.mts +3 -3
- package/dist/deploy/public.d.mts.map +1 -1
- package/dist/deploy/public.mjs +8 -8
- package/dist/{deploy-CiRYwFmr.mjs → deploy-CIPwTJ47.mjs} +797 -25
- package/dist/deploy-CIPwTJ47.mjs.map +1 -0
- package/dist/{deploy-BbI1UMh3.cjs → deploy-wSlIRPn5.cjs} +796 -24
- package/dist/deploy-wSlIRPn5.cjs.map +1 -0
- package/dist/{discover-BvJOVsYG.mjs → discover-CzGM5P3p.mjs} +71 -1
- package/dist/discover-CzGM5P3p.mjs.map +1 -0
- package/dist/{discover-ojkcbxHw.cjs → discover-DL6h-J97.cjs} +71 -1
- package/dist/discover-DL6h-J97.cjs.map +1 -0
- package/dist/{dokploy-C0aQrCgs.cjs → dokploy-BKbUrz05.cjs} +2 -2
- package/dist/{dokploy-C0aQrCgs.cjs.map → dokploy-BKbUrz05.cjs.map} +1 -1
- package/dist/{dokploy-MM7c3IE0.mjs → dokploy-BZf1AHd0.mjs} +2 -2
- package/dist/{dokploy-MM7c3IE0.mjs.map → dokploy-BZf1AHd0.mjs.map} +1 -1
- package/dist/{drivers-CQ32PB5w.cjs → drivers-C47nm-wB.cjs} +91 -4
- package/dist/drivers-C47nm-wB.cjs.map +1 -0
- package/dist/{drivers-Chb5Akov.mjs → drivers-CDjpjakg.mjs} +60 -3
- package/dist/drivers-CDjpjakg.mjs.map +1 -0
- package/dist/{eas-1Ee6kql0.mjs → eas-CxX2RCE_.mjs} +2 -2
- package/dist/{eas-1Ee6kql0.mjs.map → eas-CxX2RCE_.mjs.map} +1 -1
- package/dist/{eas-CJoys9yh.cjs → eas-DzDMGzfc.cjs} +2 -2
- package/dist/{eas-CJoys9yh.cjs.map → eas-DzDMGzfc.cjs.map} +1 -1
- package/dist/{emit-qvHxMV9b.cjs → emit-CYloptRS.cjs} +18 -1
- package/dist/emit-CYloptRS.cjs.map +1 -0
- package/dist/{emit-CNpuV_6Q.mjs → emit-CiJGdy_f.mjs} +18 -1
- package/dist/emit-CiJGdy_f.mjs.map +1 -0
- package/dist/{encryption-B8Bk1Mvu.mjs → encryption-BFSrt89F.mjs} +3 -3
- package/dist/{encryption-B8Bk1Mvu.mjs.map → encryption-BFSrt89F.mjs.map} +1 -1
- package/dist/{encryption-Bo9VlRnl.cjs → encryption-RNcBnG4Z.cjs} +3 -3
- package/dist/{encryption-Bo9VlRnl.cjs.map → encryption-RNcBnG4Z.cjs.map} +1 -1
- package/dist/{engine-esxTxcIx.cjs → engine-Dqe9KQCm.cjs} +142 -15
- package/dist/engine-Dqe9KQCm.cjs.map +1 -0
- package/dist/{engine-BuinpJfS.mjs → engine-_0pjyCd_.mjs} +142 -15
- package/dist/engine-_0pjyCd_.mjs.map +1 -0
- package/dist/{github-BEA4K3_X.cjs → github-Csev5EFf.cjs} +41 -6
- package/dist/github-Csev5EFf.cjs.map +1 -0
- package/dist/{github-BUlKJfOV.mjs → github-Dck0nLW9.mjs} +41 -6
- package/dist/github-Dck0nLW9.mjs.map +1 -0
- package/dist/{googlePlay-CiqAS2ma.cjs → googlePlay-DBtDAGBk.cjs} +3 -3
- package/dist/{googlePlay-CiqAS2ma.cjs.map → googlePlay-DBtDAGBk.cjs.map} +1 -1
- package/dist/{googlePlay-CK05QiTq.mjs → googlePlay-DTuvDHi5.mjs} +3 -3
- package/dist/{googlePlay-CK05QiTq.mjs.map → googlePlay-DTuvDHi5.mjs.map} +1 -1
- package/dist/{index-DhUf0B0m.d.mts → index-DrkV7N5w.d.mts} +2 -2
- package/dist/{index-4CO0HD27.d.cts.map → index-DrkV7N5w.d.mts.map} +1 -1
- package/dist/{index-4CO0HD27.d.cts → index-yaXZ9m-J.d.cts} +2 -2
- package/dist/{index-DhUf0B0m.d.mts.map → index-yaXZ9m-J.d.cts.map} +1 -1
- package/dist/index.cjs +150 -67
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +149 -66
- package/dist/index.mjs.map +1 -1
- package/dist/{migrate-C-hmbjpG.cjs → migrate-3ZEoqx5q.cjs} +3 -3
- package/dist/{migrate-C-hmbjpG.cjs.map → migrate-3ZEoqx5q.cjs.map} +1 -1
- package/dist/{migrate-BzCHT9qs.mjs → migrate-BABIuzQj.mjs} +3 -3
- package/dist/{migrate-BzCHT9qs.mjs.map → migrate-BABIuzQj.mjs.map} +1 -1
- package/dist/{migrate-CnbvrVag.mjs → migrate-DZeNpuX2.mjs} +8 -6
- package/dist/migrate-DZeNpuX2.mjs.map +1 -0
- package/dist/{migrate-DeQJBexh.cjs → migrate-pGiUqvBi.cjs} +8 -6
- package/dist/migrate-pGiUqvBi.cjs.map +1 -0
- package/dist/openapi.cjs +3 -3
- package/dist/openapi.d.cts +1 -1
- package/dist/openapi.d.mts +1 -1
- package/dist/openapi.mjs +3 -3
- package/dist/{publish-BISBrrqR.mjs → publish-BsnDeOVL.mjs} +2 -2
- package/dist/{publish-BISBrrqR.mjs.map → publish-BsnDeOVL.mjs.map} +1 -1
- package/dist/{publish-DtSIB-hZ.cjs → publish-CS6xDvGT.cjs} +2 -2
- package/dist/{publish-DtSIB-hZ.cjs.map → publish-CS6xDvGT.cjs.map} +1 -1
- package/dist/{ready-IVGu-q18.cjs → ready-CxPJm0Hc.cjs} +6 -6
- package/dist/{ready-IVGu-q18.cjs.map → ready-CxPJm0Hc.cjs.map} +1 -1
- package/dist/{ready-DqsyadOs.mjs → ready-DrvaAwKv.mjs} +6 -6
- package/dist/{ready-DqsyadOs.mjs.map → ready-DrvaAwKv.mjs.map} +1 -1
- package/dist/reconcile/public.cjs +2 -2
- package/dist/reconcile/public.d.cts +1 -1
- package/dist/reconcile/public.d.cts.map +1 -1
- package/dist/reconcile/public.d.mts +1 -1
- package/dist/reconcile/public.d.mts.map +1 -1
- package/dist/reconcile/public.mjs +2 -2
- package/dist/{resolve-BT7fkPN5.mjs → resolve-fCGJmM-R.mjs} +3 -3
- package/dist/{resolve-BT7fkPN5.mjs.map → resolve-fCGJmM-R.mjs.map} +1 -1
- package/dist/{resolve-C7GKQcE4.cjs → resolve-zqCMFio0.cjs} +3 -3
- package/dist/{resolve-C7GKQcE4.cjs.map → resolve-zqCMFio0.cjs.map} +1 -1
- package/dist/{rollback-DbP0KuDw.mjs → rollback-BkhVrtAf.mjs} +5 -5
- package/dist/{rollback-DbP0KuDw.mjs.map → rollback-BkhVrtAf.mjs.map} +1 -1
- package/dist/{rollback-BEiB-Pje.cjs → rollback-qc79mj6L.cjs} +5 -5
- package/dist/{rollback-BEiB-Pje.cjs.map → rollback-qc79mj6L.cjs.map} +1 -1
- package/dist/{runtime-BFJQNqwd.d.mts → runtime-DCkfI2E7.d.mts} +2 -2
- package/dist/{runtime-BFJQNqwd.d.mts.map → runtime-DCkfI2E7.d.mts.map} +1 -1
- package/dist/{runtime-BJO-FFef.d.cts → runtime-Ie4znWIB.d.cts} +2 -2
- package/dist/{runtime-BJO-FFef.d.cts.map → runtime-Ie4znWIB.d.cts.map} +1 -1
- package/dist/{s3-B4FTQQkV.mjs → s3-BZzSnker.mjs} +2 -2
- package/dist/{s3-B4FTQQkV.mjs.map → s3-BZzSnker.mjs.map} +1 -1
- package/dist/{s3-DwKLXwUT.cjs → s3-pqgmCTOq.cjs} +2 -2
- package/dist/{s3-DwKLXwUT.cjs.map → s3-pqgmCTOq.cjs.map} +1 -1
- package/dist/sandbox/credentials-worker.cjs +2 -2
- package/dist/sandbox/credentials-worker.mjs +2 -2
- package/dist/sandbox/discover-worker.cjs +1 -1
- package/dist/sandbox/discover-worker.mjs +1 -1
- package/dist/sandbox/migrate-worker.cjs +5 -4
- package/dist/sandbox/migrate-worker.cjs.map +1 -1
- package/dist/sandbox/migrate-worker.mjs +5 -4
- package/dist/sandbox/migrate-worker.mjs.map +1 -1
- package/dist/{seeds-DOfxmDRO.cjs → seeds-3awh33Wz.cjs} +607 -45
- package/dist/seeds-3awh33Wz.cjs.map +1 -0
- package/dist/{seeds-rG-Evfz9.mjs → seeds-Cfejy8wj.mjs} +517 -39
- package/dist/seeds-Cfejy8wj.mjs.map +1 -0
- package/dist/{serverSetup-CWWVcU6Y.cjs → serverSetup-BFQuwUeL.cjs} +6 -6
- package/dist/{serverSetup-CWWVcU6Y.cjs.map → serverSetup-BFQuwUeL.cjs.map} +1 -1
- package/dist/{serverSetup-xGw1fxuZ.mjs → serverSetup-C8ZbHTm_.mjs} +6 -6
- package/dist/{serverSetup-xGw1fxuZ.mjs.map → serverSetup-C8ZbHTm_.mjs.map} +1 -1
- package/dist/{sniffer-DVPgfyHr.mjs → sniffer-CCkdzjiU.mjs} +8 -8
- package/dist/{sniffer-DVPgfyHr.mjs.map → sniffer-CCkdzjiU.mjs.map} +1 -1
- package/dist/{sniffer-C7O9Pna_.cjs → sniffer-Cq1nhxIB.cjs} +8 -8
- package/dist/{sniffer-C7O9Pna_.cjs.map → sniffer-Cq1nhxIB.cjs.map} +1 -1
- package/dist/{snsSubscriptions-CSkteK2J.cjs → snsSubscriptions-DYyYP0Xf.cjs} +15 -3
- package/dist/snsSubscriptions-DYyYP0Xf.cjs.map +1 -0
- package/dist/{snsSubscriptions-CvBIGGp0.mjs → snsSubscriptions-R_AKBZYK.mjs} +4 -4
- package/dist/snsSubscriptions-R_AKBZYK.mjs.map +1 -0
- package/dist/{stage-fRfFtLwj.cjs → stage-BkgbVJ9Z.cjs} +6 -6
- package/dist/{stage-fRfFtLwj.cjs.map → stage-BkgbVJ9Z.cjs.map} +1 -1
- package/dist/{stage-2EKpzPQ1.mjs → stage-DCaxqm-G.mjs} +6 -6
- package/dist/{stage-2EKpzPQ1.mjs.map → stage-DCaxqm-G.mjs.map} +1 -1
- package/dist/{stages-B7mCWI_R.cjs → stages-3yUZaZeA.cjs} +2 -2
- package/dist/{stages-B7mCWI_R.cjs.map → stages-3yUZaZeA.cjs.map} +1 -1
- package/dist/{stages-DSltTW2d.mjs → stages-DTTv0NZW.mjs} +2 -2
- package/dist/{stages-DSltTW2d.mjs.map → stages-DTTv0NZW.mjs.map} +1 -1
- package/dist/target/public.cjs +1 -1
- package/dist/target/public.d.cts +2 -2
- package/dist/target/public.d.mts +2 -2
- package/dist/target/public.mjs +1 -1
- package/dist/{terminal-D1aeTkgv.cjs → terminal-PKhPAajN.cjs} +2 -2
- package/dist/{terminal-D1aeTkgv.cjs.map → terminal-PKhPAajN.cjs.map} +1 -1
- package/dist/{terminal-BAVrDhhN.mjs → terminal-bqY33lpN.mjs} +2 -2
- package/dist/{terminal-BAVrDhhN.mjs.map → terminal-bqY33lpN.mjs.map} +1 -1
- package/dist/{types-CFU2uvrz.d.cts → types-Bmjs4jZV.d.mts} +8 -2
- package/dist/{types-D3BeGucy.d.mts.map → types-Bmjs4jZV.d.mts.map} +1 -1
- package/dist/{types-D3BeGucy.d.mts → types-D0IsQxES.d.cts} +9 -1
- package/dist/{types-CFU2uvrz.d.cts.map → types-D0IsQxES.d.cts.map} +1 -1
- package/dist/vitest.cjs +1 -1
- package/dist/vitest.mjs +1 -1
- package/dist/workspace/index.cjs +1 -1
- package/dist/workspace/index.d.cts +2 -2
- package/dist/workspace/index.d.mts +2 -2
- package/dist/workspace/index.mjs +1 -1
- package/dist/{workspace-DUnnVjqC.mjs → workspace-DBHF9Gba.mjs} +5 -3
- package/dist/workspace-DBHF9Gba.mjs.map +1 -0
- package/dist/{workspace-C82GLPnf.cjs → workspace-Du4Afb03.cjs} +5 -3
- package/dist/workspace-Du4Afb03.cjs.map +1 -0
- package/package.json +17 -15
- package/dist/SubscriberGenerator-C3QTae-R.cjs.map +0 -1
- package/dist/SubscriberGenerator-COAVPgM-.mjs.map +0 -1
- package/dist/compose-BfXXWJSp.cjs.map +0 -1
- package/dist/compose-DJvvmF3X.mjs.map +0 -1
- package/dist/databases-BPOgTn1u.mjs.map +0 -1
- package/dist/databases-fOaoBInm.cjs.map +0 -1
- package/dist/deploy-BbI1UMh3.cjs.map +0 -1
- package/dist/deploy-CiRYwFmr.mjs.map +0 -1
- package/dist/discover-BvJOVsYG.mjs.map +0 -1
- package/dist/discover-ojkcbxHw.cjs.map +0 -1
- package/dist/drivers-CQ32PB5w.cjs.map +0 -1
- package/dist/drivers-Chb5Akov.mjs.map +0 -1
- package/dist/emit-CNpuV_6Q.mjs.map +0 -1
- package/dist/emit-qvHxMV9b.cjs.map +0 -1
- package/dist/engine-BuinpJfS.mjs.map +0 -1
- package/dist/engine-esxTxcIx.cjs.map +0 -1
- package/dist/github-BEA4K3_X.cjs.map +0 -1
- package/dist/github-BUlKJfOV.mjs.map +0 -1
- package/dist/migrate-CnbvrVag.mjs.map +0 -1
- package/dist/migrate-DeQJBexh.cjs.map +0 -1
- package/dist/seeds-DOfxmDRO.cjs.map +0 -1
- package/dist/seeds-rG-Evfz9.mjs.map +0 -1
- package/dist/snsSubscriptions-CSkteK2J.cjs.map +0 -1
- package/dist/snsSubscriptions-CvBIGGp0.mjs.map +0 -1
- package/dist/workspace-C82GLPnf.cjs.map +0 -1
- package/dist/workspace-DUnnVjqC.mjs.map +0 -1
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
const require_rolldown_runtime = require("./rolldown-runtime-C0BPl7ul.cjs");
|
|
2
2
|
const require_errors = require("./errors-DMC4Umsb.cjs");
|
|
3
3
|
const require_credentials = require("./credentials-D7XJypNd.cjs");
|
|
4
|
-
const require_workspace = require("./workspace-
|
|
4
|
+
const require_workspace = require("./workspace-Du4Afb03.cjs");
|
|
5
5
|
const require_derive = require("./derive-DAbo49sm.cjs");
|
|
6
|
-
const
|
|
6
|
+
const require_drivers = require("./drivers-C47nm-wB.cjs");
|
|
7
7
|
const require_identity = require("./identity-CbLfgQNT.cjs");
|
|
8
|
-
const require_EndpointGenerator = require("./EndpointGenerator-
|
|
9
|
-
const require_discover = require("./discover-
|
|
8
|
+
const require_EndpointGenerator = require("./EndpointGenerator-BGxf9jWE.cjs");
|
|
9
|
+
const require_discover = require("./discover-DL6h-J97.cjs");
|
|
10
10
|
const require_config = require("./config.cjs");
|
|
11
|
-
const
|
|
11
|
+
const require_SubscriberGenerator = require("./SubscriberGenerator-LgyTxZ8r.cjs");
|
|
12
|
+
const require_resolve = require("./resolve-zqCMFio0.cjs");
|
|
12
13
|
let node_path = require("node:path");
|
|
13
14
|
let node_fs = require("node:fs");
|
|
14
15
|
let node_fs_promises = require("node:fs/promises");
|
|
@@ -27,6 +28,7 @@ let _geekmidas_cache_postgres = require("@geekmidas/cache/postgres");
|
|
|
27
28
|
let dotenv = require("dotenv");
|
|
28
29
|
let node_util = require("node:util");
|
|
29
30
|
let _geekmidas_constructs_crons = require("@geekmidas/constructs/crons");
|
|
31
|
+
let _geekmidas_constructs_processors = require("@geekmidas/constructs/processors");
|
|
30
32
|
let _geekmidas_constructs_queue = require("@geekmidas/constructs/queue");
|
|
31
33
|
let _aws_sdk_client_s3 = require("@aws-sdk/client-s3");
|
|
32
34
|
let _aws_sdk_client_sns = require("@aws-sdk/client-sns");
|
|
@@ -488,6 +490,21 @@ function volumeOf(container) {
|
|
|
488
490
|
}[container];
|
|
489
491
|
}
|
|
490
492
|
//#endregion
|
|
493
|
+
//#region src/generators/processorRoute.ts
|
|
494
|
+
/**
|
|
495
|
+
* Where `gkm dev` serves a file server's processors, on the dev server of the
|
|
496
|
+
* app holding them: named after the file server.
|
|
497
|
+
*
|
|
498
|
+
* One definition for both sides — the dev server mounts it, and the local
|
|
499
|
+
* edge rewrites each processor pattern on the file server's host onto it — so
|
|
500
|
+
* the path the edge sends and the path the server answers cannot drift.
|
|
501
|
+
*/
|
|
502
|
+
const PROCESSORS_DEV_PREFIX = "/__gkm/processors/";
|
|
503
|
+
/** The base a file server's processors answer under, in `gkm dev`. */
|
|
504
|
+
function processorsDevRoute(fileServerId) {
|
|
505
|
+
return `${PROCESSORS_DEV_PREFIX}${fileServerId}`;
|
|
506
|
+
}
|
|
507
|
+
//#endregion
|
|
491
508
|
//#region src/reconcile/caddyfile.ts
|
|
492
509
|
/**
|
|
493
510
|
* The Caddy configuration a plan implies.
|
|
@@ -554,19 +571,26 @@ const LOCAL_TLD = "localhost";
|
|
|
554
571
|
* are a legitimate arrangement — two cache behaviours, one origin — and naming
|
|
555
572
|
* the host after the bucket would make them collide.
|
|
556
573
|
*/
|
|
557
|
-
function sitesFor(plan, project, addresses = {}) {
|
|
574
|
+
function sitesFor(plan, project, addresses = {}, processorAddresses = {}) {
|
|
558
575
|
const byId = new Map(plan.resources.map((r) => [r.id, r]));
|
|
559
576
|
const sites = [];
|
|
560
577
|
for (const resource of plan.resources) {
|
|
561
578
|
if (!EDGE_KINDS[resource.kind]) continue;
|
|
562
|
-
const host = hostFor(resource, project);
|
|
579
|
+
const host = hostFor$1(resource, project);
|
|
563
580
|
if (resource.kind === "file-server") {
|
|
564
581
|
const origin = resource.of ? byId.get(resource.of) : void 0;
|
|
565
582
|
if (!origin) continue;
|
|
583
|
+
const address = processorAddresses[resource.id];
|
|
584
|
+
const port = address ? portOf(address) : void 0;
|
|
566
585
|
sites.push({
|
|
567
586
|
host,
|
|
568
587
|
upstream: "http://minio:9000",
|
|
569
|
-
rewrite: `/${origin.name}{uri}
|
|
588
|
+
rewrite: `/${origin.name}{uri}`,
|
|
589
|
+
...resource.processors?.length && port ? { processors: {
|
|
590
|
+
prefixes: resource.processors,
|
|
591
|
+
upstream: `http://${HOST_GATEWAY$1}:${port}`,
|
|
592
|
+
under: processorsDevRoute(resource.id)
|
|
593
|
+
} } : {}
|
|
570
594
|
});
|
|
571
595
|
continue;
|
|
572
596
|
}
|
|
@@ -598,7 +622,7 @@ function portOf(address) {
|
|
|
598
622
|
* name, because an empty label makes `uploads..localhost` — a host nothing
|
|
599
623
|
* resolves and no certificate can be issued for.
|
|
600
624
|
*/
|
|
601
|
-
function hostFor(resource, project) {
|
|
625
|
+
function hostFor$1(resource, project) {
|
|
602
626
|
return [
|
|
603
627
|
resource.root && project ? stageOf(resource) : labelOf(resource),
|
|
604
628
|
project,
|
|
@@ -656,14 +680,24 @@ function toCaddyfile(sites) {
|
|
|
656
680
|
if (sites.length === 0) return `${GENERATED}
|
|
657
681
|
# No file server is declared in this stage, so it routes nothing.
|
|
658
682
|
`;
|
|
659
|
-
const blocks = sites.map(({ host, upstream, rewrite }) => `
|
|
683
|
+
const blocks = sites.map(({ host, upstream, rewrite, processors }) => `
|
|
660
684
|
https://${host} {
|
|
661
685
|
tls internal
|
|
662
686
|
|
|
663
687
|
# gkm's own header, which only a service of this stack may send: the auth
|
|
664
688
|
# server rate-limits by the client address it carries.
|
|
665
689
|
request_header -${_geekmidas_manifest.CLIENT_IP_HEADER}
|
|
666
|
-
|
|
690
|
+
${processors ? `
|
|
691
|
+
# Its processors' patterns, to the dev server holding them — under the
|
|
692
|
+
# route it mounts them on. Answered there, so the bucket below never is.
|
|
693
|
+
@processors path ${processors.prefixes.map((prefix) => `${prefix}*`).join(" ")}
|
|
694
|
+
handle @processors {
|
|
695
|
+
reverse_proxy ${processors.upstream} {
|
|
696
|
+
rewrite ${processors.under}{uri}
|
|
697
|
+
header_up Host {host}
|
|
698
|
+
}
|
|
699
|
+
}
|
|
700
|
+
` : ""}
|
|
667
701
|
reverse_proxy ${upstream} {${rewrite ? `
|
|
668
702
|
rewrite ${rewrite}
|
|
669
703
|
# MinIO routes and signs on the Host header, so forwarding the requested
|
|
@@ -848,13 +882,14 @@ function nodeOf(manifest, id) {
|
|
|
848
882
|
return node?.kind === "telemetry" ? node : void 0;
|
|
849
883
|
}
|
|
850
884
|
/**
|
|
851
|
-
* The `Telemetry` node the process for `id` — a surface
|
|
852
|
-
* construct id — emits through, or undefined
|
|
885
|
+
* The `Telemetry` node the process for `id` — a surface, a worker, or a file
|
|
886
|
+
* server's processor unit, by construct id — emits through, or undefined
|
|
887
|
+
* when it has no edge to one.
|
|
853
888
|
*/
|
|
854
889
|
function telemetryOf(manifest, id) {
|
|
855
890
|
const declaration = manifest[id];
|
|
856
891
|
if (!declaration) return void 0;
|
|
857
|
-
if (declaration.kind === "worker") return nodeOf(manifest, declaration.telemetry);
|
|
892
|
+
if (declaration.kind === "worker" || declaration.kind === "file-server") return nodeOf(manifest, declaration.telemetry);
|
|
858
893
|
if (declaration.kind !== "rest-api") return void 0;
|
|
859
894
|
return nodeOf(manifest, declaration.telemetry);
|
|
860
895
|
}
|
|
@@ -868,7 +903,7 @@ function appTelemetry(manifest, appName) {
|
|
|
868
903
|
}
|
|
869
904
|
/** Whether any process in the manifest emits through a `Telemetry` node. */
|
|
870
905
|
function usesTelemetry(manifest) {
|
|
871
|
-
return Object.entries(manifest).some(([id, d]) => (d.kind === "rest-api" || d.kind === "worker") && telemetryOf(manifest, id) !== void 0);
|
|
906
|
+
return Object.entries(manifest).some(([id, d]) => (d.kind === "rest-api" || d.kind === "worker" || d.kind === "file-server") && telemetryOf(manifest, id) !== void 0);
|
|
872
907
|
}
|
|
873
908
|
/**
|
|
874
909
|
* One process's share of the telemetry keys a stage resolved: all of them,
|
|
@@ -1071,11 +1106,11 @@ function resourceName(id, kind, stage, localStage) {
|
|
|
1071
1106
|
* broker the project selected, which is why the backend is an argument here
|
|
1072
1107
|
* rather than a second pass that adds containers after the fact.
|
|
1073
1108
|
*/
|
|
1074
|
-
function containerFor(kind, events = DEFAULT_EVENTS, cache =
|
|
1109
|
+
function containerFor(kind, events = DEFAULT_EVENTS, cache = require_drivers.DEFAULT_CACHE.aws, derived = false, edge = true) {
|
|
1075
1110
|
if (EVENT_KINDS[kind]) return EVENT_CONTAINERS[events] ?? CONTAINERS.database;
|
|
1076
1111
|
if (kind === "file-server") return edge ? "caddy" : CONTAINERS.objects;
|
|
1077
1112
|
if (kind === "cache") {
|
|
1078
|
-
if (derived && !
|
|
1113
|
+
if (derived && !require_drivers.holdsEveryCache(cache)) return CONTAINERS.database;
|
|
1079
1114
|
return CACHE_CONTAINERS[cache] ?? CONTAINERS.database;
|
|
1080
1115
|
}
|
|
1081
1116
|
return CONTAINERS[kind];
|
|
@@ -1092,7 +1127,7 @@ function planFor(manifest, stage, order, options = {}) {
|
|
|
1092
1127
|
const resources = [];
|
|
1093
1128
|
const fakes = {};
|
|
1094
1129
|
const events = options.events ?? "pgboss";
|
|
1095
|
-
const cache = options.cache ??
|
|
1130
|
+
const cache = options.cache ?? require_drivers.DEFAULT_CACHE.aws;
|
|
1096
1131
|
for (const id of order) {
|
|
1097
1132
|
const declaration = manifest[id];
|
|
1098
1133
|
if (!declaration) continue;
|
|
@@ -1108,7 +1143,7 @@ function planFor(manifest, stage, order, options = {}) {
|
|
|
1108
1143
|
port: fake.port
|
|
1109
1144
|
} : {}
|
|
1110
1145
|
};
|
|
1111
|
-
const detached = declaration.kind === "cache" &&
|
|
1146
|
+
const detached = declaration.kind === "cache" && require_drivers.holdsEveryCache(cache);
|
|
1112
1147
|
const container = fake?.image ? fake.key : declaration.kind === "telemetry" ? usesTelemetry(manifest) ? TELEMETRY_CONTAINER : void 0 : containerFor(declaration.kind, events, cache, "of" in declaration && typeof declaration.of === "string", options.edge !== false);
|
|
1113
1148
|
if (!container && !CONTAINERLESS[declaration.kind]) continue;
|
|
1114
1149
|
if (container) {
|
|
@@ -1129,7 +1164,8 @@ function planFor(manifest, stage, order, options = {}) {
|
|
|
1129
1164
|
...declaration.scheme ? { scheme: declaration.scheme } : {}
|
|
1130
1165
|
} : {},
|
|
1131
1166
|
...declaration.kind === "file-server" && declaration.open?.length ? { open: declaration.open } : {},
|
|
1132
|
-
...declaration.kind === "
|
|
1167
|
+
...declaration.kind === "file-server" && declaration.processors?.length ? { processors: [...new Set(declaration.processors.map((p) => p.prefix))].sort() } : {},
|
|
1168
|
+
...declaration.kind === "objects" && (0, _geekmidas_manifest.bucketExpiry)(manifest, id) ? { expire: (0, _geekmidas_manifest.bucketExpiry)(manifest, id) } : {},
|
|
1133
1169
|
...(declaration.kind === "rest-api" || declaration.kind === "site") && declaration.subdomain ? { subdomain: declaration.subdomain } : {},
|
|
1134
1170
|
...fake ? { fake: {
|
|
1135
1171
|
key: fake.key,
|
|
@@ -1478,7 +1514,7 @@ function urlFor(resource, plan, ports, project, addresses, credential) {
|
|
|
1478
1514
|
if (resource.kind === "rest-api" || resource.kind === "site") {
|
|
1479
1515
|
const address = addresses?.[resource.id];
|
|
1480
1516
|
const edge = plan.containers.includes("caddy") ? ports[primaryPortKey("caddy")] : void 0;
|
|
1481
|
-
return address && edge !== void 0 ? `https://${hostFor(resource, project)}:${edge}` : address;
|
|
1517
|
+
return address && edge !== void 0 ? `https://${hostFor$1(resource, project)}:${edge}` : address;
|
|
1482
1518
|
}
|
|
1483
1519
|
if (!resource.container) return void 0;
|
|
1484
1520
|
const port = ports[primaryPortKey(resource.container)];
|
|
@@ -1505,7 +1541,7 @@ function urlFor(resource, plan, ports, project, addresses, credential) {
|
|
|
1505
1541
|
case "file-server": {
|
|
1506
1542
|
const origin = plan.resources.find((r) => r.id === resource.of);
|
|
1507
1543
|
if (!origin) return void 0;
|
|
1508
|
-
return plan.containers.includes("caddy") ? `https://${hostFor(resource, project)}:${port}` : `http://${LOCAL_HOST}:${port}/${origin.name}`;
|
|
1544
|
+
return plan.containers.includes("caddy") ? `https://${hostFor$1(resource, project)}:${port}` : `http://${LOCAL_HOST}:${port}/${origin.name}`;
|
|
1509
1545
|
}
|
|
1510
1546
|
case "cache":
|
|
1511
1547
|
if (resource.of) {
|
|
@@ -2865,14 +2901,7 @@ var WorkerNameTaken = class extends require_errors.GkmError {
|
|
|
2865
2901
|
* @param background Each worker's files, from discovery's `background`.
|
|
2866
2902
|
*/
|
|
2867
2903
|
function workerUnits(workspace, manifest, background) {
|
|
2868
|
-
const hosts =
|
|
2869
|
-
const surface = Object.entries(manifest).find(([id, d]) => d.kind === "rest-api" && require_derive.appKey(id) === name)?.[1];
|
|
2870
|
-
return {
|
|
2871
|
-
name,
|
|
2872
|
-
root: (0, node_path.isAbsolute)(app.path) ? app.path : (0, node_path.join)(workspace.root, app.path),
|
|
2873
|
-
generated: !(surface?.kind === "rest-api" && surface.endpoints.length > 0)
|
|
2874
|
-
};
|
|
2875
|
-
}).sort((a, b) => a.name.localeCompare(b.name));
|
|
2904
|
+
const hosts = hostApps(workspace, manifest);
|
|
2876
2905
|
const units = [];
|
|
2877
2906
|
for (const [id, declaration] of Object.entries(manifest)) {
|
|
2878
2907
|
if (declaration.kind !== "worker") continue;
|
|
@@ -2880,12 +2909,8 @@ function workerUnits(workspace, manifest, background) {
|
|
|
2880
2909
|
if (files.length === 0) continue;
|
|
2881
2910
|
const name = require_derive.appKey(id);
|
|
2882
2911
|
if (workspace.apps[name]) throw new WorkerNameTaken(id, name);
|
|
2883
|
-
const
|
|
2884
|
-
|
|
2885
|
-
holds: files.filter((file) => isUnder(file, host.root)).length
|
|
2886
|
-
})).sort((a, b) => b.holds - a.holds || Number(b.host.generated) - Number(a.host.generated));
|
|
2887
|
-
const host = ranked[0]?.host;
|
|
2888
|
-
if (!host || ranked[0].holds === 0 && !host.generated) throw new WorkerHasNoApp(id);
|
|
2912
|
+
const host = hostFor(hosts, files);
|
|
2913
|
+
if (!host) throw new WorkerHasNoApp(id);
|
|
2889
2914
|
units.push({
|
|
2890
2915
|
id,
|
|
2891
2916
|
name,
|
|
@@ -2894,6 +2919,70 @@ function workerUnits(workspace, manifest, background) {
|
|
|
2894
2919
|
}
|
|
2895
2920
|
return units.sort((a, b) => a.name.localeCompare(b.name));
|
|
2896
2921
|
}
|
|
2922
|
+
/** The service and image name of a file server's processors: `assets-processors`. */
|
|
2923
|
+
function processorUnitName(fileServerId) {
|
|
2924
|
+
return `${require_derive.appKey(fileServerId.replace(/Server$/, ""))}-processors`;
|
|
2925
|
+
}
|
|
2926
|
+
/** A file server with processors and no backend app to build them from. */
|
|
2927
|
+
var ProcessorsHaveNoApp = class extends require_errors.GkmError {
|
|
2928
|
+
fileServer;
|
|
2929
|
+
constructor(fileServer) {
|
|
2930
|
+
super(`The file server '${fileServer}' has processors, and the workspace has no backend app that builds a server to carry their entry. Declare a RestApi whose app holds the processors' code.`);
|
|
2931
|
+
this.fileServer = fileServer;
|
|
2932
|
+
this.name = "ProcessorsHaveNoApp";
|
|
2933
|
+
}
|
|
2934
|
+
};
|
|
2935
|
+
/**
|
|
2936
|
+
* The processor units a workspace deploys — each file server with processors
|
|
2937
|
+
* — and the app each is built from, chosen as a worker's is: the backend app
|
|
2938
|
+
* holding the most of its processors' files.
|
|
2939
|
+
*/
|
|
2940
|
+
function processorUnits(workspace, manifest) {
|
|
2941
|
+
const hosts = hostApps(workspace, manifest);
|
|
2942
|
+
const units = [];
|
|
2943
|
+
for (const declaration of Object.values(manifest)) {
|
|
2944
|
+
if (declaration.kind !== "file-server") continue;
|
|
2945
|
+
const processors = declaration.processors ?? [];
|
|
2946
|
+
if (processors.length === 0) continue;
|
|
2947
|
+
const host = hostFor(hosts, processors.map(({ handler }) => {
|
|
2948
|
+
const file = handler.split("#")[0] ?? handler;
|
|
2949
|
+
return (0, node_path.isAbsolute)(file) ? file : (0, node_path.join)(workspace.root, file);
|
|
2950
|
+
}));
|
|
2951
|
+
if (!host) throw new ProcessorsHaveNoApp(declaration.id);
|
|
2952
|
+
const name = processorUnitName(declaration.id);
|
|
2953
|
+
if (workspace.apps[name]) throw new WorkerNameTaken(declaration.id, name);
|
|
2954
|
+
units.push({
|
|
2955
|
+
id: declaration.id,
|
|
2956
|
+
name,
|
|
2957
|
+
app: host.name
|
|
2958
|
+
});
|
|
2959
|
+
}
|
|
2960
|
+
return units.sort((a, b) => a.name.localeCompare(b.name));
|
|
2961
|
+
}
|
|
2962
|
+
/** The backend apps whose builds generate a server, each where it lives. */
|
|
2963
|
+
function hostApps(workspace, manifest) {
|
|
2964
|
+
return Object.entries(workspace.apps).filter(([, app]) => app.type === "backend" && !app.entry).map(([name, app]) => {
|
|
2965
|
+
const surface = Object.entries(manifest).find(([id, d]) => d.kind === "rest-api" && require_derive.appKey(id) === name)?.[1];
|
|
2966
|
+
return {
|
|
2967
|
+
name,
|
|
2968
|
+
root: (0, node_path.isAbsolute)(app.path) ? app.path : (0, node_path.join)(workspace.root, app.path),
|
|
2969
|
+
generated: !(surface?.kind === "rest-api" && surface.endpoints.length > 0)
|
|
2970
|
+
};
|
|
2971
|
+
}).sort((a, b) => a.name.localeCompare(b.name));
|
|
2972
|
+
}
|
|
2973
|
+
/**
|
|
2974
|
+
* The app holding the most of these files; then one that generates a server;
|
|
2975
|
+
* then by name. None when no app holds any and none generates a server.
|
|
2976
|
+
*/
|
|
2977
|
+
function hostFor(hosts, files) {
|
|
2978
|
+
const ranked = hosts.map((host) => ({
|
|
2979
|
+
host,
|
|
2980
|
+
holds: files.filter((file) => isUnder(file, host.root)).length
|
|
2981
|
+
})).sort((a, b) => b.holds - a.holds || Number(b.host.generated) - Number(a.host.generated));
|
|
2982
|
+
const host = ranked[0]?.host;
|
|
2983
|
+
if (!host || ranked[0].holds === 0 && !host.generated) return void 0;
|
|
2984
|
+
return host;
|
|
2985
|
+
}
|
|
2897
2986
|
/** Whether `file` is inside `dir`. */
|
|
2898
2987
|
function isUnder(file, dir) {
|
|
2899
2988
|
const rel = (0, node_path.relative)(dir, file);
|
|
@@ -3543,6 +3632,8 @@ function generateBackendDockerfile(options) {
|
|
|
3543
3632
|
}
|
|
3544
3633
|
/** The port a worker answers its health check on, inside its container. */
|
|
3545
3634
|
const WORKER_PORT = 3e3;
|
|
3635
|
+
/** The port a processor unit answers on, inside its container. */
|
|
3636
|
+
const PROCESSOR_PORT = 3e3;
|
|
3546
3637
|
/**
|
|
3547
3638
|
* A Worker's image: the same build as its host app's backend — a pruned
|
|
3548
3639
|
* slice, `gkm build --provider server --production` in the image, with the
|
|
@@ -3559,6 +3650,19 @@ function generateWorkerDockerfile(options) {
|
|
|
3559
3650
|
expose: false
|
|
3560
3651
|
});
|
|
3561
3652
|
}
|
|
3653
|
+
/**
|
|
3654
|
+
* A file server's processor unit: its host app's build, and the unit's bundle
|
|
3655
|
+
* as the runner. Its native packages — `sharp` — are installed for the image's
|
|
3656
|
+
* platform beside the bundle, at the versions the build resolved.
|
|
3657
|
+
*/
|
|
3658
|
+
function generateProcessorDockerfile(options) {
|
|
3659
|
+
return gkmBundleDockerfile(options, {
|
|
3660
|
+
title: `Processors Dockerfile (${options.fileServer})`,
|
|
3661
|
+
bundle: options.bundle,
|
|
3662
|
+
as: "processors.mjs",
|
|
3663
|
+
expose: true
|
|
3664
|
+
});
|
|
3665
|
+
}
|
|
3562
3666
|
function gkmBundleDockerfile(options, runner) {
|
|
3563
3667
|
const { port, healthCheckPath = "/health" } = options;
|
|
3564
3668
|
const { app } = layout(options);
|
|
@@ -3585,7 +3689,7 @@ RUN apk add --no-cache tini
|
|
|
3585
3689
|
RUN addgroup --system --gid 1001 nodejs && \\
|
|
3586
3690
|
adduser --system --uid 1001 hono
|
|
3587
3691
|
|
|
3588
|
-
# The bundled ${runner.as
|
|
3692
|
+
# The bundled ${runner.as.replace(/\.mjs$/, "")}
|
|
3589
3693
|
COPY --from=builder --chown=hono:nodejs ${app}/.gkm/server/dist/${runner.bundle} ./${runner.as === runner.bundle ? "" : runner.as}${externals.copy}
|
|
3590
3694
|
|
|
3591
3695
|
ENV NODE_ENV=production
|
|
@@ -4077,7 +4181,7 @@ async function storeFromConfig(workspace, config, options = {}) {
|
|
|
4077
4181
|
const profile = options.profile ? { profile: options.profile } : {};
|
|
4078
4182
|
switch (config.provider) {
|
|
4079
4183
|
case "s3": {
|
|
4080
|
-
const { S3SecretsStore } = await Promise.resolve().then(() => require("./s3-
|
|
4184
|
+
const { S3SecretsStore } = await Promise.resolve().then(() => require("./s3-pqgmCTOq.cjs"));
|
|
4081
4185
|
const { deployIdentity } = await Promise.resolve().then(() => require("./identity-CbLfgQNT.cjs")).then((n) => n.identity_exports);
|
|
4082
4186
|
const location = require_workspace.s3SecretsLocation(config, workspace.state);
|
|
4083
4187
|
return new S3SecretsStore({
|
|
@@ -4391,11 +4495,11 @@ function providerOf(workspace) {
|
|
|
4391
4495
|
* would be worse than a slower one.
|
|
4392
4496
|
*/
|
|
4393
4497
|
function cacheBackendFor(on) {
|
|
4394
|
-
return
|
|
4498
|
+
return require_drivers.DEFAULT_CACHE[on];
|
|
4395
4499
|
}
|
|
4396
4500
|
/** Where a declared bucket lives on a target. */
|
|
4397
4501
|
function storageBackendFor(on) {
|
|
4398
|
-
return
|
|
4502
|
+
return require_drivers.DEFAULT_STORAGE[on];
|
|
4399
4503
|
}
|
|
4400
4504
|
/**
|
|
4401
4505
|
* Which broker carries declared queues and topics on a target.
|
|
@@ -4404,7 +4508,7 @@ function storageBackendFor(on) {
|
|
|
4404
4508
|
* `Queue` has no events at all, whatever the target.
|
|
4405
4509
|
*/
|
|
4406
4510
|
function eventsBackendFor(on) {
|
|
4407
|
-
return
|
|
4511
|
+
return require_drivers.DEFAULT_EVENTS[on];
|
|
4408
4512
|
}
|
|
4409
4513
|
//#endregion
|
|
4410
4514
|
//#region src/reconcile/compose.ts
|
|
@@ -5681,7 +5785,7 @@ async function reconcile(options) {
|
|
|
5681
5785
|
...options.apps ? { apps: options.apps(plan.containers) } : {},
|
|
5682
5786
|
...options.objectWebhooks?.length ? { objectWebhooks: options.objectWebhooks } : {}
|
|
5683
5787
|
});
|
|
5684
|
-
const caddyfile = toCaddyfile(sitesFor(plan, project, options.addresses));
|
|
5788
|
+
const caddyfile = toCaddyfile(sitesFor(plan, project, options.addresses, options.processorAddresses));
|
|
5685
5789
|
const hash = planHash(plan, compose, {
|
|
5686
5790
|
caddyfile,
|
|
5687
5791
|
postgres: postgresStatements(plan, project, seed).map((statement) => statement.create).join(";\n")
|
|
@@ -5860,6 +5964,7 @@ var workspace_exports = /* @__PURE__ */ require_rolldown_runtime.__exportAll({
|
|
|
5860
5964
|
fakesApply: () => fakesApply,
|
|
5861
5965
|
localObjectWebhooks: () => localObjectWebhooks,
|
|
5862
5966
|
metroPorts: () => metroPorts,
|
|
5967
|
+
processorAddresses: () => processorAddresses,
|
|
5863
5968
|
reconcileWorkspace: () => reconcileWorkspace,
|
|
5864
5969
|
surfaceAddresses: () => surfaceAddresses
|
|
5865
5970
|
});
|
|
@@ -5951,6 +6056,7 @@ async function reconcileWorkspace(workspace, options) {
|
|
|
5951
6056
|
...backendsOf(workspace),
|
|
5952
6057
|
saved: await loadPortState(workspace.root),
|
|
5953
6058
|
addresses: surfaceAddresses(workspace, manifest),
|
|
6059
|
+
processorAddresses: processorAddresses(workspace, manifest),
|
|
5954
6060
|
metroPorts: metroPorts(workspace, manifest),
|
|
5955
6061
|
fakes,
|
|
5956
6062
|
credentialFakes,
|
|
@@ -6017,6 +6123,19 @@ function metroPorts(workspace, manifest) {
|
|
|
6017
6123
|
return ports;
|
|
6018
6124
|
}
|
|
6019
6125
|
/**
|
|
6126
|
+
* Where each file server's processors answer locally: the dev server of the
|
|
6127
|
+
* app holding them, which `gkm dev` mounts them on — the same app whose build
|
|
6128
|
+
* writes their unit deployed.
|
|
6129
|
+
*/
|
|
6130
|
+
function processorAddresses(workspace, manifest) {
|
|
6131
|
+
const addresses = {};
|
|
6132
|
+
for (const unit of processorUnits(workspace, manifest)) {
|
|
6133
|
+
const port = workspace.apps[unit.app]?.port;
|
|
6134
|
+
if (port) addresses[unit.id] = localAddress(port);
|
|
6135
|
+
}
|
|
6136
|
+
return addresses;
|
|
6137
|
+
}
|
|
6138
|
+
/**
|
|
6020
6139
|
* Where each declared surface and site answers locally.
|
|
6021
6140
|
*
|
|
6022
6141
|
* The addresses come from the ports the workspace already assigns; which
|
|
@@ -6195,6 +6314,21 @@ function workerEnvKeys(manifest, workerId, runnables = {}) {
|
|
|
6195
6314
|
return keys;
|
|
6196
6315
|
}
|
|
6197
6316
|
/** What each construct an edge reaches hands the process that reaches it. */
|
|
6317
|
+
/**
|
|
6318
|
+
* The keys a file server's processor unit reads: its bucket's, and what each
|
|
6319
|
+
* of its processors depends on. `undefined` for a file server with none.
|
|
6320
|
+
*/
|
|
6321
|
+
function processorEnvKeys(manifest, fileServerId, runnables = {}) {
|
|
6322
|
+
const server = manifest[fileServerId];
|
|
6323
|
+
if (server?.kind !== "file-server" || !server.processors?.length) return;
|
|
6324
|
+
const keys = /* @__PURE__ */ new Set();
|
|
6325
|
+
addEdgeKeys(manifest, [
|
|
6326
|
+
server.of,
|
|
6327
|
+
...server.processors.flatMap((p) => p.dependencies.map((d) => d.target)),
|
|
6328
|
+
...runnables[fileServerId] ?? []
|
|
6329
|
+
], keys);
|
|
6330
|
+
return keys;
|
|
6331
|
+
}
|
|
6198
6332
|
function addEdgeKeys(manifest, edges, keys) {
|
|
6199
6333
|
for (const id of edges) {
|
|
6200
6334
|
const bucket = require_discover.eventsEdgeBucket(id);
|
|
@@ -6662,6 +6796,308 @@ function validateImageRef(ref) {
|
|
|
6662
6796
|
return ref;
|
|
6663
6797
|
}
|
|
6664
6798
|
//#endregion
|
|
6799
|
+
//#region src/providers/processorOrigin.ts
|
|
6800
|
+
/**
|
|
6801
|
+
* A file server's processors as a CDN origin: the names both sides agree on.
|
|
6802
|
+
*
|
|
6803
|
+
* On a compose stage whose bucket is on S3, the CDN serves the bucket and
|
|
6804
|
+
* sends each processor pattern to the stack's processor unit, at a host of
|
|
6805
|
+
* its own. That host is public — a CDN reaches its origin over the internet —
|
|
6806
|
+
* so the CDN adds a secret header and the edge refuses any request without
|
|
6807
|
+
* it. One definition, read by the CDN that sends the header and by the stack
|
|
6808
|
+
* whose edge checks it, so the two cannot drift.
|
|
6809
|
+
*/
|
|
6810
|
+
/** The header the CDN adds to every request it sends a processor. */
|
|
6811
|
+
const ORIGIN_VERIFY_HEADER = "X-Gkm-Origin-Verify";
|
|
6812
|
+
/** Where a file server's processors answer the CDN: `<fileserver>-processors.<domain>`. */
|
|
6813
|
+
function processorOriginHost(serverId, domain) {
|
|
6814
|
+
return `${require_derive.appKey(serverId)}-processors.${domain}`.toLowerCase();
|
|
6815
|
+
}
|
|
6816
|
+
/** The stage secret holding the header's value: `ASSETS_SERVER_ORIGIN_SECRET`. */
|
|
6817
|
+
function originSecretKey(serverId) {
|
|
6818
|
+
return (0, _geekmidas_manifest.provideKey)(serverId, "originSecret");
|
|
6819
|
+
}
|
|
6820
|
+
/**
|
|
6821
|
+
* What the processor unit reads that secret from. Set wherever the CDN fronts
|
|
6822
|
+
* it, so the unit refuses a request without the header itself — on Dokploy,
|
|
6823
|
+
* whose edge cannot match a header, the only check; behind the stack's own
|
|
6824
|
+
* edge, a second one.
|
|
6825
|
+
*/
|
|
6826
|
+
const PROCESSOR_ORIGIN_SECRET_ENV = "GKM_PROCESSOR_ORIGIN_SECRET";
|
|
6827
|
+
/** A new value for that secret: random, generated once, kept in the stage. */
|
|
6828
|
+
function newOriginSecret() {
|
|
6829
|
+
return (0, node_crypto.randomBytes)(32).toString("base64url");
|
|
6830
|
+
}
|
|
6831
|
+
//#endregion
|
|
6832
|
+
//#region src/generators/ProcessorGenerator.ts
|
|
6833
|
+
/** Where a file server's processor entry lives, under an app's `.gkm/server`. */
|
|
6834
|
+
function processorEntryDir(serverDir, fileServerId) {
|
|
6835
|
+
return (0, node_path.join)(serverDir, "processors", processorUnitName(fileServerId));
|
|
6836
|
+
}
|
|
6837
|
+
/** The file its bundle is written to, beside the server's. */
|
|
6838
|
+
function processorBundleName(fileServerId) {
|
|
6839
|
+
return `${processorUnitName(fileServerId)}.mjs`;
|
|
6840
|
+
}
|
|
6841
|
+
/**
|
|
6842
|
+
* A file server's processors, as the build generates them.
|
|
6843
|
+
*
|
|
6844
|
+
* On AWS each is a Lambda behind a function URL — the CDN's origin for its
|
|
6845
|
+
* pattern. On a server they are one process per file server, the processor
|
|
6846
|
+
* unit (see {@link ProcessorGenerator.buildEntry}), so the `server` target
|
|
6847
|
+
* generates nothing per processor here.
|
|
6848
|
+
*/
|
|
6849
|
+
var ProcessorGenerator = class extends require_discover.ConstructGenerator {
|
|
6850
|
+
isConstruct(value) {
|
|
6851
|
+
return _geekmidas_constructs_processors.Processor.isProcessor(value);
|
|
6852
|
+
}
|
|
6853
|
+
async build(context, constructs, outputDir, options) {
|
|
6854
|
+
if ((options?.target ?? "aws") !== "aws" || constructs.length === 0) return [];
|
|
6855
|
+
const dir = (0, node_path.join)(outputDir, "processors");
|
|
6856
|
+
await (0, node_fs_promises.mkdir)(dir, { recursive: true });
|
|
6857
|
+
const infos = [];
|
|
6858
|
+
for (const { key, construct, path } of constructs) {
|
|
6859
|
+
const file = (0, node_path.join)(dir, `${key}.ts`);
|
|
6860
|
+
const importPath = (0, node_path.relative)((0, node_path.dirname)(file), path.relative).replace(/\.ts$/, ".js");
|
|
6861
|
+
await (0, node_fs_promises.writeFile)(file, `import { AWSLambdaProcessor } from '@geekmidas/constructs/processors';
|
|
6862
|
+
import { ${key} } from '${importPath}';
|
|
6863
|
+
${context.storageDrivers?.imports ?? ""}
|
|
6864
|
+
${context.storageDrivers?.setup ? `\n// The handler registers the drivers its target needs.\n${context.storageDrivers.setup}\n` : ""}
|
|
6865
|
+
const adapter = new AWSLambdaProcessor(${key});
|
|
6866
|
+
|
|
6867
|
+
export const handler = adapter.handler;
|
|
6868
|
+
`);
|
|
6869
|
+
infos.push(await processorInfo(key, construct, (0, node_path.relative)(options?.root ?? process.cwd(), file).replace(/\.ts$/, ".handler"), context));
|
|
6870
|
+
}
|
|
6871
|
+
return infos;
|
|
6872
|
+
}
|
|
6873
|
+
/**
|
|
6874
|
+
* `gkm dev`'s half: `processors.ts` beside the dev server's app, mounting
|
|
6875
|
+
* each file server's processors under `/__gkm/processors/<FileServer>`.
|
|
6876
|
+
* The local edge sends each pattern on the file server's host there, so
|
|
6877
|
+
* `processedUrl()` answers locally as it does deployed.
|
|
6878
|
+
*
|
|
6879
|
+
* In the dev server's own process rather than a unit of its own: locally
|
|
6880
|
+
* there is no CPU to protect, and the dev server already reloads on change.
|
|
6881
|
+
*/
|
|
6882
|
+
async buildDev(outputDir, processors) {
|
|
6883
|
+
await (0, node_fs_promises.mkdir)(outputDir, { recursive: true });
|
|
6884
|
+
const file = (0, node_path.join)(outputDir, "processors.ts");
|
|
6885
|
+
const imports = processors.map(({ key, path }) => {
|
|
6886
|
+
const specifier = (0, node_path.relative)(outputDir, path.absolute).replace(/\.ts$/, ".js");
|
|
6887
|
+
return `import { ${key} } from '${specifier.startsWith(".") ? specifier : `./${specifier}`}';`;
|
|
6888
|
+
}).join("\n");
|
|
6889
|
+
const byServer = /* @__PURE__ */ new Map();
|
|
6890
|
+
for (const { key, construct } of processors) byServer.set(construct.surfaceId, [...byServer.get(construct.surfaceId) ?? [], key]);
|
|
6891
|
+
const units = [...byServer.entries()].map(([id, keys]) => ` ${JSON.stringify(id)}: [${keys.join(", ")}],`).join("\n");
|
|
6892
|
+
await (0, node_fs_promises.writeFile)(file, `/**
|
|
6893
|
+
* Generated processors setup for \`gkm dev\`.
|
|
6894
|
+
*
|
|
6895
|
+
* Each file server's processors, under ${PROCESSORS_DEV_PREFIX}<FileServer>: the
|
|
6896
|
+
* local edge rewrites each processor pattern on the file server's host here.
|
|
6897
|
+
*/
|
|
6898
|
+
import type { EnvironmentParser } from '@geekmidas/envkit';
|
|
6899
|
+
import { processorServer } from '@geekmidas/constructs/processors';
|
|
6900
|
+
${imports}
|
|
6901
|
+
|
|
6902
|
+
export function setupProcessors(
|
|
6903
|
+
app: { all: (path: string, handler: (c: any) => unknown) => unknown },
|
|
6904
|
+
envParser: EnvironmentParser<any>,
|
|
6905
|
+
): void {
|
|
6906
|
+
const units: Record<string, ReturnType<typeof processorServer>> = Object.fromEntries(
|
|
6907
|
+
Object.entries({
|
|
6908
|
+
${units}
|
|
6909
|
+
}).map(([id, processors]) => [id, processorServer(processors, envParser)]),
|
|
6910
|
+
);
|
|
6911
|
+
|
|
6912
|
+
app.all('${PROCESSORS_DEV_PREFIX}:server/*', async (c: any) => {
|
|
6913
|
+
const server = c.req.param('server') as string;
|
|
6914
|
+
const serve = units[server];
|
|
6915
|
+
if (!serve) return c.notFound();
|
|
6916
|
+
const path = c.req.path.slice(\`${PROCESSORS_DEV_PREFIX}\${server}\`.length) || '/';
|
|
6917
|
+
const response = await serve({ method: c.req.method, path });
|
|
6918
|
+
if (!response) {
|
|
6919
|
+
return new Response(null, {
|
|
6920
|
+
status: 404,
|
|
6921
|
+
headers: { 'cache-control': 'public, max-age=60' },
|
|
6922
|
+
});
|
|
6923
|
+
}
|
|
6924
|
+
return new Response(c.req.method === 'HEAD' ? null : response.body, {
|
|
6925
|
+
status: response.status,
|
|
6926
|
+
headers: response.headers,
|
|
6927
|
+
});
|
|
6928
|
+
});
|
|
6929
|
+
}
|
|
6930
|
+
`);
|
|
6931
|
+
return file;
|
|
6932
|
+
}
|
|
6933
|
+
/**
|
|
6934
|
+
* A file server's processor unit: one process answering each of its
|
|
6935
|
+
* processors' patterns, and `/health`. Returns its entry, `processors.ts`.
|
|
6936
|
+
*
|
|
6937
|
+
* Its own process because making a derivative is CPU-bound — a resize
|
|
6938
|
+
* spike in the API's process would be every request's latency.
|
|
6939
|
+
*/
|
|
6940
|
+
async buildEntry(input) {
|
|
6941
|
+
const { context, outputDir, processors } = input;
|
|
6942
|
+
await (0, node_fs_promises.mkdir)(outputDir, { recursive: true });
|
|
6943
|
+
await require_EndpointGenerator.writeTelemetryModule(outputDir, input.telemetry);
|
|
6944
|
+
const healthCheck = context.production?.healthCheck ?? "/health";
|
|
6945
|
+
const imports = processors.map(({ key, path }) => {
|
|
6946
|
+
const specifier = (0, node_path.relative)(outputDir, path.absolute).replace(/\.ts$/, ".js");
|
|
6947
|
+
return `import { ${key} } from '${specifier.startsWith(".") ? specifier : `./${specifier}`}';`;
|
|
6948
|
+
}).join("\n");
|
|
6949
|
+
const entry = (0, node_path.join)(outputDir, "processors.ts");
|
|
6950
|
+
await (0, node_fs_promises.writeFile)(entry, `#!/usr/bin/env node
|
|
6951
|
+
/**
|
|
6952
|
+
* Production entry for ${input.fileServerId}'s processors.
|
|
6953
|
+
* Generated by 'gkm build --production'.
|
|
6954
|
+
*
|
|
6955
|
+
* Answers each processor's pattern, and ${healthCheck} on PORT. The edge
|
|
6956
|
+
* routes only those patterns here; everything else on the file server's
|
|
6957
|
+
* domain is the bucket.
|
|
6958
|
+
*/
|
|
6959
|
+
import { timingSafeEqual } from 'node:crypto';
|
|
6960
|
+
import { createServer } from 'node:http';
|
|
6961
|
+
import { runShutdownHooks } from '@geekmidas/constructs';
|
|
6962
|
+
import { processorServer } from '@geekmidas/constructs/processors';
|
|
6963
|
+
${context.storageDrivers?.imports ?? ""}
|
|
6964
|
+
${imports}
|
|
6965
|
+
|
|
6966
|
+
${require_EndpointGenerator.startTelemetryCode([healthCheck])}
|
|
6967
|
+
${context.storageDrivers?.setup ? `// The entry point registers the drivers its target needs.\n${context.storageDrivers.setup}\n` : ""}
|
|
6968
|
+
process.env.GKM_APP_NAME ??= ${JSON.stringify(processorUnitName(input.fileServerId))};
|
|
6969
|
+
|
|
6970
|
+
const processors = [${processors.map(({ key }) => key).join(", ")}];
|
|
6971
|
+
const serve = processorServer(processors);
|
|
6972
|
+
const port = Number(process.env.PORT) || 3000;
|
|
6973
|
+
let stopping = false;
|
|
6974
|
+
|
|
6975
|
+
${input.telemetry ? REQUEST_SPANS : NO_REQUEST_SPANS}
|
|
6976
|
+
// Where the CDN fronts this unit, the secret it adds to every request: one
|
|
6977
|
+
// without it is refused here, whatever the edge in front did or could not.
|
|
6978
|
+
const originSecret = process.env.${PROCESSOR_ORIGIN_SECRET_ENV}
|
|
6979
|
+
? Buffer.from(process.env.${PROCESSOR_ORIGIN_SECRET_ENV})
|
|
6980
|
+
: undefined;
|
|
6981
|
+
const fromOrigin = (header: string | string[] | undefined) => {
|
|
6982
|
+
if (!originSecret) return true;
|
|
6983
|
+
const given = Buffer.from(typeof header === 'string' ? header : '');
|
|
6984
|
+
return given.length === originSecret.length && timingSafeEqual(given, originSecret);
|
|
6985
|
+
};
|
|
6986
|
+
|
|
6987
|
+
const server = createServer(async (req, res) => {
|
|
6988
|
+
const method = req.method ?? 'GET';
|
|
6989
|
+
const path = (req.url ?? '/').split('?')[0] ?? '/';
|
|
6990
|
+
if (path === ${JSON.stringify(healthCheck)}) {
|
|
6991
|
+
res.writeHead(stopping ? 503 : 200, { 'content-type': 'application/json' });
|
|
6992
|
+
res.end(JSON.stringify({ status: stopping ? 'stopping' : 'ok' }));
|
|
6993
|
+
return;
|
|
6994
|
+
}
|
|
6995
|
+
if (!fromOrigin(req.headers[${JSON.stringify(ORIGIN_VERIFY_HEADER.toLowerCase())}])) {
|
|
6996
|
+
res.writeHead(403, { 'cache-control': 'no-store' }).end();
|
|
6997
|
+
return;
|
|
6998
|
+
}
|
|
6999
|
+
await traced(method, path, async () => {
|
|
7000
|
+
try {
|
|
7001
|
+
const response = await serve({ method, path });
|
|
7002
|
+
if (!response) {
|
|
7003
|
+
res.writeHead(404, { 'cache-control': 'public, max-age=60' }).end();
|
|
7004
|
+
return 404;
|
|
7005
|
+
}
|
|
7006
|
+
res.writeHead(response.status, response.headers);
|
|
7007
|
+
res.end(method === 'HEAD' ? undefined : response.body);
|
|
7008
|
+
return response.status;
|
|
7009
|
+
} catch (error) {
|
|
7010
|
+
console.error(error);
|
|
7011
|
+
res.writeHead(500, { 'cache-control': 'no-store' }).end();
|
|
7012
|
+
return 500;
|
|
7013
|
+
}
|
|
7014
|
+
});
|
|
7015
|
+
});
|
|
7016
|
+
server.listen(port);
|
|
7017
|
+
|
|
7018
|
+
const shutdown = async () => {
|
|
7019
|
+
if (stopping) return;
|
|
7020
|
+
stopping = true;
|
|
7021
|
+
setTimeout(() => process.exit(1), Number(process.env.GKM_SHUTDOWN_TIMEOUT_MS) || 8000).unref();
|
|
7022
|
+
server.close();
|
|
7023
|
+
await runShutdownHooks((error) => console.error(error));
|
|
7024
|
+
process.exit(0);
|
|
7025
|
+
};
|
|
7026
|
+
process.on('SIGTERM', shutdown);
|
|
7027
|
+
process.on('SIGINT', shutdown);
|
|
7028
|
+
`);
|
|
7029
|
+
return entry;
|
|
7030
|
+
}
|
|
7031
|
+
};
|
|
7032
|
+
/**
|
|
7033
|
+
* A SERVER span per request, once telemetry has started — opened by the unit
|
|
7034
|
+
* rather than by hooking node:http, which sees nothing inside a bundle. Named
|
|
7035
|
+
* after the processor's pattern, never the key, which has no bound.
|
|
7036
|
+
*
|
|
7037
|
+
* Only in an entry whose file server has a `Telemetry` node: the bundle
|
|
7038
|
+
* follows the import, and an app without one need not install the API.
|
|
7039
|
+
*/
|
|
7040
|
+
const REQUEST_SPANS = `const tracing = requestSpans ? await import('@opentelemetry/api') : undefined;
|
|
7041
|
+
const routeOf = (path: string) =>
|
|
7042
|
+
processors.find((processor) => path.startsWith(processor.prefix))?.pattern;
|
|
7043
|
+
|
|
7044
|
+
async function traced(
|
|
7045
|
+
method: string,
|
|
7046
|
+
path: string,
|
|
7047
|
+
run: () => Promise<number>,
|
|
7048
|
+
): Promise<void> {
|
|
7049
|
+
if (!tracing) {
|
|
7050
|
+
await run();
|
|
7051
|
+
return;
|
|
7052
|
+
}
|
|
7053
|
+
const route = routeOf(path);
|
|
7054
|
+
await tracing.trace.getTracer('@geekmidas/processors').startActiveSpan(
|
|
7055
|
+
route ? \`\${method} \${route}\` : method,
|
|
7056
|
+
{
|
|
7057
|
+
kind: tracing.SpanKind.SERVER,
|
|
7058
|
+
attributes: {
|
|
7059
|
+
'http.request.method': method,
|
|
7060
|
+
'url.path': path,
|
|
7061
|
+
...(route ? { 'http.route': route } : {}),
|
|
7062
|
+
},
|
|
7063
|
+
},
|
|
7064
|
+
async (span) => {
|
|
7065
|
+
try {
|
|
7066
|
+
const status = await run();
|
|
7067
|
+
span.setAttribute('http.response.status_code', status);
|
|
7068
|
+
if (status >= 500) span.setStatus({ code: tracing.SpanStatusCode.ERROR });
|
|
7069
|
+
} finally {
|
|
7070
|
+
span.end();
|
|
7071
|
+
}
|
|
7072
|
+
},
|
|
7073
|
+
);
|
|
7074
|
+
}
|
|
7075
|
+
`;
|
|
7076
|
+
/** The same shape without telemetry: each request just runs. */
|
|
7077
|
+
const NO_REQUEST_SPANS = `async function traced(
|
|
7078
|
+
_method: string,
|
|
7079
|
+
_path: string,
|
|
7080
|
+
run: () => Promise<number>,
|
|
7081
|
+
): Promise<void> {
|
|
7082
|
+
await run();
|
|
7083
|
+
}
|
|
7084
|
+
`;
|
|
7085
|
+
/** What the manifest records of one processor. */
|
|
7086
|
+
async function processorInfo(name, processor, handler, context) {
|
|
7087
|
+
return {
|
|
7088
|
+
name,
|
|
7089
|
+
handler,
|
|
7090
|
+
fileServer: processor.surfaceId,
|
|
7091
|
+
path: processor.pattern,
|
|
7092
|
+
prefix: processor.prefix,
|
|
7093
|
+
...processor.native.length ? { native: [...processor.native] } : {},
|
|
7094
|
+
...processor.timeout !== void 0 ? { timeout: processor.timeout } : {},
|
|
7095
|
+
...processor.memorySize !== void 0 ? { memorySize: processor.memorySize } : {},
|
|
7096
|
+
environment: await processor.getEnvironment({ markOptional: context.markOptional }),
|
|
7097
|
+
dependencies: processor.constructs
|
|
7098
|
+
};
|
|
7099
|
+
}
|
|
7100
|
+
//#endregion
|
|
6665
7101
|
//#region src/generators/CronGenerator.ts
|
|
6666
7102
|
var CronGenerator = class extends require_discover.ConstructGenerator {
|
|
6667
7103
|
async build(context, constructs, outputDir, options) {
|
|
@@ -7572,6 +8008,25 @@ async function workspaceDockerCommand(workspace, manifest, imageNames = {}, back
|
|
|
7572
8008
|
imageName: imageNames[worker.name] ?? worker.name
|
|
7573
8009
|
});
|
|
7574
8010
|
}
|
|
8011
|
+
for (const unit of manifest ? processorUnits(workspace, manifest) : []) {
|
|
8012
|
+
logger$1.log(`\n 📄 Generating Dockerfile for ${unit.name} (processors of ${unit.id}, built from ${unit.app})`);
|
|
8013
|
+
const dockerfile = processorDockerfile(unit, workspace.apps[unit.app], {
|
|
8014
|
+
layout,
|
|
8015
|
+
workspaceRoot: workspace.root,
|
|
8016
|
+
native: processorNative(manifest, unit.id)
|
|
8017
|
+
});
|
|
8018
|
+
const path = workerDockerfileOf(unit.name);
|
|
8019
|
+
const dockerfilePath = (0, node_path.join)(workspace.root, path);
|
|
8020
|
+
await (0, node_fs_promises.mkdir)((0, node_path.dirname)(dockerfilePath), { recursive: true });
|
|
8021
|
+
await (0, node_fs_promises.writeFile)(dockerfilePath, dockerfile);
|
|
8022
|
+
logger$1.log(` Generated: ${path}`);
|
|
8023
|
+
results.push({
|
|
8024
|
+
appName: unit.name,
|
|
8025
|
+
type: "backend",
|
|
8026
|
+
dockerfile: dockerfilePath,
|
|
8027
|
+
imageName: imageNames[unit.name] ?? unit.name
|
|
8028
|
+
});
|
|
8029
|
+
}
|
|
7575
8030
|
const dockerignorePath = await ensureDockerignore(layout.buildRoot);
|
|
7576
8031
|
logger$1.log(`\n Ensured: ${dockerignorePath}`);
|
|
7577
8032
|
const composePath = await writeConstructsCompose(workspace);
|
|
@@ -7631,6 +8086,29 @@ function workerDockerfile(worker, host, options) {
|
|
|
7631
8086
|
...options.cache ? { cache: options.cache } : {}
|
|
7632
8087
|
});
|
|
7633
8088
|
}
|
|
8089
|
+
/** The native packages a file server's processors named, once each. */
|
|
8090
|
+
function processorNative(manifest, fileServerId) {
|
|
8091
|
+
const server = manifest[fileServerId];
|
|
8092
|
+
if (server?.kind !== "file-server") return [];
|
|
8093
|
+
return [...new Set((server.processors ?? []).flatMap((p) => p.native ?? []))].sort();
|
|
8094
|
+
}
|
|
8095
|
+
/**
|
|
8096
|
+
* A file server's processor unit's Dockerfile: its host app's build, and the
|
|
8097
|
+
* unit's bundle as the runner, with its processors' native packages
|
|
8098
|
+
* installed beside it — see `generateProcessorDockerfile`.
|
|
8099
|
+
*/
|
|
8100
|
+
function processorDockerfile(unit, host, options) {
|
|
8101
|
+
return generateProcessorDockerfile({
|
|
8102
|
+
...appImageOptions(options.layout, unit.app, host, options.workspaceRoot),
|
|
8103
|
+
imageName: unit.name,
|
|
8104
|
+
port: PROCESSOR_PORT,
|
|
8105
|
+
fileServer: unit.id,
|
|
8106
|
+
bundle: processorBundleName(unit.id),
|
|
8107
|
+
healthCheckPath: "/health",
|
|
8108
|
+
...options.native.length ? { external: [...options.native] } : {},
|
|
8109
|
+
...options.cache ? { cache: options.cache } : {}
|
|
8110
|
+
});
|
|
8111
|
+
}
|
|
7634
8112
|
/**
|
|
7635
8113
|
* A site's Dockerfile, with an `ARG` for every key its bundler inlines.
|
|
7636
8114
|
*
|
|
@@ -7808,7 +8286,7 @@ async function createDnsProvider(options) {
|
|
|
7808
8286
|
});
|
|
7809
8287
|
}
|
|
7810
8288
|
if (provider === "godaddy") {
|
|
7811
|
-
const { GoDaddyProvider } = await Promise.resolve().then(() => require("./GoDaddyProvider-
|
|
8289
|
+
const { GoDaddyProvider } = await Promise.resolve().then(() => require("./GoDaddyProvider-DFfpzCOP.cjs"));
|
|
7812
8290
|
return new GoDaddyProvider(options.godaddy ?? {});
|
|
7813
8291
|
}
|
|
7814
8292
|
if (provider === "cloudflare") throw new DnsProviderNotImplemented("cloudflare");
|
|
@@ -8795,12 +9273,36 @@ Object.defineProperty(exports, "NoDomainForStage", {
|
|
|
8795
9273
|
return NoDomainForStage;
|
|
8796
9274
|
}
|
|
8797
9275
|
});
|
|
9276
|
+
Object.defineProperty(exports, "ORIGIN_VERIFY_HEADER", {
|
|
9277
|
+
enumerable: true,
|
|
9278
|
+
get: function() {
|
|
9279
|
+
return ORIGIN_VERIFY_HEADER;
|
|
9280
|
+
}
|
|
9281
|
+
});
|
|
9282
|
+
Object.defineProperty(exports, "PROCESSOR_ORIGIN_SECRET_ENV", {
|
|
9283
|
+
enumerable: true,
|
|
9284
|
+
get: function() {
|
|
9285
|
+
return PROCESSOR_ORIGIN_SECRET_ENV;
|
|
9286
|
+
}
|
|
9287
|
+
});
|
|
9288
|
+
Object.defineProperty(exports, "PROCESSOR_PORT", {
|
|
9289
|
+
enumerable: true,
|
|
9290
|
+
get: function() {
|
|
9291
|
+
return PROCESSOR_PORT;
|
|
9292
|
+
}
|
|
9293
|
+
});
|
|
8798
9294
|
Object.defineProperty(exports, "PROVIDER_KINDS", {
|
|
8799
9295
|
enumerable: true,
|
|
8800
9296
|
get: function() {
|
|
8801
9297
|
return PROVIDER_KINDS;
|
|
8802
9298
|
}
|
|
8803
9299
|
});
|
|
9300
|
+
Object.defineProperty(exports, "ProcessorGenerator", {
|
|
9301
|
+
enumerable: true,
|
|
9302
|
+
get: function() {
|
|
9303
|
+
return ProcessorGenerator;
|
|
9304
|
+
}
|
|
9305
|
+
});
|
|
8804
9306
|
Object.defineProperty(exports, "QueueGenerator", {
|
|
8805
9307
|
enumerable: true,
|
|
8806
9308
|
get: function() {
|
|
@@ -9152,7 +9654,7 @@ Object.defineProperty(exports, "getKeyPath", {
|
|
|
9152
9654
|
Object.defineProperty(exports, "hostFor", {
|
|
9153
9655
|
enumerable: true,
|
|
9154
9656
|
get: function() {
|
|
9155
|
-
return hostFor;
|
|
9657
|
+
return hostFor$1;
|
|
9156
9658
|
}
|
|
9157
9659
|
});
|
|
9158
9660
|
Object.defineProperty(exports, "imageBuildCredentials", {
|
|
@@ -9287,6 +9789,12 @@ Object.defineProperty(exports, "networkEnv", {
|
|
|
9287
9789
|
return networkEnv;
|
|
9288
9790
|
}
|
|
9289
9791
|
});
|
|
9792
|
+
Object.defineProperty(exports, "newOriginSecret", {
|
|
9793
|
+
enumerable: true,
|
|
9794
|
+
get: function() {
|
|
9795
|
+
return newOriginSecret;
|
|
9796
|
+
}
|
|
9797
|
+
});
|
|
9290
9798
|
Object.defineProperty(exports, "normalizeDnsConfig", {
|
|
9291
9799
|
enumerable: true,
|
|
9292
9800
|
get: function() {
|
|
@@ -9299,6 +9807,12 @@ Object.defineProperty(exports, "orchestrateDns", {
|
|
|
9299
9807
|
return orchestrateDns;
|
|
9300
9808
|
}
|
|
9301
9809
|
});
|
|
9810
|
+
Object.defineProperty(exports, "originSecretKey", {
|
|
9811
|
+
enumerable: true,
|
|
9812
|
+
get: function() {
|
|
9813
|
+
return originSecretKey;
|
|
9814
|
+
}
|
|
9815
|
+
});
|
|
9302
9816
|
Object.defineProperty(exports, "pgClient", {
|
|
9303
9817
|
enumerable: true,
|
|
9304
9818
|
get: function() {
|
|
@@ -9365,6 +9879,54 @@ Object.defineProperty(exports, "primaryPortKey", {
|
|
|
9365
9879
|
return primaryPortKey;
|
|
9366
9880
|
}
|
|
9367
9881
|
});
|
|
9882
|
+
Object.defineProperty(exports, "processorBundleName", {
|
|
9883
|
+
enumerable: true,
|
|
9884
|
+
get: function() {
|
|
9885
|
+
return processorBundleName;
|
|
9886
|
+
}
|
|
9887
|
+
});
|
|
9888
|
+
Object.defineProperty(exports, "processorDockerfile", {
|
|
9889
|
+
enumerable: true,
|
|
9890
|
+
get: function() {
|
|
9891
|
+
return processorDockerfile;
|
|
9892
|
+
}
|
|
9893
|
+
});
|
|
9894
|
+
Object.defineProperty(exports, "processorEntryDir", {
|
|
9895
|
+
enumerable: true,
|
|
9896
|
+
get: function() {
|
|
9897
|
+
return processorEntryDir;
|
|
9898
|
+
}
|
|
9899
|
+
});
|
|
9900
|
+
Object.defineProperty(exports, "processorEnvKeys", {
|
|
9901
|
+
enumerable: true,
|
|
9902
|
+
get: function() {
|
|
9903
|
+
return processorEnvKeys;
|
|
9904
|
+
}
|
|
9905
|
+
});
|
|
9906
|
+
Object.defineProperty(exports, "processorInfo", {
|
|
9907
|
+
enumerable: true,
|
|
9908
|
+
get: function() {
|
|
9909
|
+
return processorInfo;
|
|
9910
|
+
}
|
|
9911
|
+
});
|
|
9912
|
+
Object.defineProperty(exports, "processorNative", {
|
|
9913
|
+
enumerable: true,
|
|
9914
|
+
get: function() {
|
|
9915
|
+
return processorNative;
|
|
9916
|
+
}
|
|
9917
|
+
});
|
|
9918
|
+
Object.defineProperty(exports, "processorOriginHost", {
|
|
9919
|
+
enumerable: true,
|
|
9920
|
+
get: function() {
|
|
9921
|
+
return processorOriginHost;
|
|
9922
|
+
}
|
|
9923
|
+
});
|
|
9924
|
+
Object.defineProperty(exports, "processorUnits", {
|
|
9925
|
+
enumerable: true,
|
|
9926
|
+
get: function() {
|
|
9927
|
+
return processorUnits;
|
|
9928
|
+
}
|
|
9929
|
+
});
|
|
9368
9930
|
Object.defineProperty(exports, "projectKey", {
|
|
9369
9931
|
enumerable: true,
|
|
9370
9932
|
get: function() {
|
|
@@ -9678,4 +10240,4 @@ Object.defineProperty(exports, "workspace_exports", {
|
|
|
9678
10240
|
}
|
|
9679
10241
|
});
|
|
9680
10242
|
|
|
9681
|
-
//# sourceMappingURL=seeds-
|
|
10243
|
+
//# sourceMappingURL=seeds-3awh33Wz.cjs.map
|