@keboola/api-client 46.0.0 → 48.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 +95 -24
- package/API-SURFACE.md +52 -30
- package/CHANGELOG.md +85 -0
- package/README.md +47 -37
- package/dist/{ManagementSessionMintError-5FFyvBZi.js → ManagementSessionMintError-4Pkn5Oob.js} +2 -2
- package/dist/{ManagementSessionMintError-5FFyvBZi.js.map → ManagementSessionMintError-4Pkn5Oob.js.map} +1 -1
- package/dist/{ManagementSessionMintError-Bm8s6yDB.cjs → ManagementSessionMintError-Cu9beG7j.cjs} +2 -2
- package/dist/{ManagementSessionMintError-Bm8s6yDB.cjs.map → ManagementSessionMintError-Cu9beG7j.cjs.map} +1 -1
- package/dist/QueryJobError-ZZZ043Nm.js +22 -0
- package/dist/QueryJobError-ZZZ043Nm.js.map +1 -0
- package/dist/{QueryJobTimeoutError-CVNPdCWX.cjs → QueryJobError-irGiP5zh.cjs} +1 -29
- package/dist/QueryJobError-irGiP5zh.cjs.map +1 -0
- package/dist/QueueJobError-6qSEizWo.cjs +30 -0
- package/dist/QueueJobError-6qSEizWo.cjs.map +1 -0
- package/dist/QueueJobError-8bThS_Mc.js +19 -0
- package/dist/QueueJobError-8bThS_Mc.js.map +1 -0
- package/dist/adminRoles-B40yBcmq.js.map +1 -1
- package/dist/{adminRoles-C696kD_U.d.ts → adminRoles-BgpaBE7h.d.cts} +4 -2
- package/dist/adminRoles-CO7J5qAy.cjs.map +1 -1
- package/dist/{adminRoles-C696kD_U.d.cts → adminRoles-DsoGQipO.d.ts} +4 -2
- package/dist/ai/index.cjs +2 -7
- package/dist/ai/index.cjs.map +1 -1
- package/dist/ai/index.d.cts +2 -3
- package/dist/ai/index.d.ts +2 -3
- package/dist/ai/index.js +2 -7
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/types.d.cts +2 -2
- package/dist/ai/types.d.ts +2 -2
- package/dist/{appLogs-BG9ueGxA.cjs → appLogs-Cix2KWra.cjs} +2 -2
- package/dist/{appLogs-BG9ueGxA.cjs.map → appLogs-Cix2KWra.cjs.map} +1 -1
- package/dist/{appLogs-DGIctwbb.d.ts → appLogs-DpcqeOe5.d.ts} +2 -2
- package/dist/{appLogs-CEKz68bE.js → appLogs-KslK7qHr.js} +2 -2
- package/dist/{appLogs-CEKz68bE.js.map → appLogs-KslK7qHr.js.map} +1 -1
- package/dist/{appLogs-Dl0v684o.d.cts → appLogs-SjrflOHk.d.cts} +2 -2
- package/dist/apps/index.cjs +5 -5
- package/dist/apps/index.cjs.map +1 -1
- package/dist/apps/index.d.cts +3 -3
- package/dist/apps/index.d.ts +3 -3
- package/dist/apps/index.js +5 -5
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/types.d.cts +2 -2
- package/dist/apps/types.d.ts +2 -2
- package/dist/assets/index.cjs +1 -1
- package/dist/assets/index.d.cts +1 -1
- package/dist/assets/index.d.ts +1 -1
- package/dist/assets/index.js +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/{auth-C6cHWIWx.js → auth-4coY1uwo.js} +2 -2
- package/dist/{auth-C6cHWIWx.js.map → auth-4coY1uwo.js.map} +1 -1
- package/dist/{auth-C9o_0bft.cjs → auth-C8Pjl0Mu.cjs} +2 -2
- package/dist/{auth-C9o_0bft.cjs.map → auth-C8Pjl0Mu.cjs.map} +1 -1
- package/dist/{authClient-CACOwVt0.js → authClient-2e8ZmzSP.js} +71 -7
- package/dist/authClient-2e8ZmzSP.js.map +1 -0
- package/dist/{authClient-DSa5t2Ft.d.cts → authClient-BYIGzL_u.d.ts} +22 -4
- package/dist/{authClient-ZiaKSKpp.d.ts → authClient-D06srBQE.d.cts} +22 -4
- package/dist/{authClient-DZcAR-eW.cjs → authClient-DfkKlc-2.cjs} +82 -6
- package/dist/authClient-DfkKlc-2.cjs.map +1 -0
- package/dist/billing/index.cjs +2 -2
- package/dist/billing/index.d.cts +1 -1
- package/dist/billing/index.d.ts +1 -1
- package/dist/billing/index.js +2 -2
- package/dist/billing/types.d.cts +1 -1
- package/dist/billing/types.d.ts +1 -1
- package/dist/chat/index.cjs +3 -3
- package/dist/chat/index.d.cts +2 -2
- package/dist/chat/index.d.ts +2 -2
- package/dist/chat/index.js +3 -3
- package/dist/chat/types.d.cts +1 -1
- package/dist/chat/types.d.ts +1 -1
- package/dist/{collect-97WhfEpt.js → collectByOffset-2XzJqmvr.js} +6 -6
- package/dist/collectByOffset-2XzJqmvr.js.map +1 -0
- package/dist/{collect-B5TCNiT1.cjs → collectByOffset-DQsqtmJg.cjs} +7 -7
- package/dist/collectByOffset-DQsqtmJg.cjs.map +1 -0
- package/dist/componentsMcp/index.cjs +3 -0
- package/dist/componentsMcp/index.d.cts +2 -0
- package/dist/componentsMcp/index.d.ts +2 -0
- package/dist/componentsMcp/index.js +2 -0
- package/dist/componentsMcp/types.cjs +0 -0
- package/dist/componentsMcp/types.d.cts +2 -0
- package/dist/componentsMcp/types.d.ts +2 -0
- package/dist/componentsMcp/types.js +1 -0
- package/dist/componentsMcp-CHobIsuU.js +57 -0
- package/dist/componentsMcp-CHobIsuU.js.map +1 -0
- package/dist/componentsMcp-pG-PcQrg.cjs +62 -0
- package/dist/componentsMcp-pG-PcQrg.cjs.map +1 -0
- package/dist/{configurations-D_Rbs0Wl.cjs → configurations-B2O8AAy0.cjs} +2 -2
- package/dist/{configurations-D_Rbs0Wl.cjs.map → configurations-B2O8AAy0.cjs.map} +1 -1
- package/dist/{configurations-Chg_JwJ1.js → configurations-CL0ouUMa.js} +3 -3
- package/dist/configurations-CL0ouUMa.js.map +1 -0
- package/dist/{configurations-BTRHVSRq.cjs → configurations-D9J3jh3g.cjs} +3 -3
- package/dist/configurations-D9J3jh3g.cjs.map +1 -0
- package/dist/{configurations-DcpUlC8I.js → configurations-DKINmjA3.js} +2 -2
- package/dist/{configurations-DcpUlC8I.js.map → configurations-DKINmjA3.js.map} +1 -1
- package/dist/constants/index.cjs +1 -1
- package/dist/constants/index.d.cts +2 -3
- package/dist/constants/index.d.ts +2 -3
- package/dist/constants/index.js +1 -1
- package/dist/{constants-Cifrqsls.js → constants-CA4UN2Xv.js} +11 -10
- package/dist/constants-CA4UN2Xv.js.map +1 -0
- package/dist/{constants-BDGRQqij.cjs → constants-a0jswUeK.cjs} +10 -9
- package/dist/constants-a0jswUeK.cjs.map +1 -0
- package/dist/{createFetchClient-DITkTV2k.js → createFetchClient-CkHdS_IG.js} +5 -5
- package/dist/createFetchClient-CkHdS_IG.js.map +1 -0
- package/dist/{createFetchClient-ClWD4ua3.cjs → createFetchClient-lZ_93Yrb.cjs} +5 -5
- package/dist/createFetchClient-lZ_93Yrb.cjs.map +1 -0
- package/dist/{createGenericFetchClient-KqiJhw8G.js → createGenericFetchClient-CQdNcPC3.js} +2 -2
- package/dist/{createGenericFetchClient-KqiJhw8G.js.map → createGenericFetchClient-CQdNcPC3.js.map} +1 -1
- package/dist/{createGenericFetchClient-B81Iezpb.cjs → createGenericFetchClient-MOx97wi-.cjs} +2 -2
- package/dist/{createGenericFetchClient-B81Iezpb.cjs.map → createGenericFetchClient-MOx97wi-.cjs.map} +1 -1
- package/dist/{createOpenapiFetchClient-CioTX11-.cjs → createOpenapiFetchClient-DHYo_k3t.cjs} +2 -2
- package/dist/{createOpenapiFetchClient-CioTX11-.cjs.map → createOpenapiFetchClient-DHYo_k3t.cjs.map} +1 -1
- package/dist/{createOpenapiFetchClient-wq8iGLZM.js → createOpenapiFetchClient-DXiMv9WL.js} +2 -2
- package/dist/{createOpenapiFetchClient-wq8iGLZM.js.map → createOpenapiFetchClient-DXiMv9WL.js.map} +1 -1
- package/dist/dataScience/index.cjs +2 -2
- package/dist/dataScience/index.d.cts +2 -2
- package/dist/dataScience/index.d.ts +2 -2
- package/dist/dataScience/index.js +2 -2
- package/dist/dataScience/types.d.cts +2 -2
- package/dist/dataScience/types.d.ts +2 -2
- package/dist/{dataScience-BwHmDoQb.js → dataScience-AwPMeGfz.js} +5 -5
- package/dist/{dataScience-BwHmDoQb.js.map → dataScience-AwPMeGfz.js.map} +1 -1
- package/dist/{dataScience-Hhoqoql_.cjs → dataScience-BjS1p8WO.cjs} +5 -5
- package/dist/{dataScience-Hhoqoql_.cjs.map → dataScience-BjS1p8WO.cjs.map} +1 -1
- package/dist/developerPortal/index.cjs +1 -1
- package/dist/developerPortal/index.d.cts +2 -2
- package/dist/developerPortal/index.d.ts +2 -2
- package/dist/developerPortal/index.js +1 -1
- package/dist/developerPortal/types.d.cts +1 -1
- package/dist/developerPortal/types.d.ts +1 -1
- package/dist/{developerPortalClient-loKq7X_U.js → developerPortalClient-Bb2suezr.js} +13 -5
- package/dist/{developerPortalClient-loKq7X_U.js.map → developerPortalClient-Bb2suezr.js.map} +1 -1
- package/dist/{developerPortalClient-COm7wJxS.cjs → developerPortalClient-DUerKw-7.cjs} +13 -5
- package/dist/{developerPortalClient-COm7wJxS.cjs.map → developerPortalClient-DUerKw-7.cjs.map} +1 -1
- package/dist/domain/permissions/index.cjs +1 -1
- package/dist/domain/permissions/index.d.cts +2 -3
- package/dist/domain/permissions/index.d.ts +2 -3
- package/dist/domain/permissions/index.js +1 -1
- package/dist/editor/index.cjs +2 -2
- package/dist/editor/index.d.cts +2 -2
- package/dist/editor/index.d.ts +2 -2
- package/dist/editor/index.js +2 -2
- package/dist/editor/types.d.cts +1 -1
- package/dist/editor/types.d.ts +1 -1
- package/dist/encryption/index.cjs +1 -1
- package/dist/encryption/index.d.cts +1 -1
- package/dist/encryption/index.d.ts +1 -1
- package/dist/encryption/index.js +1 -1
- package/dist/encryption/types.d.cts +1 -1
- package/dist/encryption/types.d.ts +1 -1
- package/dist/import/index.cjs +1 -1
- package/dist/import/index.d.cts +3 -3
- package/dist/import/index.d.ts +3 -3
- package/dist/import/index.js +1 -1
- package/dist/{import-B5DcJGMI.cjs → import-BahNYv91.cjs} +3 -3
- package/dist/{import-B5DcJGMI.cjs.map → import-BahNYv91.cjs.map} +1 -1
- package/dist/{import-JlH_QaDd.js → import-FWy_wQZ1.js} +3 -3
- package/dist/{import-JlH_QaDd.js.map → import-FWy_wQZ1.js.map} +1 -1
- package/dist/{index-BP3choXr.d.ts → index-B3QTeqfL.d.ts} +19976 -14513
- package/dist/{index-x8ET_BTN.d.cts → index-BCjU-g9t.d.cts} +3 -3
- package/dist/{index-DCxVLGHH.d.ts → index-BHiJu8LF.d.cts} +16 -28
- package/dist/{index-DXcTukgn.d.ts → index-BIldED4N.d.ts} +4 -4
- package/dist/index-BLvmyehw.d.ts +46 -0
- package/dist/{index-BnPYPXGQ.d.ts → index-BTrxCk90.d.ts} +3 -3
- package/dist/{index-DS6O4UDB.d.cts → index-ByLCYBaw.d.cts} +4 -4
- package/dist/{index-syAYY5LC.d.cts → index-C40Fbj-6.d.cts} +19976 -14513
- package/dist/{index-DWFxcmVD.d.ts → index-CIqWOEWD.d.ts} +4 -4
- package/dist/{index-Bt43tKyu.d.cts → index-Cc5wSIRJ.d.cts} +5 -5
- package/dist/{types-CESP1ONj.d.ts → index-ChDl6ig5.d.cts} +3780 -549
- package/dist/index-Co2Cd-nw.d.cts +46 -0
- package/dist/{index-CTKC-mwi.d.cts → index-CpGmmJbt.d.cts} +4 -4
- package/dist/{index-D-4TT5yW.d.cts → index-CpUYVB-d.d.cts} +4 -4
- package/dist/{index-DeQDdut6.d.ts → index-CzHrIfZS.d.ts} +34 -2
- package/dist/{index-BhDxP0x4.d.cts → index-D91RxB_S.d.cts} +18 -13
- package/dist/{index-GVxpBH6j.d.cts → index-DlZiWfQb.d.ts} +16 -28
- package/dist/{index-DRaVzOLM.d.ts → index-DzLXtE4Q.d.ts} +5 -5
- package/dist/{index-DeQDdut6.d.cts → index-VlzlOBkc.d.cts} +34 -2
- package/dist/{index-se5ee8U1.d.ts → index-avzO5sLa.d.ts} +18 -13
- package/dist/{index-yJ0HrxY6.d.ts → index-m7fX76x3.d.ts} +4 -4
- package/dist/{types-GaOcVZ3d.d.cts → index-sDHBkJhU.d.ts} +3780 -549
- package/dist/index.cjs +551 -375
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -7
- package/dist/index.d.ts +7 -7
- package/dist/index.js +493 -320
- package/dist/index.js.map +1 -1
- package/dist/{isLoginPageRedirect-CsyRa3_v.js → isLoginPageRedirect-B4QKSiSa.js} +2 -2
- package/dist/{isLoginPageRedirect-CsyRa3_v.js.map → isLoginPageRedirect-B4QKSiSa.js.map} +1 -1
- package/dist/{isLoginPageRedirect-iNbwl3iz.cjs → isLoginPageRedirect-r0Opgc1n.cjs} +2 -2
- package/dist/{isLoginPageRedirect-iNbwl3iz.cjs.map → isLoginPageRedirect-r0Opgc1n.cjs.map} +1 -1
- package/dist/kaiAgent/index.cjs +1 -1
- package/dist/kaiAgent/index.d.cts +3 -3
- package/dist/kaiAgent/index.d.ts +3 -3
- package/dist/kaiAgent/index.js +1 -1
- package/dist/kaiAgent/types.d.cts +1 -1
- package/dist/kaiAgent/types.d.ts +1 -1
- package/dist/{kaiAgent-CUeT53-K.js → kaiAgent-CYvrS8oZ.js} +16 -7
- package/dist/kaiAgent-CYvrS8oZ.js.map +1 -0
- package/dist/{kaiAgent-BhcUsBDk.cjs → kaiAgent-N2qbUFZm.cjs} +16 -7
- package/dist/kaiAgent-N2qbUFZm.cjs.map +1 -0
- package/dist/{kaiMemory-DaOh0zVn.js → kaiMemory-C9di17bd.js} +2 -2
- package/dist/{kaiMemory-DaOh0zVn.js.map → kaiMemory-C9di17bd.js.map} +1 -1
- package/dist/{kaiMemory-Cf81ghNd.cjs → kaiMemory-Qch09f-m.cjs} +2 -2
- package/dist/{kaiMemory-Cf81ghNd.cjs.map → kaiMemory-Qch09f-m.cjs.map} +1 -1
- 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 +2 -2
- package/dist/management/types.d.ts +2 -2
- package/dist/{management-0cWVLHei.cjs → management-CXHnxVaZ.cjs} +34 -10
- package/dist/management-CXHnxVaZ.cjs.map +1 -0
- package/dist/{management-eg4Ig-Cx.js → management-NYAD6ej4.js} +34 -10
- package/dist/management-NYAD6ej4.js.map +1 -0
- package/dist/metastore/index.cjs +1 -1
- package/dist/metastore/index.d.cts +1 -1
- package/dist/metastore/index.d.ts +1 -1
- package/dist/metastore/index.js +1 -1
- package/dist/metastore/types.d.cts +1 -1
- package/dist/metastore/types.d.ts +1 -1
- package/dist/{metastore-YPHUK3jJ.cjs → metastore-BXHg33ku.cjs} +4 -4
- package/dist/{metastore-YPHUK3jJ.cjs.map → metastore-BXHg33ku.cjs.map} +1 -1
- package/dist/{metastore-D0C6uaPX.js → metastore-Ywq08DBz.js} +4 -4
- package/dist/{metastore-D0C6uaPX.js.map → metastore-Ywq08DBz.js.map} +1 -1
- package/dist/microsoftGraph/index.cjs +2 -2
- package/dist/microsoftGraph/index.d.cts +2 -2
- package/dist/microsoftGraph/index.d.ts +2 -2
- package/dist/microsoftGraph/index.js +2 -2
- package/dist/microsoftGraph/types.d.cts +1 -1
- package/dist/microsoftGraph/types.d.ts +1 -1
- package/dist/{middleware-D_p5TctO.cjs → middleware-CEP6uu_D.cjs} +5 -5
- package/dist/middleware-CEP6uu_D.cjs.map +1 -0
- package/dist/{middleware-DmR6OhTY.js → middleware-GOfx8Apu.js} +5 -5
- package/dist/middleware-GOfx8Apu.js.map +1 -0
- package/dist/notifications/index.cjs +3 -3
- package/dist/notifications/index.d.cts +2 -2
- package/dist/notifications/index.d.ts +2 -2
- package/dist/notifications/index.js +3 -3
- package/dist/notifications/types.d.cts +1 -1
- package/dist/notifications/types.d.ts +1 -1
- package/dist/oauth/index.cjs +1 -1
- package/dist/oauth/index.d.cts +6 -2
- package/dist/oauth/index.d.ts +6 -2
- package/dist/oauth/index.js +1 -1
- package/dist/oauth/types.d.cts +2 -2
- package/dist/oauth/types.d.ts +2 -2
- package/dist/{oauth-DyUwTqHJ.cjs → oauth-DKZPuUlt.cjs} +17 -6
- package/dist/{oauth-DyUwTqHJ.cjs.map → oauth-DKZPuUlt.cjs.map} +1 -1
- package/dist/{oauth-Ck_Fe14o.js → oauth-GXmZ9agP.js} +17 -6
- package/dist/{oauth-Ck_Fe14o.js.map → oauth-GXmZ9agP.js.map} +1 -1
- package/dist/omnisearch/index.cjs +2 -2
- package/dist/omnisearch/index.d.cts +2 -2
- package/dist/omnisearch/index.d.ts +2 -2
- package/dist/omnisearch/index.js +2 -2
- package/dist/omnisearch/types.d.cts +1 -1
- package/dist/omnisearch/types.d.ts +1 -1
- package/dist/project-Dzu85cqr.d.cts +74 -0
- package/dist/project-nbv9yjpl.d.ts +74 -0
- 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 +2 -2
- package/dist/queryService/types.d.ts +2 -2
- package/dist/{queryService-Blfz59Ms.js → queryService-C-pZha5p.js} +36 -27
- package/dist/queryService-C-pZha5p.js.map +1 -0
- package/dist/{queryService-RlNYw7LG.cjs → queryService-CzK53q94.cjs} +36 -27
- package/dist/queryService-CzK53q94.cjs.map +1 -0
- package/dist/queue/index.cjs +1 -1
- package/dist/queue/index.d.cts +75 -7
- package/dist/queue/index.d.ts +75 -7
- 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-BrgRdtOr.cjs → queue-BJvDWriM.cjs} +35 -25
- package/dist/queue-BJvDWriM.cjs.map +1 -0
- package/dist/{queue-CNvR-M23.js → queue-D6-x4OGF.js} +35 -25
- package/dist/queue-D6-x4OGF.js.map +1 -0
- package/dist/scheduler/index.cjs +3 -3
- package/dist/scheduler/index.d.cts +2 -2
- package/dist/scheduler/index.d.ts +2 -2
- package/dist/scheduler/index.js +3 -3
- package/dist/scheduler/types.d.cts +1 -1
- package/dist/scheduler/types.d.ts +1 -1
- package/dist/sdk/configurations/index.cjs +1 -1
- package/dist/sdk/configurations/index.d.cts +2 -4
- package/dist/sdk/configurations/index.d.ts +2 -4
- package/dist/sdk/configurations/index.js +1 -1
- package/dist/sdk/developerPortal/index.cjs +3 -3
- package/dist/sdk/developerPortal/index.d.cts +3 -3
- package/dist/sdk/developerPortal/index.d.ts +3 -3
- package/dist/sdk/developerPortal/index.js +3 -3
- package/dist/sdk/kaiMemory/index.cjs +1 -1
- package/dist/sdk/kaiMemory/index.d.cts +1 -1
- package/dist/sdk/kaiMemory/index.d.ts +1 -1
- package/dist/sdk/kaiMemory/index.js +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.cjs +34 -55
- package/dist/sdk/queryService/index.cjs.map +1 -1
- package/dist/sdk/queryService/index.d.cts +2 -2
- package/dist/sdk/queryService/index.d.ts +2 -2
- package/dist/sdk/queryService/index.js +34 -55
- package/dist/sdk/queryService/index.js.map +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/storage/index.cjs +0 -119
- package/dist/sdk/storage/index.cjs.map +1 -1
- package/dist/sdk/storage/index.d.cts +103 -2
- package/dist/sdk/storage/index.d.ts +103 -2
- package/dist/sdk/storage/index.js +1 -119
- package/dist/sdk/storage/index.js.map +1 -1
- package/dist/sdk/tag/index.d.cts +2 -2
- package/dist/sdk/tag/index.d.ts +2 -2
- 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.cjs +1 -1
- package/dist/status/index.d.cts +1 -1
- package/dist/status/index.d.ts +1 -1
- package/dist/status/index.js +1 -1
- package/dist/storage/index.cjs +13 -9
- package/dist/storage/index.d.cts +3 -3
- package/dist/storage/index.d.ts +3 -3
- package/dist/storage/index.js +7 -6
- package/dist/storage/types.d.cts +6 -5
- package/dist/storage/types.d.ts +6 -5
- package/dist/{storage-RkNaOFJ-.js → storage-BR-Kgi-6.js} +353 -169
- package/dist/storage-BR-Kgi-6.js.map +1 -0
- package/dist/{storage-76Sf_z_H.cjs → storage-CVBXivpB.cjs} +372 -170
- package/dist/storage-CVBXivpB.cjs.map +1 -0
- package/dist/stream/index.cjs +3 -3
- package/dist/stream/index.d.cts +2 -2
- package/dist/stream/index.d.ts +2 -2
- package/dist/stream/index.js +3 -3
- package/dist/stream/types.d.cts +1 -1
- package/dist/stream/types.d.ts +1 -1
- package/dist/syncActions/index.cjs +1 -1
- package/dist/syncActions/index.d.cts +2 -2
- package/dist/syncActions/index.d.ts +2 -2
- package/dist/syncActions/index.js +1 -1
- package/dist/syncActions/types.d.cts +1 -1
- package/dist/syncActions/types.d.ts +1 -1
- package/dist/{syncActions-DlNPhZY4.cjs → syncActions-C1rE4R3f.cjs} +5 -5
- package/dist/{syncActions-DlNPhZY4.cjs.map → syncActions-C1rE4R3f.cjs.map} +1 -1
- package/dist/{syncActions-BvFUa9xV.js → syncActions-DM8vP7p3.js} +5 -5
- package/dist/{syncActions-BvFUa9xV.js.map → syncActions-DM8vP7p3.js.map} +1 -1
- package/dist/telemetry/index.cjs +3 -6
- package/dist/telemetry/index.cjs.map +1 -1
- package/dist/telemetry/index.d.cts +2 -5
- package/dist/telemetry/index.d.ts +2 -5
- package/dist/telemetry/index.js +3 -6
- package/dist/telemetry/index.js.map +1 -1
- package/dist/telemetry/types.d.cts +1 -1
- package/dist/telemetry/types.d.ts +1 -1
- package/dist/{jobStatus-BJdbZ72V.js → transientRetries-B4iusp69.js} +79 -37
- package/dist/transientRetries-B4iusp69.js.map +1 -0
- package/dist/{jobStatus-B0E-MZ9I.cjs → transientRetries-DdJfH9QK.cjs} +82 -40
- package/dist/transientRetries-DdJfH9QK.cjs.map +1 -0
- package/dist/{types-QroFANIW.d.cts → types-0ZAMQhva.d.cts} +3 -3
- package/dist/{types-BMWeCO5M.d.ts → types-1LENlL5h.d.ts} +3 -3
- package/dist/{types-BRvs3fXN.d.cts → types-6KabdIyO.d.cts} +3 -3
- package/dist/{types-B5kkD7h4.d.cts → types-9d8ihjZh.d.cts} +2 -2
- package/dist/{types-qGMVZGSB.d.ts → types-B7L6uSYb.d.ts} +50 -3
- package/dist/{types-qWA5iU0j.d.ts → types-BTy_FFSu.d.ts} +2 -2
- package/dist/{types-B1GN_I06.d.ts → types-BWYtQkHu.d.ts} +2 -2
- package/dist/types-BXHZQvGy.d.ts +2111 -0
- package/dist/{types-Btb8r9iw.d.ts → types-BYFU_6Iz.d.ts} +95 -26
- package/dist/{types-Nwq1QtYe.d.ts → types-BaqdM92a.d.ts} +3 -4
- package/dist/{types-CFurl1xe.d.cts → types-BbwrMl0Q.d.cts} +2 -2
- package/dist/{types-Br04cEri.d.ts → types-Bt8CEZ6K.d.ts} +2 -2
- package/dist/types-BtS3DhGu.d.cts +2111 -0
- package/dist/{types-CaBhH99H.d.ts → types-C-GSYDTN.d.ts} +3 -3
- package/dist/{types-BGICH80a.d.cts → types-C4eQ-Zcx.d.cts} +2 -2
- package/dist/{types-BTqxM-IN.d.ts → types-C9VaQSqV.d.ts} +2 -2
- package/dist/{types-C05ALlV6.d.cts → types-CNkQuWnO.d.cts} +3 -3
- package/dist/{types-DMWfdZ5C.d.cts → types-CXv_e6xC.d.cts} +2 -2
- package/dist/{types-C8oZX0oP.d.cts → types-C_raqbl-.d.cts} +3 -3
- package/dist/{types-BtII5RSD.d.ts → types-Cc4yTEdK.d.ts} +11 -3
- package/dist/{types-BoNqe_Lz.d.ts → types-Ce5Blzhg.d.ts} +2 -2
- package/dist/{types-UI2aZ74n.d.ts → types-CfZLdfAL.d.ts} +3 -3
- package/dist/{types-sg2xnYlr.d.cts → types-Cfc-fYbq.d.cts} +95 -26
- package/dist/{types-C4yryy-R.d.ts → types-Cn8I0vcr.d.ts} +3 -3
- package/dist/{types-DQauEri3.d.ts → types-CpWE6Yg2.d.ts} +2 -2
- package/dist/{types-XHNJRi3-.d.cts → types-CrJIILXf.d.cts} +2 -2
- package/dist/{types-DHdXufVf.d.cts → types-CwGbiMF-.d.cts} +3 -3
- package/dist/{types-fAqPUl-a.d.ts → types-CwQ8_n8q.d.ts} +320 -43
- package/dist/{types-BksK2Eo0.d.cts → types-D3H3EAre.d.ts} +2 -2
- package/dist/{types-CyO8qCKl.d.cts → types-D3mj56iq.d.cts} +2 -2
- package/dist/{types-YdE2VJzw.d.cts → types-D8d5tyGi.d.cts} +2 -2
- package/dist/{types-Csmy6qFk.d.cts → types-DMpiG2q4.d.cts} +3 -3
- package/dist/{types-ggpJFEWZ.d.cts → types-DSBrhK_K.d.cts} +2 -2
- package/dist/{types-5HdT1rSH.d.cts → types-DXF6faow.d.cts} +2 -2
- package/dist/{types-DDjp9lXD.d.ts → types-DfJP6Dti.d.ts} +2 -2
- package/dist/{types-DSv1XS7s.d.ts → types-DgOLSRiy.d.ts} +3 -3
- package/dist/{types-tJLoKlMX.d.cts → types-DlgqPU_4.d.cts} +2 -2
- package/dist/{types-sI3K5t3w.d.cts → types-Dn1G-qv4.d.cts} +320 -43
- package/dist/{types--owScV0r.d.cts → types-EkyQ0_10.d.cts} +11 -3
- package/dist/{types-LxDyOfdY.d.cts → types-EmIcG-8K.d.cts} +2 -2
- package/dist/{types-DGu-wPPm.d.cts → types-NSxpnYW5.d.cts} +50 -3
- package/dist/{types-Dvysi2Eo.d.ts → types-QPW-7dPm.d.ts} +2 -2
- package/dist/{types-BE7mRarT.d.ts → types-UySfduQo.d.ts} +2 -2
- package/dist/{types-BHxsCu0f.d.ts → types-VehpPOQX.d.ts} +2 -2
- package/dist/{types-DiE081mn.d.ts → types-Vu09EUZs.d.ts} +3 -3
- package/dist/{types-CoQET4Ep.d.ts → types-c4h2YDMC.d.ts} +2 -2
- package/dist/{types-BuKviWct.d.ts → types-sOM2_KPc.d.cts} +2 -2
- package/dist/{types-DUDQg4ry.d.cts → types-wNuJUhco.d.cts} +3 -4
- package/dist/{validateConnectionStatus-DR-0h35y.cjs → validateConnectionStatus-BalWEyRk.cjs} +3 -3
- package/dist/{validateConnectionStatus-DR-0h35y.cjs.map → validateConnectionStatus-BalWEyRk.cjs.map} +1 -1
- package/dist/{validateConnectionStatus-CdTV3gsP.js → validateConnectionStatus-DyrYpn0G.js} +3 -3
- package/dist/{validateConnectionStatus-CdTV3gsP.js.map → validateConnectionStatus-DyrYpn0G.js.map} +1 -1
- package/dist/vault/index.cjs +6 -6
- package/dist/vault/index.cjs.map +1 -1
- package/dist/vault/index.d.cts +1 -1
- package/dist/vault/index.d.ts +1 -1
- package/dist/vault/index.js +6 -6
- package/dist/vault/index.js.map +1 -1
- package/dist/vault/types.d.cts +1 -1
- package/dist/vault/types.d.ts +1 -1
- package/package.json +27 -1
- package/surface/ai.md +0 -1
- package/surface/apps.md +5 -5
- package/surface/auth.md +2 -0
- package/surface/chat.md +2 -2
- package/surface/componentsMcp.md +9 -0
- package/surface/dataScience.md +2 -2
- package/surface/kaiAgent.md +5 -4
- package/surface/management.md +5 -2
- package/surface/oauth.md +1 -0
- package/surface/queryService.md +4 -4
- package/surface/queue.md +2 -2
- package/surface/sdk.md +0 -24
- package/surface/storage.md +88 -57
- package/dist/QueryJobTimeoutError-C7JbNGOM.js +0 -38
- package/dist/QueryJobTimeoutError-C7JbNGOM.js.map +0 -1
- package/dist/QueryJobTimeoutError-CVNPdCWX.cjs.map +0 -1
- package/dist/authClient-CACOwVt0.js.map +0 -1
- package/dist/authClient-DZcAR-eW.cjs.map +0 -1
- package/dist/collect-97WhfEpt.js.map +0 -1
- package/dist/collect-B5TCNiT1.cjs.map +0 -1
- package/dist/configurations-BTRHVSRq.cjs.map +0 -1
- package/dist/configurations-Chg_JwJ1.js.map +0 -1
- package/dist/constants-BDGRQqij.cjs.map +0 -1
- package/dist/constants-Cifrqsls.js.map +0 -1
- package/dist/createFetchClient-ClWD4ua3.cjs.map +0 -1
- package/dist/createFetchClient-DITkTV2k.js.map +0 -1
- package/dist/index-BzhLY7el.d.cts +0 -254
- package/dist/index-CH5Sg3rk.d.ts +0 -77
- package/dist/index-CiwWDu-q.d.cts +0 -16
- package/dist/index-DCAnnlcL.d.ts +0 -16
- package/dist/index-DQwjlSJi.d.cts +0 -77
- package/dist/index-PyTPrtaL.d.ts +0 -254
- package/dist/jobStatus-B0E-MZ9I.cjs.map +0 -1
- package/dist/jobStatus-BJdbZ72V.js.map +0 -1
- package/dist/kaiAgent-BhcUsBDk.cjs.map +0 -1
- package/dist/kaiAgent-CUeT53-K.js.map +0 -1
- package/dist/management-0cWVLHei.cjs.map +0 -1
- package/dist/management-eg4Ig-Cx.js.map +0 -1
- package/dist/middleware-D_p5TctO.cjs.map +0 -1
- package/dist/middleware-DmR6OhTY.js.map +0 -1
- package/dist/project-BN7YRWFS.d.cts +0 -24
- package/dist/project-BpWTnoQ_.d.ts +0 -24
- package/dist/queryService-Blfz59Ms.js.map +0 -1
- package/dist/queryService-RlNYw7LG.cjs.map +0 -1
- package/dist/queue-BrgRdtOr.cjs.map +0 -1
- package/dist/queue-CNvR-M23.js.map +0 -1
- package/dist/serviceIds-DRcoTnSd.d.cts +0 -32
- package/dist/serviceIds-DRcoTnSd.d.ts +0 -32
- package/dist/storage-76Sf_z_H.cjs.map +0 -1
- package/dist/storage-RkNaOFJ-.js.map +0 -1
- package/dist/types-1B3ioN33.d.cts +0 -1868
- package/dist/types-BjIuVrAZ.d.ts +0 -66
- package/dist/types-CGhu0tID.d.cts +0 -1298
- package/dist/types-CclheyE7.d.cts +0 -66
- package/dist/types-M9vU_ONp.d.ts +0 -1868
- package/dist/types-P_61P9Nd.d.ts +0 -1298
- package/dist/types-j30rKMe6.d.ts +0 -957
- package/dist/types-q5lgElyc.d.cts +0 -957
package/dist/index.cjs
CHANGED
|
@@ -1,54 +1,55 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
2
|
const require_rolldown_runtime = require("./rolldown-runtime-VH7oDXx4.cjs");
|
|
3
3
|
const require_project = require("./project-CpgplgCr.cjs");
|
|
4
|
-
const
|
|
4
|
+
const require_collectByOffset = require("./collectByOffset-DQsqtmJg.cjs");
|
|
5
|
+
const require_authClient = require("./authClient-DfkKlc-2.cjs");
|
|
5
6
|
const require_concurrent = require("./concurrent-CdVfR1N5.cjs");
|
|
6
7
|
const require_dedupe = require("./dedupe-OSnnst2u.cjs");
|
|
7
|
-
const
|
|
8
|
+
const require_transientRetries = require("./transientRetries-DdJfH9QK.cjs");
|
|
8
9
|
const require_store = require("./store-xS-Cu_VS.cjs");
|
|
9
|
-
const require_storage = require("./storage-
|
|
10
|
+
const require_storage = require("./storage-CVBXivpB.cjs");
|
|
10
11
|
const require_tag = require("./tag-DHS_soa7.cjs");
|
|
11
12
|
const require_generateUUID = require("./generateUUID-C6qKBPIv.cjs");
|
|
12
13
|
const require_isPlainObject = require("./isPlainObject-BB3iy87C.cjs");
|
|
13
|
-
const require_configurations = require("./configurations-
|
|
14
|
+
const require_configurations = require("./configurations-B2O8AAy0.cjs");
|
|
14
15
|
const require_UserError = require("./UserError-CSGO1qII.cjs");
|
|
15
|
-
const require_createFetchClient = require("./createFetchClient-
|
|
16
|
-
const require_validateConnectionStatus = require("./validateConnectionStatus-
|
|
17
|
-
const require_ManagementSessionMintError = require("./ManagementSessionMintError-
|
|
18
|
-
const
|
|
16
|
+
const require_createFetchClient = require("./createFetchClient-lZ_93Yrb.cjs");
|
|
17
|
+
const require_validateConnectionStatus = require("./validateConnectionStatus-BalWEyRk.cjs");
|
|
18
|
+
const require_ManagementSessionMintError = require("./ManagementSessionMintError-Cu9beG7j.cjs");
|
|
19
|
+
const require_QueryJobError = require("./QueryJobError-irGiP5zh.cjs");
|
|
20
|
+
const require_QueueJobError = require("./QueueJobError-6qSEizWo.cjs");
|
|
19
21
|
const require_SyncActionError = require("./SyncActionError-BG0zwchi.cjs");
|
|
20
22
|
const require_ValidationError = require("./ValidationError-D65QU0uq.cjs");
|
|
21
|
-
const require_createGenericFetchClient = require("./createGenericFetchClient-
|
|
22
|
-
const require_import = require("./import-
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const require_constants = require("./constants-BDGRQqij.cjs");
|
|
23
|
+
const require_createGenericFetchClient = require("./createGenericFetchClient-MOx97wi-.cjs");
|
|
24
|
+
const require_import = require("./import-BahNYv91.cjs");
|
|
25
|
+
const require_management = require("./management-CXHnxVaZ.cjs");
|
|
26
|
+
const require_constants = require("./constants-a0jswUeK.cjs");
|
|
26
27
|
const require_storageTable = require("./storageTable-BNOR2FCh.cjs");
|
|
27
|
-
const require_kaiMemory = require("./kaiMemory-
|
|
28
|
+
const require_kaiMemory = require("./kaiMemory-Qch09f-m.cjs");
|
|
28
29
|
const require_semanticLayer = require("./semanticLayer-7BejcMj_.cjs");
|
|
29
|
-
const require_sdk_storage_index = require("./sdk/storage/index.cjs");
|
|
30
30
|
const require_sdk_vault_index = require("./sdk/vault/index.cjs");
|
|
31
31
|
const require_ai_index = require("./ai/index.cjs");
|
|
32
|
-
const require_appLogs = require("./appLogs-
|
|
32
|
+
const require_appLogs = require("./appLogs-Cix2KWra.cjs");
|
|
33
33
|
const require_apps_index = require("./apps/index.cjs");
|
|
34
34
|
const require_billing_index = require("./billing/index.cjs");
|
|
35
35
|
const require_chat_index = require("./chat/index.cjs");
|
|
36
|
-
const
|
|
36
|
+
const require_componentsMcp = require("./componentsMcp-pG-PcQrg.cjs");
|
|
37
|
+
const require_dataScience = require("./dataScience-BjS1p8WO.cjs");
|
|
37
38
|
const require_editor_index = require("./editor/index.cjs");
|
|
38
39
|
const require_encryption_index = require("./encryption/index.cjs");
|
|
39
|
-
const require_kaiAgent = require("./kaiAgent-
|
|
40
|
-
const require_metastore = require("./metastore-
|
|
40
|
+
const require_kaiAgent = require("./kaiAgent-N2qbUFZm.cjs");
|
|
41
|
+
const require_metastore = require("./metastore-BXHg33ku.cjs");
|
|
41
42
|
const require_notifications_index = require("./notifications/index.cjs");
|
|
42
|
-
const require_oauth = require("./oauth-
|
|
43
|
+
const require_oauth = require("./oauth-DKZPuUlt.cjs");
|
|
43
44
|
const require_omnisearch_index = require("./omnisearch/index.cjs");
|
|
44
|
-
const require_queryService = require("./queryService-
|
|
45
|
-
const require_queue = require("./queue-
|
|
45
|
+
const require_queryService = require("./queryService-CzK53q94.cjs");
|
|
46
|
+
const require_queue = require("./queue-BJvDWriM.cjs");
|
|
46
47
|
const require_scheduler_index = require("./scheduler/index.cjs");
|
|
47
48
|
const require_stream_index = require("./stream/index.cjs");
|
|
48
|
-
const require_syncActions = require("./syncActions-
|
|
49
|
+
const require_syncActions = require("./syncActions-C1rE4R3f.cjs");
|
|
49
50
|
const require_telemetry_index = require("./telemetry/index.cjs");
|
|
50
51
|
const require_vault_index = require("./vault/index.cjs");
|
|
51
|
-
const require_middleware = require("./middleware-
|
|
52
|
+
const require_middleware = require("./middleware-CEP6uu_D.cjs");
|
|
52
53
|
const require_sdk_queryService_index = require("./sdk/queryService/index.cjs");
|
|
53
54
|
let zod = require("zod");
|
|
54
55
|
zod = require_rolldown_runtime.__toESM(zod, 1);
|
|
@@ -211,11 +212,11 @@ const createDerivedAsyncStore = ({ source, dependsOn, build, keyEquals = shallow
|
|
|
211
212
|
//#endregion
|
|
212
213
|
//#region src/utils/async/poll/registry.ts
|
|
213
214
|
const DEFAULT_LIMIT = 50;
|
|
214
|
-
const isFinished = ({ snapshot }) => snapshot.state !== "idle" && snapshot.state !== "polling";
|
|
215
|
+
const isFinished = ({ snapshot }) => snapshot.state !== "idle" && snapshot.state !== "requesting" && snapshot.state !== "polling";
|
|
215
216
|
const createPollRegistry = ({ limit = DEFAULT_LIMIT } = {}) => {
|
|
216
217
|
const entries = require_store.createStore([]);
|
|
217
218
|
const unsubscribes = /* @__PURE__ */ new Map();
|
|
218
|
-
const maxEntries =
|
|
219
|
+
const maxEntries = require_transientRetries.clamp(require_transientRetries.finiteOr(limit, DEFAULT_LIMIT), 1);
|
|
219
220
|
let nextKey = 1;
|
|
220
221
|
const forget = (key) => {
|
|
221
222
|
unsubscribes.get(key)?.();
|
|
@@ -248,7 +249,7 @@ const createPollRegistry = ({ limit = DEFAULT_LIMIT } = {}) => {
|
|
|
248
249
|
entries.set(trim([entry, ...entries.get()]));
|
|
249
250
|
};
|
|
250
251
|
const collect = () => {
|
|
251
|
-
|
|
252
|
+
require_transientRetries.emitter.subscribe(register);
|
|
252
253
|
};
|
|
253
254
|
return {
|
|
254
255
|
list: entries.get,
|
|
@@ -262,6 +263,47 @@ const createPollRegistry = ({ limit = DEFAULT_LIMIT } = {}) => {
|
|
|
262
263
|
};
|
|
263
264
|
};
|
|
264
265
|
//#endregion
|
|
266
|
+
//#region src/utils/async/queueSeries.ts
|
|
267
|
+
const isPromiseLike = (value) => (typeof value === "object" && value !== null || typeof value === "function") && "then" in value && typeof value.then === "function";
|
|
268
|
+
/**
|
|
269
|
+
* Queues tasks added over time so a slower earlier task cannot finish after and overwrite a later one.
|
|
270
|
+
* Each `add` returns its task's result; a rejection does not stop the remaining queue.
|
|
271
|
+
*/
|
|
272
|
+
const queueSeries = () => {
|
|
273
|
+
let tail = null;
|
|
274
|
+
const add = (task) => {
|
|
275
|
+
if (tail !== null) {
|
|
276
|
+
const result = tail.then(task);
|
|
277
|
+
tail = result.then(() => void 0, () => void 0);
|
|
278
|
+
return result;
|
|
279
|
+
}
|
|
280
|
+
let value;
|
|
281
|
+
try {
|
|
282
|
+
value = task();
|
|
283
|
+
} catch (error) {
|
|
284
|
+
return Promise.reject(error);
|
|
285
|
+
}
|
|
286
|
+
if (!isPromiseLike(value)) return Promise.resolve(value);
|
|
287
|
+
const result = Promise.resolve(value);
|
|
288
|
+
tail = result.then(() => void 0, () => void 0);
|
|
289
|
+
return result;
|
|
290
|
+
};
|
|
291
|
+
const onIdle = async () => {
|
|
292
|
+
while (tail !== null) {
|
|
293
|
+
const current = tail;
|
|
294
|
+
await current;
|
|
295
|
+
if (tail === current) {
|
|
296
|
+
tail = null;
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
};
|
|
301
|
+
return {
|
|
302
|
+
add,
|
|
303
|
+
onIdle
|
|
304
|
+
};
|
|
305
|
+
};
|
|
306
|
+
//#endregion
|
|
265
307
|
//#region src/utils/deepMerge.ts
|
|
266
308
|
/**
|
|
267
309
|
* Recursively merge `patch` into `base`. Plain-object values are merged key-by-key; every
|
|
@@ -319,6 +361,10 @@ const createWebStorage = (pick) => {
|
|
|
319
361
|
},
|
|
320
362
|
removeItem: (key) => {
|
|
321
363
|
storage.removeItem(key);
|
|
364
|
+
},
|
|
365
|
+
withLock: async (name, task) => {
|
|
366
|
+
if (typeof navigator === "undefined" || !("locks" in navigator)) return task();
|
|
367
|
+
return navigator.locks.request(`keboola:${name}`, { mode: "exclusive" }, task);
|
|
322
368
|
}
|
|
323
369
|
};
|
|
324
370
|
};
|
|
@@ -327,62 +373,56 @@ const createSessionStorage = () => createWebStorage(() => "sessionStorage" in gl
|
|
|
327
373
|
//#endregion
|
|
328
374
|
//#region src/utils/persistor/persistor.ts
|
|
329
375
|
const createPersistor = ({ storage = createNullStorage(), key, schema, defaultValue, encode = JSON.stringify, decode = JSON.parse }) => {
|
|
330
|
-
const
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
const hasPersistedValue = () => {
|
|
338
|
-
try {
|
|
339
|
-
return !!storage.getItem(key);
|
|
340
|
-
} catch (err) {
|
|
341
|
-
console.warn(`createPersistor: failed to read "${key}", assuming empty`, err);
|
|
342
|
-
return false;
|
|
343
|
-
}
|
|
344
|
-
};
|
|
345
|
-
const hydrate = () => {
|
|
346
|
-
let raw;
|
|
347
|
-
try {
|
|
348
|
-
raw = storage.getItem(key);
|
|
349
|
-
} catch (err) {
|
|
350
|
-
console.warn(`createPersistor: failed to read "${key}", using default`, err);
|
|
351
|
-
return defaultValue;
|
|
352
|
-
}
|
|
353
|
-
if (raw === null) return defaultValue;
|
|
376
|
+
const writes = queueSeries();
|
|
377
|
+
const _load = async () => {
|
|
378
|
+
const raw = await storage.getItem(key);
|
|
379
|
+
if (raw === null) return {
|
|
380
|
+
value: defaultValue,
|
|
381
|
+
corrupt: false
|
|
382
|
+
};
|
|
354
383
|
let decoded;
|
|
355
384
|
try {
|
|
356
385
|
decoded = decode(raw);
|
|
357
386
|
} catch (err) {
|
|
358
|
-
console.warn(`createPersistor: failed to decode "${key}"
|
|
359
|
-
|
|
360
|
-
|
|
387
|
+
console.warn(`createPersistor: failed to decode "${key}"`, err);
|
|
388
|
+
return {
|
|
389
|
+
value: defaultValue,
|
|
390
|
+
corrupt: true
|
|
391
|
+
};
|
|
361
392
|
}
|
|
362
393
|
const parsed = schema.safeParse(decoded);
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
394
|
+
return parsed.success ? {
|
|
395
|
+
value: parsed.data,
|
|
396
|
+
corrupt: false
|
|
397
|
+
} : {
|
|
398
|
+
value: defaultValue,
|
|
399
|
+
corrupt: true
|
|
400
|
+
};
|
|
366
401
|
};
|
|
367
|
-
const
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
storage.setItem(key, raw);
|
|
377
|
-
} catch (err) {
|
|
378
|
-
console.warn(`createPersistor: failed to write "${key}"`, err);
|
|
379
|
-
}
|
|
402
|
+
const remove = () => writes.add(() => storage.removeItem(key));
|
|
403
|
+
const write = (value) => writes.add(() => storage.setItem(key, encode(value)));
|
|
404
|
+
const read = async () => {
|
|
405
|
+
await writes.onIdle();
|
|
406
|
+
const parsed = await _load();
|
|
407
|
+
if (parsed.corrupt) remove().catch((err) => {
|
|
408
|
+
console.warn(`createPersistor: failed to drop the corrupt "${key}"`, err);
|
|
409
|
+
});
|
|
410
|
+
return parsed.value;
|
|
380
411
|
};
|
|
412
|
+
const modify = (change) => writes.add(async () => {
|
|
413
|
+
const next = change((await _load()).value);
|
|
414
|
+
await storage.setItem(key, encode(next));
|
|
415
|
+
});
|
|
416
|
+
const cell = {
|
|
417
|
+
read,
|
|
418
|
+
write,
|
|
419
|
+
modify,
|
|
420
|
+
remove
|
|
421
|
+
};
|
|
422
|
+
const locked = (task) => storage.withLock ? storage.withLock(key, () => task(cell)) : task(cell);
|
|
381
423
|
return {
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
clear,
|
|
385
|
-
hasPersistedValue
|
|
424
|
+
...cell,
|
|
425
|
+
locked
|
|
386
426
|
};
|
|
387
427
|
};
|
|
388
428
|
//#endregion
|
|
@@ -430,8 +470,7 @@ const KeboolaErrorType = {
|
|
|
430
470
|
NotBearer: "not-bearer",
|
|
431
471
|
NotReady: "not-ready",
|
|
432
472
|
InvalidBuildTransition: "invalid-build-transition",
|
|
433
|
-
StackActive: "stack-active"
|
|
434
|
-
CredentialKindMismatch: "credential-kind-mismatch"
|
|
473
|
+
StackActive: "stack-active"
|
|
435
474
|
};
|
|
436
475
|
const MESSAGES = {
|
|
437
476
|
[KeboolaErrorType.Unconfigured]: "The session is not configured — set a baseUrl first.",
|
|
@@ -444,8 +483,7 @@ const MESSAGES = {
|
|
|
444
483
|
[KeboolaErrorType.NotBearer]: "This operation requires a bearer (OAuth) session.",
|
|
445
484
|
[KeboolaErrorType.NotReady]: "The client is not ready — authenticate the storage realm first.",
|
|
446
485
|
[KeboolaErrorType.InvalidBuildTransition]: "Invalid storage build transition — the build goes idle → initializing → ready | failed.",
|
|
447
|
-
[KeboolaErrorType.StackActive]: "The active stack cannot be closed — select another first."
|
|
448
|
-
[KeboolaErrorType.CredentialKindMismatch]: "This client renews the other credential kind — log in the way its `credentials` mode expects."
|
|
486
|
+
[KeboolaErrorType.StackActive]: "The active stack cannot be closed — select another first."
|
|
449
487
|
};
|
|
450
488
|
var KeboolaError = class KeboolaError extends Error {
|
|
451
489
|
type;
|
|
@@ -606,10 +644,12 @@ const createDefaultBranch = ({ devBranches }) => {
|
|
|
606
644
|
};
|
|
607
645
|
//#endregion
|
|
608
646
|
//#region src/domain/stack.ts
|
|
647
|
+
const isServiceId = (id) => Object.values(require_constants.ServiceId).includes(id);
|
|
609
648
|
const SERVICE_URL_OVERRIDES = { "kai-assistant": (url) => `${url}/api` };
|
|
610
649
|
const createStack = ({ stackInfo, clientServiceUrls }) => {
|
|
611
650
|
const { services, components, features, ...infoRest } = stackInfo;
|
|
612
651
|
const serviceMap = new Map(services.map((service) => {
|
|
652
|
+
if (!isServiceId(service.id)) return [service.id, service.url];
|
|
613
653
|
const devOverride = clientServiceUrls?.[service.id]?.(service.url);
|
|
614
654
|
const prodOverride = SERVICE_URL_OVERRIDES[service.id]?.(service.url);
|
|
615
655
|
const url = devOverride ?? prodOverride ?? service.url;
|
|
@@ -733,7 +773,6 @@ const createSdk = ({ storage, services, context }) => ({
|
|
|
733
773
|
tag: require_tag.createTagSdk({ metastoreClient: services.metastore }),
|
|
734
774
|
semanticLayer: require_semanticLayer.createSemanticLayerSdk({ metastoreClient: services.metastore }),
|
|
735
775
|
kaiMemory: require_kaiMemory.createKaiMemorySdk({ metastoreClient: services.metastore }),
|
|
736
|
-
storage: require_sdk_storage_index.createStorageSdk({ storageClient: storage }),
|
|
737
776
|
vault: require_sdk_vault_index.createVaultSdk({
|
|
738
777
|
vaultClient: services.vault,
|
|
739
778
|
encryptionClient: services.encryption
|
|
@@ -860,6 +899,14 @@ const createServiceClients = ({ baseUrl, auth, getServiceBaseUrl, middlewareFor,
|
|
|
860
899
|
middlewares: middlewareFor("kaiAgent", [attachTokenMiddleware]),
|
|
861
900
|
auth
|
|
862
901
|
})
|
|
902
|
+
}).add({
|
|
903
|
+
serviceId: "components-mcp",
|
|
904
|
+
clientName: "componentsMcp",
|
|
905
|
+
clientFn: (serviceBaseUrl) => require_componentsMcp.createComponentsMcpClient({
|
|
906
|
+
baseUrl: serviceBaseUrl,
|
|
907
|
+
middlewares: middlewareFor("componentsMcp", [attachTokenMiddleware]),
|
|
908
|
+
auth
|
|
909
|
+
})
|
|
863
910
|
}).add({
|
|
864
911
|
serviceId: "oauth",
|
|
865
912
|
clientName: "oauth",
|
|
@@ -1067,154 +1114,6 @@ const createLegacyKeboola = (options = {}) => {
|
|
|
1067
1114
|
};
|
|
1068
1115
|
};
|
|
1069
1116
|
//#endregion
|
|
1070
|
-
//#region src/keboola/bearer/credentials/renewal.ts
|
|
1071
|
-
const renewalGrant = (credential) => credential.type === "token" ? {
|
|
1072
|
-
type: "token",
|
|
1073
|
-
refreshToken: credential.refreshToken
|
|
1074
|
-
} : {
|
|
1075
|
-
type: "cookie",
|
|
1076
|
-
sessionId: credential.sessionId
|
|
1077
|
-
};
|
|
1078
|
-
const renew = async (client, grant) => {
|
|
1079
|
-
if (grant.type === "cookie") {
|
|
1080
|
-
const { accessToken, expiresIn, sessionId } = await client.token.refreshWithSession({ sessionId: grant.sessionId });
|
|
1081
|
-
return {
|
|
1082
|
-
type: "cookie",
|
|
1083
|
-
accessToken,
|
|
1084
|
-
expiresIn,
|
|
1085
|
-
sessionId
|
|
1086
|
-
};
|
|
1087
|
-
}
|
|
1088
|
-
const { accessToken, expiresIn, refreshToken } = await client.token.refreshWithToken({ refreshToken: grant.refreshToken });
|
|
1089
|
-
if (!refreshToken) throw new KeboolaError(KeboolaErrorType.NotAuthenticated);
|
|
1090
|
-
return {
|
|
1091
|
-
type: "token",
|
|
1092
|
-
accessToken,
|
|
1093
|
-
expiresIn,
|
|
1094
|
-
refreshToken
|
|
1095
|
-
};
|
|
1096
|
-
};
|
|
1097
|
-
//#endregion
|
|
1098
|
-
//#region src/keboola/bearer/credentials/credentials.ts
|
|
1099
|
-
const DEFAULT_REFRESH_THRESHOLD = .9;
|
|
1100
|
-
const signInEnded = () => new KeboolaError(KeboolaErrorType.SignInEnded);
|
|
1101
|
-
const createCredentials = ({ state, persistor, middlewares, mode = "token", refreshThreshold = DEFAULT_REFRESH_THRESHOLD, onSignedOut }) => {
|
|
1102
|
-
const rotationMap = /* @__PURE__ */ new Map();
|
|
1103
|
-
const generations = /* @__PURE__ */ new Map();
|
|
1104
|
-
const generationOf = (baseUrl) => generations.get(baseUrl) ?? 0;
|
|
1105
|
-
const refresh = async (baseUrl, grant) => {
|
|
1106
|
-
const client = require_authClient.createAuthClient({
|
|
1107
|
-
baseUrl,
|
|
1108
|
-
middlewares
|
|
1109
|
-
});
|
|
1110
|
-
const epochBefore = require_jobStatus.Result.unwrap(state.auth.getEpoch(baseUrl));
|
|
1111
|
-
const generationBefore = generationOf(baseUrl);
|
|
1112
|
-
const refreshed = await require_jobStatus.Result.tryCatchAsync(() => renew(client, grant));
|
|
1113
|
-
return require_jobStatus.Result.unwrapOr(state.auth.getEpoch(baseUrl), -1) === epochBefore && generationOf(baseUrl) === generationBefore ? refreshed : require_jobStatus.Result.failure(signInEnded());
|
|
1114
|
-
};
|
|
1115
|
-
/**
|
|
1116
|
-
* A stack's teardown, from the credential's side.
|
|
1117
|
-
*
|
|
1118
|
-
* - Bumps the generation, so an in-flight rotation can no longer write.
|
|
1119
|
-
* - Drops the deduped entry, so nothing joins that rotation.
|
|
1120
|
-
*/
|
|
1121
|
-
const forget = (baseUrl) => {
|
|
1122
|
-
generations.set(baseUrl, generationOf(baseUrl) + 1);
|
|
1123
|
-
rotationMap.delete(baseUrl);
|
|
1124
|
-
};
|
|
1125
|
-
/**
|
|
1126
|
-
* The rotation, and the one place a credential is declared dead.
|
|
1127
|
-
*
|
|
1128
|
-
* - A refused refresh token or session is unambiguous.
|
|
1129
|
-
* - The triggering 401 is not (an unreachable project answers the same), so never sign out on a replay.
|
|
1130
|
-
*/
|
|
1131
|
-
const rotateOnce = async (baseUrl) => {
|
|
1132
|
-
const credential = state.auth.requireCredentialOf(baseUrl, mode);
|
|
1133
|
-
if (!credential.success) return credential;
|
|
1134
|
-
const refreshed = await refresh(baseUrl, renewalGrant(credential.data));
|
|
1135
|
-
if (!refreshed.success) {
|
|
1136
|
-
if (require_middleware.isUnauthorized(refreshed.error)) expire(baseUrl);
|
|
1137
|
-
return refreshed;
|
|
1138
|
-
}
|
|
1139
|
-
return require_jobStatus.Result.map(state.auth.applyRefresh(baseUrl, refreshed.data), () => refreshed.data.accessToken);
|
|
1140
|
-
};
|
|
1141
|
-
const rotate = (baseUrl) => ensure(rotationMap, baseUrl, () => require_dedupe.dedupe(() => rotateOnce(baseUrl)))();
|
|
1142
|
-
const restoreStack = async (baseUrl, grant) => {
|
|
1143
|
-
if (!state.auth.startRestore(baseUrl).success) return "unreachable";
|
|
1144
|
-
const refreshed = await refresh(baseUrl, grant);
|
|
1145
|
-
if (!refreshed.success) {
|
|
1146
|
-
state.auth.cancelRestore(baseUrl);
|
|
1147
|
-
return require_middleware.isUnauthorized(refreshed.error) ? "refused" : "unreachable";
|
|
1148
|
-
}
|
|
1149
|
-
state.auth.authenticate(baseUrl, refreshed.data);
|
|
1150
|
-
return "restored";
|
|
1151
|
-
};
|
|
1152
|
-
const restoreProjects = (baseUrl, projects) => {
|
|
1153
|
-
for (const { projectId } of projects) state.projects.open(baseUrl, projectId);
|
|
1154
|
-
};
|
|
1155
|
-
/**
|
|
1156
|
-
* Every persisted stack back into the table, with whatever credential it can hand back.
|
|
1157
|
-
*
|
|
1158
|
-
* - Never writes the scope. `lastActive` is what was scoped when the session was stored, for the
|
|
1159
|
-
* caller to select.
|
|
1160
|
-
* - `status` reports what became of `lastActive`'s credential; the client reads it to decide
|
|
1161
|
-
* when persistence may start.
|
|
1162
|
-
*/
|
|
1163
|
-
const restore = async () => {
|
|
1164
|
-
const hydrated = persistor.hydrate();
|
|
1165
|
-
const stacks = hydrated.stacks.map((stack) => stack.credential && stack.credential.type !== "static" && stack.credential.type !== mode ? {
|
|
1166
|
-
...stack,
|
|
1167
|
-
credential: null
|
|
1168
|
-
} : stack);
|
|
1169
|
-
const { current } = hydrated;
|
|
1170
|
-
const scoped = stacks.find(({ baseUrl }) => baseUrl === current?.baseUrl);
|
|
1171
|
-
const restored = stacks.map(async ({ baseUrl, credential, projects }) => {
|
|
1172
|
-
state.stacks.ensure(baseUrl);
|
|
1173
|
-
if (!credential) return "unreachable";
|
|
1174
|
-
if (require_jobStatus.Result.unwrapOr(state.auth.getEpoch(baseUrl), 0) > 0) return "skipped";
|
|
1175
|
-
const outcome = credential.type === "static" ? state.auth.authenticate(baseUrl, credential).success ? "restored" : "refused" : await restoreStack(baseUrl, credential);
|
|
1176
|
-
if (outcome === "restored") restoreProjects(baseUrl, projects);
|
|
1177
|
-
return outcome;
|
|
1178
|
-
});
|
|
1179
|
-
const results = await Promise.all(restored);
|
|
1180
|
-
const outcome = scoped?.credential ? results[stacks.indexOf(scoped)] : void 0;
|
|
1181
|
-
return {
|
|
1182
|
-
lastActive: current,
|
|
1183
|
-
status: outcome === void 0 || outcome === "skipped" ? "empty" : outcome === "restored" ? "restored" : outcome === "unreachable" ? "unreachable" : "expired"
|
|
1184
|
-
};
|
|
1185
|
-
};
|
|
1186
|
-
const isStale = (baseUrl) => {
|
|
1187
|
-
const ageing = require_jobStatus.Result.map(state.auth.requireCredentialOf(baseUrl, mode), ({ issuedAt, expiresIn }) => Date.now() >= issuedAt + expiresIn * 1e3 * refreshThreshold);
|
|
1188
|
-
return require_jobStatus.Result.unwrapOr(ageing, false);
|
|
1189
|
-
};
|
|
1190
|
-
const signOut = (baseUrl) => {
|
|
1191
|
-
rotationMap.delete(baseUrl);
|
|
1192
|
-
const signedOut = state.auth.signOut(baseUrl);
|
|
1193
|
-
onSignedOut?.(baseUrl);
|
|
1194
|
-
return signedOut;
|
|
1195
|
-
};
|
|
1196
|
-
const expire = (baseUrl) => {
|
|
1197
|
-
if (state.auth.notifyExpired(baseUrl)) signOut(baseUrl);
|
|
1198
|
-
};
|
|
1199
|
-
const canRefresh = (baseUrl) => state.auth.requireCredentialOf(baseUrl, mode).success;
|
|
1200
|
-
const renewIfStale = async (baseUrl) => {
|
|
1201
|
-
if (isStale(baseUrl)) await rotate(baseUrl);
|
|
1202
|
-
};
|
|
1203
|
-
const middleware = (baseUrl) => require_middleware.createBearerAuthMiddleware({ getAccessToken: async ({ forceRefresh = false } = {}) => {
|
|
1204
|
-
if (forceRefresh) return canRefresh(baseUrl) ? require_jobStatus.Result.unwrap(await rotate(baseUrl)) : null;
|
|
1205
|
-
await renewIfStale(baseUrl);
|
|
1206
|
-
return state.auth.getAccessToken(baseUrl);
|
|
1207
|
-
} });
|
|
1208
|
-
return {
|
|
1209
|
-
middleware,
|
|
1210
|
-
rotate,
|
|
1211
|
-
renewIfStale,
|
|
1212
|
-
restore,
|
|
1213
|
-
signOut,
|
|
1214
|
-
forget
|
|
1215
|
-
};
|
|
1216
|
-
};
|
|
1217
|
-
//#endregion
|
|
1218
1117
|
//#region src/keboola/bearer/state/factories.ts
|
|
1219
1118
|
/**
|
|
1220
1119
|
* Everything the table constructs: the entries themselves, and the failures reading them produces.
|
|
@@ -1232,9 +1131,16 @@ const authenticatedAuth = (credential) => ({
|
|
|
1232
1131
|
status: "authenticated",
|
|
1233
1132
|
credential
|
|
1234
1133
|
});
|
|
1235
|
-
const
|
|
1134
|
+
const credential = (input) => ({
|
|
1236
1135
|
...input,
|
|
1237
1136
|
issuedAt: Date.now()
|
|
1137
|
+
});
|
|
1138
|
+
const grant = (credential) => credential.type === "token" ? {
|
|
1139
|
+
type: "token",
|
|
1140
|
+
refreshToken: credential.refreshToken
|
|
1141
|
+
} : {
|
|
1142
|
+
type: "cookie",
|
|
1143
|
+
sessionId: credential.sessionId
|
|
1238
1144
|
};
|
|
1239
1145
|
const expiredCredential = (credential) => ({
|
|
1240
1146
|
...credential,
|
|
@@ -1244,7 +1150,8 @@ const stack = (baseUrl) => ({
|
|
|
1244
1150
|
baseUrl,
|
|
1245
1151
|
context: "idle",
|
|
1246
1152
|
epoch: 0,
|
|
1247
|
-
auth: anonymousAuth()
|
|
1153
|
+
auth: anonymousAuth(),
|
|
1154
|
+
retained: null
|
|
1248
1155
|
});
|
|
1249
1156
|
const project = (baseUrl, projectId) => ({
|
|
1250
1157
|
id: projectEntryId(baseUrl, projectId),
|
|
@@ -1276,7 +1183,8 @@ const Entry = {
|
|
|
1276
1183
|
anonymousAuth,
|
|
1277
1184
|
restoringAuth,
|
|
1278
1185
|
authenticatedAuth,
|
|
1279
|
-
|
|
1186
|
+
credential,
|
|
1187
|
+
grant,
|
|
1280
1188
|
expiredCredential
|
|
1281
1189
|
};
|
|
1282
1190
|
/**
|
|
@@ -1294,12 +1202,11 @@ const Errors = {
|
|
|
1294
1202
|
notReady: () => new KeboolaError(KeboolaErrorType.NotReady),
|
|
1295
1203
|
alreadyRestoring: (baseUrl) => /* @__PURE__ */ new Error(`Stack "${baseUrl}" is already being restored`),
|
|
1296
1204
|
notRestoring: (baseUrl) => /* @__PURE__ */ new Error(`Stack "${baseUrl}" is not being restored`),
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
credentialKindChanged: (from, to) => /* @__PURE__ */ new Error(`A ${from} credential cannot become ${to}`),
|
|
1205
|
+
grantTypeChanged: (from, to) => /* @__PURE__ */ new Error(`A ${from} grant cannot become ${to}`),
|
|
1206
|
+
nothingRetained: (baseUrl) => /* @__PURE__ */ new Error(`Stack "${baseUrl}" retains no credential`),
|
|
1300
1207
|
missingProject: (id) => /* @__PURE__ */ new Error(`No project "${id}"`)
|
|
1301
1208
|
};
|
|
1302
|
-
const authenticated = (auth) => auth.status === "authenticated" ?
|
|
1209
|
+
const authenticated = (auth) => auth.status === "authenticated" ? require_transientRetries.Result.success(auth.credential) : require_transientRetries.Result.failure(Errors.notAuthenticated());
|
|
1303
1210
|
//#endregion
|
|
1304
1211
|
//#region src/keboola/bearer/state/auth.ts
|
|
1305
1212
|
/**
|
|
@@ -1325,45 +1232,55 @@ const createExpiryLatch = () => {
|
|
|
1325
1232
|
* sign-in is this" — what an in-flight exchange compares itself against.
|
|
1326
1233
|
*/
|
|
1327
1234
|
const createAuth = ({ stacks, projects, expiry }) => {
|
|
1328
|
-
const requireUnauthenticated = (baseUrl) =>
|
|
1329
|
-
const requireAnonymous = (baseUrl) =>
|
|
1330
|
-
const requireRestoring = (baseUrl) =>
|
|
1331
|
-
const
|
|
1332
|
-
const requireCredentialOf = (baseUrl, mode) => require_jobStatus.Result.andThen(requireRotatingCredential(baseUrl), (credential) => credential.type === mode ? require_jobStatus.Result.success(credential) : require_jobStatus.Result.failure(Errors.unexpectedCredentialKind(baseUrl, credential.type)));
|
|
1333
|
-
const startRestore = (baseUrl) => require_jobStatus.Result.map(requireAnonymous(baseUrl), (stack) => stacks.set({
|
|
1235
|
+
const requireUnauthenticated = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "authenticated" ? require_transientRetries.Result.failure(Errors.alreadyAuthenticated()) : require_transientRetries.Result.success(stack));
|
|
1236
|
+
const requireAnonymous = (baseUrl) => require_transientRetries.Result.andThen(requireUnauthenticated(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.failure(Errors.alreadyRestoring(baseUrl)) : require_transientRetries.Result.success(stack));
|
|
1237
|
+
const requireRestoring = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.auth.status === "restoring" ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(Errors.notRestoring(baseUrl)));
|
|
1238
|
+
const startRestore = (baseUrl) => require_transientRetries.Result.map(requireAnonymous(baseUrl), (stack) => stacks.set({
|
|
1334
1239
|
...stack,
|
|
1335
1240
|
auth: Entry.restoringAuth()
|
|
1336
1241
|
}));
|
|
1337
|
-
const cancelRestore = (baseUrl) =>
|
|
1242
|
+
const cancelRestore = (baseUrl) => require_transientRetries.Result.map(requireRestoring(baseUrl), (stack) => stacks.set({
|
|
1338
1243
|
...stack,
|
|
1339
1244
|
auth: Entry.anonymousAuth()
|
|
1340
1245
|
}));
|
|
1341
|
-
const authenticate = (baseUrl, input) =>
|
|
1246
|
+
const authenticate = (baseUrl, input) => require_transientRetries.Result.map(requireUnauthenticated(baseUrl), (stack) => {
|
|
1342
1247
|
expiry.arm(baseUrl);
|
|
1343
1248
|
return stacks.set({
|
|
1344
1249
|
...stack,
|
|
1345
1250
|
epoch: stack.epoch + 1,
|
|
1346
|
-
auth: Entry.authenticatedAuth(Entry.
|
|
1251
|
+
auth: Entry.authenticatedAuth(Entry.credential(input)),
|
|
1252
|
+
retained: null
|
|
1347
1253
|
});
|
|
1348
1254
|
});
|
|
1349
|
-
const applyRefresh = (baseUrl, input) =>
|
|
1255
|
+
const applyRefresh = (baseUrl, input) => require_transientRetries.Result.andThen(stacks.requireCredential(baseUrl), (credential) => credential.type !== input.type ? require_transientRetries.Result.failure(Errors.grantTypeChanged(credential.type, input.type)) : require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
1350
1256
|
...stack,
|
|
1351
|
-
auth: Entry.authenticatedAuth(Entry.
|
|
1257
|
+
auth: Entry.authenticatedAuth(Entry.credential(input))
|
|
1352
1258
|
})));
|
|
1353
|
-
const forceExpire = (baseUrl) =>
|
|
1259
|
+
const forceExpire = (baseUrl) => require_transientRetries.Result.andThen(stacks.requireCredential(baseUrl), (credential) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
1354
1260
|
...stack,
|
|
1355
1261
|
auth: Entry.authenticatedAuth(Entry.expiredCredential(credential))
|
|
1356
1262
|
})));
|
|
1357
|
-
const signOut = (baseUrl) =>
|
|
1263
|
+
const signOut = (baseUrl, { retain = false } = {}) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => {
|
|
1358
1264
|
projects.closeAll(baseUrl);
|
|
1265
|
+
const retained = retain ? require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(authenticated(stack.auth), (credential) => ({ grant: Entry.grant(credential) })), stack.retained) : null;
|
|
1359
1266
|
return stacks.set({
|
|
1360
1267
|
...stack,
|
|
1361
1268
|
epoch: stack.epoch + 1,
|
|
1362
|
-
auth: Entry.anonymousAuth()
|
|
1269
|
+
auth: Entry.anonymousAuth(),
|
|
1270
|
+
retained
|
|
1363
1271
|
});
|
|
1364
1272
|
});
|
|
1365
|
-
const
|
|
1366
|
-
|
|
1273
|
+
const retain = (baseUrl, retained) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
1274
|
+
...stack,
|
|
1275
|
+
retained
|
|
1276
|
+
}));
|
|
1277
|
+
const dropRetained = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stacks.set({
|
|
1278
|
+
...stack,
|
|
1279
|
+
retained: null
|
|
1280
|
+
}));
|
|
1281
|
+
const requireRetained = (baseUrl) => require_transientRetries.Result.andThen(stacks.get(baseUrl), (stack) => stack.retained ? require_transientRetries.Result.success(stack.retained) : require_transientRetries.Result.failure(Errors.nothingRetained(baseUrl)));
|
|
1282
|
+
const getEpoch = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => stack.epoch);
|
|
1283
|
+
const getAccessToken = (baseUrl) => require_transientRetries.Result.unwrapOr(require_transientRetries.Result.map(stacks.requireCredential(baseUrl), ({ accessToken }) => accessToken), null);
|
|
1367
1284
|
return {
|
|
1368
1285
|
startRestore,
|
|
1369
1286
|
cancelRestore,
|
|
@@ -1371,10 +1288,11 @@ const createAuth = ({ stacks, projects, expiry }) => {
|
|
|
1371
1288
|
applyRefresh,
|
|
1372
1289
|
forceExpire,
|
|
1373
1290
|
signOut,
|
|
1291
|
+
retain,
|
|
1292
|
+
dropRetained,
|
|
1293
|
+
requireRetained,
|
|
1374
1294
|
notifyExpired: expiry.report,
|
|
1375
1295
|
requireCredential: stacks.requireCredential,
|
|
1376
|
-
requireRotatingCredential,
|
|
1377
|
-
requireCredentialOf,
|
|
1378
1296
|
getEpoch,
|
|
1379
1297
|
getAccessToken
|
|
1380
1298
|
};
|
|
@@ -1386,7 +1304,7 @@ const createProjects = ({ store, stacks }) => {
|
|
|
1386
1304
|
const has = (id) => id in store.get().projects;
|
|
1387
1305
|
const get = (id) => {
|
|
1388
1306
|
const project = store.get().projects[id];
|
|
1389
|
-
return project ?
|
|
1307
|
+
return project ? require_transientRetries.Result.success(project) : require_transientRetries.Result.failure(Errors.missingProject(id));
|
|
1390
1308
|
};
|
|
1391
1309
|
const list = (baseUrl) => Object.values(store.get().projects).filter((project) => project.baseUrl === baseUrl);
|
|
1392
1310
|
/** Every open project with this id, whatever stack it sits on — a project number is not unique. */
|
|
@@ -1402,7 +1320,7 @@ const createProjects = ({ store, stacks }) => {
|
|
|
1402
1320
|
});
|
|
1403
1321
|
return project;
|
|
1404
1322
|
};
|
|
1405
|
-
const update = (id, updater) =>
|
|
1323
|
+
const update = (id, updater) => require_transientRetries.Result.map(get(id), (project) => set(updater(project)));
|
|
1406
1324
|
const removeMany = (ids, nextActive) => {
|
|
1407
1325
|
const state = store.get();
|
|
1408
1326
|
const projects = { ...state.projects };
|
|
@@ -1413,13 +1331,13 @@ const createProjects = ({ store, stacks }) => {
|
|
|
1413
1331
|
projects
|
|
1414
1332
|
});
|
|
1415
1333
|
};
|
|
1416
|
-
const requireCredential = (id) =>
|
|
1334
|
+
const requireCredential = (id) => require_transientRetries.Result.andThen(get(id), (project) => stacks.requireCredential(project.baseUrl));
|
|
1417
1335
|
const open = (baseUrl, projectId) => {
|
|
1418
1336
|
const id = Entry.projectEntryId(baseUrl, projectId);
|
|
1419
1337
|
if (has(id)) return get(id);
|
|
1420
|
-
return
|
|
1338
|
+
return require_transientRetries.Result.map(stacks.requireCredential(baseUrl), () => set(Entry.project(baseUrl, projectId)));
|
|
1421
1339
|
};
|
|
1422
|
-
const close = (id) =>
|
|
1340
|
+
const close = (id) => require_transientRetries.Result.tap(get(id), ({ baseUrl, projectId }) => {
|
|
1423
1341
|
const { active } = store.get();
|
|
1424
1342
|
const isScoped = active.baseUrl === baseUrl && active.projectId === projectId;
|
|
1425
1343
|
removeMany([id], isScoped ? Entry.stackAddress(baseUrl) : active);
|
|
@@ -1487,25 +1405,25 @@ const createScope = ({ store, stacks, projects }) => {
|
|
|
1487
1405
|
return location;
|
|
1488
1406
|
};
|
|
1489
1407
|
const getActiveStack = () => getActive().stack;
|
|
1490
|
-
const activateStack = (baseUrl) =>
|
|
1408
|
+
const activateStack = (baseUrl) => require_transientRetries.Result.map(stacks.get(baseUrl), (stack) => {
|
|
1491
1409
|
const next = Entry.stackAddress(stack.baseUrl);
|
|
1492
1410
|
set(next);
|
|
1493
1411
|
return next;
|
|
1494
1412
|
});
|
|
1495
|
-
const activateProject = (baseUrl, projectId) =>
|
|
1413
|
+
const activateProject = (baseUrl, projectId) => require_transientRetries.Result.map(projects.requireCredential(Entry.projectEntryId(baseUrl, projectId)), () => {
|
|
1496
1414
|
const next = Entry.projectAddress(baseUrl, projectId);
|
|
1497
1415
|
set(next);
|
|
1498
1416
|
return next;
|
|
1499
1417
|
});
|
|
1500
1418
|
const selectStack = (baseUrl) => {
|
|
1501
1419
|
const stack = stacks.ensure(baseUrl);
|
|
1502
|
-
return
|
|
1420
|
+
return require_transientRetries.Result.map(activateStack(stack.baseUrl), () => stack);
|
|
1503
1421
|
};
|
|
1504
1422
|
const selectProject = (projectId) => {
|
|
1505
1423
|
const { baseUrl } = getActiveStack();
|
|
1506
1424
|
const project = projects.open(baseUrl, projectId);
|
|
1507
1425
|
if (!project.success) return project;
|
|
1508
|
-
return
|
|
1426
|
+
return require_transientRetries.Result.map(activateProject(baseUrl, projectId), () => project.data);
|
|
1509
1427
|
};
|
|
1510
1428
|
const deactivate = () => {
|
|
1511
1429
|
const active = get();
|
|
@@ -1514,7 +1432,7 @@ const createScope = ({ store, stacks, projects }) => {
|
|
|
1514
1432
|
};
|
|
1515
1433
|
const requireActiveProject = () => {
|
|
1516
1434
|
const { project } = getActive();
|
|
1517
|
-
return project ?
|
|
1435
|
+
return project ? require_transientRetries.Result.success(project) : require_transientRetries.Result.failure(Errors.notReady());
|
|
1518
1436
|
};
|
|
1519
1437
|
return {
|
|
1520
1438
|
get,
|
|
@@ -1535,7 +1453,7 @@ const createStacks = ({ store, forgetExpiry }) => {
|
|
|
1535
1453
|
const has = (baseUrl) => baseUrl in store.get().stacks;
|
|
1536
1454
|
const get = (baseUrl) => {
|
|
1537
1455
|
const stack = store.get().stacks[baseUrl];
|
|
1538
|
-
return stack ?
|
|
1456
|
+
return stack ? require_transientRetries.Result.success(stack) : require_transientRetries.Result.failure(Errors.unconfigured());
|
|
1539
1457
|
};
|
|
1540
1458
|
const list = () => Object.values(store.get().stacks);
|
|
1541
1459
|
const set = (stack) => {
|
|
@@ -1549,8 +1467,8 @@ const createStacks = ({ store, forgetExpiry }) => {
|
|
|
1549
1467
|
});
|
|
1550
1468
|
return stack;
|
|
1551
1469
|
};
|
|
1552
|
-
const update = (baseUrl, updater) =>
|
|
1553
|
-
const requireCredential = (baseUrl) =>
|
|
1470
|
+
const update = (baseUrl, updater) => require_transientRetries.Result.map(get(baseUrl), (stack) => set(updater(stack)));
|
|
1471
|
+
const requireCredential = (baseUrl) => require_transientRetries.Result.andThen(get(baseUrl), (stack) => authenticated(stack.auth));
|
|
1554
1472
|
const ensure = (baseUrl) => {
|
|
1555
1473
|
const existing = get(baseUrl);
|
|
1556
1474
|
if (existing.success) return existing.data;
|
|
@@ -1560,7 +1478,7 @@ const createStacks = ({ store, forgetExpiry }) => {
|
|
|
1560
1478
|
const stack = get(baseUrl);
|
|
1561
1479
|
if (!stack.success) return stack;
|
|
1562
1480
|
const state = store.get();
|
|
1563
|
-
if (state.active.baseUrl === baseUrl) return
|
|
1481
|
+
if (state.active.baseUrl === baseUrl) return require_transientRetries.Result.failure(Errors.stackActive());
|
|
1564
1482
|
const stacks = { ...state.stacks };
|
|
1565
1483
|
delete stacks[baseUrl];
|
|
1566
1484
|
const projects = Object.fromEntries(Object.entries(state.projects).filter(([, project]) => project.baseUrl !== baseUrl));
|
|
@@ -1626,6 +1544,204 @@ const createState = (defaultBaseUrl) => {
|
|
|
1626
1544
|
};
|
|
1627
1545
|
};
|
|
1628
1546
|
//#endregion
|
|
1547
|
+
//#region src/keboola/bearer/credentials/renewal.ts
|
|
1548
|
+
const renew = async (client, grant) => {
|
|
1549
|
+
if (grant.type === "cookie") {
|
|
1550
|
+
const { accessToken, expiresIn, sessionId } = await client.token.refreshWithSession({ sessionId: grant.sessionId });
|
|
1551
|
+
return {
|
|
1552
|
+
type: "cookie",
|
|
1553
|
+
accessToken,
|
|
1554
|
+
expiresIn,
|
|
1555
|
+
sessionId
|
|
1556
|
+
};
|
|
1557
|
+
}
|
|
1558
|
+
const { accessToken, expiresIn, refreshToken } = await client.token.refreshWithToken({ refreshToken: grant.refreshToken });
|
|
1559
|
+
if (!refreshToken) throw new KeboolaError(KeboolaErrorType.NotAuthenticated);
|
|
1560
|
+
return {
|
|
1561
|
+
type: "token",
|
|
1562
|
+
accessToken,
|
|
1563
|
+
expiresIn,
|
|
1564
|
+
refreshToken
|
|
1565
|
+
};
|
|
1566
|
+
};
|
|
1567
|
+
//#endregion
|
|
1568
|
+
//#region src/keboola/bearer/credentials/credentials.ts
|
|
1569
|
+
const DEFAULT_REFRESH_THRESHOLD = .9;
|
|
1570
|
+
const signInEnded = () => new KeboolaError(KeboolaErrorType.SignInEnded);
|
|
1571
|
+
const toRestoreStatus = (outcome) => {
|
|
1572
|
+
if (outcome === void 0 || outcome === "skipped") return "empty";
|
|
1573
|
+
if (outcome === "refused") return "expired";
|
|
1574
|
+
return outcome;
|
|
1575
|
+
};
|
|
1576
|
+
const createCredentials = ({ state, persistor, middlewares, refreshThreshold = DEFAULT_REFRESH_THRESHOLD, onSignedOut, onExpired }) => {
|
|
1577
|
+
const rotationMap = /* @__PURE__ */ new Map();
|
|
1578
|
+
const generations = /* @__PURE__ */ new Map();
|
|
1579
|
+
const generationOf = (baseUrl) => generations.get(baseUrl) ?? 0;
|
|
1580
|
+
const refresh = async (baseUrl, grant) => {
|
|
1581
|
+
const client = require_authClient.createAuthClient({
|
|
1582
|
+
baseUrl,
|
|
1583
|
+
middlewares
|
|
1584
|
+
});
|
|
1585
|
+
const epochBefore = require_transientRetries.Result.unwrap(state.auth.getEpoch(baseUrl));
|
|
1586
|
+
const generationBefore = generationOf(baseUrl);
|
|
1587
|
+
const refreshed = await require_transientRetries.Result.tryCatchAsync(() => renew(client, grant));
|
|
1588
|
+
return require_transientRetries.Result.unwrapOr(state.auth.getEpoch(baseUrl), -1) === epochBefore && generationOf(baseUrl) === generationBefore ? refreshed : require_transientRetries.Result.failure(signInEnded());
|
|
1589
|
+
};
|
|
1590
|
+
/**
|
|
1591
|
+
* A stack's teardown, from the credential's side.
|
|
1592
|
+
*
|
|
1593
|
+
* - Bumps the generation, so an in-flight rotation can no longer write.
|
|
1594
|
+
* - Drops the deduped entry, so nothing joins that rotation.
|
|
1595
|
+
*/
|
|
1596
|
+
const forget = (baseUrl) => {
|
|
1597
|
+
generations.set(baseUrl, generationOf(baseUrl) + 1);
|
|
1598
|
+
rotationMap.delete(baseUrl);
|
|
1599
|
+
};
|
|
1600
|
+
/**
|
|
1601
|
+
* The rotation, and the one place a credential is declared dead.
|
|
1602
|
+
*
|
|
1603
|
+
* - Renews by the credential's grant: the refresh token, or the session id with the cookie.
|
|
1604
|
+
* - A refused refresh token or session is unambiguous.
|
|
1605
|
+
* - The triggering 401 is not (an unreachable project answers the same), so never sign out on a replay.
|
|
1606
|
+
*/
|
|
1607
|
+
const getGrantForRotation = async (store, baseUrl, credential) => {
|
|
1608
|
+
const epochBefore = require_transientRetries.Result.unwrap(state.auth.getEpoch(baseUrl));
|
|
1609
|
+
const generationBefore = generationOf(baseUrl);
|
|
1610
|
+
const hydrated = await require_transientRetries.Result.tryCatchAsync(() => store.read());
|
|
1611
|
+
if (!hydrated.success) return hydrated;
|
|
1612
|
+
if (require_transientRetries.Result.unwrapOr(state.auth.getEpoch(baseUrl), -1) !== epochBefore || generationOf(baseUrl) !== generationBefore) return require_transientRetries.Result.failure(signInEnded());
|
|
1613
|
+
const persistedStack = hydrated.data.stacks.find((stack) => stack.baseUrl === baseUrl);
|
|
1614
|
+
if (persistedStack && persistedStack.credential === null) return require_transientRetries.Result.failure(signInEnded());
|
|
1615
|
+
return require_transientRetries.Result.success(persistedStack?.credential ?? Entry.grant(credential));
|
|
1616
|
+
};
|
|
1617
|
+
const rotateOnce = async (baseUrl) => persistor.locked(async (store) => {
|
|
1618
|
+
const credential = state.auth.requireCredential(baseUrl);
|
|
1619
|
+
if (!credential.success) return credential;
|
|
1620
|
+
const grant = await getGrantForRotation(store, baseUrl, credential.data);
|
|
1621
|
+
if (!grant.success) return grant;
|
|
1622
|
+
const refreshed = await refresh(baseUrl, grant.data);
|
|
1623
|
+
if (!refreshed.success) {
|
|
1624
|
+
if (require_middleware.isUnauthorized(refreshed.error)) await expire(baseUrl, store);
|
|
1625
|
+
return refreshed;
|
|
1626
|
+
}
|
|
1627
|
+
const accessToken = require_transientRetries.Result.map(state.auth.applyRefresh(baseUrl, refreshed.data), () => refreshed.data.accessToken);
|
|
1628
|
+
await store.persistStack(baseUrl, state.store.get());
|
|
1629
|
+
return accessToken;
|
|
1630
|
+
});
|
|
1631
|
+
const rotate = (baseUrl) => ensure(rotationMap, baseUrl, () => require_dedupe.dedupe(() => rotateOnce(baseUrl)))();
|
|
1632
|
+
const restoreStack = async (baseUrl, grant, retained = false) => persistor.locked(async (store) => {
|
|
1633
|
+
const storedStack = (await store.read()).stacks.find((stack) => stack.baseUrl === baseUrl);
|
|
1634
|
+
const latestGrant = retained ? storedStack?.retained?.grant : storedStack?.credential;
|
|
1635
|
+
if (storedStack && !latestGrant) return "skipped";
|
|
1636
|
+
if (!state.auth.startRestore(baseUrl).success) return "unreachable";
|
|
1637
|
+
const refreshed = await refresh(baseUrl, latestGrant ?? grant);
|
|
1638
|
+
if (!refreshed.success) {
|
|
1639
|
+
state.auth.cancelRestore(baseUrl);
|
|
1640
|
+
if (require_middleware.isUnauthorized(refreshed.error)) {
|
|
1641
|
+
if (retained) state.auth.dropRetained(baseUrl);
|
|
1642
|
+
await store.persistStack(baseUrl, state.store.get());
|
|
1643
|
+
return "refused";
|
|
1644
|
+
}
|
|
1645
|
+
return "unreachable";
|
|
1646
|
+
}
|
|
1647
|
+
state.auth.authenticate(baseUrl, refreshed.data);
|
|
1648
|
+
if (!state.auth.requireCredential(baseUrl).success) return "unreachable";
|
|
1649
|
+
if (retained) state.auth.dropRetained(baseUrl);
|
|
1650
|
+
await store.persistStack(baseUrl, state.store.get());
|
|
1651
|
+
return "restored";
|
|
1652
|
+
});
|
|
1653
|
+
const restoreProjects = (baseUrl, projects) => {
|
|
1654
|
+
for (const { projectId } of projects) state.projects.open(baseUrl, projectId);
|
|
1655
|
+
};
|
|
1656
|
+
/**
|
|
1657
|
+
* Every persisted stack back into the table, with whatever credential it can hand back.
|
|
1658
|
+
*
|
|
1659
|
+
* - Never writes the scope. `lastActive` is what was scoped when the session was stored, for the
|
|
1660
|
+
* caller to select.
|
|
1661
|
+
* - `status` reports what became of `lastActive`'s credential; the client reads it to decide
|
|
1662
|
+
* when persistence may start.
|
|
1663
|
+
*/
|
|
1664
|
+
const restore = async () => {
|
|
1665
|
+
const hydrated = await persistor.locked((store) => store.read()).catch((error) => {
|
|
1666
|
+
console.warn("createCredentials: the stored session could not be read", error);
|
|
1667
|
+
return null;
|
|
1668
|
+
});
|
|
1669
|
+
if (hydrated === null) return {
|
|
1670
|
+
lastActive: null,
|
|
1671
|
+
status: "unreachable"
|
|
1672
|
+
};
|
|
1673
|
+
const { stacks, current } = hydrated;
|
|
1674
|
+
const scoped = stacks.find(({ baseUrl }) => baseUrl === current?.baseUrl);
|
|
1675
|
+
const restored = stacks.map(async ({ baseUrl, credential, retained, projects }) => {
|
|
1676
|
+
state.stacks.ensure(baseUrl);
|
|
1677
|
+
if (!credential && !retained) return "unreachable";
|
|
1678
|
+
if (require_transientRetries.Result.unwrapOr(state.auth.getEpoch(baseUrl), 0) > 0) return "skipped";
|
|
1679
|
+
if (retained) state.auth.retain(baseUrl, retained);
|
|
1680
|
+
if (!credential) return "unreachable";
|
|
1681
|
+
const outcome = await restoreStack(baseUrl, credential);
|
|
1682
|
+
if (outcome === "restored") restoreProjects(baseUrl, projects);
|
|
1683
|
+
return outcome;
|
|
1684
|
+
});
|
|
1685
|
+
const results = await Promise.all(restored);
|
|
1686
|
+
const scopedOutcome = scoped?.credential ? results[stacks.indexOf(scoped)] : void 0;
|
|
1687
|
+
return {
|
|
1688
|
+
lastActive: current,
|
|
1689
|
+
status: toRestoreStatus(scopedOutcome)
|
|
1690
|
+
};
|
|
1691
|
+
};
|
|
1692
|
+
/**
|
|
1693
|
+
* Signs a retained stack back in from the grant it kept.
|
|
1694
|
+
*
|
|
1695
|
+
* - `restored` and `refused` empty the slot; `unreachable` keeps it for another try.
|
|
1696
|
+
* - Throws when the stack retains nothing.
|
|
1697
|
+
*/
|
|
1698
|
+
const restoreRetained = async (baseUrl) => {
|
|
1699
|
+
const { grant } = require_transientRetries.Result.unwrap(state.auth.requireRetained(baseUrl));
|
|
1700
|
+
return restoreStack(baseUrl, grant, true);
|
|
1701
|
+
};
|
|
1702
|
+
const isStale = (baseUrl) => {
|
|
1703
|
+
const ageing = require_transientRetries.Result.map(state.auth.requireCredential(baseUrl), ({ issuedAt, expiresIn }) => Date.now() >= issuedAt + expiresIn * 1e3 * refreshThreshold);
|
|
1704
|
+
return require_transientRetries.Result.unwrapOr(ageing, false);
|
|
1705
|
+
};
|
|
1706
|
+
/**
|
|
1707
|
+
* Drops the slot so the next sign-in's requests don't join the dying rotation.
|
|
1708
|
+
*
|
|
1709
|
+
* - Writes nothing: the caller persists the stack, under the lock it holds or takes.
|
|
1710
|
+
*/
|
|
1711
|
+
const signOut = (baseUrl, options) => {
|
|
1712
|
+
rotationMap.delete(baseUrl);
|
|
1713
|
+
const signedOut = state.auth.signOut(baseUrl, options);
|
|
1714
|
+
onSignedOut?.(baseUrl);
|
|
1715
|
+
return signedOut;
|
|
1716
|
+
};
|
|
1717
|
+
const expire = async (baseUrl, store) => {
|
|
1718
|
+
if (!state.auth.notifyExpired(baseUrl)) return;
|
|
1719
|
+
signOut(baseUrl);
|
|
1720
|
+
await store.persistStack(baseUrl, state.store.get());
|
|
1721
|
+
onExpired?.(baseUrl);
|
|
1722
|
+
};
|
|
1723
|
+
const renewIfStale = async (baseUrl) => {
|
|
1724
|
+
if (isStale(baseUrl)) await rotate(baseUrl);
|
|
1725
|
+
};
|
|
1726
|
+
const middleware = (baseUrl) => require_middleware.createBearerAuthMiddleware({ getAccessToken: async ({ forceRefresh = false } = {}) => {
|
|
1727
|
+
if (forceRefresh) {
|
|
1728
|
+
if (!state.auth.requireCredential(baseUrl).success) return null;
|
|
1729
|
+
return require_transientRetries.Result.unwrap(await rotate(baseUrl));
|
|
1730
|
+
}
|
|
1731
|
+
await renewIfStale(baseUrl);
|
|
1732
|
+
return state.auth.getAccessToken(baseUrl);
|
|
1733
|
+
} });
|
|
1734
|
+
return {
|
|
1735
|
+
middleware,
|
|
1736
|
+
rotate,
|
|
1737
|
+
renewIfStale,
|
|
1738
|
+
restore,
|
|
1739
|
+
restoreRetained,
|
|
1740
|
+
signOut,
|
|
1741
|
+
forget
|
|
1742
|
+
};
|
|
1743
|
+
};
|
|
1744
|
+
//#endregion
|
|
1629
1745
|
//#region src/keboola/bearer/context/resource.ts
|
|
1630
1746
|
/**
|
|
1631
1747
|
* Owns fetching one async value per key — a caller names what it needs and never orchestrates the
|
|
@@ -1942,61 +2058,86 @@ const createPerProject = ({ state, credentials, middlewareFor, stack, clientServ
|
|
|
1942
2058
|
*/
|
|
1943
2059
|
const SESSION_STORAGE_KEY = "keboola:session";
|
|
1944
2060
|
/**
|
|
1945
|
-
* What survives a reload, per
|
|
2061
|
+
* What survives a reload, per grant type.
|
|
2062
|
+
*
|
|
2063
|
+
* - Written under `credential`: the key every blob already stored carries.
|
|
1946
2064
|
*
|
|
1947
2065
|
* - `token`: the refresh token. It rotates, is single-use and is server-revocable, so a leaked
|
|
1948
2066
|
* snapshot has limited and revocable value. The access token is never written.
|
|
1949
|
-
* - `static`: the token itself — a long-lived PAT the user pasted, which nothing can re-mint.
|
|
1950
2067
|
* - `cookie`: the session id. The session cookie is the durable half and the browser keeps it;
|
|
1951
2068
|
* the id alone renews nothing.
|
|
1952
2069
|
*/
|
|
1953
|
-
const
|
|
1954
|
-
zod.
|
|
1955
|
-
|
|
1956
|
-
|
|
1957
|
-
|
|
1958
|
-
zod.
|
|
1959
|
-
|
|
1960
|
-
sessionId: zod.string()
|
|
1961
|
-
}),
|
|
1962
|
-
zod.object({
|
|
1963
|
-
type: zod.literal("static"),
|
|
1964
|
-
accessToken: zod.string()
|
|
1965
|
-
})
|
|
1966
|
-
]);
|
|
2070
|
+
const persistedGrantSchema = zod.discriminatedUnion("type", [zod.object({
|
|
2071
|
+
type: zod.literal("token"),
|
|
2072
|
+
refreshToken: zod.string()
|
|
2073
|
+
}), zod.object({
|
|
2074
|
+
type: zod.literal("cookie"),
|
|
2075
|
+
sessionId: zod.string()
|
|
2076
|
+
})]);
|
|
1967
2077
|
/** A record per project rather than a bare id, so a project can grow a field without a migration. */
|
|
1968
2078
|
const persistedProjectSchema = zod.object({ projectId: zod.number() });
|
|
2079
|
+
const persistedStackSchema = zod.object({
|
|
2080
|
+
baseUrl: zod.string(),
|
|
2081
|
+
credential: persistedGrantSchema.nullable().catch(null),
|
|
2082
|
+
retained: zod.object({ grant: persistedGrantSchema }).nullable().default(null).catch(null),
|
|
2083
|
+
projects: zod.array(persistedProjectSchema)
|
|
2084
|
+
});
|
|
1969
2085
|
const persistedSessionSchema = zod.object({
|
|
1970
2086
|
current: zod.object({
|
|
1971
2087
|
baseUrl: zod.string(),
|
|
1972
2088
|
projectId: zod.number().nullable()
|
|
1973
2089
|
}).nullable(),
|
|
1974
|
-
stacks: zod.array(
|
|
1975
|
-
baseUrl: zod.string(),
|
|
1976
|
-
credential: persistedCredentialSchema.nullable(),
|
|
1977
|
-
projects: zod.array(persistedProjectSchema)
|
|
1978
|
-
}))
|
|
2090
|
+
stacks: zod.array(persistedStackSchema)
|
|
1979
2091
|
});
|
|
1980
2092
|
const EMPTY_PERSISTED_SESSION = {
|
|
1981
2093
|
current: null,
|
|
1982
2094
|
stacks: []
|
|
1983
2095
|
};
|
|
1984
|
-
const
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
|
|
1989
|
-
|
|
1990
|
-
|
|
1991
|
-
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
|
|
2096
|
+
const projectsOf = (projects, baseUrl) => Object.values(projects).filter((project) => project.baseUrl === baseUrl).map(({ projectId }) => ({ projectId }));
|
|
2097
|
+
const grantsOf = (stack) => ({
|
|
2098
|
+
credential: stack.auth.status === "authenticated" ? Entry.grant(stack.auth.credential) : null,
|
|
2099
|
+
retained: stack.retained
|
|
2100
|
+
});
|
|
2101
|
+
/**
|
|
2102
|
+
* The stored session, rewritten from the table except for the grants.
|
|
2103
|
+
*
|
|
2104
|
+
* - Scope, stack list and open projects come from memory.
|
|
2105
|
+
* - `credential` and `retained` stay as stored: a grant another document rotated must not be put
|
|
2106
|
+
* back by a snapshot of this one's older table.
|
|
2107
|
+
*/
|
|
2108
|
+
const mergeSnapshot = (stored, { active, stacks, projects }) => ({
|
|
2109
|
+
current: {
|
|
2110
|
+
baseUrl: active.baseUrl,
|
|
2111
|
+
projectId: active.projectId
|
|
2112
|
+
},
|
|
2113
|
+
stacks: Object.values(stacks).map(({ baseUrl }) => {
|
|
2114
|
+
const kept = stored.stacks.find((stack) => stack.baseUrl === baseUrl);
|
|
2115
|
+
return {
|
|
2116
|
+
baseUrl,
|
|
2117
|
+
credential: kept?.credential ?? null,
|
|
2118
|
+
retained: kept?.retained ?? null,
|
|
2119
|
+
projects: projectsOf(projects, baseUrl)
|
|
2120
|
+
};
|
|
2121
|
+
})
|
|
2122
|
+
});
|
|
2123
|
+
const upsertStack = (stored, baseUrl, update) => {
|
|
2124
|
+
const index = stored.stacks.findIndex((stack) => stack.baseUrl === baseUrl);
|
|
2125
|
+
const stacks = [...stored.stacks];
|
|
2126
|
+
if (index < 0) stacks.push(update(void 0));
|
|
2127
|
+
else stacks[index] = update(stacks[index]);
|
|
1995
2128
|
return {
|
|
1996
|
-
|
|
1997
|
-
|
|
2129
|
+
...stored,
|
|
2130
|
+
stacks
|
|
1998
2131
|
};
|
|
1999
2132
|
};
|
|
2133
|
+
/**
|
|
2134
|
+
* The stored session, reached in two ways.
|
|
2135
|
+
*
|
|
2136
|
+
* - `locked`: the only way to read, and the only way to a grant write. Rotation and restore hold
|
|
2137
|
+
* it across the refresh; sign-in, sign-out and the boot restore open it for one step.
|
|
2138
|
+
* - `snapshot`: the table minus its grants, under the lock, coalesced; what the store subscription
|
|
2139
|
+
* feeds, and what a scope change awaits before the document leaves.
|
|
2140
|
+
*/
|
|
2000
2141
|
const createSessionPersistor = (storage) => {
|
|
2001
2142
|
const persistor = createPersistor({
|
|
2002
2143
|
storage,
|
|
@@ -2004,20 +2145,35 @@ const createSessionPersistor = (storage) => {
|
|
|
2004
2145
|
schema: persistedSessionSchema,
|
|
2005
2146
|
defaultValue: EMPTY_PERSISTED_SESSION
|
|
2006
2147
|
});
|
|
2007
|
-
const
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2148
|
+
const persistStack = (cell, baseUrl, { stacks, projects }) => {
|
|
2149
|
+
const stack = stacks[baseUrl];
|
|
2150
|
+
if (stack === void 0) return Promise.resolve();
|
|
2151
|
+
return cell.modify((stored) => upsertStack(stored, baseUrl, (existing) => ({
|
|
2152
|
+
baseUrl,
|
|
2153
|
+
...grantsOf(stack),
|
|
2154
|
+
projects: existing?.projects ?? projectsOf(projects, baseUrl)
|
|
2155
|
+
})));
|
|
2156
|
+
};
|
|
2157
|
+
const locked = (task) => persistor.locked((cell) => task({
|
|
2158
|
+
read: cell.read,
|
|
2159
|
+
persistStack: (baseUrl, state) => persistStack(cell, baseUrl, state)
|
|
2160
|
+
}));
|
|
2161
|
+
let latest = null;
|
|
2162
|
+
let pending = null;
|
|
2163
|
+
const snapshot = (state) => {
|
|
2164
|
+
latest = state;
|
|
2165
|
+
if (pending) return pending;
|
|
2166
|
+
const write = persistor.locked((cell) => {
|
|
2167
|
+
pending = null;
|
|
2168
|
+
const table = latest ?? state;
|
|
2169
|
+
return cell.modify((stored) => mergeSnapshot(stored, table));
|
|
2170
|
+
});
|
|
2171
|
+
pending = write;
|
|
2172
|
+
return write;
|
|
2173
|
+
};
|
|
2018
2174
|
return {
|
|
2019
|
-
|
|
2020
|
-
|
|
2175
|
+
locked,
|
|
2176
|
+
snapshot
|
|
2021
2177
|
};
|
|
2022
2178
|
};
|
|
2023
2179
|
//#endregion
|
|
@@ -2062,7 +2218,7 @@ const createPerStack = ({ state, credentials, middlewareFor }) => {
|
|
|
2062
2218
|
*
|
|
2063
2219
|
* - Credential-derived state is owned by the scope whose end ends it (`perStack`, `perProject`).
|
|
2064
2220
|
*/
|
|
2065
|
-
const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls,
|
|
2221
|
+
const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls, onExpired }) => {
|
|
2066
2222
|
const state = createState(require_createFetchClient.normalizeBaseUrl(defaultBaseUrl));
|
|
2067
2223
|
const persistor = createSessionPersistor(storage);
|
|
2068
2224
|
const middlewareFor = createMiddlewareFor(middlewares);
|
|
@@ -2070,8 +2226,8 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2070
2226
|
state,
|
|
2071
2227
|
persistor,
|
|
2072
2228
|
middlewares: middlewareFor("auth"),
|
|
2073
|
-
|
|
2074
|
-
|
|
2229
|
+
onSignedOut: (baseUrl) => perProject.forgetUnder(baseUrl),
|
|
2230
|
+
onExpired
|
|
2075
2231
|
});
|
|
2076
2232
|
const perStack = createPerStack({
|
|
2077
2233
|
state,
|
|
@@ -2086,33 +2242,33 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2086
2242
|
clientServiceUrls,
|
|
2087
2243
|
buildApi: (project) => createApiFor({
|
|
2088
2244
|
stackUrl: () => project.baseUrl,
|
|
2089
|
-
project: () =>
|
|
2245
|
+
project: () => require_transientRetries.Result.unwrap(state.projects.get(project.id)),
|
|
2090
2246
|
pinned: true
|
|
2091
2247
|
})
|
|
2092
2248
|
});
|
|
2093
2249
|
state.store.subscribe(perStack.context.subscriber);
|
|
2094
2250
|
perStack.context.subscriber(state.store.get());
|
|
2095
2251
|
state.store.subscribe(perProject.context.subscriber);
|
|
2096
|
-
const selectStack = (baseUrl) =>
|
|
2097
|
-
const selectProject = (projectId) =>
|
|
2252
|
+
const selectStack = (baseUrl) => require_transientRetries.Result.unwrap(state.scope.selectStack(require_createFetchClient.normalizeBaseUrl(baseUrl)));
|
|
2253
|
+
const selectProject = (projectId) => require_transientRetries.Result.unwrap(state.scope.selectProject(projectId));
|
|
2098
2254
|
/** The scoped stack, or a named one — normalised to key like `select`. */
|
|
2099
2255
|
const requireStackUrl = (baseUrl) => baseUrl === void 0 ? state.scope.getActiveStack().baseUrl : require_createFetchClient.normalizeBaseUrl(baseUrl);
|
|
2100
2256
|
/** The scoped project, or the row a table id names — on whichever stack that is. */
|
|
2101
|
-
const requireProjectEntry = (id) => id === void 0 ?
|
|
2257
|
+
const requireProjectEntry = (id) => id === void 0 ? require_transientRetries.Result.unwrap(state.scope.requireActiveProject()) : require_transientRetries.Result.unwrap(state.projects.get(id));
|
|
2102
2258
|
/**
|
|
2103
2259
|
* The scoped project, or a named open one.
|
|
2104
2260
|
*
|
|
2105
2261
|
* - An id is ambiguous across stacks: the active stack decides, else the single one open elsewhere.
|
|
2106
2262
|
*/
|
|
2107
2263
|
const requireProject = (projectId) => {
|
|
2108
|
-
if (projectId === void 0) return
|
|
2264
|
+
if (projectId === void 0) return require_transientRetries.Result.unwrap(state.scope.requireActiveProject());
|
|
2109
2265
|
const scoped = state.projects.get(Entry.projectEntryId(requireStackUrl(), projectId));
|
|
2110
2266
|
if (scoped.success) return scoped.data;
|
|
2111
2267
|
const [only, ...rest] = state.projects.findAll(projectId);
|
|
2112
|
-
return only !== void 0 && rest.length === 0 ? only :
|
|
2268
|
+
return only !== void 0 && rest.length === 0 ? only : require_transientRetries.Result.unwrap(scoped);
|
|
2113
2269
|
};
|
|
2114
2270
|
const headersFor = (project) => {
|
|
2115
|
-
const credential =
|
|
2271
|
+
const credential = require_transientRetries.Result.unwrap(state.auth.requireCredential(project.baseUrl));
|
|
2116
2272
|
return {
|
|
2117
2273
|
[require_createFetchClient.HttpHeader.AUTHORIZATION]: `Bearer ${credential.accessToken}`,
|
|
2118
2274
|
[require_createFetchClient.KeboolaHttpHeader.PROJECT_ID]: String(project.projectId)
|
|
@@ -2133,18 +2289,24 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2133
2289
|
const getAuthHeadersAsync = async (projectId) => {
|
|
2134
2290
|
const project = requireProject(projectId);
|
|
2135
2291
|
await credentials.renewIfStale(project.baseUrl);
|
|
2136
|
-
return headersFor(
|
|
2292
|
+
return headersFor(require_transientRetries.Result.unwrap(state.projects.get(project.id)));
|
|
2137
2293
|
};
|
|
2138
|
-
const
|
|
2139
|
-
|
|
2140
|
-
if (input.type !== "static" && input.type !== mode) throw new KeboolaError(KeboolaErrorType.CredentialKindMismatch);
|
|
2141
|
-
if (input.type !== "token") return require_jobStatus.Result.unwrap(state.auth.authenticate(stack.baseUrl, input));
|
|
2294
|
+
const toCredential = (input) => {
|
|
2295
|
+
if (input.type !== "token") return input;
|
|
2142
2296
|
const { refreshToken } = input;
|
|
2143
2297
|
if (!refreshToken) throw new KeboolaError(KeboolaErrorType.NotAuthenticated);
|
|
2144
|
-
return
|
|
2298
|
+
return {
|
|
2145
2299
|
...input,
|
|
2146
2300
|
refreshToken
|
|
2147
|
-
}
|
|
2301
|
+
};
|
|
2302
|
+
};
|
|
2303
|
+
const authenticate = (input) => {
|
|
2304
|
+
const { baseUrl } = state.scope.getActiveStack();
|
|
2305
|
+
const signedIn = require_transientRetries.Result.unwrap(state.auth.authenticate(baseUrl, toCredential(input)));
|
|
2306
|
+
persistor.locked((store) => store.persistStack(baseUrl, state.store.get())).catch((error) => {
|
|
2307
|
+
console.warn("createKeboola: the sign-in could not be stored", error);
|
|
2308
|
+
});
|
|
2309
|
+
return signedIn;
|
|
2148
2310
|
};
|
|
2149
2311
|
/**
|
|
2150
2312
|
* The flat product surface: `auth` and `management` per stack, the rest per project.
|
|
@@ -2168,7 +2330,7 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2168
2330
|
} });
|
|
2169
2331
|
const activeApi = createApiFor({
|
|
2170
2332
|
stackUrl: () => state.scope.getActiveStack().baseUrl,
|
|
2171
|
-
project: () =>
|
|
2333
|
+
project: () => require_transientRetries.Result.unwrap(state.scope.requireActiveProject())
|
|
2172
2334
|
});
|
|
2173
2335
|
/** The scoped project's surface. Re-points when the scope moves. */
|
|
2174
2336
|
const getActiveApi = () => activeApi;
|
|
@@ -2181,14 +2343,24 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2181
2343
|
const getApi = (projectId) => {
|
|
2182
2344
|
const { baseUrl } = state.scope.getActiveStack();
|
|
2183
2345
|
const project = Entry.project(baseUrl, projectId);
|
|
2184
|
-
|
|
2346
|
+
require_transientRetries.Result.unwrapOr(state.projects.open(baseUrl, projectId), null);
|
|
2185
2347
|
return perProject.get(project).api;
|
|
2186
2348
|
};
|
|
2187
|
-
/**
|
|
2188
|
-
|
|
2349
|
+
/**
|
|
2350
|
+
* The scope's sign-in, or a named stack's — and everything that sign-in derived.
|
|
2351
|
+
*
|
|
2352
|
+
* - `retain` keeps the grant on the stack, persisted beside the sign-in it ended, for
|
|
2353
|
+
* `restoreRetained`; the next sign-in on the stack replaces it.
|
|
2354
|
+
* - The table is signed out on return; the promise resolves once that is stored, so a caller
|
|
2355
|
+
* leaving the document waits for it.
|
|
2356
|
+
*/
|
|
2357
|
+
const signOut = ({ baseUrl, ...options } = {}) => {
|
|
2189
2358
|
const target = requireStackUrl(baseUrl);
|
|
2190
|
-
|
|
2359
|
+
const signedOut = require_transientRetries.Result.unwrap(credentials.signOut(target, options));
|
|
2360
|
+
return persistor.locked((store) => store.persistStack(target, state.store.get())).then(() => signedOut);
|
|
2191
2361
|
};
|
|
2362
|
+
/** Signs a stack back in from what a retained sign-out kept; `unreachable` leaves it to retry. */
|
|
2363
|
+
const restoreRetained = (baseUrl) => credentials.restoreRetained(require_createFetchClient.normalizeBaseUrl(baseUrl));
|
|
2192
2364
|
/**
|
|
2193
2365
|
* `input` replaces the active stack's sign-in, whatever it holds.
|
|
2194
2366
|
*
|
|
@@ -2200,26 +2372,13 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2200
2372
|
return authenticate(input);
|
|
2201
2373
|
};
|
|
2202
2374
|
/**
|
|
2203
|
-
* A server-injected `token` credential, adopted whatever this client's mode.
|
|
2204
|
-
*
|
|
2205
|
-
* @deprecated Temporary, for the agent-project claim page only: Connection injects an API-mode
|
|
2206
|
-
* session through `UiConfig.programmaticAuth`. Remove together with that injection.
|
|
2207
|
-
*
|
|
2208
|
-
* - Replaces the active stack's sign-in, like `replace`.
|
|
2209
|
-
* - A cookie-mode client never rotates it, so it lasts as long as its access token.
|
|
2210
|
-
*/
|
|
2211
|
-
const adoptInjected = (input) => {
|
|
2212
|
-
signOut();
|
|
2213
|
-
return require_jobStatus.Result.unwrap(state.auth.authenticate(getActiveStack().baseUrl, input));
|
|
2214
|
-
};
|
|
2215
|
-
/**
|
|
2216
2375
|
* Leave one project: its row and everything built for it; its handles stop answering.
|
|
2217
2376
|
*
|
|
2218
2377
|
* - Counterpart of `getApi(projectId)`; without it the project is held and persisted until sign-out.
|
|
2219
2378
|
*/
|
|
2220
2379
|
const closeProject = (projectId) => {
|
|
2221
2380
|
const id = Entry.projectEntryId(requireStackUrl(), projectId);
|
|
2222
|
-
const closed =
|
|
2381
|
+
const closed = require_transientRetries.Result.unwrapOr(state.projects.close(id), null);
|
|
2223
2382
|
if (closed === null) return null;
|
|
2224
2383
|
perProject.forget(id);
|
|
2225
2384
|
return closed;
|
|
@@ -2227,7 +2386,7 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2227
2386
|
const closeStack = (baseUrl) => {
|
|
2228
2387
|
const target = require_createFetchClient.normalizeBaseUrl(baseUrl);
|
|
2229
2388
|
if (state.scope.get().baseUrl === target) throw new KeboolaError(KeboolaErrorType.StackActive);
|
|
2230
|
-
const closed =
|
|
2389
|
+
const closed = require_transientRetries.Result.unwrapOr(state.stacks.close(target), null);
|
|
2231
2390
|
if (closed === null) return null;
|
|
2232
2391
|
perProject.forgetUnder(target);
|
|
2233
2392
|
perStack.forget(target);
|
|
@@ -2238,16 +2397,22 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2238
2397
|
/**
|
|
2239
2398
|
* Persistence starts only once the restore has settled.
|
|
2240
2399
|
*
|
|
2241
|
-
* - Mid-hydration an unexchanged stack is `anonymous`;
|
|
2400
|
+
* - Mid-hydration an unexchanged stack is `anonymous`; the persistor would erase the
|
|
2242
2401
|
* refresh token the exchange is about to spend.
|
|
2243
2402
|
* - Writes the settled table once: the subscription fires only on the next change.
|
|
2244
2403
|
*/
|
|
2245
2404
|
const enablePersistence = () => {
|
|
2246
2405
|
if (persisting) return;
|
|
2247
2406
|
persisting = true;
|
|
2248
|
-
|
|
2249
|
-
state.store.subscribe(
|
|
2407
|
+
snapshot(state.store.get());
|
|
2408
|
+
state.store.subscribe(snapshot);
|
|
2409
|
+
};
|
|
2410
|
+
const snapshot = (table) => {
|
|
2411
|
+
persistor.snapshot(table).catch((error) => {
|
|
2412
|
+
console.warn("createKeboola: the session could not be stored", error);
|
|
2413
|
+
});
|
|
2250
2414
|
};
|
|
2415
|
+
const persistScope = () => persisting ? persistor.snapshot(state.store.get()) : Promise.resolve();
|
|
2251
2416
|
/**
|
|
2252
2417
|
* The same, deferred until a sign-in.
|
|
2253
2418
|
*
|
|
@@ -2261,7 +2426,7 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2261
2426
|
enablePersistence();
|
|
2262
2427
|
});
|
|
2263
2428
|
};
|
|
2264
|
-
const restore =
|
|
2429
|
+
const restore = require_transientRetries.lazy(() => credentials.restore().then((restored) => {
|
|
2265
2430
|
if (restored.status === "unreachable") enablePersistenceOnSignIn();
|
|
2266
2431
|
else enablePersistence();
|
|
2267
2432
|
return restored;
|
|
@@ -2281,7 +2446,7 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2281
2446
|
* - Resolves with the stored credential's fate — only this tells `expired` from `empty`.
|
|
2282
2447
|
* - Other stacks still come back, persistence still starts; repeat calls share one promise.
|
|
2283
2448
|
*/
|
|
2284
|
-
const resume =
|
|
2449
|
+
const resume = require_transientRetries.lazy(() => restore().then(({ lastActive, status }) => {
|
|
2285
2450
|
if (!lastActive || callerScoped) return status;
|
|
2286
2451
|
const stack = selectStack(lastActive.baseUrl);
|
|
2287
2452
|
if (lastActive.projectId !== null && stack.auth.status === "authenticated") selectProject(lastActive.projectId);
|
|
@@ -2301,14 +2466,22 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2301
2466
|
resume,
|
|
2302
2467
|
stack: {
|
|
2303
2468
|
getActive: getActiveStack,
|
|
2304
|
-
|
|
2469
|
+
/** Scoped on return; resolves once that is stored, for a caller leaving the document. */
|
|
2470
|
+
select: byCaller((baseUrl) => {
|
|
2471
|
+
const stack = selectStack(baseUrl);
|
|
2472
|
+
return persistScope().then(() => stack);
|
|
2473
|
+
}),
|
|
2305
2474
|
close: closeStack,
|
|
2306
2475
|
retryContext: perStack.context.retry,
|
|
2307
2476
|
getContext: (baseUrl) => perStack.context.get(requireStackUrl(baseUrl)),
|
|
2308
2477
|
getContextAsync: (baseUrl) => perStack.context.getAsync(requireStackUrl(baseUrl))
|
|
2309
2478
|
},
|
|
2310
2479
|
project: {
|
|
2311
|
-
|
|
2480
|
+
/** Scoped on return; resolves once that is stored, for a caller leaving the document. */
|
|
2481
|
+
select: byCaller((projectId) => {
|
|
2482
|
+
const project = selectProject(projectId);
|
|
2483
|
+
return persistScope().then(() => project);
|
|
2484
|
+
}),
|
|
2312
2485
|
close: closeProject,
|
|
2313
2486
|
deactivate: state.scope.deactivate,
|
|
2314
2487
|
retryContext: perProject.context.retry,
|
|
@@ -2318,12 +2491,12 @@ const createKeboola = ({ defaultBaseUrl, storage, middlewares, clientServiceUrls
|
|
|
2318
2491
|
auth: {
|
|
2319
2492
|
authenticate: byCaller(authenticate),
|
|
2320
2493
|
replace: byCaller(replace),
|
|
2321
|
-
adoptInjected: byCaller(adoptInjected),
|
|
2322
2494
|
signOut: byCaller(signOut),
|
|
2495
|
+
restoreRetained: byCaller(restoreRetained),
|
|
2323
2496
|
/** Whether the active stack holds a credential — `restoring` is not one yet. */
|
|
2324
2497
|
isAuthenticated,
|
|
2325
2498
|
isAuthenticatedAsync: () => resume().then(isAuthenticated),
|
|
2326
|
-
rotate: (baseUrl) => credentials.rotate(baseUrl).then(
|
|
2499
|
+
rotate: (baseUrl) => credentials.rotate(baseUrl).then(require_transientRetries.Result.unwrap),
|
|
2327
2500
|
getHeaders: getAuthHeaders,
|
|
2328
2501
|
getHeadersAsync: getAuthHeadersAsync
|
|
2329
2502
|
}
|
|
@@ -2473,7 +2646,7 @@ const createRetryMiddleware = (options) => {
|
|
|
2473
2646
|
} catch (error) {
|
|
2474
2647
|
if (attempt === maxRetries || !shouldRetry(error, attempt)) throw error;
|
|
2475
2648
|
const delayMs = backoffFactor * 1e3 * Math.pow(2, attempt);
|
|
2476
|
-
await
|
|
2649
|
+
await require_transientRetries.delay(delayMs, request.request.signal ?? void 0);
|
|
2477
2650
|
}
|
|
2478
2651
|
throw new Error("unreachable");
|
|
2479
2652
|
};
|
|
@@ -2522,18 +2695,20 @@ exports.KeboolaErrorType = KeboolaErrorType;
|
|
|
2522
2695
|
exports.KeboolaHttpHeader = require_createFetchClient.KeboolaHttpHeader;
|
|
2523
2696
|
exports.ManagementClientAuthError = require_ManagementSessionMintError.ManagementClientAuthError;
|
|
2524
2697
|
exports.ManagementSessionMintError = require_ManagementSessionMintError.ManagementSessionMintError;
|
|
2525
|
-
exports.QueryJobError =
|
|
2526
|
-
exports.
|
|
2527
|
-
exports.Result =
|
|
2698
|
+
exports.QueryJobError = require_QueryJobError.QueryJobError;
|
|
2699
|
+
exports.QueueJobError = require_QueueJobError.QueueJobError;
|
|
2700
|
+
exports.Result = require_transientRetries.Result;
|
|
2528
2701
|
exports.SESSION_STORAGE_KEY = SESSION_STORAGE_KEY;
|
|
2529
2702
|
exports.ServiceUnavailableError = require_storage.ServiceUnavailableError;
|
|
2703
|
+
exports.StorageJobError = require_storage.StorageJobError;
|
|
2530
2704
|
exports.SyncActionError = require_SyncActionError.SyncActionError;
|
|
2531
2705
|
exports.UserError = require_UserError.UserError;
|
|
2532
2706
|
exports.ValidationError = require_ValidationError.ValidationError;
|
|
2533
|
-
exports.asError =
|
|
2707
|
+
exports.asError = require_transientRetries.asError;
|
|
2534
2708
|
exports.assert = assert;
|
|
2535
2709
|
exports.coalesce = coalesce;
|
|
2536
|
-
exports.
|
|
2710
|
+
exports.collectByCursor = require_authClient.collectByCursor;
|
|
2711
|
+
exports.collectByOffset = require_collectByOffset.collectByOffset;
|
|
2537
2712
|
exports.concurrent = require_concurrent.concurrent;
|
|
2538
2713
|
exports.createAdminAccount = createAdminAccount;
|
|
2539
2714
|
exports.createDerivedAsyncStore = createDerivedAsyncStore;
|
|
@@ -2551,15 +2726,14 @@ exports.createPollRegistry = createPollRegistry;
|
|
|
2551
2726
|
exports.createQueryServiceSdk = require_sdk_queryService_index.createQueryServiceSdk;
|
|
2552
2727
|
exports.createRetryMiddleware = createRetryMiddleware;
|
|
2553
2728
|
exports.createSessionStorage = createSessionStorage;
|
|
2554
|
-
exports.createStorageSdk = require_sdk_storage_index.createStorageSdk;
|
|
2555
2729
|
exports.createStore = require_store.createStore;
|
|
2556
2730
|
exports.createUiVersionMiddleware = createUiVersionMiddleware;
|
|
2557
2731
|
exports.dedupe = require_dedupe.dedupe;
|
|
2558
2732
|
exports.deepMerge = deepMerge;
|
|
2559
|
-
exports.delay =
|
|
2560
|
-
exports.emitter =
|
|
2733
|
+
exports.delay = require_transientRetries.delay;
|
|
2734
|
+
exports.emitter = require_transientRetries.emitter;
|
|
2561
2735
|
exports.ensure = ensure;
|
|
2562
|
-
exports.failureOf =
|
|
2736
|
+
exports.failureOf = require_transientRetries.failureOf;
|
|
2563
2737
|
exports.formatValidationIssues = require_ValidationError.formatValidationIssues;
|
|
2564
2738
|
exports.generateUUID = require_generateUUID.generateUUID;
|
|
2565
2739
|
exports.isAbortError = require_createFetchClient.isAbortError;
|
|
@@ -2571,19 +2745,21 @@ exports.isKeboolaError = isKeboolaError;
|
|
|
2571
2745
|
exports.isManagementClientAuthError = require_management.isManagementClientAuthError;
|
|
2572
2746
|
exports.isManagementSessionMintError = require_management.isManagementSessionMintError;
|
|
2573
2747
|
exports.isPlainObject = require_isPlainObject.isPlainObject;
|
|
2574
|
-
exports.isQueryJobError =
|
|
2575
|
-
exports.
|
|
2748
|
+
exports.isQueryJobError = require_QueryJobError.isQueryJobError;
|
|
2749
|
+
exports.isQueueJobError = require_QueueJobError.isQueueJobError;
|
|
2750
|
+
exports.isStorageJobError = require_storage.isStorageJobError;
|
|
2576
2751
|
exports.isStorageTokenMutatingRequest = isStorageTokenMutatingRequest;
|
|
2577
2752
|
exports.isSyncActionError = require_SyncActionError.isSyncActionError;
|
|
2578
2753
|
exports.isTimeoutError = require_createFetchClient.isTimeoutError;
|
|
2579
2754
|
exports.isValidationError = require_ValidationError.isValidationError;
|
|
2580
|
-
exports.jobStatus =
|
|
2755
|
+
exports.jobStatus = require_transientRetries.jobStatus;
|
|
2581
2756
|
exports.keboolaUID = require_tag.keboolaUID;
|
|
2582
|
-
exports.lazy =
|
|
2757
|
+
exports.lazy = require_transientRetries.lazy;
|
|
2758
|
+
exports.nextCursorOf = require_authClient.nextCursorOf;
|
|
2583
2759
|
exports.parseLogLines = require_appLogs.parseLogLines;
|
|
2584
2760
|
exports.parseOrThrow = require_ValidationError.parseOrThrow;
|
|
2585
|
-
exports.
|
|
2586
|
-
exports.
|
|
2761
|
+
exports.poller = require_transientRetries.poller;
|
|
2762
|
+
exports.queueSeries = queueSeries;
|
|
2587
2763
|
exports.readableReason = require_storage.readableReason;
|
|
2588
2764
|
exports.schemaGuidedMerge = require_configurations.schemaGuidedMerge;
|
|
2589
2765
|
exports.series = require_storage.series;
|