@keboola/api-client 56.0.0 → 57.0.0
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/AGENTS.md +110 -229
- package/API-SURFACE.md +10 -2
- package/CHANGELOG.md +45 -0
- package/README.md +20 -133
- package/dist/{ManagementSessionMintError-Bc9bc7Ai.cjs → ManagementSessionMintError-BCOLLaJi.cjs} +3 -2
- package/dist/ManagementSessionMintError-BCOLLaJi.cjs.map +1 -0
- package/dist/{ManagementSessionMintError-BMHDcEqV.js → ManagementSessionMintError-KUX3utTV.js} +3 -2
- package/dist/ManagementSessionMintError-KUX3utTV.js.map +1 -0
- package/dist/{adminRoles-CUB0JddB.d.ts → adminRoles-CnfGDvjN.d.ts} +2 -2
- package/dist/{adminRoles-BFOPSedO.d.cts → adminRoles-D6AS9Bzx.d.cts} +2 -2
- package/dist/ai/index.d.cts +2 -2
- package/dist/ai/index.d.ts +2 -2
- package/dist/ai/types.d.cts +1 -1
- package/dist/ai/types.d.ts +1 -1
- package/dist/apps/index.cjs +1 -1
- package/dist/apps/index.d.cts +2 -2
- package/dist/apps/index.d.ts +2 -2
- package/dist/apps/index.js +1 -1
- package/dist/apps/types.d.cts +2 -2
- package/dist/apps/types.d.ts +2 -2
- package/dist/{apps-C1x5IKNQ.cjs → apps-BA9JRLAZ.cjs} +55 -1
- package/dist/apps-BA9JRLAZ.cjs.map +1 -0
- package/dist/{apps-BN7fWtSm.js → apps-DDcguJ1i.js} +55 -1
- package/dist/apps-DDcguJ1i.js.map +1 -0
- package/dist/assets/index.d.cts +1 -1
- package/dist/assets/index.d.ts +1 -1
- package/dist/auth/index.cjs +1 -1
- package/dist/auth/index.d.cts +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/types.d.cts +2 -2
- package/dist/auth/types.d.ts +2 -2
- package/dist/{authClient-B_Mb4Vzs.js → authClient-BKGpJI5L.js} +13 -2
- package/dist/authClient-BKGpJI5L.js.map +1 -0
- package/dist/{authClient-C9QqhT2M.cjs → authClient-C3KG9hXw.cjs} +17 -6
- package/dist/authClient-C3KG9hXw.cjs.map +1 -0
- package/dist/{authClient-Dgyb0EFi.d.ts → authClient-CbWpMmdX.d.ts} +7 -4
- package/dist/{authClient-DOetdp2k.d.cts → authClient-UKeopxZZ.d.cts} +7 -4
- package/dist/billing/index.d.cts +1 -1
- package/dist/billing/index.d.ts +1 -1
- package/dist/billing/types.d.cts +1 -1
- package/dist/billing/types.d.ts +1 -1
- package/dist/chat/index.d.cts +2 -2
- package/dist/chat/index.d.ts +2 -2
- package/dist/chat/types.d.cts +1 -1
- package/dist/chat/types.d.ts +1 -1
- package/dist/componentsMcp/index.d.cts +1 -1
- package/dist/componentsMcp/index.d.ts +1 -1
- package/dist/componentsMcp/types.d.cts +1 -1
- package/dist/componentsMcp/types.d.ts +1 -1
- package/dist/constants/index.cjs +2 -2
- package/dist/constants/index.d.cts +3 -3
- package/dist/constants/index.d.ts +3 -3
- package/dist/constants/index.js +2 -2
- package/dist/{constants-HccvU5kx.js → constants-CxEaHCyt.js} +4 -3
- package/dist/constants-CxEaHCyt.js.map +1 -0
- package/dist/{constants-V9hAyPTo.cjs → constants-fiyOLyZE.cjs} +4 -3
- package/dist/constants-fiyOLyZE.cjs.map +1 -0
- package/dist/dataScience/index.d.cts +3 -3
- package/dist/dataScience/index.d.ts +3 -3
- package/dist/dataScience/types.d.cts +1 -1
- package/dist/dataScience/types.d.ts +1 -1
- package/dist/developerPortal/index.cjs +1 -1
- package/dist/developerPortal/index.d.cts +3 -3
- package/dist/developerPortal/index.d.ts +3 -3
- package/dist/developerPortal/index.js +1 -1
- package/dist/developerPortal/types.d.cts +2 -2
- package/dist/developerPortal/types.d.ts +2 -2
- package/dist/{developerPortalClient-CzCJ5sE3.js → developerPortalClient-3Q7049-4.js} +19 -1
- package/dist/developerPortalClient-3Q7049-4.js.map +1 -0
- package/dist/{developerPortalClient-BcK9F-Fs.cjs → developerPortalClient-Cj9bStCS.cjs} +19 -1
- package/dist/developerPortalClient-Cj9bStCS.cjs.map +1 -0
- package/dist/domain/permissions/index.d.cts +1 -1
- package/dist/domain/permissions/index.d.ts +1 -1
- package/dist/editor/index.d.cts +2 -2
- package/dist/editor/index.d.ts +2 -2
- package/dist/editor/types.d.cts +1 -1
- package/dist/editor/types.d.ts +1 -1
- package/dist/{emitter-raKkIqRp.d.ts → emitter-yaYzJOdh.d.cts} +1 -2
- package/dist/{emitter-raKkIqRp.d.cts → emitter-yaYzJOdh.d.ts} +1 -2
- package/dist/encryption/index.d.cts +1 -1
- package/dist/encryption/index.d.ts +1 -1
- package/dist/encryption/types.d.cts +1 -1
- package/dist/encryption/types.d.ts +1 -1
- package/dist/import/index.d.cts +3 -3
- package/dist/import/index.d.ts +3 -3
- package/dist/{index-DcKc3_Y1.d.cts → index-9p4O-clX.d.cts} +2033 -72
- package/dist/{index-DcKc3_Y1.d.ts → index-9p4O-clX.d.ts} +2033 -72
- package/dist/{index-CLqZfRpv.d.cts → index-B-HCh7LL.d.cts} +3 -3
- package/dist/{index-CxoJuIzB.d.cts → index-B0e42GnK.d.cts} +4 -3
- package/dist/{index-Bgu3hnMO.d.ts → index-BbXGsspe.d.ts} +4 -4
- package/dist/{index-B7Ogo2SK.d.ts → index-Bg9BWpIY.d.ts} +4 -3
- package/dist/{index-DPhGNQC5.d.cts → index-BgEu7wGk.d.cts} +2559 -7319
- package/dist/{index-C_A0JS9s.d.ts → index-Btft3BFn.d.ts} +29 -3
- package/dist/{index-DXNRd61K.d.cts → index-ByaAn_lm.d.cts} +4 -4
- package/dist/{index-A8udJCGv.d.ts → index-C92Ct6K5.d.ts} +178 -4
- package/dist/{index-B30dBBBH.d.ts → index-CBq59Aif.d.ts} +3 -3
- package/dist/{index-DAb1g6je.d.cts → index-CGUPsu_R.d.cts} +29 -3
- package/dist/{index-CLxvW_pn.d.ts → index-CIA6-x2Q.d.ts} +4 -4
- package/dist/{index-B2YNTI4p.d.ts → index-CeWVf3d1.d.ts} +4 -4
- package/dist/{index-GlHJ4j3a.d.ts → index-Cj0l_DL_.d.ts} +2559 -7319
- package/dist/{index-BUZ-vTRt.d.ts → index-Ck0UPKMM.d.ts} +2 -2
- package/dist/{index-B-HhOTVk.d.cts → index-D0ACg_Pp.d.cts} +7 -4
- package/dist/{index-Dx02AUpZ.d.cts → index-D8nMnVp1.d.cts} +4 -4
- package/dist/{index-24GpnYhn.d.cts → index-DENUPo51.d.cts} +2 -2
- package/dist/{index-RHYdFrfn.d.cts → index-DGjxLWZ-.d.cts} +3 -3
- package/dist/{index-BH1jo-bb.d.ts → index-Dse6Psvc.d.ts} +7 -4
- package/dist/{index-BaJ-GMa7.d.ts → index-DxcaEIhU.d.ts} +3 -3
- package/dist/{index-CpidrJQc.d.cts → index-OCEoQ1Y-.d.cts} +4 -4
- package/dist/{index-DxbqDi_0.d.cts → index-jR69kGUZ.d.cts} +178 -4
- package/dist/index.cjs +615 -867
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -9
- package/dist/index.d.ts +9 -9
- package/dist/index.js +611 -860
- package/dist/index.js.map +1 -1
- package/dist/kaiAgent/index.cjs +1 -1
- package/dist/kaiAgent/index.d.cts +2 -2
- package/dist/kaiAgent/index.d.ts +2 -2
- package/dist/kaiAgent/index.js +1 -1
- package/dist/kaiAgent/types.d.cts +2 -2
- package/dist/kaiAgent/types.d.ts +2 -2
- package/dist/{kaiAgent-De2T6G4G.cjs → kaiAgent-Q00g6S1v.cjs} +16 -1
- package/dist/kaiAgent-Q00g6S1v.cjs.map +1 -0
- package/dist/{kaiAgent-D0MoKqXe.js → kaiAgent-aqylPZHY.js} +16 -1
- package/dist/kaiAgent-aqylPZHY.js.map +1 -0
- package/dist/management/index.cjs +1 -1
- package/dist/management/index.d.cts +1 -1
- package/dist/management/index.d.ts +1 -1
- package/dist/management/index.js +1 -1
- package/dist/management/types.d.cts +1 -1
- package/dist/management/types.d.ts +1 -1
- package/dist/{management-BlMQnPNS.js → management-CIK5-Aq5.js} +14 -7
- package/dist/management-CIK5-Aq5.js.map +1 -0
- package/dist/{management-dIMrTTpI.cjs → management-Dqrc516s.cjs} +14 -7
- package/dist/management-Dqrc516s.cjs.map +1 -0
- package/dist/{metaObject-qWyZAD-5.d.ts → metaObject-AQ7wKDOu.d.ts} +2 -2
- package/dist/{metaObject-BsBMgWRt.d.cts → metaObject-I35_krxf.d.cts} +2 -2
- package/dist/metastore/index.d.cts +1 -1
- package/dist/metastore/index.d.ts +1 -1
- package/dist/metastore/types.d.cts +1 -1
- package/dist/metastore/types.d.ts +1 -1
- package/dist/microsoftGraph/index.d.cts +3 -3
- package/dist/microsoftGraph/index.d.ts +3 -3
- package/dist/microsoftGraph/types.d.cts +2 -2
- package/dist/microsoftGraph/types.d.ts +2 -2
- package/dist/{middleware-DxGv7DG8.js → middleware-DWmhthX0.js} +2 -2
- package/dist/middleware-DWmhthX0.js.map +1 -0
- package/dist/{middleware-vIaPDtQI.cjs → middleware-DYdDD4O6.cjs} +2 -2
- package/dist/middleware-DYdDD4O6.cjs.map +1 -0
- package/dist/notifications/index.d.cts +2 -2
- package/dist/notifications/index.d.ts +2 -2
- package/dist/notifications/types.d.cts +1 -1
- package/dist/notifications/types.d.ts +1 -1
- package/dist/oauth/index.d.cts +2 -2
- package/dist/oauth/index.d.ts +2 -2
- package/dist/oauth/types.d.cts +1 -1
- package/dist/oauth/types.d.ts +1 -1
- package/dist/omnisearch/index.d.cts +2 -2
- package/dist/omnisearch/index.d.ts +2 -2
- package/dist/omnisearch/types.d.cts +1 -1
- package/dist/omnisearch/types.d.ts +1 -1
- package/dist/{project-CmV1OhK4.d.ts → project-DwRvx_zN.d.ts} +3 -3
- package/dist/{project-F6eHCACz.d.cts → project-ERH0FTGW.d.cts} +3 -3
- package/dist/queryService/index.cjs +1 -1
- package/dist/queryService/index.d.cts +1 -1
- package/dist/queryService/index.d.ts +1 -1
- package/dist/queryService/index.js +1 -1
- package/dist/queryService/types.d.cts +1 -1
- package/dist/queryService/types.d.ts +1 -1
- package/dist/{queryService-C3BQ6GKW.cjs → queryService-CECWubS0.cjs} +2 -2
- package/dist/{queryService-C3BQ6GKW.cjs.map → queryService-CECWubS0.cjs.map} +1 -1
- package/dist/{queryService-DQHtHy2-.js → queryService-CIxb_mcP.js} +2 -2
- package/dist/{queryService-DQHtHy2-.js.map → queryService-CIxb_mcP.js.map} +1 -1
- package/dist/queue/index.cjs +1 -1
- package/dist/queue/index.d.cts +11 -4
- package/dist/queue/index.d.ts +11 -4
- package/dist/queue/index.js +1 -1
- package/dist/queue/types.d.cts +1 -1
- package/dist/queue/types.d.ts +1 -1
- package/dist/{queue-6cywDnA-.js → queue-BBihD5qQ.js} +2 -2
- package/dist/{queue-6cywDnA-.js.map → queue-BBihD5qQ.js.map} +1 -1
- package/dist/{queue-J2uXzXR9.cjs → queue-PmTfoniJ.cjs} +2 -2
- package/dist/{queue-J2uXzXR9.cjs.map → queue-PmTfoniJ.cjs.map} +1 -1
- package/dist/scheduler/index.d.cts +2 -2
- package/dist/scheduler/index.d.ts +2 -2
- package/dist/scheduler/types.d.cts +1 -1
- package/dist/scheduler/types.d.ts +1 -1
- package/dist/{schema-DLmBEgPM.d.cts → schema-CqzWi5cO.d.cts} +14 -4
- package/dist/{schema-DLmBEgPM.d.ts → schema-CqzWi5cO.d.ts} +14 -4
- package/dist/sdk/configurations/index.d.cts +2 -3
- package/dist/sdk/configurations/index.d.ts +2 -3
- package/dist/sdk/dataAppServer/index.cjs +3 -3
- package/dist/sdk/dataAppServer/index.d.cts +1 -1
- package/dist/sdk/dataAppServer/index.d.ts +1 -1
- package/dist/sdk/dataAppServer/index.js +3 -3
- package/dist/sdk/developerPortal/index.cjs +3 -3
- package/dist/sdk/developerPortal/index.cjs.map +1 -1
- package/dist/sdk/developerPortal/index.d.cts +178 -4
- package/dist/sdk/developerPortal/index.d.ts +178 -4
- package/dist/sdk/developerPortal/index.js +3 -3
- package/dist/sdk/developerPortal/index.js.map +1 -1
- package/dist/sdk/kaiMemory/index.d.cts +1 -1
- package/dist/sdk/kaiMemory/index.d.ts +1 -1
- package/dist/sdk/kaiMemory/types.d.cts +1 -1
- package/dist/sdk/kaiMemory/types.d.ts +1 -1
- package/dist/sdk/queryService/index.d.cts +1 -1
- package/dist/sdk/queryService/index.d.ts +1 -1
- package/dist/sdk/securityPolicy/index.d.cts +2 -2
- package/dist/sdk/securityPolicy/index.d.ts +2 -2
- package/dist/sdk/securityPolicy/types.d.cts +1 -1
- package/dist/sdk/securityPolicy/types.d.ts +1 -1
- package/dist/sdk/semanticLayer/index.d.cts +1 -1
- package/dist/sdk/semanticLayer/index.d.ts +1 -1
- package/dist/sdk/semanticLayer/types.d.cts +1 -1
- package/dist/sdk/semanticLayer/types.d.ts +1 -1
- package/dist/sdk/tag/index.d.cts +3 -3
- package/dist/sdk/tag/index.d.ts +3 -3
- package/dist/sdk/tag/types.d.cts +1 -1
- package/dist/sdk/tag/types.d.ts +1 -1
- package/dist/sdk/vault/index.d.cts +1 -1
- package/dist/sdk/vault/index.d.ts +1 -1
- package/dist/status/index.d.cts +1 -1
- package/dist/status/index.d.ts +1 -1
- package/dist/storage/index.cjs +5 -5
- package/dist/storage/index.d.cts +2 -3
- package/dist/storage/index.d.ts +2 -3
- package/dist/storage/index.js +3 -3
- package/dist/storage/types.d.cts +5 -5
- package/dist/storage/types.d.ts +5 -5
- package/dist/{storage-jLhVrKZh.cjs → storage-chxoWtAL.cjs} +44 -56
- package/dist/storage-chxoWtAL.cjs.map +1 -0
- package/dist/{storage-Bw-HSnPp.js → storage-o9teEKl_.js} +42 -54
- package/dist/storage-o9teEKl_.js.map +1 -0
- package/dist/{store-2OyH1XOP.cjs → store-7xlVu4qF.cjs} +3 -14
- package/dist/store-7xlVu4qF.cjs.map +1 -0
- package/dist/{store-HP0zRcLz.js → store-DDUzPeCm.js} +3 -14
- package/dist/store-DDUzPeCm.js.map +1 -0
- package/dist/stream/index.d.cts +2 -2
- package/dist/stream/index.d.ts +2 -2
- package/dist/stream/types.d.cts +1 -1
- package/dist/stream/types.d.ts +1 -1
- package/dist/syncActions/index.d.cts +2 -2
- package/dist/syncActions/index.d.ts +2 -2
- package/dist/syncActions/types.d.cts +1 -1
- package/dist/syncActions/types.d.ts +1 -1
- package/dist/telemetry/index.d.cts +2 -2
- package/dist/telemetry/index.d.ts +2 -2
- package/dist/telemetry/types.d.cts +1 -1
- package/dist/telemetry/types.d.ts +1 -1
- package/dist/{transientRetries-BORv47mH.js → transientRetries-dssygpwU.js} +2 -2
- package/dist/{transientRetries-BORv47mH.js.map → transientRetries-dssygpwU.js.map} +1 -1
- package/dist/{transientRetries-CBorl4Ue.cjs → transientRetries-yVaQgKqP.cjs} +2 -2
- package/dist/{transientRetries-CBorl4Ue.cjs.map → transientRetries-yVaQgKqP.cjs.map} +1 -1
- package/dist/{types-LOf_GCej.d.cts → types-B1kernzE.d.cts} +2 -2
- package/dist/{types-Cvbcjdgf.d.ts → types-BBmS7-IS.d.ts} +151 -4
- package/dist/{types-DaRxZt3v.d.ts → types-BJyWTgXX.d.ts} +2 -2
- package/dist/{types-CnKiVVb8.d.ts → types-BPNFTA63.d.cts} +21 -7
- package/dist/{types-BJRRAQ9R.d.cts → types-BPSExpye.d.cts} +244 -4
- package/dist/{types-Cg_66Toy.d.ts → types-BiXonOK6.d.ts} +2 -2
- package/dist/{types-CNDemlfn.d.cts → types-BimRBONo.d.cts} +3 -3
- package/dist/{types-CrXoqs8E.d.cts → types-BuEC58u3.d.cts} +2 -2
- package/dist/{types-BnkHyxdp.d.ts → types-BzHyi99r.d.cts} +5 -3
- package/dist/{types-2CMPwArl.d.ts → types-C4T_2JdN.d.cts} +40 -27
- package/dist/{types-lZRyNwOH.d.ts → types-C53aKnWt.d.ts} +2 -2
- package/dist/{types-6oLbURTK.d.cts → types-CEjgqmr2.d.cts} +2 -2
- package/dist/{types-BEEGI4aq.d.ts → types-CGtpwTJk.d.ts} +2 -2
- package/dist/{types-B_yv00AL.d.ts → types-CH1uguug.d.cts} +2 -163
- package/dist/{types-DMEl2iet.d.ts → types-CP8-CssY.d.ts} +2 -2
- package/dist/{types-DgAMVyiT.d.ts → types-CPQ6RkiZ.d.ts} +244 -4
- package/dist/{types-EdL0Eb0B.d.ts → types-CPwofeyq.d.ts} +3 -3
- package/dist/{types-CFuT8zr3.d.cts → types-CQAEOq-K.d.cts} +2 -2
- package/dist/{types-DslO1S5E.d.cts → types-CVWoP_PC.d.cts} +3 -3
- package/dist/{types-BqJycQNM.d.cts → types-CbM2MApW.d.cts} +2 -2
- package/dist/{types-BDGkMVWf.d.cts → types-CbOfT6lb.d.ts} +21 -7
- package/dist/{types-B6OG1lLf.d.cts → types-CcPpqVhm.d.cts} +2 -2
- package/dist/{types-D2J3SaoY.d.ts → types-CeqpzbBH.d.ts} +2 -2
- package/dist/{types-C_JO7FI9.d.cts → types-CjJYZaMO.d.cts} +2 -2
- package/dist/{types-D0Gqu-Xz.d.cts → types-CjP8RcFN.d.cts} +2 -2
- package/dist/{types-CUovU--e.d.ts → types-CjfsPtwk.d.ts} +2 -2
- package/dist/{types-DPFG6AAA.d.ts → types-CnSBLcZB.d.ts} +163 -3
- package/dist/{types-D4knWlwr.d.ts → types-CsXLdnfV.d.ts} +2 -2
- package/dist/{types-C3Kf_ggm.d.cts → types-CzAh5-0z.d.cts} +2 -2
- package/dist/{types-D6Fbf_y3.d.ts → types-D0F_c5KI.d.ts} +4 -4
- package/dist/{types-DykEfF2N.d.cts → types-D3L3CqKl.d.cts} +151 -4
- package/dist/{types--mz2z0Zm.d.cts → types-D4oIei5M.d.cts} +163 -3
- package/dist/{types-Cm1iOHE5.d.cts → types-D6ilG8sC.d.cts} +3 -3
- package/dist/{types-DtS7qAdz.d.cts → types-DEGkXcw2.d.ts} +5 -3
- package/dist/{types-DQguGTlM.d.cts → types-DEhAcO1Z.d.cts} +2 -2
- package/dist/{types-CuYaiy4R.d.cts → types-DaIfg9Mb.d.cts} +4 -4
- package/dist/{types-ByKSM08P.d.ts → types-DhofEmWy.d.ts} +2 -2
- package/dist/{types-B5FgsIiY.d.ts → types-Dp61pYgP.d.ts} +3 -3
- package/dist/{types-BhGr9OQ4.d.ts → types-Dteot3tT.d.ts} +757 -112
- package/dist/{types-3ZE32k8V.d.cts → types-K-JISUUI.d.cts} +757 -112
- package/dist/{types-CjqFLXVx.d.cts → types-TywAc1ow.d.ts} +40 -27
- package/dist/{types-DiXeO0yB.d.ts → types-UBpth6_9.d.ts} +2 -2
- package/dist/{types-D0BOES7q.d.cts → types-Vw-tduOH.d.ts} +2 -163
- package/dist/{types-CF5ZROX5.d.cts → types-ZyLTqgpa.d.cts} +2 -2
- package/dist/{types-BmcZyKgM.d.cts → types-aylD1zQz.d.cts} +3 -3
- package/dist/{types-CbPO9cGq.d.cts → types-fYY4q7dC.d.cts} +2 -2
- package/dist/{types-Foy0RnqF.d.ts → types-jYn3e3Du.d.ts} +3 -3
- package/dist/{types-p6UYqJo_.d.ts → types-qXqJRPHj.d.ts} +2 -2
- package/dist/{types-B452bFfS.d.ts → types-r-Qa3y8e.d.ts} +2 -2
- package/dist/{types-DhE7iY90.d.ts → types-z82j5aNW.d.ts} +3 -3
- package/dist/{collectByCursor-2-8SuJ-8.js → validateConnectionStatus-DgJwuEy9.js} +32 -22
- package/dist/validateConnectionStatus-DgJwuEy9.js.map +1 -0
- package/dist/{collectByCursor-D58__WD1.cjs → validateConnectionStatus-DpYRsU-e.cjs} +37 -21
- package/dist/validateConnectionStatus-DpYRsU-e.cjs.map +1 -0
- package/dist/vault/index.d.cts +1 -1
- package/dist/vault/index.d.ts +1 -1
- package/dist/vault/types.d.cts +1 -1
- package/dist/vault/types.d.ts +1 -1
- package/package.json +2 -2
- package/surface/apps.md +8 -3
- package/surface/auth.md +3 -2
- package/surface/chat.md +3 -3
- package/surface/dataScience.md +2 -2
- package/surface/kaiAgent.md +4 -3
- package/surface/management.md +4 -4
- package/surface/queue.md +7 -7
- package/surface/storage.md +27 -26
- package/dist/ManagementSessionMintError-BMHDcEqV.js.map +0 -1
- package/dist/ManagementSessionMintError-Bc9bc7Ai.cjs.map +0 -1
- package/dist/apps-BN7fWtSm.js.map +0 -1
- package/dist/apps-C1x5IKNQ.cjs.map +0 -1
- package/dist/authClient-B_Mb4Vzs.js.map +0 -1
- package/dist/authClient-C9QqhT2M.cjs.map +0 -1
- package/dist/collectByCursor-2-8SuJ-8.js.map +0 -1
- package/dist/collectByCursor-D58__WD1.cjs.map +0 -1
- package/dist/constants-HccvU5kx.js.map +0 -1
- package/dist/constants-V9hAyPTo.cjs.map +0 -1
- package/dist/developerPortalClient-BcK9F-Fs.cjs.map +0 -1
- package/dist/developerPortalClient-CzCJ5sE3.js.map +0 -1
- package/dist/index-C6FI_Lc7.d.ts +0 -10
- package/dist/index-CmtqbTse.d.cts +0 -10
- package/dist/kaiAgent-D0MoKqXe.js.map +0 -1
- package/dist/kaiAgent-De2T6G4G.cjs.map +0 -1
- package/dist/management-BlMQnPNS.js.map +0 -1
- package/dist/management-dIMrTTpI.cjs.map +0 -1
- package/dist/middleware-DxGv7DG8.js.map +0 -1
- package/dist/middleware-vIaPDtQI.cjs.map +0 -1
- package/dist/storage-Bw-HSnPp.js.map +0 -1
- package/dist/storage-jLhVrKZh.cjs.map +0 -1
- package/dist/store-2OyH1XOP.cjs.map +0 -1
- package/dist/store-HP0zRcLz.js.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -2,51 +2,51 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_rolldown_runtime = require("./rolldown-runtime-CmQyd0Gu.cjs");
|
|
3
3
|
const require_UserError = require("./UserError-D4P9Tbhf.cjs");
|
|
4
4
|
const require_createFetchClient = require("./createFetchClient-CDKSkd7i.cjs");
|
|
5
|
-
const
|
|
6
|
-
const require_storage = require("./storage-
|
|
7
|
-
const require_ManagementSessionMintError = require("./ManagementSessionMintError-
|
|
5
|
+
const require_validateConnectionStatus = require("./validateConnectionStatus-DpYRsU-e.cjs");
|
|
6
|
+
const require_storage = require("./storage-chxoWtAL.cjs");
|
|
7
|
+
const require_ManagementSessionMintError = require("./ManagementSessionMintError-BCOLLaJi.cjs");
|
|
8
8
|
const require_RowLevelSecurityError = require("./RowLevelSecurityError-RK_NhhAx.cjs");
|
|
9
9
|
const require_QueueJobError = require("./QueueJobError-DruZK3tc.cjs");
|
|
10
10
|
const require_SyncActionError = require("./SyncActionError-mbpVg63X.cjs");
|
|
11
11
|
const require_ValidationError = require("./ValidationError-BXcFX4nD.cjs");
|
|
12
12
|
const require_createGenericFetchClient = require("./createGenericFetchClient-BuYzzV_D.cjs");
|
|
13
13
|
const require_import = require("./import-DHq6q3Fm.cjs");
|
|
14
|
-
const require_authClient = require("./authClient-C9QqhT2M.cjs");
|
|
15
14
|
const require_collectByOffset = require("./collectByOffset-DgxJ3zT9.cjs");
|
|
16
15
|
const require_concurrent = require("./concurrent-DnTV_ppY.cjs");
|
|
17
16
|
const require_dedupe = require("./dedupe-Bf0gl9TJ.cjs");
|
|
18
|
-
const require_transientRetries = require("./transientRetries-
|
|
19
|
-
const require_store = require("./store-
|
|
17
|
+
const require_transientRetries = require("./transientRetries-yVaQgKqP.cjs");
|
|
18
|
+
const require_store = require("./store-7xlVu4qF.cjs");
|
|
20
19
|
const require_tag = require("./tag-A5z4tJn1.cjs");
|
|
21
20
|
const require_generateUUID = require("./generateUUID-DbSTmvVP.cjs");
|
|
22
21
|
const require_isPlainObject = require("./isPlainObject-CcvQt0qB.cjs");
|
|
23
22
|
const require_schemaGuidedMerge = require("./schemaGuidedMerge-C8CqrNGe.cjs");
|
|
24
|
-
const
|
|
25
|
-
const
|
|
23
|
+
const require_authClient = require("./authClient-C3KG9hXw.cjs");
|
|
24
|
+
const require_middleware = require("./middleware-DYdDD4O6.cjs");
|
|
26
25
|
const require_kaiMemory = require("./kaiMemory-DZ6hXni_.cjs");
|
|
27
26
|
const require_semanticLayer = require("./semanticLayer-BVpdWKJn.cjs");
|
|
28
27
|
const require_sdk_vault_index = require("./sdk/vault/index.cjs");
|
|
29
28
|
const require_ai_index = require("./ai/index.cjs");
|
|
30
|
-
const require_apps = require("./apps-
|
|
29
|
+
const require_apps = require("./apps-BA9JRLAZ.cjs");
|
|
31
30
|
const require_billing_index = require("./billing/index.cjs");
|
|
32
31
|
const require_chat_index = require("./chat/index.cjs");
|
|
33
32
|
const require_componentsMcp = require("./componentsMcp-DXu-0Qt-.cjs");
|
|
34
33
|
const require_dataScience_index = require("./dataScience/index.cjs");
|
|
35
34
|
const require_editor_index = require("./editor/index.cjs");
|
|
36
35
|
const require_encryption_index = require("./encryption/index.cjs");
|
|
37
|
-
const require_kaiAgent = require("./kaiAgent-
|
|
36
|
+
const require_kaiAgent = require("./kaiAgent-Q00g6S1v.cjs");
|
|
38
37
|
const require_metastore = require("./metastore-CV4DUDxP.cjs");
|
|
39
38
|
const require_notifications_index = require("./notifications/index.cjs");
|
|
40
39
|
const require_oauth = require("./oauth-CEW2AvDV.cjs");
|
|
41
40
|
const require_omnisearch_index = require("./omnisearch/index.cjs");
|
|
42
|
-
const require_queryService = require("./queryService-
|
|
43
|
-
const require_queue = require("./queue-
|
|
41
|
+
const require_queryService = require("./queryService-CECWubS0.cjs");
|
|
42
|
+
const require_queue = require("./queue-PmTfoniJ.cjs");
|
|
44
43
|
const require_scheduler_index = require("./scheduler/index.cjs");
|
|
45
44
|
const require_stream_index = require("./stream/index.cjs");
|
|
46
45
|
const require_syncActions = require("./syncActions-B9JTiSao.cjs");
|
|
46
|
+
const require_serviceIds = require("./serviceIds-Bg1pWiPE.cjs");
|
|
47
47
|
const require_telemetry_index = require("./telemetry/index.cjs");
|
|
48
48
|
const require_vault_index = require("./vault/index.cjs");
|
|
49
|
-
const
|
|
49
|
+
const require_management = require("./management-Dqrc516s.cjs");
|
|
50
50
|
const require_project = require("./project-BQ2oD6IW.cjs");
|
|
51
51
|
const require_queryService$1 = require("./queryService-B4h1Ez44.cjs");
|
|
52
52
|
let zod = require("zod");
|
|
@@ -61,24 +61,14 @@ const KeboolaErrorType = {
|
|
|
61
61
|
NotAuthenticated: "not-authenticated",
|
|
62
62
|
SignInEnded: "sign-in-ended",
|
|
63
63
|
AlreadyAuthenticated: "already-authenticated",
|
|
64
|
-
|
|
65
|
-
NoManagementToken: "no-management-token",
|
|
66
|
-
MissingProject: "missing-project",
|
|
67
|
-
NotBearer: "not-bearer",
|
|
68
|
-
NotReady: "not-ready",
|
|
69
|
-
InvalidBuildTransition: "invalid-build-transition"
|
|
64
|
+
NotReady: "not-ready"
|
|
70
65
|
};
|
|
71
66
|
const MESSAGES = {
|
|
72
|
-
[KeboolaErrorType.Unconfigured]: "
|
|
67
|
+
[KeboolaErrorType.Unconfigured]: "This stack has not been selected — call session.stack.select(baseUrl) first.",
|
|
73
68
|
[KeboolaErrorType.NotAuthenticated]: "The session is not authenticated — sign in first.",
|
|
74
69
|
[KeboolaErrorType.SignInEnded]: "The sign-in this operation started under has ended — its result belongs to nobody.",
|
|
75
|
-
[KeboolaErrorType.AlreadyAuthenticated]: "
|
|
76
|
-
[KeboolaErrorType.
|
|
77
|
-
[KeboolaErrorType.NoManagementToken]: "No management token — authenticate the management realm first.",
|
|
78
|
-
[KeboolaErrorType.MissingProject]: "A bearer storage session requires a project — call setProject(projectId) first.",
|
|
79
|
-
[KeboolaErrorType.NotBearer]: "This operation requires a bearer (OAuth) session.",
|
|
80
|
-
[KeboolaErrorType.NotReady]: "The client is not ready — authenticate the storage realm first.",
|
|
81
|
-
[KeboolaErrorType.InvalidBuildTransition]: "Invalid storage build transition — the build goes idle → initializing → ready | failed."
|
|
70
|
+
[KeboolaErrorType.AlreadyAuthenticated]: "This stack is already signed in — sign out or use auth.replace first.",
|
|
71
|
+
[KeboolaErrorType.NotReady]: "The stack index has not loaded yet."
|
|
82
72
|
};
|
|
83
73
|
var KeboolaError = class KeboolaError extends Error {
|
|
84
74
|
type;
|
|
@@ -143,109 +133,6 @@ const coalesce = (task) => {
|
|
|
143
133
|
return waiter.promise;
|
|
144
134
|
};
|
|
145
135
|
};
|
|
146
|
-
// src/utils/store/derivedStore.ts
|
|
147
|
-
const isPlainObjectOrArray = (value) => {
|
|
148
|
-
if (Array.isArray(value)) return true;
|
|
149
|
-
const proto = Object.getPrototypeOf(value);
|
|
150
|
-
return proto === Object.prototype || proto === null;
|
|
151
|
-
};
|
|
152
|
-
const shallowEqual = (a, b) => {
|
|
153
|
-
if (Object.is(a, b)) return true;
|
|
154
|
-
if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) return false;
|
|
155
|
-
if (!isPlainObjectOrArray(a) || !isPlainObjectOrArray(b)) return false;
|
|
156
|
-
const aKeys = Object.keys(a);
|
|
157
|
-
const bKeys = Object.keys(b);
|
|
158
|
-
return aKeys.length === bKeys.length && aKeys.every((key) => Object.is(a[key], b[key]));
|
|
159
|
-
};
|
|
160
|
-
const createDerivedStore = ({ source, dependsOn, build, keyEquals = shallowEqual }) => {
|
|
161
|
-
let key = dependsOn(source.get());
|
|
162
|
-
const store = require_store.createStore(build(key));
|
|
163
|
-
const unsubscribe = source.subscribe((state) => {
|
|
164
|
-
const next = dependsOn(state);
|
|
165
|
-
if (keyEquals(key, next)) return;
|
|
166
|
-
key = next;
|
|
167
|
-
store.set(build(next));
|
|
168
|
-
});
|
|
169
|
-
const get = store.get;
|
|
170
|
-
const subscribe = store.subscribe;
|
|
171
|
-
const dispose = () => {
|
|
172
|
-
unsubscribe();
|
|
173
|
-
store.dispose();
|
|
174
|
-
};
|
|
175
|
-
return {
|
|
176
|
-
get,
|
|
177
|
-
subscribe,
|
|
178
|
-
dispose
|
|
179
|
-
};
|
|
180
|
-
};
|
|
181
|
-
// src/utils/store/derivedAsyncStore.ts
|
|
182
|
-
const createDerivedAsyncStore = ({ source, dependsOn, build, keyEquals = shallowEqual }) => {
|
|
183
|
-
const store = require_store.createStore({ state: "idle" });
|
|
184
|
-
let currentKey = null;
|
|
185
|
-
let generation = 0;
|
|
186
|
-
let controller = null;
|
|
187
|
-
const run = (key) => {
|
|
188
|
-
controller?.abort();
|
|
189
|
-
controller = new AbortController();
|
|
190
|
-
const runGeneration = ++generation;
|
|
191
|
-
store.set({ state: "pending" });
|
|
192
|
-
build(key, controller.signal).then((value) => {
|
|
193
|
-
if (runGeneration === generation) store.set({
|
|
194
|
-
state: "ready",
|
|
195
|
-
value
|
|
196
|
-
});
|
|
197
|
-
}, (error) => {
|
|
198
|
-
if (runGeneration === generation) store.set({
|
|
199
|
-
state: "errored",
|
|
200
|
-
error
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
};
|
|
204
|
-
const sync = (state) => {
|
|
205
|
-
const next = dependsOn(state);
|
|
206
|
-
if (next === null) {
|
|
207
|
-
if (currentKey === null) return;
|
|
208
|
-
controller?.abort();
|
|
209
|
-
controller = null;
|
|
210
|
-
generation += 1;
|
|
211
|
-
currentKey = null;
|
|
212
|
-
store.set({ state: "idle" });
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
if (currentKey !== null && keyEquals(currentKey, next)) return;
|
|
216
|
-
currentKey = next;
|
|
217
|
-
run(next);
|
|
218
|
-
};
|
|
219
|
-
sync(source.get());
|
|
220
|
-
const unsubscribe = source.subscribe(sync);
|
|
221
|
-
const get = store.get;
|
|
222
|
-
const subscribe = store.subscribe;
|
|
223
|
-
const dispose = () => {
|
|
224
|
-
controller?.abort();
|
|
225
|
-
unsubscribe();
|
|
226
|
-
store.dispose();
|
|
227
|
-
};
|
|
228
|
-
const readable = {
|
|
229
|
-
get,
|
|
230
|
-
subscribe,
|
|
231
|
-
dispose
|
|
232
|
-
};
|
|
233
|
-
const settled = () => new Promise((resolve) => {
|
|
234
|
-
let unsubscribeSettled = () => {};
|
|
235
|
-
const check = (state) => {
|
|
236
|
-
if (state.state === "ready" || state.state === "errored") {
|
|
237
|
-
unsubscribeSettled();
|
|
238
|
-
resolve(state);
|
|
239
|
-
}
|
|
240
|
-
};
|
|
241
|
-
unsubscribeSettled = store.subscribe(check);
|
|
242
|
-
check(store.get());
|
|
243
|
-
});
|
|
244
|
-
return {
|
|
245
|
-
store: readable,
|
|
246
|
-
settled
|
|
247
|
-
};
|
|
248
|
-
};
|
|
249
136
|
// src/utils/async/poll/registry.ts
|
|
250
137
|
const DEFAULT_LIMIT = 50;
|
|
251
138
|
const isFinished = ({ snapshot }) => snapshot.state !== "idle" && snapshot.state !== "requesting" && snapshot.state !== "polling";
|
|
@@ -457,721 +344,175 @@ const createPersistor = ({ storage = createNullStorage(), key, schema, defaultVa
|
|
|
457
344
|
locked
|
|
458
345
|
};
|
|
459
346
|
};
|
|
460
|
-
// src/serviceClientRegistry/utils.ts
|
|
461
|
-
const isBuiltInProperty = (property) => typeof property === "symbol" || property === "then" || property === "constructor" || property === "toString" || property === "valueOf";
|
|
462
|
-
/**
|
|
463
|
-
* Creates a dummy client that intercepts method calls and invokes the provided onCall callback.
|
|
464
|
-
*/
|
|
465
|
-
const createDummyClient = ({ onCall }) => {
|
|
466
|
-
const createProxy = (path = []) => new Proxy(() => {}, {
|
|
467
|
-
get: (_target, prop) => {
|
|
468
|
-
if (isBuiltInProperty(prop)) return void 0;
|
|
469
|
-
return createProxy([...path, prop]);
|
|
470
|
-
},
|
|
471
|
-
apply: (_target, _thisArgs, args) => onCall(path, args)
|
|
472
|
-
});
|
|
473
|
-
return createProxy();
|
|
474
|
-
};
|
|
475
|
-
// src/serviceClientRegistry/createServiceClientRegistry.ts
|
|
476
|
-
const createServiceClientRegistry = () => ({ getServiceBaseUrl, onUnavailable }) => {
|
|
477
|
-
const dummy = (serviceId, clientName) => createDummyClient({ onCall: (path, args) => {
|
|
478
|
-
onUnavailable?.({
|
|
479
|
-
serviceId,
|
|
480
|
-
path,
|
|
481
|
-
args,
|
|
482
|
-
clientName
|
|
483
|
-
});
|
|
484
|
-
} });
|
|
485
|
-
const configs = [];
|
|
486
|
-
const resolveClient = ({ serviceId, clientFn, clientName }) => {
|
|
487
|
-
const serviceBaseUrl = getServiceBaseUrl(serviceId);
|
|
488
|
-
return serviceBaseUrl ? clientFn(serviceBaseUrl) : dummy(serviceId, clientName);
|
|
489
|
-
};
|
|
490
|
-
const registry = {
|
|
491
|
-
add: (config) => {
|
|
492
|
-
configs.push(config);
|
|
493
|
-
return registry;
|
|
494
|
-
},
|
|
495
|
-
build: () => {
|
|
496
|
-
const clientMap = {};
|
|
497
|
-
const clientMeta = [];
|
|
498
|
-
configs.forEach((config) => {
|
|
499
|
-
clientMap[config.clientName] = resolveClient(config);
|
|
500
|
-
clientMeta.push({
|
|
501
|
-
clientName: config.clientName,
|
|
502
|
-
serviceId: config.serviceId,
|
|
503
|
-
isAvailable: !!getServiceBaseUrl(config.serviceId)
|
|
504
|
-
});
|
|
505
|
-
});
|
|
506
|
-
return {
|
|
507
|
-
client: clientMap,
|
|
508
|
-
meta: clientMeta
|
|
509
|
-
};
|
|
510
|
-
}
|
|
511
|
-
};
|
|
512
|
-
return registry;
|
|
513
|
-
};
|
|
514
|
-
// src/keboola/createApi.ts
|
|
515
|
-
const createApi = (state) => new Proxy({}, { get(_target, property) {
|
|
516
|
-
if (isBuiltInProperty(property)) return void 0;
|
|
517
|
-
if (property === "auth") {
|
|
518
|
-
const authClient = state.getAuthClient();
|
|
519
|
-
assert$1(authClient, KeboolaErrorType.Unconfigured);
|
|
520
|
-
return authClient;
|
|
521
|
-
}
|
|
522
|
-
if (property === "management") {
|
|
523
|
-
const management = state.getManagementClient();
|
|
524
|
-
assert$1(management, KeboolaErrorType.NoManagementToken);
|
|
525
|
-
return management;
|
|
526
|
-
}
|
|
527
|
-
const clients = state.getProjectClients();
|
|
528
|
-
assert$1(clients, KeboolaErrorType.NotReady);
|
|
529
|
-
return clients[property];
|
|
530
|
-
} });
|
|
531
347
|
// src/keboola/createMiddlewareFor.ts
|
|
532
348
|
const createMiddlewareFor = (middlewares) => {
|
|
533
349
|
return (target, baseline = []) => {
|
|
534
350
|
if (Array.isArray(middlewares)) return [...baseline, ...middlewares];
|
|
535
|
-
|
|
536
|
-
const targeted = middlewares?.[target] ?? [];
|
|
537
|
-
return [
|
|
538
|
-
...baseline,
|
|
539
|
-
...all,
|
|
540
|
-
...targeted
|
|
541
|
-
];
|
|
351
|
+
return [...baseline, ...middlewares?.[target] ?? []];
|
|
542
352
|
};
|
|
543
353
|
};
|
|
544
|
-
// src/keboola/
|
|
545
|
-
const
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
354
|
+
// src/keboola/state/auth.ts
|
|
355
|
+
const grantOf = (credential) => credential.type === "token" ? {
|
|
356
|
+
type: "token",
|
|
357
|
+
refreshToken: credential.refreshToken
|
|
358
|
+
} : {
|
|
359
|
+
type: "cookie",
|
|
360
|
+
sessionId: credential.sessionId
|
|
361
|
+
};
|
|
362
|
+
const stamped = (input) => ({
|
|
363
|
+
...input,
|
|
364
|
+
issuedAt: Date.now()
|
|
365
|
+
});
|
|
366
|
+
const credentialOf = (auth) => auth.status === "authenticated" ? require_transientRetries.Result.success(auth.credential) : require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.NotAuthenticated));
|
|
367
|
+
/**
|
|
368
|
+
* The stack's credential and its sign-in pin.
|
|
369
|
+
*
|
|
370
|
+
* - `epoch` moves on `authenticate` and `signOut` and never on a rotation, so it is exactly "which
|
|
371
|
+
* sign-in is this" — what an in-flight exchange compares itself against.
|
|
372
|
+
*/
|
|
373
|
+
const createAuth = (stacks) => {
|
|
374
|
+
const expired = /* @__PURE__ */ new Set();
|
|
375
|
+
const requireCredential = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => credentialOf(stack.auth));
|
|
376
|
+
const requireUnauthenticated = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "authenticated" ? require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.AlreadyAuthenticated)) : require_transientRetries.Result.success(stack));
|
|
377
|
+
const requireAnonymous = (baseUrl) => require_transientRetries.Result.andThen(requireUnauthenticated(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" is already being restored`)) : require_transientRetries.Result.success(stack));
|
|
378
|
+
const requireRestoring = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" is not being restored`)));
|
|
379
|
+
const startRestore = (baseUrl) => require_transientRetries.Result.map(requireAnonymous(baseUrl), (stack) => stacks.set({
|
|
380
|
+
...stack,
|
|
381
|
+
auth: { status: "restoring" }
|
|
382
|
+
}));
|
|
383
|
+
const cancelRestore = (baseUrl) => require_transientRetries.Result.map(requireRestoring(baseUrl), (stack) => stacks.set({
|
|
384
|
+
...stack,
|
|
385
|
+
auth: { status: "anonymous" }
|
|
386
|
+
}));
|
|
387
|
+
const authenticate = (baseUrl, input) => require_transientRetries.Result.map(requireUnauthenticated(baseUrl), (stack) => {
|
|
388
|
+
expired.delete(baseUrl);
|
|
389
|
+
return stacks.set({
|
|
390
|
+
...stack,
|
|
391
|
+
epoch: stack.epoch + 1,
|
|
392
|
+
auth: {
|
|
393
|
+
status: "authenticated",
|
|
394
|
+
credential: stamped(input)
|
|
395
|
+
},
|
|
396
|
+
retained: null
|
|
555
397
|
});
|
|
556
|
-
};
|
|
557
|
-
const
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
398
|
+
});
|
|
399
|
+
const applyRefresh = (baseUrl, input) => require_transientRetries.Result.andThen(requireCredential(baseUrl), (credential) => credential.type !== input.type ? require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`A ${credential.type} grant cannot become ${input.type}`)) : require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
400
|
+
...stack,
|
|
401
|
+
auth: {
|
|
402
|
+
status: "authenticated",
|
|
403
|
+
credential: stamped(input)
|
|
404
|
+
}
|
|
405
|
+
})));
|
|
406
|
+
const forceExpire = (baseUrl) => require_transientRetries.Result.andThen(requireCredential(baseUrl), (credential) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
407
|
+
...stack,
|
|
408
|
+
auth: {
|
|
409
|
+
status: "authenticated",
|
|
410
|
+
credential: {
|
|
411
|
+
...credential,
|
|
412
|
+
issuedAt: Date.now() - credential.expiresIn * 1e3
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
})));
|
|
416
|
+
const signOut = (baseUrl, { retain = false } = {}) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => {
|
|
417
|
+
const retained = retain ? require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(credentialOf(stack.auth), (credential) => ({ grant: grantOf(credential) })), stack.retained) : null;
|
|
418
|
+
return stacks.set({
|
|
419
|
+
...stack,
|
|
420
|
+
epoch: stack.epoch + 1,
|
|
421
|
+
auth: { status: "anonymous" },
|
|
422
|
+
retained
|
|
563
423
|
});
|
|
564
|
-
};
|
|
565
|
-
const getStorageToken = () => store.get().sapiToken ?? "";
|
|
566
|
-
const setStorageToken = (sapiToken) => store.set({
|
|
567
|
-
...store.get(),
|
|
568
|
-
sapiToken
|
|
569
424
|
});
|
|
570
|
-
|
|
571
|
-
|
|
425
|
+
const retain = (baseUrl, retained) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
426
|
+
...stack,
|
|
427
|
+
retained
|
|
428
|
+
}));
|
|
429
|
+
const dropRetained = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
430
|
+
...stack,
|
|
431
|
+
retained: null
|
|
432
|
+
}));
|
|
433
|
+
const requireRetained = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.retained ? require_transientRetries.Result.success(stack.retained) : require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" retains no credential`)));
|
|
434
|
+
const notifyExpired = (baseUrl) => {
|
|
435
|
+
if (expired.has(baseUrl)) return false;
|
|
436
|
+
expired.add(baseUrl);
|
|
437
|
+
return true;
|
|
438
|
+
};
|
|
439
|
+
const getEpoch = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stack.epoch);
|
|
440
|
+
const getAccessToken = (baseUrl) => require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(requireCredential(baseUrl), ({ accessToken }) => accessToken), null);
|
|
572
441
|
return {
|
|
573
|
-
|
|
574
|
-
|
|
442
|
+
startRestore,
|
|
443
|
+
cancelRestore,
|
|
575
444
|
authenticate,
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
445
|
+
applyRefresh,
|
|
446
|
+
forceExpire,
|
|
447
|
+
signOut,
|
|
448
|
+
retain,
|
|
449
|
+
dropRetained,
|
|
450
|
+
requireRetained,
|
|
451
|
+
notifyExpired,
|
|
452
|
+
requireCredential,
|
|
453
|
+
getEpoch,
|
|
454
|
+
getAccessToken
|
|
579
455
|
};
|
|
580
456
|
};
|
|
581
|
-
// src/
|
|
582
|
-
const
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
const featureSet = new Set(features);
|
|
595
|
-
const hasFeature = (...feature) => {
|
|
596
|
-
if (feature.length === 0) return false;
|
|
597
|
-
return feature.every((x) => featureSet.has(x));
|
|
457
|
+
// src/keboola/state/stacks.ts
|
|
458
|
+
const newStack = (baseUrl) => ({
|
|
459
|
+
baseUrl,
|
|
460
|
+
context: "idle",
|
|
461
|
+
epoch: 0,
|
|
462
|
+
auth: { status: "anonymous" },
|
|
463
|
+
retained: null
|
|
464
|
+
});
|
|
465
|
+
/** One entry per stack, and the verbs that open and select them. */
|
|
466
|
+
const createStacks = (store) => {
|
|
467
|
+
const get = (baseUrl) => {
|
|
468
|
+
const stack = store.get().stacks[baseUrl];
|
|
469
|
+
return stack ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.Unconfigured));
|
|
598
470
|
};
|
|
599
|
-
const
|
|
600
|
-
|
|
601
|
-
|
|
471
|
+
const set = (stack) => {
|
|
472
|
+
const state = store.get();
|
|
473
|
+
store.set({
|
|
474
|
+
...state,
|
|
475
|
+
stacks: {
|
|
476
|
+
...state.stacks,
|
|
477
|
+
[stack.baseUrl]: stack
|
|
478
|
+
}
|
|
479
|
+
});
|
|
480
|
+
return stack;
|
|
602
481
|
};
|
|
603
|
-
const
|
|
604
|
-
|
|
605
|
-
|
|
482
|
+
const ensure = (baseUrl) => {
|
|
483
|
+
const existing = get(baseUrl);
|
|
484
|
+
if (existing.success) return existing.data;
|
|
485
|
+
return set(newStack(baseUrl));
|
|
486
|
+
};
|
|
487
|
+
const getActive = () => {
|
|
488
|
+
const { active } = store.get();
|
|
489
|
+
const stack = get(active);
|
|
490
|
+
if (!stack.success) throw new Error(`The active stack has no row: ${active}`);
|
|
491
|
+
return stack.data;
|
|
492
|
+
};
|
|
493
|
+
const select = (baseUrl) => {
|
|
494
|
+
const stack = ensure(baseUrl);
|
|
495
|
+
const state = store.get();
|
|
496
|
+
if (state.active !== baseUrl) store.set({
|
|
497
|
+
...state,
|
|
498
|
+
active: baseUrl
|
|
499
|
+
});
|
|
500
|
+
return stack;
|
|
501
|
+
};
|
|
502
|
+
const updateContext = (baseUrl, context) => require_transientRetries.Result.map(get(baseUrl), (stack) => set({
|
|
503
|
+
...stack,
|
|
504
|
+
context
|
|
505
|
+
}));
|
|
606
506
|
return {
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
hasService,
|
|
614
|
-
getComponent,
|
|
615
|
-
hasComponent
|
|
507
|
+
get,
|
|
508
|
+
set,
|
|
509
|
+
ensure,
|
|
510
|
+
getActive,
|
|
511
|
+
select,
|
|
512
|
+
updateContext
|
|
616
513
|
};
|
|
617
514
|
};
|
|
618
|
-
// src/
|
|
619
|
-
const VARIABLES_COMPONENT_ID = "keboola.variables";
|
|
620
|
-
/** Union the definitions by name; on a name conflict the target's definition is kept. */
|
|
621
|
-
const mergeVariableDefinitions = (target, source) => {
|
|
622
|
-
const targetNames = new Set(target.map((definition) => definition.name));
|
|
623
|
-
return [...target, ...source.filter((definition) => !targetNames.has(definition.name))];
|
|
624
|
-
};
|
|
625
|
-
/** Add values missing in the target; on a name conflict the value is updated to the source's. */
|
|
626
|
-
const mergeVariableValues = (target, source) => {
|
|
627
|
-
const sourceByName = new Map(source.map((value) => [value.name, value.value]));
|
|
628
|
-
const targetNames = new Set(target.map((value) => value.name));
|
|
629
|
-
return [...target.map((value) => sourceByName.has(value.name) ? {
|
|
630
|
-
...value,
|
|
631
|
-
value: sourceByName.get(value.name)
|
|
632
|
-
} : value), ...source.filter((value) => !targetNames.has(value.name))];
|
|
633
|
-
};
|
|
634
|
-
/**
|
|
635
|
-
* Orchestration for `keboola.variables` configs: copy a config, or merge two configs into a fresh
|
|
636
|
-
* one (union definitions, upsert values — source wins on a name conflict). Each result is a brand
|
|
637
|
-
* new config + values row, so the caller can reference it without sharing lineage with the source.
|
|
638
|
-
*/
|
|
639
|
-
const createVariablesSdk = ({ storageClient }) => {
|
|
640
|
-
const configs = storageClient.configurations;
|
|
641
|
-
const rows = storageClient.configurationRows;
|
|
642
|
-
const readVariables = async (configId, valuesRowId, branchId) => {
|
|
643
|
-
const config = await configs.getConfiguration({
|
|
644
|
-
componentId: VARIABLES_COMPONENT_ID,
|
|
645
|
-
configId,
|
|
646
|
-
branchId
|
|
647
|
-
});
|
|
648
|
-
const row = config.rows.find((candidate) => candidate.id === valuesRowId) ?? config.rows[0];
|
|
649
|
-
const rawDefinitions = config.configuration?.variables;
|
|
650
|
-
const rawValues = row?.configuration?.values;
|
|
651
|
-
return {
|
|
652
|
-
definitions: Array.isArray(rawDefinitions) ? rawDefinitions : [],
|
|
653
|
-
values: Array.isArray(rawValues) ? rawValues : []
|
|
654
|
-
};
|
|
655
|
-
};
|
|
656
|
-
const createVariables = async (definitions, values, branchId) => {
|
|
657
|
-
const config = await configs.createConfiguration({
|
|
658
|
-
branchId,
|
|
659
|
-
componentId: VARIABLES_COMPONENT_ID,
|
|
660
|
-
name: "Variables definition",
|
|
661
|
-
configuration: { variables: definitions }
|
|
662
|
-
});
|
|
663
|
-
try {
|
|
664
|
-
const row = await rows.createConfigurationRow({
|
|
665
|
-
branchId: String(branchId),
|
|
666
|
-
componentId: VARIABLES_COMPONENT_ID,
|
|
667
|
-
configurationId: config.id,
|
|
668
|
-
name: "Default values",
|
|
669
|
-
configuration: { values }
|
|
670
|
-
});
|
|
671
|
-
return {
|
|
672
|
-
variablesId: config.id,
|
|
673
|
-
variablesValuesId: row.id
|
|
674
|
-
};
|
|
675
|
-
} catch (error) {
|
|
676
|
-
await configs.deleteConfiguration({
|
|
677
|
-
branchId,
|
|
678
|
-
componentId: VARIABLES_COMPONENT_ID,
|
|
679
|
-
configId: config.id
|
|
680
|
-
}).catch((cleanupError) => {
|
|
681
|
-
if (error instanceof Error && error.cause === void 0) error.cause = cleanupError;
|
|
682
|
-
});
|
|
683
|
-
throw error;
|
|
684
|
-
}
|
|
685
|
-
};
|
|
686
|
-
return {
|
|
687
|
-
/** Copy a variables config into a fresh, independent config + values row. */
|
|
688
|
-
copy: async ({ variablesId, variablesValuesId, branchId = "default" }) => {
|
|
689
|
-
const { definitions, values } = await readVariables(variablesId, variablesValuesId, branchId);
|
|
690
|
-
return createVariables(definitions, values, branchId);
|
|
691
|
-
},
|
|
692
|
-
/** Merge the source's variables into the target's and create a fresh merged config + values row. */
|
|
693
|
-
merge: async ({ targetVariablesId, targetValuesId, sourceVariablesId, sourceValuesId, branchId = "default" }) => {
|
|
694
|
-
const [target, source] = await Promise.all([readVariables(targetVariablesId, targetValuesId, branchId), readVariables(sourceVariablesId, sourceValuesId, branchId)]);
|
|
695
|
-
return createVariables(mergeVariableDefinitions(target.definitions, source.definitions), mergeVariableValues(target.values, source.values), branchId);
|
|
696
|
-
}
|
|
697
|
-
};
|
|
698
|
-
};
|
|
699
|
-
// src/keboola/createSdk.ts
|
|
700
|
-
const createSdk = ({ storage, services }) => ({
|
|
701
|
-
tag: require_tag.createTagSdk({ metastoreClient: services.metastore }),
|
|
702
|
-
semanticLayer: require_semanticLayer.createSemanticLayerSdk({ metastoreClient: services.metastore }),
|
|
703
|
-
kaiMemory: require_kaiMemory.createKaiMemorySdk({ metastoreClient: services.metastore }),
|
|
704
|
-
vault: require_sdk_vault_index.createVaultSdk({
|
|
705
|
-
vaultClient: services.vault,
|
|
706
|
-
encryptionClient: services.encryption
|
|
707
|
-
}),
|
|
708
|
-
variables: createVariablesSdk({ storageClient: storage })
|
|
709
|
-
});
|
|
710
|
-
// src/keboola/createServiceClients.ts
|
|
711
|
-
const withPath = (serviceBaseUrl, path) => typeof serviceBaseUrl === "string" ? `${serviceBaseUrl}${path}` : async () => `${await serviceBaseUrl()}${path}`;
|
|
712
|
-
const createServiceClients = ({ baseUrl, auth, getServiceBaseUrl, middlewareFor, attachTokenMiddleware }) => createServiceClientRegistry()({
|
|
713
|
-
getServiceBaseUrl,
|
|
714
|
-
onUnavailable: ({ serviceId, path, clientName }) => {
|
|
715
|
-
throw new require_storage.ServiceUnavailableError(serviceId, path, clientName);
|
|
716
|
-
}
|
|
717
|
-
}).add({
|
|
718
|
-
serviceId: "vault",
|
|
719
|
-
clientName: "vault",
|
|
720
|
-
clientFn: (serviceBaseUrl) => require_vault_index.createVaultClient({
|
|
721
|
-
baseUrl: serviceBaseUrl,
|
|
722
|
-
middlewares: middlewareFor("vault", [attachTokenMiddleware]),
|
|
723
|
-
auth
|
|
724
|
-
})
|
|
725
|
-
}).add({
|
|
726
|
-
serviceId: "data-science",
|
|
727
|
-
clientName: "dataScience",
|
|
728
|
-
clientFn: (serviceBaseUrl) => require_dataScience_index.createDataScienceClient({
|
|
729
|
-
baseUrl: serviceBaseUrl,
|
|
730
|
-
middlewares: middlewareFor("dataScience", [attachTokenMiddleware]),
|
|
731
|
-
auth
|
|
732
|
-
})
|
|
733
|
-
}).add({
|
|
734
|
-
serviceId: "data-science",
|
|
735
|
-
clientName: "apps",
|
|
736
|
-
clientFn: (serviceBaseUrl) => require_apps.createAppsClient({
|
|
737
|
-
baseUrl: withPath(serviceBaseUrl, "/v2"),
|
|
738
|
-
middlewares: middlewareFor("apps", [attachTokenMiddleware]),
|
|
739
|
-
auth
|
|
740
|
-
})
|
|
741
|
-
}).add({
|
|
742
|
-
serviceId: "encryption",
|
|
743
|
-
clientName: "encryption",
|
|
744
|
-
clientFn: (serviceBaseUrl) => require_encryption_index.createEncryptionClient({
|
|
745
|
-
baseUrl: serviceBaseUrl,
|
|
746
|
-
middlewares: middlewareFor("encryption")
|
|
747
|
-
})
|
|
748
|
-
}).add({
|
|
749
|
-
serviceId: "editor",
|
|
750
|
-
clientName: "editor",
|
|
751
|
-
clientFn: (serviceBaseUrl) => require_editor_index.createEditorClient({
|
|
752
|
-
baseUrl: serviceBaseUrl,
|
|
753
|
-
middlewares: middlewareFor("editor", [attachTokenMiddleware]),
|
|
754
|
-
auth
|
|
755
|
-
})
|
|
756
|
-
}).add({
|
|
757
|
-
serviceId: "sync-actions",
|
|
758
|
-
clientName: "syncActions",
|
|
759
|
-
clientFn: (serviceBaseUrl) => require_syncActions.createSyncActionsClient({
|
|
760
|
-
baseUrl: serviceBaseUrl,
|
|
761
|
-
middlewares: middlewareFor("syncActions", [attachTokenMiddleware]),
|
|
762
|
-
auth
|
|
763
|
-
})
|
|
764
|
-
}).add({
|
|
765
|
-
serviceId: "telemetry",
|
|
766
|
-
clientName: "telemetry",
|
|
767
|
-
clientFn: (serviceBaseUrl) => require_telemetry_index.createTelemetryClient({
|
|
768
|
-
baseUrl: serviceBaseUrl,
|
|
769
|
-
middlewares: middlewareFor("telemetry", [attachTokenMiddleware]),
|
|
770
|
-
auth
|
|
771
|
-
})
|
|
772
|
-
}).add({
|
|
773
|
-
serviceId: "query",
|
|
774
|
-
clientName: "queryService",
|
|
775
|
-
clientFn: (serviceBaseUrl) => require_queryService.createQueryServiceClient({
|
|
776
|
-
baseUrl: serviceBaseUrl,
|
|
777
|
-
middlewares: middlewareFor("queryService", [attachTokenMiddleware]),
|
|
778
|
-
auth
|
|
779
|
-
})
|
|
780
|
-
}).add({
|
|
781
|
-
serviceId: "queue",
|
|
782
|
-
clientName: "queue",
|
|
783
|
-
clientFn: (serviceBaseUrl) => require_queue.createQueueClient({
|
|
784
|
-
baseUrl: serviceBaseUrl,
|
|
785
|
-
middlewares: middlewareFor("queue", [attachTokenMiddleware]),
|
|
786
|
-
auth
|
|
787
|
-
})
|
|
788
|
-
}).add({
|
|
789
|
-
serviceId: "kai-assistant",
|
|
790
|
-
clientName: "chat",
|
|
791
|
-
clientFn: (serviceBaseUrl) => require_chat_index.createChatClient({
|
|
792
|
-
storageApiUrl: baseUrl,
|
|
793
|
-
baseUrl: serviceBaseUrl,
|
|
794
|
-
middlewares: middlewareFor("chat", [attachTokenMiddleware]),
|
|
795
|
-
auth
|
|
796
|
-
})
|
|
797
|
-
}).add({
|
|
798
|
-
serviceId: "ai",
|
|
799
|
-
clientName: "ai",
|
|
800
|
-
clientFn: (serviceBaseUrl) => require_ai_index.createAiClient({
|
|
801
|
-
baseUrl: serviceBaseUrl,
|
|
802
|
-
middlewares: middlewareFor("ai", [attachTokenMiddleware]),
|
|
803
|
-
auth
|
|
804
|
-
})
|
|
805
|
-
}).add({
|
|
806
|
-
serviceId: "ai",
|
|
807
|
-
clientName: "omnisearch",
|
|
808
|
-
clientFn: (serviceBaseUrl) => require_omnisearch_index.createOmnisearchClient({
|
|
809
|
-
baseUrl: withPath(serviceBaseUrl, "/omnisearch"),
|
|
810
|
-
middlewares: middlewareFor("omnisearch", [attachTokenMiddleware]),
|
|
811
|
-
auth
|
|
812
|
-
})
|
|
813
|
-
}).add({
|
|
814
|
-
serviceId: "import",
|
|
815
|
-
clientName: "import",
|
|
816
|
-
clientFn: (serviceBaseUrl) => require_import.createImportClient({
|
|
817
|
-
baseUrl: serviceBaseUrl,
|
|
818
|
-
middlewares: middlewareFor("import", [attachTokenMiddleware]),
|
|
819
|
-
auth
|
|
820
|
-
})
|
|
821
|
-
}).add({
|
|
822
|
-
serviceId: "kai-agent",
|
|
823
|
-
clientName: "kaiAgent",
|
|
824
|
-
clientFn: (serviceBaseUrl) => require_kaiAgent.createKaiAgentClient({
|
|
825
|
-
baseUrl: serviceBaseUrl,
|
|
826
|
-
middlewares: middlewareFor("kaiAgent", [attachTokenMiddleware]),
|
|
827
|
-
auth
|
|
828
|
-
})
|
|
829
|
-
}).add({
|
|
830
|
-
serviceId: "components-mcp",
|
|
831
|
-
clientName: "componentsMcp",
|
|
832
|
-
clientFn: (serviceBaseUrl) => require_componentsMcp.createComponentsMcpClient({
|
|
833
|
-
baseUrl: serviceBaseUrl,
|
|
834
|
-
middlewares: middlewareFor("componentsMcp", [attachTokenMiddleware]),
|
|
835
|
-
auth
|
|
836
|
-
})
|
|
837
|
-
}).add({
|
|
838
|
-
serviceId: "oauth",
|
|
839
|
-
clientName: "oauth",
|
|
840
|
-
clientFn: (serviceBaseUrl) => require_oauth.createOauthClient({
|
|
841
|
-
baseUrl: serviceBaseUrl,
|
|
842
|
-
middlewares: middlewareFor("oauth", [attachTokenMiddleware]),
|
|
843
|
-
auth
|
|
844
|
-
})
|
|
845
|
-
}).add({
|
|
846
|
-
serviceId: "scheduler",
|
|
847
|
-
clientName: "scheduler",
|
|
848
|
-
clientFn: (serviceBaseUrl) => require_scheduler_index.createSchedulerClient({
|
|
849
|
-
baseUrl: serviceBaseUrl,
|
|
850
|
-
middlewares: middlewareFor("scheduler", [attachTokenMiddleware]),
|
|
851
|
-
auth
|
|
852
|
-
})
|
|
853
|
-
}).add({
|
|
854
|
-
serviceId: "stream",
|
|
855
|
-
clientName: "stream",
|
|
856
|
-
clientFn: (serviceBaseUrl) => require_stream_index.createStreamClient({
|
|
857
|
-
baseUrl: serviceBaseUrl,
|
|
858
|
-
middlewares: middlewareFor("stream", [attachTokenMiddleware]),
|
|
859
|
-
auth
|
|
860
|
-
})
|
|
861
|
-
}).add({
|
|
862
|
-
serviceId: "notification",
|
|
863
|
-
clientName: "notifications",
|
|
864
|
-
clientFn: (serviceBaseUrl) => require_notifications_index.createNotificationsClient({
|
|
865
|
-
baseUrl: serviceBaseUrl,
|
|
866
|
-
middlewares: middlewareFor("notifications", [attachTokenMiddleware]),
|
|
867
|
-
auth
|
|
868
|
-
})
|
|
869
|
-
}).add({
|
|
870
|
-
serviceId: "billing",
|
|
871
|
-
clientName: "billing",
|
|
872
|
-
clientFn: (serviceBaseUrl) => require_billing_index.createBillingClient({
|
|
873
|
-
baseUrl: serviceBaseUrl,
|
|
874
|
-
middlewares: middlewareFor("billing", [attachTokenMiddleware]),
|
|
875
|
-
auth
|
|
876
|
-
})
|
|
877
|
-
}).add({
|
|
878
|
-
serviceId: "metastore",
|
|
879
|
-
clientName: "metastore",
|
|
880
|
-
clientFn: (serviceBaseUrl) => require_metastore.createMetastoreClient({
|
|
881
|
-
baseUrl: serviceBaseUrl,
|
|
882
|
-
middlewares: middlewareFor("metastore", [attachTokenMiddleware]),
|
|
883
|
-
auth
|
|
884
|
-
})
|
|
885
|
-
}).build();
|
|
886
|
-
// src/keboola/legacy/createProjectClients.ts
|
|
887
|
-
const createAttachStorageToken = (getToken) => (next) => (request) => {
|
|
888
|
-
request.request.headers.set(require_createFetchClient.KeboolaHttpHeader.STORAGE_API_TOKEN, getToken());
|
|
889
|
-
return next(request);
|
|
890
|
-
};
|
|
891
|
-
const createProjectClients = async ({ baseUrl, getStorageToken, onStorageTokenRefreshed, middlewareFor, clientServiceUrls }) => {
|
|
892
|
-
const auth = {
|
|
893
|
-
type: "sapi-token",
|
|
894
|
-
token: getStorageToken()
|
|
895
|
-
};
|
|
896
|
-
const attach = createAttachStorageToken(getStorageToken);
|
|
897
|
-
const stackInfo = await require_storage.createStorageClient({
|
|
898
|
-
baseUrl,
|
|
899
|
-
auth,
|
|
900
|
-
middlewares: [attach]
|
|
901
|
-
}).getStackInfo({ exclude: "componentDetails" });
|
|
902
|
-
const stack = createStack({
|
|
903
|
-
stackInfo,
|
|
904
|
-
clientServiceUrls
|
|
905
|
-
});
|
|
906
|
-
const storage = require_storage.createStorageClient({
|
|
907
|
-
baseUrl,
|
|
908
|
-
auth,
|
|
909
|
-
middlewares: middlewareFor("storage", []),
|
|
910
|
-
onRefreshToken: onStorageTokenRefreshed
|
|
911
|
-
});
|
|
912
|
-
const { client: services, meta: serviceMeta } = createServiceClients({
|
|
913
|
-
baseUrl,
|
|
914
|
-
auth,
|
|
915
|
-
getServiceBaseUrl: stack.getServiceUrl,
|
|
916
|
-
middlewareFor,
|
|
917
|
-
attachTokenMiddleware: attach
|
|
918
|
-
});
|
|
919
|
-
return {
|
|
920
|
-
baseUrl: require_createFetchClient.normalizeBaseUrl(baseUrl),
|
|
921
|
-
stack,
|
|
922
|
-
serviceMeta,
|
|
923
|
-
storage,
|
|
924
|
-
...services,
|
|
925
|
-
sdk: createSdk({
|
|
926
|
-
storage,
|
|
927
|
-
services
|
|
928
|
-
})
|
|
929
|
-
};
|
|
930
|
-
};
|
|
931
|
-
// src/keboola/legacy/keboola.ts
|
|
932
|
-
const createLegacyKeboola = (options = {}) => {
|
|
933
|
-
const config = createConfig();
|
|
934
|
-
const middlewareFor = createMiddlewareFor(options.middlewares);
|
|
935
|
-
const authClient = createDerivedStore({
|
|
936
|
-
source: config.store,
|
|
937
|
-
dependsOn: (state) => state.baseUrl,
|
|
938
|
-
build: (baseUrl) => baseUrl ? require_authClient.createAuthClient({
|
|
939
|
-
baseUrl,
|
|
940
|
-
middlewares: middlewareFor("auth", [])
|
|
941
|
-
}) : null
|
|
942
|
-
});
|
|
943
|
-
const management = createDerivedStore({
|
|
944
|
-
source: config.store,
|
|
945
|
-
dependsOn: (state) => ({
|
|
946
|
-
baseUrl: state.baseUrl,
|
|
947
|
-
token: state.managementToken
|
|
948
|
-
}),
|
|
949
|
-
build: ({ baseUrl, token }) => baseUrl ? require_management.createManagementClient({
|
|
950
|
-
baseUrl,
|
|
951
|
-
auth: token ? {
|
|
952
|
-
type: "management-token",
|
|
953
|
-
token
|
|
954
|
-
} : { type: "management-token" },
|
|
955
|
-
middlewares: middlewareFor("management", [])
|
|
956
|
-
}) : null
|
|
957
|
-
});
|
|
958
|
-
const build = createDerivedAsyncStore({
|
|
959
|
-
source: config.store,
|
|
960
|
-
dependsOn: (state) => state.sapiToken && state.baseUrl ? state.baseUrl : null,
|
|
961
|
-
build: (baseUrl) => createProjectClients({
|
|
962
|
-
baseUrl,
|
|
963
|
-
getStorageToken: config.getStorageToken,
|
|
964
|
-
onStorageTokenRefreshed: config.setStorageToken,
|
|
965
|
-
middlewareFor,
|
|
966
|
-
clientServiceUrls: options.clientServiceUrls
|
|
967
|
-
})
|
|
968
|
-
});
|
|
969
|
-
if (options.baseUrl) config.setBaseUrl(options.baseUrl);
|
|
970
|
-
const debug = () => {
|
|
971
|
-
const info = config.debug();
|
|
972
|
-
return {
|
|
973
|
-
type: "Sapi",
|
|
974
|
-
config: info,
|
|
975
|
-
authReady: authClient.get() !== null,
|
|
976
|
-
managementReady: !!info.managementToken,
|
|
977
|
-
storage: build.store.get().state
|
|
978
|
-
};
|
|
979
|
-
};
|
|
980
|
-
const session = {
|
|
981
|
-
setBaseUrl: config.setBaseUrl,
|
|
982
|
-
isStorageReady: () => build.store.get().state === "ready",
|
|
983
|
-
authenticateStorage: (sapiToken) => config.authenticate({ sapiToken }),
|
|
984
|
-
authenticateStorageAsync: async (sapiToken) => {
|
|
985
|
-
config.authenticate({ sapiToken });
|
|
986
|
-
await build.settled();
|
|
987
|
-
},
|
|
988
|
-
authenticateManagement: (managementToken) => config.authenticate({ managementToken }),
|
|
989
|
-
subscribe: (listener) => {
|
|
990
|
-
const unsubscribeConfig = config.store.subscribe(() => listener(debug()));
|
|
991
|
-
const unsubscribeBuild = build.store.subscribe(() => listener(debug()));
|
|
992
|
-
return () => {
|
|
993
|
-
unsubscribeConfig();
|
|
994
|
-
unsubscribeBuild();
|
|
995
|
-
};
|
|
996
|
-
},
|
|
997
|
-
debug
|
|
998
|
-
};
|
|
999
|
-
return {
|
|
1000
|
-
api: createApi({
|
|
1001
|
-
getAuthClient: () => authClient.get(),
|
|
1002
|
-
getManagementClient: () => management.get(),
|
|
1003
|
-
getProjectClients: () => {
|
|
1004
|
-
const state = build.store.get();
|
|
1005
|
-
return state.state === "ready" ? state.value : null;
|
|
1006
|
-
}
|
|
1007
|
-
}),
|
|
1008
|
-
session
|
|
1009
|
-
};
|
|
1010
|
-
};
|
|
1011
|
-
// src/keboola/bearer/state/auth.ts
|
|
1012
|
-
const grantOf = (credential) => credential.type === "token" ? {
|
|
1013
|
-
type: "token",
|
|
1014
|
-
refreshToken: credential.refreshToken
|
|
1015
|
-
} : {
|
|
1016
|
-
type: "cookie",
|
|
1017
|
-
sessionId: credential.sessionId
|
|
1018
|
-
};
|
|
1019
|
-
const stamped = (input) => ({
|
|
1020
|
-
...input,
|
|
1021
|
-
issuedAt: Date.now()
|
|
1022
|
-
});
|
|
1023
|
-
const credentialOf = (auth) => auth.status === "authenticated" ? require_transientRetries.Result.success(auth.credential) : require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.NotAuthenticated));
|
|
1024
|
-
/**
|
|
1025
|
-
* The stack's credential and its sign-in pin.
|
|
1026
|
-
*
|
|
1027
|
-
* - `epoch` moves on `authenticate` and `signOut` and never on a rotation, so it is exactly "which
|
|
1028
|
-
* sign-in is this" — what an in-flight exchange compares itself against.
|
|
1029
|
-
*/
|
|
1030
|
-
const createAuth = (stacks) => {
|
|
1031
|
-
const expired = /* @__PURE__ */ new Set();
|
|
1032
|
-
const requireCredential = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => credentialOf(stack.auth));
|
|
1033
|
-
const requireUnauthenticated = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "authenticated" ? require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.AlreadyAuthenticated)) : require_transientRetries.Result.success(stack));
|
|
1034
|
-
const requireAnonymous = (baseUrl) => require_transientRetries.Result.andThen(requireUnauthenticated(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" is already being restored`)) : require_transientRetries.Result.success(stack));
|
|
1035
|
-
const requireRestoring = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" is not being restored`)));
|
|
1036
|
-
const startRestore = (baseUrl) => require_transientRetries.Result.map(requireAnonymous(baseUrl), (stack) => stacks.set({
|
|
1037
|
-
...stack,
|
|
1038
|
-
auth: { status: "restoring" }
|
|
1039
|
-
}));
|
|
1040
|
-
const cancelRestore = (baseUrl) => require_transientRetries.Result.map(requireRestoring(baseUrl), (stack) => stacks.set({
|
|
1041
|
-
...stack,
|
|
1042
|
-
auth: { status: "anonymous" }
|
|
1043
|
-
}));
|
|
1044
|
-
const authenticate = (baseUrl, input) => require_transientRetries.Result.map(requireUnauthenticated(baseUrl), (stack) => {
|
|
1045
|
-
expired.delete(baseUrl);
|
|
1046
|
-
return stacks.set({
|
|
1047
|
-
...stack,
|
|
1048
|
-
epoch: stack.epoch + 1,
|
|
1049
|
-
auth: {
|
|
1050
|
-
status: "authenticated",
|
|
1051
|
-
credential: stamped(input)
|
|
1052
|
-
},
|
|
1053
|
-
retained: null
|
|
1054
|
-
});
|
|
1055
|
-
});
|
|
1056
|
-
const applyRefresh = (baseUrl, input) => require_transientRetries.Result.andThen(requireCredential(baseUrl), (credential) => credential.type !== input.type ? require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`A ${credential.type} grant cannot become ${input.type}`)) : require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
1057
|
-
...stack,
|
|
1058
|
-
auth: {
|
|
1059
|
-
status: "authenticated",
|
|
1060
|
-
credential: stamped(input)
|
|
1061
|
-
}
|
|
1062
|
-
})));
|
|
1063
|
-
const forceExpire = (baseUrl) => require_transientRetries.Result.andThen(requireCredential(baseUrl), (credential) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
1064
|
-
...stack,
|
|
1065
|
-
auth: {
|
|
1066
|
-
status: "authenticated",
|
|
1067
|
-
credential: {
|
|
1068
|
-
...credential,
|
|
1069
|
-
issuedAt: Date.now() - credential.expiresIn * 1e3
|
|
1070
|
-
}
|
|
1071
|
-
}
|
|
1072
|
-
})));
|
|
1073
|
-
const signOut = (baseUrl, { retain = false } = {}) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => {
|
|
1074
|
-
const retained = retain ? require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(credentialOf(stack.auth), (credential) => ({ grant: grantOf(credential) })), stack.retained) : null;
|
|
1075
|
-
return stacks.set({
|
|
1076
|
-
...stack,
|
|
1077
|
-
epoch: stack.epoch + 1,
|
|
1078
|
-
auth: { status: "anonymous" },
|
|
1079
|
-
retained
|
|
1080
|
-
});
|
|
1081
|
-
});
|
|
1082
|
-
const retain = (baseUrl, retained) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
1083
|
-
...stack,
|
|
1084
|
-
retained
|
|
1085
|
-
}));
|
|
1086
|
-
const dropRetained = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
1087
|
-
...stack,
|
|
1088
|
-
retained: null
|
|
1089
|
-
}));
|
|
1090
|
-
const requireRetained = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.retained ? require_transientRetries.Result.success(stack.retained) : require_transientRetries.Result.failure(/* @__PURE__ */ new Error(`Stack "${baseUrl}" retains no credential`)));
|
|
1091
|
-
const notifyExpired = (baseUrl) => {
|
|
1092
|
-
if (expired.has(baseUrl)) return false;
|
|
1093
|
-
expired.add(baseUrl);
|
|
1094
|
-
return true;
|
|
1095
|
-
};
|
|
1096
|
-
const getEpoch = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stack.epoch);
|
|
1097
|
-
const getAccessToken = (baseUrl) => require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(requireCredential(baseUrl), ({ accessToken }) => accessToken), null);
|
|
1098
|
-
return {
|
|
1099
|
-
startRestore,
|
|
1100
|
-
cancelRestore,
|
|
1101
|
-
authenticate,
|
|
1102
|
-
applyRefresh,
|
|
1103
|
-
forceExpire,
|
|
1104
|
-
signOut,
|
|
1105
|
-
retain,
|
|
1106
|
-
dropRetained,
|
|
1107
|
-
requireRetained,
|
|
1108
|
-
notifyExpired,
|
|
1109
|
-
requireCredential,
|
|
1110
|
-
getEpoch,
|
|
1111
|
-
getAccessToken
|
|
1112
|
-
};
|
|
1113
|
-
};
|
|
1114
|
-
// src/keboola/bearer/state/stacks.ts
|
|
1115
|
-
const newStack = (baseUrl) => ({
|
|
1116
|
-
baseUrl,
|
|
1117
|
-
context: "idle",
|
|
1118
|
-
epoch: 0,
|
|
1119
|
-
auth: { status: "anonymous" },
|
|
1120
|
-
retained: null
|
|
1121
|
-
});
|
|
1122
|
-
/** One entry per stack, and the verbs that open and select them. */
|
|
1123
|
-
const createStacks = (store) => {
|
|
1124
|
-
const get = (baseUrl) => {
|
|
1125
|
-
const stack = store.get().stacks[baseUrl];
|
|
1126
|
-
return stack ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(new KeboolaError(KeboolaErrorType.Unconfigured));
|
|
1127
|
-
};
|
|
1128
|
-
const set = (stack) => {
|
|
1129
|
-
const state = store.get();
|
|
1130
|
-
store.set({
|
|
1131
|
-
...state,
|
|
1132
|
-
stacks: {
|
|
1133
|
-
...state.stacks,
|
|
1134
|
-
[stack.baseUrl]: stack
|
|
1135
|
-
}
|
|
1136
|
-
});
|
|
1137
|
-
return stack;
|
|
1138
|
-
};
|
|
1139
|
-
const update = (baseUrl, updater) => require_transientRetries.Result.map(get(baseUrl), (stack) => set(updater(stack)));
|
|
1140
|
-
const ensure = (baseUrl) => {
|
|
1141
|
-
const existing = get(baseUrl);
|
|
1142
|
-
if (existing.success) return existing.data;
|
|
1143
|
-
return set(newStack(baseUrl));
|
|
1144
|
-
};
|
|
1145
|
-
const getActive = () => {
|
|
1146
|
-
const { active } = store.get();
|
|
1147
|
-
const stack = get(active);
|
|
1148
|
-
if (!stack.success) throw new Error(`The active stack has no row: ${active}`);
|
|
1149
|
-
return stack.data;
|
|
1150
|
-
};
|
|
1151
|
-
const select = (baseUrl) => {
|
|
1152
|
-
const stack = ensure(baseUrl);
|
|
1153
|
-
const state = store.get();
|
|
1154
|
-
if (state.active !== baseUrl) store.set({
|
|
1155
|
-
...state,
|
|
1156
|
-
active: baseUrl
|
|
1157
|
-
});
|
|
1158
|
-
return stack;
|
|
1159
|
-
};
|
|
1160
|
-
const updateContext = (baseUrl, context) => update(baseUrl, (stack) => ({
|
|
1161
|
-
...stack,
|
|
1162
|
-
context
|
|
1163
|
-
}));
|
|
1164
|
-
return {
|
|
1165
|
-
get,
|
|
1166
|
-
set,
|
|
1167
|
-
update,
|
|
1168
|
-
ensure,
|
|
1169
|
-
getActive,
|
|
1170
|
-
select,
|
|
1171
|
-
updateContext
|
|
1172
|
-
};
|
|
1173
|
-
};
|
|
1174
|
-
// src/keboola/bearer/state/state.ts
|
|
515
|
+
// src/keboola/state/state.ts
|
|
1175
516
|
/**
|
|
1176
517
|
* The stack table and the rules over it, one namespace per concern.
|
|
1177
518
|
*
|
|
@@ -1190,8 +531,9 @@ const createState = (defaultBaseUrl) => {
|
|
|
1190
531
|
auth
|
|
1191
532
|
};
|
|
1192
533
|
};
|
|
1193
|
-
// src/keboola/
|
|
534
|
+
// src/keboola/credentials/credentials.ts
|
|
1194
535
|
const DEFAULT_REFRESH_THRESHOLD = .9;
|
|
536
|
+
const END_SESSION_TIMEOUT_MS = 1e4;
|
|
1195
537
|
const signInEnded = () => new KeboolaError(KeboolaErrorType.SignInEnded);
|
|
1196
538
|
const toRestoreStatus = (outcome) => {
|
|
1197
539
|
if (outcome === void 0 || outcome === "skipped") return "empty";
|
|
@@ -1232,13 +574,18 @@ const createCredentials = ({ state, persistor, middlewares, refreshThreshold = D
|
|
|
1232
574
|
const refreshed = await require_transientRetries.Result.tryCatchAsync(() => renew(client, grant));
|
|
1233
575
|
return isSameSignIn() ? refreshed : require_transientRetries.Result.failure(signInEnded());
|
|
1234
576
|
};
|
|
577
|
+
/**
|
|
578
|
+
* The grant to rotate, or the sign-out another tab stored.
|
|
579
|
+
*
|
|
580
|
+
* - `{ retained }`: the stored sign-in ended; `retained` is what a retained sign-out kept.
|
|
581
|
+
*/
|
|
1235
582
|
const getGrantForRotation = async (store, baseUrl, credential) => {
|
|
1236
583
|
const isSameSignIn = markSignIn(baseUrl);
|
|
1237
584
|
const hydrated = await require_transientRetries.Result.tryCatchAsync(() => store.read());
|
|
1238
585
|
if (!hydrated.success) return hydrated;
|
|
1239
586
|
if (!isSameSignIn()) return require_transientRetries.Result.failure(signInEnded());
|
|
1240
587
|
const persistedStack = hydrated.data.stacks.find((stack) => stack.baseUrl === baseUrl);
|
|
1241
|
-
if (persistedStack && persistedStack.credential === null) return require_transientRetries.Result.
|
|
588
|
+
if (persistedStack && persistedStack.credential === null) return require_transientRetries.Result.success({ retained: persistedStack.retained ?? null });
|
|
1242
589
|
return require_transientRetries.Result.success(persistedStack?.credential ?? grantOf(credential));
|
|
1243
590
|
};
|
|
1244
591
|
const rotateOnce = async (baseUrl) => persistor.locked(async (store) => {
|
|
@@ -1246,6 +593,10 @@ const createCredentials = ({ state, persistor, middlewares, refreshThreshold = D
|
|
|
1246
593
|
if (!credential.success) return credential;
|
|
1247
594
|
const grant = await getGrantForRotation(store, baseUrl, credential.data);
|
|
1248
595
|
if (!grant.success) return grant;
|
|
596
|
+
if ("retained" in grant.data) {
|
|
597
|
+
await expire(baseUrl, store, grant.data.retained);
|
|
598
|
+
return require_transientRetries.Result.failure(signInEnded());
|
|
599
|
+
}
|
|
1249
600
|
const refreshed = await refresh(baseUrl, grant.data);
|
|
1250
601
|
if (!refreshed.success) {
|
|
1251
602
|
if (require_middleware.isUnauthorized(refreshed.error)) await expire(baseUrl, store);
|
|
@@ -1317,9 +668,10 @@ const createCredentials = ({ state, persistor, middlewares, refreshThreshold = D
|
|
|
1317
668
|
onSignedOut?.(baseUrl);
|
|
1318
669
|
return signedOut;
|
|
1319
670
|
};
|
|
1320
|
-
const expire = async (baseUrl, store) => {
|
|
671
|
+
const expire = async (baseUrl, store, retained = null) => {
|
|
1321
672
|
if (!state.auth.notifyExpired(baseUrl)) return;
|
|
1322
673
|
signOut(baseUrl);
|
|
674
|
+
if (retained) state.auth.retain(baseUrl, retained);
|
|
1323
675
|
await store.persistStack(baseUrl, state.store.get());
|
|
1324
676
|
onExpired?.(baseUrl);
|
|
1325
677
|
};
|
|
@@ -1332,19 +684,360 @@ const createCredentials = ({ state, persistor, middlewares, refreshThreshold = D
|
|
|
1332
684
|
if (!state.auth.requireCredential(baseUrl).success) return null;
|
|
1333
685
|
return require_transientRetries.Result.unwrap(await rotate(baseUrl));
|
|
1334
686
|
}
|
|
1335
|
-
await renewIfStale(baseUrl);
|
|
1336
|
-
return state.auth.getAccessToken(baseUrl);
|
|
1337
|
-
} });
|
|
687
|
+
await renewIfStale(baseUrl);
|
|
688
|
+
return state.auth.getAccessToken(baseUrl);
|
|
689
|
+
} });
|
|
690
|
+
/**
|
|
691
|
+
* Ends a signed-out grant's server session: its refresh, derived PATs and paired browser session.
|
|
692
|
+
*
|
|
693
|
+
* 1. `token`: revokes the refresh token; the server also takes the one before the last rotation.
|
|
694
|
+
* 2. `cookie`: renews off the session cookie, then revokes that fresh access token.
|
|
695
|
+
* - Never an access token held from before: one rotation later the server no longer knows it.
|
|
696
|
+
* - Best effort, bounded by `END_SESSION_TIMEOUT_MS`: a failure is logged, the sign-out stands.
|
|
697
|
+
*/
|
|
698
|
+
const endSession = async (baseUrl, grant) => {
|
|
699
|
+
const client = require_authClient.createAuthClient({
|
|
700
|
+
baseUrl,
|
|
701
|
+
middlewares
|
|
702
|
+
});
|
|
703
|
+
const signal = AbortSignal.timeout(END_SESSION_TIMEOUT_MS);
|
|
704
|
+
try {
|
|
705
|
+
const body = grant.type === "token" ? {
|
|
706
|
+
token: grant.refreshToken,
|
|
707
|
+
tokenTypeHint: "refreshToken"
|
|
708
|
+
} : {
|
|
709
|
+
token: (await client.token.refreshWithSession({ sessionId: grant.sessionId }, signal)).accessToken,
|
|
710
|
+
tokenTypeHint: "accessToken"
|
|
711
|
+
};
|
|
712
|
+
await client.token.revoke(body, signal);
|
|
713
|
+
} catch (error) {
|
|
714
|
+
console.warn("createCredentials: the session could not be ended", error);
|
|
715
|
+
}
|
|
716
|
+
};
|
|
717
|
+
return {
|
|
718
|
+
middleware,
|
|
719
|
+
rotate,
|
|
720
|
+
renewIfStale,
|
|
721
|
+
restore,
|
|
722
|
+
restoreRetained,
|
|
723
|
+
signOut,
|
|
724
|
+
endSession
|
|
725
|
+
};
|
|
726
|
+
};
|
|
727
|
+
// src/serviceClientRegistry/utils.ts
|
|
728
|
+
const isBuiltInProperty = (property) => typeof property === "symbol" || property === "then" || property === "constructor" || property === "toString" || property === "valueOf";
|
|
729
|
+
/**
|
|
730
|
+
* Creates a dummy client that intercepts method calls and invokes the provided onCall callback.
|
|
731
|
+
*/
|
|
732
|
+
const createDummyClient = ({ onCall }) => {
|
|
733
|
+
const createProxy = (path = []) => new Proxy(() => {}, {
|
|
734
|
+
get: (_target, prop) => {
|
|
735
|
+
if (isBuiltInProperty(prop)) return void 0;
|
|
736
|
+
return createProxy([...path, prop]);
|
|
737
|
+
},
|
|
738
|
+
apply: (_target, _thisArgs, args) => onCall(path, args)
|
|
739
|
+
});
|
|
740
|
+
return createProxy();
|
|
741
|
+
};
|
|
742
|
+
// src/serviceClientRegistry/createServiceClientRegistry.ts
|
|
743
|
+
const createServiceClientRegistry = () => ({ getServiceBaseUrl, onUnavailable }) => {
|
|
744
|
+
const dummy = (serviceId, clientName) => createDummyClient({ onCall: (path, args) => {
|
|
745
|
+
onUnavailable?.({
|
|
746
|
+
serviceId,
|
|
747
|
+
path,
|
|
748
|
+
args,
|
|
749
|
+
clientName
|
|
750
|
+
});
|
|
751
|
+
} });
|
|
752
|
+
const configs = [];
|
|
753
|
+
const resolveClient = ({ serviceId, clientFn, clientName }) => {
|
|
754
|
+
const serviceBaseUrl = getServiceBaseUrl(serviceId);
|
|
755
|
+
return serviceBaseUrl ? clientFn(serviceBaseUrl) : dummy(serviceId, clientName);
|
|
756
|
+
};
|
|
757
|
+
const registry = {
|
|
758
|
+
add: (config) => {
|
|
759
|
+
configs.push(config);
|
|
760
|
+
return registry;
|
|
761
|
+
},
|
|
762
|
+
build: () => {
|
|
763
|
+
const clientMap = {};
|
|
764
|
+
configs.forEach((config) => {
|
|
765
|
+
clientMap[config.clientName] = resolveClient(config);
|
|
766
|
+
});
|
|
767
|
+
return { client: clientMap };
|
|
768
|
+
}
|
|
769
|
+
};
|
|
770
|
+
return registry;
|
|
771
|
+
};
|
|
772
|
+
// src/sdks/variables/variablesSdk.ts
|
|
773
|
+
const VARIABLES_COMPONENT_ID = "keboola.variables";
|
|
774
|
+
/** Union the definitions by name; on a name conflict the target's definition is kept. */
|
|
775
|
+
const mergeVariableDefinitions = (target, source) => {
|
|
776
|
+
const targetNames = new Set(target.map((definition) => definition.name));
|
|
777
|
+
return [...target, ...source.filter((definition) => !targetNames.has(definition.name))];
|
|
778
|
+
};
|
|
779
|
+
/** Add values missing in the target; on a name conflict the value is updated to the source's. */
|
|
780
|
+
const mergeVariableValues = (target, source) => {
|
|
781
|
+
const sourceByName = new Map(source.map((value) => [value.name, value.value]));
|
|
782
|
+
const targetNames = new Set(target.map((value) => value.name));
|
|
783
|
+
return [...target.map((value) => sourceByName.has(value.name) ? {
|
|
784
|
+
...value,
|
|
785
|
+
value: sourceByName.get(value.name)
|
|
786
|
+
} : value), ...source.filter((value) => !targetNames.has(value.name))];
|
|
787
|
+
};
|
|
788
|
+
/**
|
|
789
|
+
* Orchestration for `keboola.variables` configs: copy a config, or merge two configs into a fresh
|
|
790
|
+
* one (union definitions, upsert values — source wins on a name conflict). Each result is a brand
|
|
791
|
+
* new config + values row, so the caller can reference it without sharing lineage with the source.
|
|
792
|
+
*/
|
|
793
|
+
const createVariablesSdk = ({ storageClient }) => {
|
|
794
|
+
const configs = storageClient.configurations;
|
|
795
|
+
const rows = storageClient.configurationRows;
|
|
796
|
+
const readVariables = async (configId, valuesRowId, branchId) => {
|
|
797
|
+
const config = await configs.getConfiguration({
|
|
798
|
+
componentId: VARIABLES_COMPONENT_ID,
|
|
799
|
+
configId,
|
|
800
|
+
branchId
|
|
801
|
+
});
|
|
802
|
+
const row = config.rows.find((candidate) => candidate.id === valuesRowId) ?? config.rows[0];
|
|
803
|
+
const rawDefinitions = config.configuration?.variables;
|
|
804
|
+
const rawValues = row?.configuration?.values;
|
|
805
|
+
return {
|
|
806
|
+
definitions: Array.isArray(rawDefinitions) ? rawDefinitions : [],
|
|
807
|
+
values: Array.isArray(rawValues) ? rawValues : []
|
|
808
|
+
};
|
|
809
|
+
};
|
|
810
|
+
const createVariables = async (definitions, values, branchId) => {
|
|
811
|
+
const config = await configs.createConfiguration({
|
|
812
|
+
branchId,
|
|
813
|
+
componentId: VARIABLES_COMPONENT_ID,
|
|
814
|
+
name: "Variables definition",
|
|
815
|
+
configuration: { variables: definitions }
|
|
816
|
+
});
|
|
817
|
+
try {
|
|
818
|
+
const row = await rows.createConfigurationRow({
|
|
819
|
+
branchId: String(branchId),
|
|
820
|
+
componentId: VARIABLES_COMPONENT_ID,
|
|
821
|
+
configurationId: config.id,
|
|
822
|
+
name: "Default values",
|
|
823
|
+
configuration: { values }
|
|
824
|
+
});
|
|
825
|
+
return {
|
|
826
|
+
variablesId: config.id,
|
|
827
|
+
variablesValuesId: row.id
|
|
828
|
+
};
|
|
829
|
+
} catch (error) {
|
|
830
|
+
await configs.deleteConfiguration({
|
|
831
|
+
branchId,
|
|
832
|
+
componentId: VARIABLES_COMPONENT_ID,
|
|
833
|
+
configId: config.id
|
|
834
|
+
}).catch((cleanupError) => {
|
|
835
|
+
if (error instanceof Error && error.cause === void 0) error.cause = cleanupError;
|
|
836
|
+
});
|
|
837
|
+
throw error;
|
|
838
|
+
}
|
|
839
|
+
};
|
|
1338
840
|
return {
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
841
|
+
/** Copy a variables config into a fresh, independent config + values row. */
|
|
842
|
+
copy: async ({ variablesId, variablesValuesId, branchId = "default" }) => {
|
|
843
|
+
const { definitions, values } = await readVariables(variablesId, variablesValuesId, branchId);
|
|
844
|
+
return createVariables(definitions, values, branchId);
|
|
845
|
+
},
|
|
846
|
+
/** Merge the source's variables into the target's and create a fresh merged config + values row. */
|
|
847
|
+
merge: async ({ targetVariablesId, targetValuesId, sourceVariablesId, sourceValuesId, branchId = "default" }) => {
|
|
848
|
+
const [target, source] = await Promise.all([readVariables(targetVariablesId, targetValuesId, branchId), readVariables(sourceVariablesId, sourceValuesId, branchId)]);
|
|
849
|
+
return createVariables(mergeVariableDefinitions(target.definitions, source.definitions), mergeVariableValues(target.values, source.values), branchId);
|
|
850
|
+
}
|
|
1345
851
|
};
|
|
1346
852
|
};
|
|
1347
|
-
// src/keboola/
|
|
853
|
+
// src/keboola/createSdk.ts
|
|
854
|
+
const createSdk = ({ storage, services }) => ({
|
|
855
|
+
tag: require_tag.createTagSdk({ metastoreClient: services.metastore }),
|
|
856
|
+
semanticLayer: require_semanticLayer.createSemanticLayerSdk({ metastoreClient: services.metastore }),
|
|
857
|
+
kaiMemory: require_kaiMemory.createKaiMemorySdk({ metastoreClient: services.metastore }),
|
|
858
|
+
vault: require_sdk_vault_index.createVaultSdk({
|
|
859
|
+
vaultClient: services.vault,
|
|
860
|
+
encryptionClient: services.encryption
|
|
861
|
+
}),
|
|
862
|
+
variables: createVariablesSdk({ storageClient: storage })
|
|
863
|
+
});
|
|
864
|
+
// src/keboola/createServiceClients.ts
|
|
865
|
+
const withPath = (serviceBaseUrl, path) => typeof serviceBaseUrl === "string" ? `${serviceBaseUrl}${path}` : async () => `${await serviceBaseUrl()}${path}`;
|
|
866
|
+
const createServiceClients = ({ baseUrl, auth, getServiceBaseUrl, middlewareFor, attachTokenMiddleware }) => createServiceClientRegistry()({
|
|
867
|
+
getServiceBaseUrl,
|
|
868
|
+
onUnavailable: ({ serviceId, path, clientName }) => {
|
|
869
|
+
throw new require_storage.ServiceUnavailableError(serviceId, path, clientName);
|
|
870
|
+
}
|
|
871
|
+
}).add({
|
|
872
|
+
serviceId: "vault",
|
|
873
|
+
clientName: "vault",
|
|
874
|
+
clientFn: (serviceBaseUrl) => require_vault_index.createVaultClient({
|
|
875
|
+
baseUrl: serviceBaseUrl,
|
|
876
|
+
middlewares: middlewareFor("vault", [attachTokenMiddleware]),
|
|
877
|
+
auth
|
|
878
|
+
})
|
|
879
|
+
}).add({
|
|
880
|
+
serviceId: "data-science",
|
|
881
|
+
clientName: "dataScience",
|
|
882
|
+
clientFn: (serviceBaseUrl) => require_dataScience_index.createDataScienceClient({
|
|
883
|
+
baseUrl: serviceBaseUrl,
|
|
884
|
+
middlewares: middlewareFor("dataScience", [attachTokenMiddleware]),
|
|
885
|
+
auth
|
|
886
|
+
})
|
|
887
|
+
}).add({
|
|
888
|
+
serviceId: "data-science",
|
|
889
|
+
clientName: "apps",
|
|
890
|
+
clientFn: (serviceBaseUrl) => require_apps.createAppsClient({
|
|
891
|
+
baseUrl: withPath(serviceBaseUrl, "/v2"),
|
|
892
|
+
middlewares: middlewareFor("apps", [attachTokenMiddleware]),
|
|
893
|
+
auth
|
|
894
|
+
})
|
|
895
|
+
}).add({
|
|
896
|
+
serviceId: "encryption",
|
|
897
|
+
clientName: "encryption",
|
|
898
|
+
clientFn: (serviceBaseUrl) => require_encryption_index.createEncryptionClient({
|
|
899
|
+
baseUrl: serviceBaseUrl,
|
|
900
|
+
middlewares: middlewareFor("encryption")
|
|
901
|
+
})
|
|
902
|
+
}).add({
|
|
903
|
+
serviceId: "editor",
|
|
904
|
+
clientName: "editor",
|
|
905
|
+
clientFn: (serviceBaseUrl) => require_editor_index.createEditorClient({
|
|
906
|
+
baseUrl: serviceBaseUrl,
|
|
907
|
+
middlewares: middlewareFor("editor", [attachTokenMiddleware]),
|
|
908
|
+
auth
|
|
909
|
+
})
|
|
910
|
+
}).add({
|
|
911
|
+
serviceId: "sync-actions",
|
|
912
|
+
clientName: "syncActions",
|
|
913
|
+
clientFn: (serviceBaseUrl) => require_syncActions.createSyncActionsClient({
|
|
914
|
+
baseUrl: serviceBaseUrl,
|
|
915
|
+
middlewares: middlewareFor("syncActions", [attachTokenMiddleware]),
|
|
916
|
+
auth
|
|
917
|
+
})
|
|
918
|
+
}).add({
|
|
919
|
+
serviceId: "telemetry",
|
|
920
|
+
clientName: "telemetry",
|
|
921
|
+
clientFn: (serviceBaseUrl) => require_telemetry_index.createTelemetryClient({
|
|
922
|
+
baseUrl: serviceBaseUrl,
|
|
923
|
+
middlewares: middlewareFor("telemetry", [attachTokenMiddleware]),
|
|
924
|
+
auth
|
|
925
|
+
})
|
|
926
|
+
}).add({
|
|
927
|
+
serviceId: "query",
|
|
928
|
+
clientName: "queryService",
|
|
929
|
+
clientFn: (serviceBaseUrl) => require_queryService.createQueryServiceClient({
|
|
930
|
+
baseUrl: serviceBaseUrl,
|
|
931
|
+
middlewares: middlewareFor("queryService", [attachTokenMiddleware]),
|
|
932
|
+
auth
|
|
933
|
+
})
|
|
934
|
+
}).add({
|
|
935
|
+
serviceId: "queue",
|
|
936
|
+
clientName: "queue",
|
|
937
|
+
clientFn: (serviceBaseUrl) => require_queue.createQueueClient({
|
|
938
|
+
baseUrl: serviceBaseUrl,
|
|
939
|
+
middlewares: middlewareFor("queue", [attachTokenMiddleware]),
|
|
940
|
+
auth
|
|
941
|
+
})
|
|
942
|
+
}).add({
|
|
943
|
+
serviceId: "kai-assistant",
|
|
944
|
+
clientName: "chat",
|
|
945
|
+
clientFn: (serviceBaseUrl) => require_chat_index.createChatClient({
|
|
946
|
+
storageApiUrl: baseUrl,
|
|
947
|
+
baseUrl: serviceBaseUrl,
|
|
948
|
+
middlewares: middlewareFor("chat", [attachTokenMiddleware]),
|
|
949
|
+
auth
|
|
950
|
+
})
|
|
951
|
+
}).add({
|
|
952
|
+
serviceId: "ai",
|
|
953
|
+
clientName: "ai",
|
|
954
|
+
clientFn: (serviceBaseUrl) => require_ai_index.createAiClient({
|
|
955
|
+
baseUrl: serviceBaseUrl,
|
|
956
|
+
middlewares: middlewareFor("ai", [attachTokenMiddleware]),
|
|
957
|
+
auth
|
|
958
|
+
})
|
|
959
|
+
}).add({
|
|
960
|
+
serviceId: "ai",
|
|
961
|
+
clientName: "omnisearch",
|
|
962
|
+
clientFn: (serviceBaseUrl) => require_omnisearch_index.createOmnisearchClient({
|
|
963
|
+
baseUrl: withPath(serviceBaseUrl, "/omnisearch"),
|
|
964
|
+
middlewares: middlewareFor("omnisearch", [attachTokenMiddleware]),
|
|
965
|
+
auth
|
|
966
|
+
})
|
|
967
|
+
}).add({
|
|
968
|
+
serviceId: "import",
|
|
969
|
+
clientName: "import",
|
|
970
|
+
clientFn: (serviceBaseUrl) => require_import.createImportClient({
|
|
971
|
+
baseUrl: serviceBaseUrl,
|
|
972
|
+
middlewares: middlewareFor("import", [attachTokenMiddleware]),
|
|
973
|
+
auth
|
|
974
|
+
})
|
|
975
|
+
}).add({
|
|
976
|
+
serviceId: "kai-agent",
|
|
977
|
+
clientName: "kaiAgent",
|
|
978
|
+
clientFn: (serviceBaseUrl) => require_kaiAgent.createKaiAgentClient({
|
|
979
|
+
baseUrl: serviceBaseUrl,
|
|
980
|
+
middlewares: middlewareFor("kaiAgent", [attachTokenMiddleware]),
|
|
981
|
+
auth
|
|
982
|
+
})
|
|
983
|
+
}).add({
|
|
984
|
+
serviceId: "components-mcp",
|
|
985
|
+
clientName: "componentsMcp",
|
|
986
|
+
clientFn: (serviceBaseUrl) => require_componentsMcp.createComponentsMcpClient({
|
|
987
|
+
baseUrl: serviceBaseUrl,
|
|
988
|
+
middlewares: middlewareFor("componentsMcp", [attachTokenMiddleware]),
|
|
989
|
+
auth
|
|
990
|
+
})
|
|
991
|
+
}).add({
|
|
992
|
+
serviceId: "oauth",
|
|
993
|
+
clientName: "oauth",
|
|
994
|
+
clientFn: (serviceBaseUrl) => require_oauth.createOauthClient({
|
|
995
|
+
baseUrl: serviceBaseUrl,
|
|
996
|
+
middlewares: middlewareFor("oauth", [attachTokenMiddleware]),
|
|
997
|
+
auth
|
|
998
|
+
})
|
|
999
|
+
}).add({
|
|
1000
|
+
serviceId: "scheduler",
|
|
1001
|
+
clientName: "scheduler",
|
|
1002
|
+
clientFn: (serviceBaseUrl) => require_scheduler_index.createSchedulerClient({
|
|
1003
|
+
baseUrl: serviceBaseUrl,
|
|
1004
|
+
middlewares: middlewareFor("scheduler", [attachTokenMiddleware]),
|
|
1005
|
+
auth
|
|
1006
|
+
})
|
|
1007
|
+
}).add({
|
|
1008
|
+
serviceId: "stream",
|
|
1009
|
+
clientName: "stream",
|
|
1010
|
+
clientFn: (serviceBaseUrl) => require_stream_index.createStreamClient({
|
|
1011
|
+
baseUrl: serviceBaseUrl,
|
|
1012
|
+
middlewares: middlewareFor("stream", [attachTokenMiddleware]),
|
|
1013
|
+
auth
|
|
1014
|
+
})
|
|
1015
|
+
}).add({
|
|
1016
|
+
serviceId: "notification",
|
|
1017
|
+
clientName: "notifications",
|
|
1018
|
+
clientFn: (serviceBaseUrl) => require_notifications_index.createNotificationsClient({
|
|
1019
|
+
baseUrl: serviceBaseUrl,
|
|
1020
|
+
middlewares: middlewareFor("notifications", [attachTokenMiddleware]),
|
|
1021
|
+
auth
|
|
1022
|
+
})
|
|
1023
|
+
}).add({
|
|
1024
|
+
serviceId: "billing",
|
|
1025
|
+
clientName: "billing",
|
|
1026
|
+
clientFn: (serviceBaseUrl) => require_billing_index.createBillingClient({
|
|
1027
|
+
baseUrl: serviceBaseUrl,
|
|
1028
|
+
middlewares: middlewareFor("billing", [attachTokenMiddleware]),
|
|
1029
|
+
auth
|
|
1030
|
+
})
|
|
1031
|
+
}).add({
|
|
1032
|
+
serviceId: "metastore",
|
|
1033
|
+
clientName: "metastore",
|
|
1034
|
+
clientFn: (serviceBaseUrl) => require_metastore.createMetastoreClient({
|
|
1035
|
+
baseUrl: serviceBaseUrl,
|
|
1036
|
+
middlewares: middlewareFor("metastore", [attachTokenMiddleware]),
|
|
1037
|
+
auth
|
|
1038
|
+
})
|
|
1039
|
+
}).build();
|
|
1040
|
+
// src/keboola/perProject.ts
|
|
1348
1041
|
const projectKey = ({ baseUrl, projectId }) => `${baseUrl}#${projectId}`;
|
|
1349
1042
|
/**
|
|
1350
1043
|
* One handle per project, and the one call that drops it.
|
|
@@ -1379,12 +1072,12 @@ const createPerProject = ({ state, credentials, middlewareFor, stack }) => {
|
|
|
1379
1072
|
auth: authFor(project),
|
|
1380
1073
|
middlewares: middlewareFor("storage", [attach])
|
|
1381
1074
|
});
|
|
1382
|
-
const { client
|
|
1075
|
+
const { client } = createServiceClients({
|
|
1383
1076
|
baseUrl: project.baseUrl,
|
|
1384
1077
|
auth: authFor(project),
|
|
1385
1078
|
getServiceBaseUrl: (serviceId) => async () => {
|
|
1386
1079
|
const serviceUrl = (await stack.context.getAsync(project.baseUrl)).getServiceUrl(serviceId);
|
|
1387
|
-
|
|
1080
|
+
if (!serviceUrl) throw new require_storage.ServiceUnavailableError(serviceId);
|
|
1388
1081
|
return serviceUrl;
|
|
1389
1082
|
},
|
|
1390
1083
|
middlewareFor,
|
|
@@ -1403,7 +1096,6 @@ const createPerProject = ({ state, credentials, middlewareFor, stack }) => {
|
|
|
1403
1096
|
if (property === "stack" || property === "auth" || property === "management") return stack.get(project.baseUrl)[property];
|
|
1404
1097
|
if (property === "storage") return storage;
|
|
1405
1098
|
if (property === "sdk") return sdk;
|
|
1406
|
-
if (property === "serviceMeta") return meta;
|
|
1407
1099
|
return client[property];
|
|
1408
1100
|
} }),
|
|
1409
1101
|
end: () => {
|
|
@@ -1425,13 +1117,13 @@ const createPerProject = ({ state, credentials, middlewareFor, stack }) => {
|
|
|
1425
1117
|
forgetUnder
|
|
1426
1118
|
};
|
|
1427
1119
|
};
|
|
1428
|
-
// src/keboola/
|
|
1120
|
+
// src/keboola/persistor.ts
|
|
1429
1121
|
/**
|
|
1430
1122
|
* Where a bearer session is persisted, under whichever adapter the client was given.
|
|
1431
1123
|
*
|
|
1432
1124
|
* Exported because a consumer sometimes has to drop a session a client cannot reach: the adapter is
|
|
1433
1125
|
* chosen at construction, so a client built without one holds no handle to the storage its own
|
|
1434
|
-
* session is sitting in.
|
|
1126
|
+
* session is sitting in.
|
|
1435
1127
|
*/
|
|
1436
1128
|
const SESSION_STORAGE_KEY = "keboola:session";
|
|
1437
1129
|
/**
|
|
@@ -1558,7 +1250,44 @@ const createSessionPersistor = (storage) => {
|
|
|
1558
1250
|
snapshot
|
|
1559
1251
|
};
|
|
1560
1252
|
};
|
|
1561
|
-
// src/
|
|
1253
|
+
// src/domain/stack.ts
|
|
1254
|
+
const isServiceId = (id) => Object.values(require_serviceIds.ServiceId).includes(id);
|
|
1255
|
+
const SERVICE_URL_OVERRIDES = { "kai-assistant": (url) => `${url}/api` };
|
|
1256
|
+
const createStack = ({ stackInfo, clientServiceUrls }) => {
|
|
1257
|
+
const { services, components, features, ...infoRest } = stackInfo;
|
|
1258
|
+
const serviceMap = new Map(services.map((service) => {
|
|
1259
|
+
if (!isServiceId(service.id)) return [service.id, service.url];
|
|
1260
|
+
const devOverride = clientServiceUrls?.[service.id]?.(service.url);
|
|
1261
|
+
const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);
|
|
1262
|
+
const url = devOverride ?? prodOverride ?? service.url;
|
|
1263
|
+
return [service.id, url];
|
|
1264
|
+
}));
|
|
1265
|
+
const componentMap = new Map(components.map((component) => [component.id, component]));
|
|
1266
|
+
const featureSet = new Set(features);
|
|
1267
|
+
const hasFeature = (...feature) => {
|
|
1268
|
+
if (feature.length === 0) return false;
|
|
1269
|
+
return feature.every((x) => featureSet.has(x));
|
|
1270
|
+
};
|
|
1271
|
+
const hasComponent = (...componentId) => {
|
|
1272
|
+
if (componentId.length === 0) return false;
|
|
1273
|
+
return componentId.every((x) => componentMap.has(x));
|
|
1274
|
+
};
|
|
1275
|
+
const getComponent = (componentId) => componentMap.get(componentId) ?? null;
|
|
1276
|
+
const hasService = (serviceId) => serviceMap.has(serviceId);
|
|
1277
|
+
const getServiceUrl = (serviceId) => serviceMap.get(serviceId) ?? null;
|
|
1278
|
+
return {
|
|
1279
|
+
...infoRest,
|
|
1280
|
+
services,
|
|
1281
|
+
features,
|
|
1282
|
+
components,
|
|
1283
|
+
hasFeature,
|
|
1284
|
+
getServiceUrl,
|
|
1285
|
+
hasService,
|
|
1286
|
+
getComponent,
|
|
1287
|
+
hasComponent
|
|
1288
|
+
};
|
|
1289
|
+
};
|
|
1290
|
+
// src/keboola/context.ts
|
|
1562
1291
|
const STACK_INDEX_TIMEOUT_MS = 3e4;
|
|
1563
1292
|
/**
|
|
1564
1293
|
* One parsed stack index per stack; `createStack` applies the dev and production overrides.
|
|
@@ -1624,7 +1353,7 @@ const createStackContext = ({ state, clientServiceUrls }) => {
|
|
|
1624
1353
|
getAsync
|
|
1625
1354
|
};
|
|
1626
1355
|
};
|
|
1627
|
-
// src/keboola/
|
|
1356
|
+
// src/keboola/perStack.ts
|
|
1628
1357
|
/**
|
|
1629
1358
|
* Everything one stack derives.
|
|
1630
1359
|
*
|
|
@@ -1662,7 +1391,7 @@ const createPerStack = ({ state, credentials, middlewareFor, clientServiceUrls }
|
|
|
1662
1391
|
get
|
|
1663
1392
|
};
|
|
1664
1393
|
};
|
|
1665
|
-
// src/keboola/
|
|
1394
|
+
// src/keboola/keboola.ts
|
|
1666
1395
|
/**
|
|
1667
1396
|
* The bearer client: the session table, its two scopes, and the surface they back.
|
|
1668
1397
|
*
|
|
@@ -1750,20 +1479,39 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
1750
1479
|
return active().management;
|
|
1751
1480
|
}
|
|
1752
1481
|
};
|
|
1753
|
-
const
|
|
1754
|
-
const getProjectApi = (projectId) => perProject.get(onActiveStack(projectId));
|
|
1482
|
+
const projectApi = (projectId) => perProject.get(onActiveStack(projectId));
|
|
1755
1483
|
/**
|
|
1756
1484
|
* The scope's sign-in, or a named stack's — and everything that sign-in derived.
|
|
1757
1485
|
*
|
|
1486
|
+
* - Ends the server session too (`credentials.endSession`).
|
|
1758
1487
|
* - `retain` keeps the grant on the stack, persisted beside the sign-in it ended, for
|
|
1759
|
-
* `restoreRetained
|
|
1760
|
-
* - The table is signed out on return; the promise resolves once that is stored
|
|
1761
|
-
* leaving the document waits for
|
|
1488
|
+
* `restoreRetained`, and so leaves the server session live; the next sign-in replaces it.
|
|
1489
|
+
* - The table is signed out on return; the promise resolves once that is stored and the
|
|
1490
|
+
* session's end was attempted, so a caller leaving the document waits for both.
|
|
1762
1491
|
*/
|
|
1763
|
-
const signOut = ({ baseUrl, ...options } = {}) =>
|
|
1764
|
-
|
|
1492
|
+
const signOut = ({ baseUrl, ...options } = {}) => endSignIn(requireStackUrl(baseUrl), options, !options.retain);
|
|
1493
|
+
const endingSessions = /* @__PURE__ */ new Map();
|
|
1494
|
+
/** `signOut`; `endSession: false` leaves the server session alone. */
|
|
1495
|
+
const endSignIn = (target, options, endSession) => {
|
|
1496
|
+
const held = endSession ? require_transientRetries.Result.unwrapOr(state.auth.requireCredential(target), null) : null;
|
|
1765
1497
|
const signedOut = require_transientRetries.Result.unwrap(credentials.signOut(target, options));
|
|
1766
|
-
|
|
1498
|
+
let newest = held && grantOf(held);
|
|
1499
|
+
const ended = persistor.locked(async (store) => {
|
|
1500
|
+
if (held !== null) newest = (await store.read()).stacks.find((stack) => stack.baseUrl === target)?.credential ?? newest;
|
|
1501
|
+
await store.persistStack(target, state.store.get());
|
|
1502
|
+
}).then(() => newest ? credentials.endSession(target, newest) : void 0, async (error) => {
|
|
1503
|
+
if (newest) await credentials.endSession(target, newest);
|
|
1504
|
+
throw error;
|
|
1505
|
+
});
|
|
1506
|
+
const earlier = endingSessions.get(target);
|
|
1507
|
+
if (held !== null) {
|
|
1508
|
+
endingSessions.set(target, ended);
|
|
1509
|
+
const forget = () => {
|
|
1510
|
+
if (endingSessions.get(target) === ended) endingSessions.delete(target);
|
|
1511
|
+
};
|
|
1512
|
+
ended.then(forget, forget);
|
|
1513
|
+
}
|
|
1514
|
+
return Promise.all([ended, earlier]).then(() => signedOut);
|
|
1767
1515
|
};
|
|
1768
1516
|
/** Signs a stack back in from what a retained sign-out kept; `unreachable` leaves it to retry. */
|
|
1769
1517
|
const restoreRetained = (baseUrl) => credentials.restoreRetained(require_createFetchClient.normalizeBaseUrl(baseUrl));
|
|
@@ -1772,9 +1520,12 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
1772
1520
|
*
|
|
1773
1521
|
* - Signs out first, always: a sign-out moves the epoch even on an anonymous stack, so a stored
|
|
1774
1522
|
* session still being restored cannot land on top of this one.
|
|
1523
|
+
* - Locally only: the replaced sign-in can share a browser session with `input`.
|
|
1775
1524
|
*/
|
|
1776
1525
|
const replace = (input) => {
|
|
1777
|
-
|
|
1526
|
+
endSignIn(requireStackUrl(), {}, false).catch((error) => {
|
|
1527
|
+
console.warn("createKeboola: the replaced sign-in could not be stored", error);
|
|
1528
|
+
});
|
|
1778
1529
|
return authenticate(input);
|
|
1779
1530
|
};
|
|
1780
1531
|
let persisting = false;
|
|
@@ -1840,8 +1591,8 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
1840
1591
|
return verb(...args);
|
|
1841
1592
|
};
|
|
1842
1593
|
return {
|
|
1843
|
-
|
|
1844
|
-
|
|
1594
|
+
stackApi,
|
|
1595
|
+
projectApi,
|
|
1845
1596
|
session: {
|
|
1846
1597
|
getState: state.store.get,
|
|
1847
1598
|
subscribe: state.store.subscribe,
|
|
@@ -2065,7 +1816,7 @@ const createBranchRefs = ({ devBranches }) => {
|
|
|
2065
1816
|
};
|
|
2066
1817
|
};
|
|
2067
1818
|
exports.ApiError = require_createFetchClient.ApiError;
|
|
2068
|
-
exports.HtmlResponseError =
|
|
1819
|
+
exports.HtmlResponseError = require_validateConnectionStatus.HtmlResponseError;
|
|
2069
1820
|
exports.HttpContentType = require_createFetchClient.HttpContentType;
|
|
2070
1821
|
exports.HttpHeader = require_createFetchClient.HttpHeader;
|
|
2071
1822
|
exports.KeboolaError = KeboolaError;
|
|
@@ -2086,17 +1837,14 @@ exports.ValidationError = require_ValidationError.ValidationError;
|
|
|
2086
1837
|
exports.asError = require_transientRetries.asError;
|
|
2087
1838
|
exports.assert = assert;
|
|
2088
1839
|
exports.coalesce = coalesce;
|
|
2089
|
-
exports.collectByCursor =
|
|
1840
|
+
exports.collectByCursor = require_validateConnectionStatus.collectByCursor;
|
|
2090
1841
|
exports.collectByOffset = require_collectByOffset.collectByOffset;
|
|
2091
1842
|
exports.concurrent = require_concurrent.concurrent;
|
|
2092
1843
|
exports.createAdminAccount = createAdminAccount;
|
|
2093
1844
|
exports.createBranchRefs = createBranchRefs;
|
|
2094
|
-
exports.createDerivedAsyncStore = createDerivedAsyncStore;
|
|
2095
|
-
exports.createDerivedStore = createDerivedStore;
|
|
2096
1845
|
exports.createEmitter = require_store.createEmitter;
|
|
2097
1846
|
exports.createGenericFetchClient = require_createGenericFetchClient.createGenericFetchClient;
|
|
2098
1847
|
exports.createKeboola = createKeboola;
|
|
2099
|
-
exports.createLegacyKeboola = createLegacyKeboola;
|
|
2100
1848
|
exports.createLocalStorage = createLocalStorage;
|
|
2101
1849
|
exports.createLoggingMiddleware = createLoggingMiddleware;
|
|
2102
1850
|
exports.createMemoryStorage = createMemoryStorage;
|
|
@@ -2121,7 +1869,7 @@ exports.isAbortError = require_createFetchClient.isAbortError;
|
|
|
2121
1869
|
exports.isApiError = require_createFetchClient.isApiError;
|
|
2122
1870
|
exports.isEmptyDeep = require_schemaGuidedMerge.isEmptyDeep;
|
|
2123
1871
|
exports.isFetchClientError = require_createFetchClient.isFetchClientError;
|
|
2124
|
-
exports.isHtmlResponseError =
|
|
1872
|
+
exports.isHtmlResponseError = require_validateConnectionStatus.isHtmlResponseError;
|
|
2125
1873
|
exports.isKeboolaError = isKeboolaError;
|
|
2126
1874
|
exports.isManageError = require_storage.isManageError;
|
|
2127
1875
|
exports.isManagementClientAuthError = require_management.isManagementClientAuthError;
|
|
@@ -2134,11 +1882,12 @@ exports.isStorageJobError = require_storage.isStorageJobError;
|
|
|
2134
1882
|
exports.isSyncActionError = require_SyncActionError.isSyncActionError;
|
|
2135
1883
|
exports.isTimeoutError = require_createFetchClient.isTimeoutError;
|
|
2136
1884
|
exports.isValidationError = require_ValidationError.isValidationError;
|
|
1885
|
+
exports.iterateByCursor = require_validateConnectionStatus.iterateByCursor;
|
|
2137
1886
|
exports.jobStatus = require_transientRetries.jobStatus;
|
|
2138
1887
|
exports.keboolaUID = require_tag.keboolaUID;
|
|
2139
1888
|
exports.lazy = require_transientRetries.lazy;
|
|
2140
1889
|
exports.manageErrorCode = require_storage.manageErrorCode;
|
|
2141
|
-
exports.nextCursorOf =
|
|
1890
|
+
exports.nextCursorOf = require_validateConnectionStatus.nextCursorOf;
|
|
2142
1891
|
exports.parseLogLines = require_apps.parseLogLines;
|
|
2143
1892
|
exports.parseOrThrow = require_ValidationError.parseOrThrow;
|
|
2144
1893
|
exports.poller = require_transientRetries.poller;
|
|
@@ -2147,6 +1896,5 @@ exports.readableReason = require_storage.readableReason;
|
|
|
2147
1896
|
exports.retryAfterSeconds = require_storage.retryAfterSeconds;
|
|
2148
1897
|
exports.schemaGuidedMerge = require_schemaGuidedMerge.schemaGuidedMerge;
|
|
2149
1898
|
exports.series = require_storage.series;
|
|
2150
|
-
exports.shallowEqual = shallowEqual;
|
|
2151
1899
|
|
|
2152
1900
|
//# sourceMappingURL=index.cjs.map
|