@loxtep/sdk 0.1.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/CHANGELOG.md +30 -0
- package/README.md +274 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +4 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/jwt.d.ts +10 -0
- package/dist/auth/jwt.d.ts.map +1 -0
- package/dist/auth/jwt.js +24 -0
- package/dist/auth/jwt.js.map +1 -0
- package/dist/auth/login.d.ts +49 -0
- package/dist/auth/login.d.ts.map +1 -0
- package/dist/auth/login.js +131 -0
- package/dist/auth/login.js.map +1 -0
- package/dist/auth/token-manager.d.ts +30 -0
- package/dist/auth/token-manager.d.ts.map +1 -0
- package/dist/auth/token-manager.js +61 -0
- package/dist/auth/token-manager.js.map +1 -0
- package/dist/checkpoint/index.d.ts +6 -0
- package/dist/checkpoint/index.d.ts.map +1 -0
- package/dist/checkpoint/index.js +5 -0
- package/dist/checkpoint/index.js.map +1 -0
- package/dist/checkpoint/memory-store.d.ts +6 -0
- package/dist/checkpoint/memory-store.d.ts.map +1 -0
- package/dist/checkpoint/memory-store.js +16 -0
- package/dist/checkpoint/memory-store.js.map +1 -0
- package/dist/checkpoint/types.d.ts +14 -0
- package/dist/checkpoint/types.d.ts.map +1 -0
- package/dist/checkpoint/types.js +5 -0
- package/dist/checkpoint/types.js.map +1 -0
- package/dist/cli/auth-resolve.d.ts +19 -0
- package/dist/cli/auth-resolve.d.ts.map +1 -0
- package/dist/cli/auth-resolve.js +25 -0
- package/dist/cli/auth-resolve.js.map +1 -0
- package/dist/cli/commands/bus-cmd.d.ts +6 -0
- package/dist/cli/commands/bus-cmd.d.ts.map +1 -0
- package/dist/cli/commands/bus-cmd.js +19 -0
- package/dist/cli/commands/bus-cmd.js.map +1 -0
- package/dist/cli/commands/config-cmd.d.ts +105 -0
- package/dist/cli/commands/config-cmd.d.ts.map +1 -0
- package/dist/cli/commands/config-cmd.js +334 -0
- package/dist/cli/commands/config-cmd.js.map +1 -0
- package/dist/cli/commands/connections-cmd.d.ts +19 -0
- package/dist/cli/commands/connections-cmd.d.ts.map +1 -0
- package/dist/cli/commands/connections-cmd.js +39 -0
- package/dist/cli/commands/connections-cmd.js.map +1 -0
- package/dist/cli/commands/data-assets-cmd.d.ts +12 -0
- package/dist/cli/commands/data-assets-cmd.d.ts.map +1 -0
- package/dist/cli/commands/data-assets-cmd.js +75 -0
- package/dist/cli/commands/data-assets-cmd.js.map +1 -0
- package/dist/cli/commands/data-contracts-cmd.d.ts +12 -0
- package/dist/cli/commands/data-contracts-cmd.d.ts.map +1 -0
- package/dist/cli/commands/data-contracts-cmd.js +28 -0
- package/dist/cli/commands/data-contracts-cmd.js.map +1 -0
- package/dist/cli/commands/data-products-cmd.d.ts +15 -0
- package/dist/cli/commands/data-products-cmd.d.ts.map +1 -0
- package/dist/cli/commands/data-products-cmd.js +30 -0
- package/dist/cli/commands/data-products-cmd.js.map +1 -0
- package/dist/cli/commands/domains-cmd.d.ts +12 -0
- package/dist/cli/commands/domains-cmd.d.ts.map +1 -0
- package/dist/cli/commands/domains-cmd.js +28 -0
- package/dist/cli/commands/domains-cmd.js.map +1 -0
- package/dist/cli/commands/flows-cmd.d.ts +19 -0
- package/dist/cli/commands/flows-cmd.d.ts.map +1 -0
- package/dist/cli/commands/flows-cmd.js +37 -0
- package/dist/cli/commands/flows-cmd.js.map +1 -0
- package/dist/cli/commands/login.d.ts +28 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +110 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +5 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +9 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/metrics-cmd.d.ts +15 -0
- package/dist/cli/commands/metrics-cmd.d.ts.map +1 -0
- package/dist/cli/commands/metrics-cmd.js +21 -0
- package/dist/cli/commands/metrics-cmd.js.map +1 -0
- package/dist/cli/commands/observe-cmd.d.ts +10 -0
- package/dist/cli/commands/observe-cmd.d.ts.map +1 -0
- package/dist/cli/commands/observe-cmd.js +10 -0
- package/dist/cli/commands/observe-cmd.js.map +1 -0
- package/dist/cli/commands/pipelines-cmd.d.ts +17 -0
- package/dist/cli/commands/pipelines-cmd.d.ts.map +1 -0
- package/dist/cli/commands/pipelines-cmd.js +52 -0
- package/dist/cli/commands/pipelines-cmd.js.map +1 -0
- package/dist/cli/commands/promises-cmd.d.ts +11 -0
- package/dist/cli/commands/promises-cmd.d.ts.map +1 -0
- package/dist/cli/commands/promises-cmd.js +53 -0
- package/dist/cli/commands/promises-cmd.js.map +1 -0
- package/dist/cli/commands/queue-cmd.d.ts +13 -0
- package/dist/cli/commands/queue-cmd.d.ts.map +1 -0
- package/dist/cli/commands/queue-cmd.js +21 -0
- package/dist/cli/commands/queue-cmd.js.map +1 -0
- package/dist/cli/commands/standards-cmd.d.ts +12 -0
- package/dist/cli/commands/standards-cmd.d.ts.map +1 -0
- package/dist/cli/commands/standards-cmd.js +28 -0
- package/dist/cli/commands/standards-cmd.js.map +1 -0
- package/dist/cli/commands/whoami.d.ts +24 -0
- package/dist/cli/commands/whoami.d.ts.map +1 -0
- package/dist/cli/commands/whoami.js +46 -0
- package/dist/cli/commands/whoami.js.map +1 -0
- package/dist/cli/commands/workflows-cmd.d.ts +18 -0
- package/dist/cli/commands/workflows-cmd.d.ts.map +1 -0
- package/dist/cli/commands/workflows-cmd.js +32 -0
- package/dist/cli/commands/workflows-cmd.js.map +1 -0
- package/dist/cli/create-cli-client.d.ts +32 -0
- package/dist/cli/create-cli-client.d.ts.map +1 -0
- package/dist/cli/create-cli-client.js +143 -0
- package/dist/cli/create-cli-client.js.map +1 -0
- package/dist/cli/credentials.d.ts +25 -0
- package/dist/cli/credentials.d.ts.map +1 -0
- package/dist/cli/credentials.js +70 -0
- package/dist/cli/credentials.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +424 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/client/catalog-types.d.ts +22 -0
- package/dist/client/catalog-types.d.ts.map +1 -0
- package/dist/client/catalog-types.js +5 -0
- package/dist/client/catalog-types.js.map +1 -0
- package/dist/client/catalog.d.ts +9 -0
- package/dist/client/catalog.d.ts.map +1 -0
- package/dist/client/catalog.js +29 -0
- package/dist/client/catalog.js.map +1 -0
- package/dist/client/connection-types.d.ts +98 -0
- package/dist/client/connection-types.d.ts.map +1 -0
- package/dist/client/connection-types.js +18 -0
- package/dist/client/connection-types.js.map +1 -0
- package/dist/client/connections.d.ts +18 -0
- package/dist/client/connections.d.ts.map +1 -0
- package/dist/client/connections.js +66 -0
- package/dist/client/connections.js.map +1 -0
- package/dist/client/connectors-types.d.ts +61 -0
- package/dist/client/connectors-types.d.ts.map +1 -0
- package/dist/client/connectors-types.js +6 -0
- package/dist/client/connectors-types.js.map +1 -0
- package/dist/client/connectors.d.ts +27 -0
- package/dist/client/connectors.d.ts.map +1 -0
- package/dist/client/connectors.js +71 -0
- package/dist/client/connectors.js.map +1 -0
- package/dist/client/consumptions-types.d.ts +80 -0
- package/dist/client/consumptions-types.d.ts.map +1 -0
- package/dist/client/consumptions-types.js +5 -0
- package/dist/client/consumptions-types.js.map +1 -0
- package/dist/client/consumptions.d.ts +14 -0
- package/dist/client/consumptions.d.ts.map +1 -0
- package/dist/client/consumptions.js +47 -0
- package/dist/client/consumptions.js.map +1 -0
- package/dist/client/data-assets-types.d.ts +150 -0
- package/dist/client/data-assets-types.d.ts.map +1 -0
- package/dist/client/data-assets-types.js +5 -0
- package/dist/client/data-assets-types.js.map +1 -0
- package/dist/client/data-assets.d.ts +31 -0
- package/dist/client/data-assets.d.ts.map +1 -0
- package/dist/client/data-assets.js +182 -0
- package/dist/client/data-assets.js.map +1 -0
- package/dist/client/data-product-resolver.d.ts +92 -0
- package/dist/client/data-product-resolver.d.ts.map +1 -0
- package/dist/client/data-product-resolver.js +165 -0
- package/dist/client/data-product-resolver.js.map +1 -0
- package/dist/client/data-products-types.d.ts +182 -0
- package/dist/client/data-products-types.d.ts.map +1 -0
- package/dist/client/data-products-types.js +5 -0
- package/dist/client/data-products-types.js.map +1 -0
- package/dist/client/data-products.d.ts +63 -0
- package/dist/client/data-products.d.ts.map +1 -0
- package/dist/client/data-products.js +461 -0
- package/dist/client/data-products.js.map +1 -0
- package/dist/client/discovery-types.d.ts +74 -0
- package/dist/client/discovery-types.d.ts.map +1 -0
- package/dist/client/discovery-types.js +6 -0
- package/dist/client/discovery-types.js.map +1 -0
- package/dist/client/discovery.d.ts +14 -0
- package/dist/client/discovery.d.ts.map +1 -0
- package/dist/client/discovery.js +57 -0
- package/dist/client/discovery.js.map +1 -0
- package/dist/client/domains-types.d.ts +46 -0
- package/dist/client/domains-types.d.ts.map +1 -0
- package/dist/client/domains-types.js +6 -0
- package/dist/client/domains-types.js.map +1 -0
- package/dist/client/domains.d.ts +11 -0
- package/dist/client/domains.d.ts.map +1 -0
- package/dist/client/domains.js +39 -0
- package/dist/client/domains.js.map +1 -0
- package/dist/client/flow-queue-resolve.d.ts +9 -0
- package/dist/client/flow-queue-resolve.d.ts.map +1 -0
- package/dist/client/flow-queue-resolve.js +17 -0
- package/dist/client/flow-queue-resolve.js.map +1 -0
- package/dist/client/flow-types.d.ts +112 -0
- package/dist/client/flow-types.d.ts.map +1 -0
- package/dist/client/flow-types.js +6 -0
- package/dist/client/flow-types.js.map +1 -0
- package/dist/client/flows.d.ts +33 -0
- package/dist/client/flows.d.ts.map +1 -0
- package/dist/client/flows.js +293 -0
- package/dist/client/flows.js.map +1 -0
- package/dist/client/index.d.ts +28 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/instances-types.d.ts +40 -0
- package/dist/client/instances-types.d.ts.map +1 -0
- package/dist/client/instances-types.js +6 -0
- package/dist/client/instances-types.js.map +1 -0
- package/dist/client/instances.d.ts +29 -0
- package/dist/client/instances.d.ts.map +1 -0
- package/dist/client/instances.js +41 -0
- package/dist/client/instances.js.map +1 -0
- package/dist/client/loxtep-client.d.ts +111 -0
- package/dist/client/loxtep-client.d.ts.map +1 -0
- package/dist/client/loxtep-client.js +262 -0
- package/dist/client/loxtep-client.js.map +1 -0
- package/dist/client/observe-types.d.ts +17 -0
- package/dist/client/observe-types.d.ts.map +1 -0
- package/dist/client/observe-types.js +5 -0
- package/dist/client/observe-types.js.map +1 -0
- package/dist/client/observe.d.ts +15 -0
- package/dist/client/observe.d.ts.map +1 -0
- package/dist/client/observe.js +22 -0
- package/dist/client/observe.js.map +1 -0
- package/dist/client/pipelines-types.d.ts +3 -0
- package/dist/client/pipelines-types.d.ts.map +1 -0
- package/dist/client/pipelines-types.js +3 -0
- package/dist/client/pipelines-types.js.map +1 -0
- package/dist/client/pipelines.d.ts +3 -0
- package/dist/client/pipelines.d.ts.map +1 -0
- package/dist/client/pipelines.js +3 -0
- package/dist/client/pipelines.js.map +1 -0
- package/dist/client/procedures-types.d.ts +25 -0
- package/dist/client/procedures-types.d.ts.map +1 -0
- package/dist/client/procedures-types.js +6 -0
- package/dist/client/procedures-types.js.map +1 -0
- package/dist/client/procedures.d.ts +19 -0
- package/dist/client/procedures.d.ts.map +1 -0
- package/dist/client/procedures.js +33 -0
- package/dist/client/procedures.js.map +1 -0
- package/dist/client/process-intelligence-types.d.ts +45 -0
- package/dist/client/process-intelligence-types.d.ts.map +1 -0
- package/dist/client/process-intelligence-types.js +6 -0
- package/dist/client/process-intelligence-types.js.map +1 -0
- package/dist/client/process-intelligence.d.ts +17 -0
- package/dist/client/process-intelligence.d.ts.map +1 -0
- package/dist/client/process-intelligence.js +50 -0
- package/dist/client/process-intelligence.js.map +1 -0
- package/dist/client/projects-types.d.ts +79 -0
- package/dist/client/projects-types.d.ts.map +1 -0
- package/dist/client/projects-types.js +6 -0
- package/dist/client/projects-types.js.map +1 -0
- package/dist/client/projects.d.ts +19 -0
- package/dist/client/projects.d.ts.map +1 -0
- package/dist/client/projects.js +53 -0
- package/dist/client/projects.js.map +1 -0
- package/dist/client/promises-types.d.ts +56 -0
- package/dist/client/promises-types.d.ts.map +1 -0
- package/dist/client/promises-types.js +6 -0
- package/dist/client/promises-types.js.map +1 -0
- package/dist/client/promises.d.ts +11 -0
- package/dist/client/promises.d.ts.map +1 -0
- package/dist/client/promises.js +41 -0
- package/dist/client/promises.js.map +1 -0
- package/dist/client/quality-types.d.ts +62 -0
- package/dist/client/quality-types.d.ts.map +1 -0
- package/dist/client/quality-types.js +5 -0
- package/dist/client/quality-types.js.map +1 -0
- package/dist/client/quality.d.ts +12 -0
- package/dist/client/quality.d.ts.map +1 -0
- package/dist/client/quality.js +57 -0
- package/dist/client/quality.js.map +1 -0
- package/dist/client/queue-types.d.ts +84 -0
- package/dist/client/queue-types.d.ts.map +1 -0
- package/dist/client/queue-types.js +5 -0
- package/dist/client/queue-types.js.map +1 -0
- package/dist/client/queues.d.ts +61 -0
- package/dist/client/queues.d.ts.map +1 -0
- package/dist/client/queues.js +138 -0
- package/dist/client/queues.js.map +1 -0
- package/dist/client/schemas-types.d.ts +27 -0
- package/dist/client/schemas-types.d.ts.map +1 -0
- package/dist/client/schemas-types.js +5 -0
- package/dist/client/schemas-types.js.map +1 -0
- package/dist/client/schemas.d.ts +11 -0
- package/dist/client/schemas.d.ts.map +1 -0
- package/dist/client/schemas.js +22 -0
- package/dist/client/schemas.js.map +1 -0
- package/dist/client/standards-types.d.ts +45 -0
- package/dist/client/standards-types.d.ts.map +1 -0
- package/dist/client/standards-types.js +6 -0
- package/dist/client/standards-types.js.map +1 -0
- package/dist/client/standards.d.ts +11 -0
- package/dist/client/standards.d.ts.map +1 -0
- package/dist/client/standards.js +41 -0
- package/dist/client/standards.js.map +1 -0
- package/dist/client/stubs.d.ts +35 -0
- package/dist/client/stubs.d.ts.map +1 -0
- package/dist/client/stubs.js +30 -0
- package/dist/client/stubs.js.map +1 -0
- package/dist/client/templates-types.d.ts +70 -0
- package/dist/client/templates-types.d.ts.map +1 -0
- package/dist/client/templates-types.js +7 -0
- package/dist/client/templates-types.js.map +1 -0
- package/dist/client/templates.d.ts +12 -0
- package/dist/client/templates.d.ts.map +1 -0
- package/dist/client/templates.js +38 -0
- package/dist/client/templates.js.map +1 -0
- package/dist/client/thesaurus-types.d.ts +28 -0
- package/dist/client/thesaurus-types.d.ts.map +1 -0
- package/dist/client/thesaurus-types.js +5 -0
- package/dist/client/thesaurus-types.js.map +1 -0
- package/dist/client/thesaurus.d.ts +11 -0
- package/dist/client/thesaurus.d.ts.map +1 -0
- package/dist/client/thesaurus.js +35 -0
- package/dist/client/thesaurus.js.map +1 -0
- package/dist/client/types.d.ts +80 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +2 -0
- package/dist/client/types.js.map +1 -0
- package/dist/client/versions-types.d.ts +47 -0
- package/dist/client/versions-types.d.ts.map +1 -0
- package/dist/client/versions-types.js +9 -0
- package/dist/client/versions-types.js.map +1 -0
- package/dist/client/versions.d.ts +14 -0
- package/dist/client/versions.d.ts.map +1 -0
- package/dist/client/versions.js +14 -0
- package/dist/client/versions.js.map +1 -0
- package/dist/client/workflows-types.d.ts +56 -0
- package/dist/client/workflows-types.d.ts.map +1 -0
- package/dist/client/workflows-types.js +6 -0
- package/dist/client/workflows-types.js.map +1 -0
- package/dist/client/workflows.d.ts +15 -0
- package/dist/client/workflows.d.ts.map +1 -0
- package/dist/client/workflows.js +50 -0
- package/dist/client/workflows.js.map +1 -0
- package/dist/config/api-path.d.ts +17 -0
- package/dist/config/api-path.d.ts.map +1 -0
- package/dist/config/api-path.js +57 -0
- package/dist/config/api-path.js.map +1 -0
- package/dist/config/index.d.ts +10 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +9 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/load.d.ts +12 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +152 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/paths.d.ts +5 -0
- package/dist/config/paths.d.ts.map +1 -0
- package/dist/config/paths.js +11 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/platform-request-url.d.ts +35 -0
- package/dist/config/platform-request-url.d.ts.map +1 -0
- package/dist/config/platform-request-url.js +100 -0
- package/dist/config/platform-request-url.js.map +1 -0
- package/dist/config/resolve-sdk-urls.d.ts +39 -0
- package/dist/config/resolve-sdk-urls.d.ts.map +1 -0
- package/dist/config/resolve-sdk-urls.js +130 -0
- package/dist/config/resolve-sdk-urls.js.map +1 -0
- package/dist/config/save.d.ts +7 -0
- package/dist/config/save.d.ts.map +1 -0
- package/dist/config/save.js +26 -0
- package/dist/config/save.js.map +1 -0
- package/dist/config/streams-partial.d.ts +9 -0
- package/dist/config/streams-partial.d.ts.map +1 -0
- package/dist/config/streams-partial.js +30 -0
- package/dist/config/streams-partial.js.map +1 -0
- package/dist/config/types.d.ts +37 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +11 -0
- package/dist/config/types.js.map +1 -0
- package/dist/errors/auth.d.ts +10 -0
- package/dist/errors/auth.d.ts.map +1 -0
- package/dist/errors/auth.js +26 -0
- package/dist/errors/auth.js.map +1 -0
- package/dist/errors/base.d.ts +15 -0
- package/dist/errors/base.d.ts.map +1 -0
- package/dist/errors/base.js +32 -0
- package/dist/errors/base.js.map +1 -0
- package/dist/errors/index.d.ts +15 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +14 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/parse-http.d.ts +13 -0
- package/dist/errors/parse-http.d.ts.map +1 -0
- package/dist/errors/parse-http.js +68 -0
- package/dist/errors/parse-http.js.map +1 -0
- package/dist/errors/rate-limit.d.ts +17 -0
- package/dist/errors/rate-limit.d.ts.map +1 -0
- package/dist/errors/rate-limit.js +23 -0
- package/dist/errors/rate-limit.js.map +1 -0
- package/dist/errors/resource.d.ts +18 -0
- package/dist/errors/resource.d.ts.map +1 -0
- package/dist/errors/resource.js +32 -0
- package/dist/errors/resource.js.map +1 -0
- package/dist/errors/streaming.d.ts +19 -0
- package/dist/errors/streaming.d.ts.map +1 -0
- package/dist/errors/streaming.js +32 -0
- package/dist/errors/streaming.js.map +1 -0
- package/dist/errors/types.d.ts +44 -0
- package/dist/errors/types.d.ts.map +1 -0
- package/dist/errors/types.js +2 -0
- package/dist/errors/types.js.map +1 -0
- package/dist/errors/validation.d.ts +23 -0
- package/dist/errors/validation.d.ts.map +1 -0
- package/dist/errors/validation.js +37 -0
- package/dist/errors/validation.js.map +1 -0
- package/dist/http/client.d.ts +51 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +164 -0
- package/dist/http/client.js.map +1 -0
- package/dist/http/index.d.ts +5 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +3 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/signer.d.ts +15 -0
- package/dist/http/signer.d.ts.map +1 -0
- package/dist/http/signer.js +55 -0
- package/dist/http/signer.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/rstreams/configuration.d.ts +11 -0
- package/dist/rstreams/configuration.d.ts.map +1 -0
- package/dist/rstreams/configuration.js +43 -0
- package/dist/rstreams/configuration.js.map +1 -0
- package/dist/rstreams/event-bridge.d.ts +16 -0
- package/dist/rstreams/event-bridge.d.ts.map +1 -0
- package/dist/rstreams/event-bridge.js +45 -0
- package/dist/rstreams/event-bridge.js.map +1 -0
- package/dist/rstreams/leo-runtime.d.ts +9 -0
- package/dist/rstreams/leo-runtime.d.ts.map +1 -0
- package/dist/rstreams/leo-runtime.js +14 -0
- package/dist/rstreams/leo-runtime.js.map +1 -0
- package/dist/streaming/index.d.ts +2 -0
- package/dist/streaming/index.d.ts.map +1 -0
- package/dist/streaming/index.js +2 -0
- package/dist/streaming/index.js.map +1 -0
- package/dist/streaming/transformer.d.ts +15 -0
- package/dist/streaming/transformer.d.ts.map +1 -0
- package/dist/streaming/transformer.js +25 -0
- package/dist/streaming/transformer.js.map +1 -0
- package/dist/types/generated-api.d.ts +146 -0
- package/dist/types/generated-api.d.ts.map +1 -0
- package/dist/types/generated-api.js +7 -0
- package/dist/types/generated-api.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/docs/event-replay-cookbook.md +152 -0
- package/docs/getting-started.md +332 -0
- package/docs/quick-reference.md +256 -0
- package/docs/sdk-bus-rbac-threat-model.md +46 -0
- package/docs/sdk-control-vs-data-plane.md +32 -0
- package/docs/sdk-ingestion-export-guide.md +480 -0
- package/docs/sdk-mcp-mapping.md +20 -0
- package/docs/sdk-pairing.md +42 -0
- package/docs/sdk-rest-vs-bus.md +131 -0
- package/package.json +85 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `@loxtep/sdk` will be documented in this file.
|
|
4
|
+
|
|
5
|
+
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
+
and this project adheres to
|
|
7
|
+
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
8
|
+
|
|
9
|
+
## [0.1.0] - Unreleased
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Initial SDK release
|
|
14
|
+
- `LoxtepClient` with JWT and SigV4 authentication
|
|
15
|
+
- Data products API (list, get, search, query, stream, replay)
|
|
16
|
+
- Flows API (list, get, create, get_writer)
|
|
17
|
+
- Connections API (list, get, create, test)
|
|
18
|
+
- Queues API (metadata, checkpoints, open_reader, open_writer)
|
|
19
|
+
- Quality API (list, get)
|
|
20
|
+
- Catalog and Discovery APIs
|
|
21
|
+
- Schemas, Projects, Domains, Standards, Data Contracts APIs
|
|
22
|
+
- Process Intelligence API (entity context, decision traces)
|
|
23
|
+
- Observe API (status, stream_config)
|
|
24
|
+
- FlowWriter with transparent batching
|
|
25
|
+
- QueueReader with async iteration
|
|
26
|
+
- Stream helpers (`mapStream`, `filterStream`)
|
|
27
|
+
- CLI (`loxtep`) with login, config, data-products, flows, connections, queues
|
|
28
|
+
commands
|
|
29
|
+
- Typed errors (`@loxtep/sdk/errors`)
|
|
30
|
+
- Generated API types from Zod schemas
|
package/README.md
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
# Loxtep Node.js SDK
|
|
2
|
+
|
|
3
|
+
Client for the Loxtep API. Customer-facing surface: **data_products**,
|
|
4
|
+
**flows**, **connections**, **queues**, **quality**, **catalog**, **discovery**,
|
|
5
|
+
**schemas**, **projects**, **domains**, **standards**, **data_contracts**.
|
|
6
|
+
|
|
7
|
+
**Node.js 22+** is the supported runtime (`engines` in `package.json`). **Live**
|
|
8
|
+
queue/flow writes use the **Loxtep stream** data plane; configure stream bus
|
|
9
|
+
resources (`streams` on `LoxtepClient` and instance env from your stack) and AWS
|
|
10
|
+
credentials for SigV4 on both REST and the bus.
|
|
11
|
+
|
|
12
|
+
## Quick start (< 5 min to first stream)
|
|
13
|
+
|
|
14
|
+
1. **Install**
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm install @loxtep/sdk
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
2. **Configure and log in**
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npx loxtep config set api_url https://api.loxtep.com
|
|
24
|
+
npx loxtep login
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Tokens resolve in this order: **`LOXTEP_AUTH_TOKEN`** →
|
|
28
|
+
**`~/.loxtep/credentials.json`** (shared with
|
|
29
|
+
`npx @loxtep/customer-mcp-server login`).
|
|
30
|
+
|
|
31
|
+
3. **Create a client, write and read events**
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { LoxtepClient } from '@loxtep/sdk';
|
|
35
|
+
|
|
36
|
+
const client = new LoxtepClient({
|
|
37
|
+
api_url: 'https://api.loxtep.com',
|
|
38
|
+
auth: { type: 'jwt', token: process.env.LOXTEP_TOKEN },
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Write events to a data product
|
|
42
|
+
const writer = await client.data_products.get_writer('shopify_gql_customer');
|
|
43
|
+
writer.write({
|
|
44
|
+
customer_id: '123',
|
|
45
|
+
name: 'Alice',
|
|
46
|
+
email: 'alice@example.com',
|
|
47
|
+
});
|
|
48
|
+
await writer.close();
|
|
49
|
+
|
|
50
|
+
// Read events from a data product
|
|
51
|
+
const reader = await client.data_products.get_reader('shopify_gql_customer');
|
|
52
|
+
for await (const event of reader) {
|
|
53
|
+
console.log(event);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
That's it. The SDK resolves the data product's queue, bot identity, and
|
|
58
|
+
stream bus configuration automatically from the deployment metadata. No
|
|
59
|
+
manual queue names, no stream config, no bot IDs.
|
|
60
|
+
|
|
61
|
+
4. **Lower-level escape hatch** — if you need explicit control over bot_id,
|
|
62
|
+
queue name, or stream bus resources, use `flows.get_writer` directly:
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
const writer = client.flows.get_writer('your-flow-id', {
|
|
66
|
+
bot_id: 'your-bot-id',
|
|
67
|
+
output_queue_name: 'your-ingest-queue',
|
|
68
|
+
});
|
|
69
|
+
writer.write({ id: 'e1', payload: { name: 'Alice' } });
|
|
70
|
+
await writer.close();
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
5. **Stream config from the platform (optional)** — after login,
|
|
74
|
+
`await client.observe.stream_config()` returns Leo/RStreams resource names
|
|
75
|
+
via **`GET /observe/stream-config`** (Observe proxy + `instances:read`).
|
|
76
|
+
Merge into `new LoxtepClient({ ...opts, streams: { ...partial } })` with your
|
|
77
|
+
JWT-backed client. Note: `data_products.get_writer` and `get_reader` resolve
|
|
78
|
+
stream config automatically — this is only needed for manual bus access.
|
|
79
|
+
|
|
80
|
+
## Quick start: "Tell me everything about this order"
|
|
81
|
+
|
|
82
|
+
Process Intelligence returns unified context from all connected systems
|
|
83
|
+
(Shopify, Stripe, Gorgias, etc.) for a given entity:
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
import { LoxtepClient } from '@loxtep/sdk';
|
|
87
|
+
|
|
88
|
+
const client = new LoxtepClient({
|
|
89
|
+
api_url: 'https://api.loxtep.com',
|
|
90
|
+
auth: { type: 'jwt', token: process.env.LOXTEP_AUTH_TOKEN! },
|
|
91
|
+
organization_id: process.env.LOXTEP_ORGANIZATION_ID,
|
|
92
|
+
credentials: {
|
|
93
|
+
accessKeyId: process.env.AWS_ACCESS_KEY_ID ?? 'cli',
|
|
94
|
+
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY ?? 'cli',
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
// Tell me everything about order #4821
|
|
99
|
+
const context = await client.process_intelligence.getEntityContext(
|
|
100
|
+
client.organization_id!,
|
|
101
|
+
{ entity_type: 'order', entity_id: '4821' }
|
|
102
|
+
);
|
|
103
|
+
console.log(context); // Shopify order + Stripe payments + support tickets, etc.
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
See
|
|
107
|
+
[Process Intelligence API Guide](../../docs/api/process-intelligence-guide.md)
|
|
108
|
+
for full API and MCP tool reference.
|
|
109
|
+
|
|
110
|
+
## API surface
|
|
111
|
+
|
|
112
|
+
- **data_products** – get, list, search, query, list_tables, create, stream,
|
|
113
|
+
replay, **get_writer**, **get_reader**, invalidate_cache
|
|
114
|
+
- **flows** – list, get, create, get_writer
|
|
115
|
+
- **connections** – list, get, create, test
|
|
116
|
+
- **queues** – get_queue_metadata, get_reader_checkpoint, open_reader,
|
|
117
|
+
open_writer
|
|
118
|
+
- **quality** – list, get
|
|
119
|
+
- **catalog** – search
|
|
120
|
+
- **discovery** – search (access-filtered catalog search with optional
|
|
121
|
+
evidence/lineage), getEvidence, getLineageImpact, getGovernanceFlags,
|
|
122
|
+
runDiscovery (all call `POST /ai/mcp/tools/call`; results are access-filtered
|
|
123
|
+
when user context is present)
|
|
124
|
+
- **schemas** – get (data product schema)
|
|
125
|
+
- **observe** – `status`, **`stream_config`** (proxied bus resource names for
|
|
126
|
+
SDK `streams`)
|
|
127
|
+
- **projects**, **domains**, **standards**, **data_contracts** – list, get (full
|
|
128
|
+
CRUD where applicable)
|
|
129
|
+
|
|
130
|
+
## Data product writer and reader
|
|
131
|
+
|
|
132
|
+
`await client.data_products.get_writer('name')` resolves the data product's
|
|
133
|
+
queue, bot identity, and stream bus config automatically, then returns a
|
|
134
|
+
**FlowWriter**:
|
|
135
|
+
|
|
136
|
+
```ts
|
|
137
|
+
const writer = await client.data_products.get_writer('shopify_gql_customer');
|
|
138
|
+
writer.write({ customer_id: '123', name: 'Alice', email: 'alice@example.com' });
|
|
139
|
+
await writer.close();
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`await client.data_products.get_reader('name')` returns an async iterable over
|
|
143
|
+
the data product's queue:
|
|
144
|
+
|
|
145
|
+
```ts
|
|
146
|
+
const reader = await client.data_products.get_reader('shopify_gql_customer');
|
|
147
|
+
for await (const event of reader) {
|
|
148
|
+
console.log(event);
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
Options:
|
|
153
|
+
|
|
154
|
+
- **Writer**: `{ bot_id?, batch_size?, max_retries? }`
|
|
155
|
+
- **Reader**: `{ bot_id?, from?, batch_size? }`
|
|
156
|
+
|
|
157
|
+
Cache: call `client.data_products.invalidate_cache('name')` to force
|
|
158
|
+
re-resolution on the next call.
|
|
159
|
+
|
|
160
|
+
## Flow writer (lower-level escape hatch)
|
|
161
|
+
|
|
162
|
+
`client.flows.get_writer(flow_id)` returns a **FlowWriter** with:
|
|
163
|
+
|
|
164
|
+
- **`write(event)`** – enqueues an event. Batching is transparent: you do not
|
|
165
|
+
control batch size or flush timing.
|
|
166
|
+
- **`close()`** – flushes any buffered events and guarantees delivery (or
|
|
167
|
+
attempts to). Always call `close()` when done writing.
|
|
168
|
+
|
|
169
|
+
Example:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
const writer = client.flows.get_writer(flowId, { bot_id: 'your-bot-id' });
|
|
173
|
+
writer.write({ id: 'e1', payload: { name: 'Alice' } });
|
|
174
|
+
writer.write({ id: 'e2', payload: { name: 'Bob' } });
|
|
175
|
+
await writer.close();
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
Buffered events flush on `close()` via stream **`putEvents`** to the resolved
|
|
179
|
+
output queue (see `docs/sdk-control-vs-data-plane.md`).
|
|
180
|
+
|
|
181
|
+
## Stream helpers
|
|
182
|
+
|
|
183
|
+
Use `mapStream` and `filterStream` with `data_products.stream()`,
|
|
184
|
+
`data_products.replay()`, or `queues.open_reader().read()`:
|
|
185
|
+
|
|
186
|
+
```ts
|
|
187
|
+
import { mapStream, filterStream } from '@loxtep/sdk';
|
|
188
|
+
|
|
189
|
+
for await (const event of mapStream(reader.read(), e => e.payload)) {
|
|
190
|
+
console.log(event);
|
|
191
|
+
}
|
|
192
|
+
for await (const event of filterStream(
|
|
193
|
+
reader.read(),
|
|
194
|
+
e => e.event_id !== 'skip'
|
|
195
|
+
)) {
|
|
196
|
+
console.log(event);
|
|
197
|
+
}
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
## Generated API types
|
|
201
|
+
|
|
202
|
+
Types for API request/response shapes (data_product, workflow, connection, etc.)
|
|
203
|
+
are generated from Zod schemas and exported from `@loxtep/sdk`:
|
|
204
|
+
|
|
205
|
+
```ts
|
|
206
|
+
import type { DataProductApi, FlowApi, ConnectionApi } from '@loxtep/sdk';
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
Regenerate after changing `scripts/api-schemas.ts`:
|
|
210
|
+
|
|
211
|
+
```bash
|
|
212
|
+
pnpm run generate:api-types
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
## Documentation
|
|
216
|
+
|
|
217
|
+
- **[Event replay cookbook](docs/event-replay-cookbook.md)** – Replay events
|
|
218
|
+
from a data product or queue (key differentiator).
|
|
219
|
+
- **[MCP + SDK pairing](docs/sdk-pairing.md)** – one auth story, when MCP vs
|
|
220
|
+
SDK.
|
|
221
|
+
- **[Control vs data plane](docs/sdk-control-vs-data-plane.md)** – REST vs
|
|
222
|
+
Loxtep streams.
|
|
223
|
+
- **[REST SigV4 vs bus](docs/sdk-rest-vs-bus.md)** – never mix secrets.
|
|
224
|
+
- **[MCP → SDK mapping](docs/sdk-mcp-mapping.md)** – agent-oriented table.
|
|
225
|
+
- **[Bus RBAC threat model](docs/sdk-bus-rbac-threat-model.md)** – issuance
|
|
226
|
+
direction.
|
|
227
|
+
- **Typed errors** – `import { … } from '@loxtep/sdk/errors'`.
|
|
228
|
+
- **API reference** – `npm run docs` (Typedoc).
|
|
229
|
+
|
|
230
|
+
## CLI reference
|
|
231
|
+
|
|
232
|
+
| Command | Description |
|
|
233
|
+
| ---------------------------------------------------- | ----------------------------------------------------------- |
|
|
234
|
+
| `login` | Log in with email/password (prompts if not provided) |
|
|
235
|
+
| `logout` | Remove stored credentials |
|
|
236
|
+
| `whoami` | Print current user and organization |
|
|
237
|
+
| `init` | Setup checklist + doc pointers |
|
|
238
|
+
| `config list` | Show api_url, organization_id, project_id, instance_id |
|
|
239
|
+
| `config set <key> <value>` | Set api_url \| organization_id \| project_id \| instance_id |
|
|
240
|
+
| `config export --from-data-product <id>` | Print shell exports / JSON for SDK bootstrap |
|
|
241
|
+
| `bus login` | Explain bus vs JWT (placeholder for future session API) |
|
|
242
|
+
| `data-products list` | List data products |
|
|
243
|
+
| `data-products get <id>` | Get data product by id |
|
|
244
|
+
| `data-products create --name … --domain-id …` | Create data product |
|
|
245
|
+
| `data-products query <id> <SQL>` | Run SQL in data product context (or `--file query.sql`) |
|
|
246
|
+
| `data-products tables <id>` | List tables for data product |
|
|
247
|
+
| `flows list [--project-id <id>]` | List flows (project_id required or from config) |
|
|
248
|
+
| `flows get <id>` | Get flow by id (with nodes) |
|
|
249
|
+
| `flows create --name <n> --project-id <id>` | Create flow (optional: `--template-id`, `--description`) |
|
|
250
|
+
| `connections list` | List connections |
|
|
251
|
+
| `connections get <id>` | Get connection by id |
|
|
252
|
+
| `connections create --name <n> --type <t> --key <k>` | Create connection |
|
|
253
|
+
| `connections test <id>` | Test connection |
|
|
254
|
+
| `queue info <data-product-id>` | Queue info by data product id |
|
|
255
|
+
| `queue info --queue <name>` | Queue info by queue name |
|
|
256
|
+
| `queue checkpoint <id> --bot <bot-id>` | Reader checkpoint for data product and bot |
|
|
257
|
+
| `domains list` \| `domains get <id>` | List or get domain |
|
|
258
|
+
| `standards list` \| `standards get <id>` | List or get standard (policy) |
|
|
259
|
+
| `data-contracts list` \| `data-contracts get <id>` | List or get data contract |
|
|
260
|
+
| `metrics rate-limits` | Show rate limit info |
|
|
261
|
+
| `metrics log --id <id> --value <n>` | Log metric (optional `--tags k=v,...`) |
|
|
262
|
+
|
|
263
|
+
Examples:
|
|
264
|
+
|
|
265
|
+
```bash
|
|
266
|
+
loxtep login
|
|
267
|
+
loxtep whoami
|
|
268
|
+
loxtep data-products list
|
|
269
|
+
loxtep flows list --project-id <project-id>
|
|
270
|
+
loxtep flows get <flow-id>
|
|
271
|
+
loxtep queue info <data-product-id>
|
|
272
|
+
loxtep data-products query <data-product-id> "SELECT * FROM t LIMIT 10"
|
|
273
|
+
loxtep metrics rate-limits
|
|
274
|
+
```
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { decodeJwtPayload, DEFAULT_REFRESH_THRESHOLD_SECONDS } from './jwt.js';
|
|
2
|
+
export { TokenManager } from './token-manager.js';
|
|
3
|
+
export type { TokenState } from './token-manager.js';
|
|
4
|
+
export { login, refresh, LoginMfaRequiredError } from './login.js';
|
|
5
|
+
export type { AwsCredentialsSnake, LoginResponse, RefreshResponse } from './login.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AACnE,YAAY,EAAE,mBAAmB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iCAAiC,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decode JWT payload to read exp (expiry) without verification.
|
|
3
|
+
* Used client-side only for refresh threshold; do not use for security decisions.
|
|
4
|
+
*/
|
|
5
|
+
export declare function decodeJwtPayload(token: string): {
|
|
6
|
+
exp?: number;
|
|
7
|
+
};
|
|
8
|
+
/** Default refresh threshold: refresh when less than 5 minutes until expiry. */
|
|
9
|
+
export declare const DEFAULT_REFRESH_THRESHOLD_SECONDS = 300;
|
|
10
|
+
//# sourceMappingURL=jwt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAehE;AAED,gFAAgF;AAChF,eAAO,MAAM,iCAAiC,MAAM,CAAC"}
|
package/dist/auth/jwt.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decode JWT payload to read exp (expiry) without verification.
|
|
3
|
+
* Used client-side only for refresh threshold; do not use for security decisions.
|
|
4
|
+
*/
|
|
5
|
+
export function decodeJwtPayload(token) {
|
|
6
|
+
try {
|
|
7
|
+
const parts = token.split('.');
|
|
8
|
+
if (parts.length !== 3)
|
|
9
|
+
return {};
|
|
10
|
+
const payload = parts[1];
|
|
11
|
+
if (!payload)
|
|
12
|
+
return {};
|
|
13
|
+
const decoded = Buffer.from(payload.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf-8');
|
|
14
|
+
const parsed = JSON.parse(decoded);
|
|
15
|
+
const exp = typeof parsed.exp === 'number' ? parsed.exp : undefined;
|
|
16
|
+
return { exp };
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return {};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Default refresh threshold: refresh when less than 5 minutes until expiry. */
|
|
23
|
+
export const DEFAULT_REFRESH_THRESHOLD_SECONDS = 300;
|
|
24
|
+
//# sourceMappingURL=jwt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAC3F,OAAO,CACR,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;QAC9D,MAAM,GAAG,GAAG,OAAO,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;QACpE,OAAO,EAAE,GAAG,EAAE,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,iCAAiC,GAAG,GAAG,CAAC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Login and refresh using platform auth endpoints.
|
|
3
|
+
* POST .../{app}/auth/login and POST .../{app}/auth/refresh (first segment = app microservice by default). No token on disk.
|
|
4
|
+
*/
|
|
5
|
+
/** Thrown when POST /auth/login returns 403 and the user must supply TOTP (same as the web app for MFA). */
|
|
6
|
+
export declare class LoginMfaRequiredError extends Error {
|
|
7
|
+
readonly name = "LoginMfaRequiredError";
|
|
8
|
+
constructor();
|
|
9
|
+
}
|
|
10
|
+
/** Same snake_case shape as platform login/refresh JSON. */
|
|
11
|
+
export type AwsCredentialsSnake = {
|
|
12
|
+
access_key_id: string;
|
|
13
|
+
secret_access_key: string;
|
|
14
|
+
session_token: string;
|
|
15
|
+
expiration: string;
|
|
16
|
+
};
|
|
17
|
+
export interface LoginResponse {
|
|
18
|
+
access_token: string;
|
|
19
|
+
refresh_token?: string;
|
|
20
|
+
expires_in: number;
|
|
21
|
+
expires_at: string;
|
|
22
|
+
aws_credentials?: AwsCredentialsSnake;
|
|
23
|
+
}
|
|
24
|
+
export interface RefreshResponse {
|
|
25
|
+
access_token: string;
|
|
26
|
+
refresh_token: string;
|
|
27
|
+
expires_in: number;
|
|
28
|
+
expires_at: string;
|
|
29
|
+
aws_credentials?: AwsCredentialsSnake;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Login with email/password. POST `{apiUrl}/{auth_path}/auth/login` (default `auth_path` = `app`).
|
|
33
|
+
* Returns tokens; caller should set them in TokenManager (no disk).
|
|
34
|
+
*/
|
|
35
|
+
export declare function login(apiUrl: string, email: string, password: string, options?: {
|
|
36
|
+
organization_id?: string;
|
|
37
|
+
mfa_code?: string;
|
|
38
|
+
/** Omitted: default `app`. Set to `""` to omit (if `api_url` already includes `/app`). */
|
|
39
|
+
auth_path_prefix?: string;
|
|
40
|
+
fetchFn?: typeof fetch;
|
|
41
|
+
}): Promise<LoginResponse>;
|
|
42
|
+
/**
|
|
43
|
+
* Refresh access token. POST `{apiUrl}/{auth_path}/auth/refresh` (default path segment: `app`).
|
|
44
|
+
*/
|
|
45
|
+
export declare function refresh(apiUrl: string, refreshToken: string, options?: {
|
|
46
|
+
auth_path_prefix?: string;
|
|
47
|
+
fetchFn?: typeof fetch;
|
|
48
|
+
}): Promise<RefreshResponse>;
|
|
49
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/auth/login.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,4GAA4G;AAC5G,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,2BAA2B;;CAIlD;AAED,4DAA4D;AAC5D,MAAM,MAAM,mBAAmB,GAAG;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAED,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,mBAAmB,CAAC;CACvC;AAiED;;;GAGG;AACH,wBAAsB,KAAK,CACzB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;IACR,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0FAA0F;IAC1F,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB,GACA,OAAO,CAAC,aAAa,CAAC,CAgDxB;AAED;;GAEG;AACH,wBAAsB,OAAO,CAC3B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAA;CAAE,GAC9D,OAAO,CAAC,eAAe,CAAC,CA4C1B"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { buildAuthServiceUrl } from '../config/api-path.js';
|
|
2
|
+
/**
|
|
3
|
+
* Login and refresh using platform auth endpoints.
|
|
4
|
+
* POST .../{app}/auth/login and POST .../{app}/auth/refresh (first segment = app microservice by default). No token on disk.
|
|
5
|
+
*/
|
|
6
|
+
/** Thrown when POST /auth/login returns 403 and the user must supply TOTP (same as the web app for MFA). */
|
|
7
|
+
export class LoginMfaRequiredError extends Error {
|
|
8
|
+
name = 'LoginMfaRequiredError';
|
|
9
|
+
constructor() {
|
|
10
|
+
super('MFA code required');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const DEFAULT_FETCH = typeof fetch !== 'undefined' ? fetch : undefined;
|
|
14
|
+
/** Undici/Node `fetch` throws `TypeError: fetch failed` with no URL; rethrow with `POST {url}` and `error.cause`. */
|
|
15
|
+
function rethrowNetworkError(method, url, err) {
|
|
16
|
+
const e = err instanceof Error ? err : new Error(String(err));
|
|
17
|
+
const cause = e.cause;
|
|
18
|
+
const causeMsg = cause instanceof Error
|
|
19
|
+
? cause.message
|
|
20
|
+
: cause !== undefined && cause !== null
|
|
21
|
+
? String(cause)
|
|
22
|
+
: '';
|
|
23
|
+
const tail = [e.message, causeMsg].filter(s => s.length > 0).join(' — ');
|
|
24
|
+
throw new Error(`${method} ${url} failed${tail ? `: ${tail}` : ''}`);
|
|
25
|
+
}
|
|
26
|
+
async function doFetch(method, url, init, fetchFn) {
|
|
27
|
+
try {
|
|
28
|
+
return await fetchFn(url, init);
|
|
29
|
+
}
|
|
30
|
+
catch (e) {
|
|
31
|
+
rethrowNetworkError(method, url, e);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function isMfaRequiredResponse(status, json) {
|
|
35
|
+
if (status !== 403)
|
|
36
|
+
return false;
|
|
37
|
+
if (json.mfaRequired === true)
|
|
38
|
+
return true;
|
|
39
|
+
const e = json.error;
|
|
40
|
+
if (e && typeof e === 'object') {
|
|
41
|
+
if (e.details?.mfaRequired === true)
|
|
42
|
+
return true;
|
|
43
|
+
if (e.context?.mfaRequired === true)
|
|
44
|
+
return true;
|
|
45
|
+
if (typeof e.message === 'string' && /\bmfa\b/i.test(e.message))
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
if (typeof e === 'string' && /\bmfa\b/i.test(e))
|
|
49
|
+
return true;
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
function getLoginErrorMessage(json, res) {
|
|
53
|
+
const e = json.error;
|
|
54
|
+
if (typeof e === 'string' && e.trim())
|
|
55
|
+
return e;
|
|
56
|
+
if (e && typeof e === 'object' && typeof e.message === 'string' && e.message.trim()) {
|
|
57
|
+
return e.message;
|
|
58
|
+
}
|
|
59
|
+
return res.statusText;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Login with email/password. POST `{apiUrl}/{auth_path}/auth/login` (default `auth_path` = `app`).
|
|
63
|
+
* Returns tokens; caller should set them in TokenManager (no disk).
|
|
64
|
+
*/
|
|
65
|
+
export async function login(apiUrl, email, password, options) {
|
|
66
|
+
const base = apiUrl.replace(/\/$/, '');
|
|
67
|
+
const url = buildAuthServiceUrl(base, options?.auth_path_prefix, '/auth/login');
|
|
68
|
+
const body = {
|
|
69
|
+
email,
|
|
70
|
+
password,
|
|
71
|
+
...(options?.organization_id && { organization_id: options.organization_id }),
|
|
72
|
+
...(options?.mfa_code && { mfa_code: options.mfa_code }),
|
|
73
|
+
};
|
|
74
|
+
const fetchFn = options?.fetchFn ?? DEFAULT_FETCH;
|
|
75
|
+
if (!fetchFn)
|
|
76
|
+
throw new Error('fetch not available');
|
|
77
|
+
const res = await doFetch('POST', url, {
|
|
78
|
+
method: 'POST',
|
|
79
|
+
headers: { 'Content-Type': 'application/json' },
|
|
80
|
+
body: JSON.stringify(body),
|
|
81
|
+
}, fetchFn);
|
|
82
|
+
const json = (await res.json());
|
|
83
|
+
if (!res.ok) {
|
|
84
|
+
if (isMfaRequiredResponse(res.status, json)) {
|
|
85
|
+
throw new LoginMfaRequiredError();
|
|
86
|
+
}
|
|
87
|
+
const msg = getLoginErrorMessage(json, res);
|
|
88
|
+
throw new Error(String(msg));
|
|
89
|
+
}
|
|
90
|
+
const payload = json?.data;
|
|
91
|
+
if (!payload?.access_token)
|
|
92
|
+
throw new Error('Invalid login response');
|
|
93
|
+
return {
|
|
94
|
+
access_token: payload.access_token,
|
|
95
|
+
refresh_token: payload.refresh_token,
|
|
96
|
+
expires_in: payload.expires_in ?? 3600,
|
|
97
|
+
expires_at: payload.expires_at ?? '',
|
|
98
|
+
...(payload.aws_credentials ? { aws_credentials: payload.aws_credentials } : {}),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Refresh access token. POST `{apiUrl}/{auth_path}/auth/refresh` (default path segment: `app`).
|
|
103
|
+
*/
|
|
104
|
+
export async function refresh(apiUrl, refreshToken, options) {
|
|
105
|
+
const base = apiUrl.replace(/\/$/, '');
|
|
106
|
+
const url = buildAuthServiceUrl(base, options?.auth_path_prefix, '/auth/refresh');
|
|
107
|
+
const fetchFn = options?.fetchFn ?? DEFAULT_FETCH;
|
|
108
|
+
if (!fetchFn)
|
|
109
|
+
throw new Error('fetch not available');
|
|
110
|
+
const res = await doFetch('POST', url, {
|
|
111
|
+
method: 'POST',
|
|
112
|
+
headers: { 'Content-Type': 'application/json' },
|
|
113
|
+
body: JSON.stringify({ refresh_token: refreshToken }),
|
|
114
|
+
}, fetchFn);
|
|
115
|
+
const json = (await res.json());
|
|
116
|
+
if (!res.ok) {
|
|
117
|
+
const msg = json?.error ?? res.statusText;
|
|
118
|
+
throw new Error(String(msg));
|
|
119
|
+
}
|
|
120
|
+
const payload = json.success && json.data && typeof json.data === 'object' ? json.data : json;
|
|
121
|
+
if (!payload?.access_token)
|
|
122
|
+
throw new Error('Invalid refresh response');
|
|
123
|
+
return {
|
|
124
|
+
access_token: payload.access_token,
|
|
125
|
+
refresh_token: payload.refresh_token ?? refreshToken,
|
|
126
|
+
expires_in: payload.expires_in ?? 3600,
|
|
127
|
+
expires_at: payload.expires_at ?? '',
|
|
128
|
+
...(payload.aws_credentials ? { aws_credentials: payload.aws_credentials } : {}),
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/auth/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export interface TokenState {
|
|
2
|
+
access_token: string;
|
|
3
|
+
refresh_token?: string;
|
|
4
|
+
expires_at?: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* In-memory token manager. No token persisted to disk.
|
|
8
|
+
* setToken, getToken, shouldRefresh, getTokenOrRefresh (with optional refresh fetcher).
|
|
9
|
+
*/
|
|
10
|
+
export declare class TokenManager {
|
|
11
|
+
private state;
|
|
12
|
+
setToken(access_token: string, refresh_token?: string, expires_at?: number): void;
|
|
13
|
+
getToken(): string | null;
|
|
14
|
+
getRefreshToken(): string | null;
|
|
15
|
+
clear(): void;
|
|
16
|
+
/**
|
|
17
|
+
* True if access token is missing or expires within thresholdSeconds.
|
|
18
|
+
*/
|
|
19
|
+
shouldRefresh(thresholdSeconds?: number): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Return access token, or refresh if shouldRefresh(thresholdSeconds) and refresh_token exists.
|
|
22
|
+
* refreshFn(apiUrl, refresh_token) must return { access_token, refresh_token?, expires_in }.
|
|
23
|
+
*/
|
|
24
|
+
getTokenOrRefresh(apiUrl: string, thresholdSeconds: number | undefined, refreshFn: (apiUrl: string, refreshToken: string) => Promise<{
|
|
25
|
+
access_token: string;
|
|
26
|
+
refresh_token?: string;
|
|
27
|
+
expires_in?: number;
|
|
28
|
+
}>): Promise<string | null>;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=token-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,UAAU;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAA2B;IAExC,QAAQ,CAAC,YAAY,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAQjF,QAAQ,IAAI,MAAM,GAAG,IAAI;IAIzB,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,aAAa,CAAC,gBAAgB,GAAE,MAA0C,GAAG,OAAO;IASpF;;;OAGG;IACG,iBAAiB,CACrB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,MAAM,YAAoC,EAC5D,SAAS,EAAE,CACT,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC;QACX,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC,GACD,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAgB1B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { decodeJwtPayload, DEFAULT_REFRESH_THRESHOLD_SECONDS } from './jwt.js';
|
|
2
|
+
/**
|
|
3
|
+
* In-memory token manager. No token persisted to disk.
|
|
4
|
+
* setToken, getToken, shouldRefresh, getTokenOrRefresh (with optional refresh fetcher).
|
|
5
|
+
*/
|
|
6
|
+
export class TokenManager {
|
|
7
|
+
state = null;
|
|
8
|
+
setToken(access_token, refresh_token, expires_at) {
|
|
9
|
+
this.state = {
|
|
10
|
+
access_token,
|
|
11
|
+
refresh_token,
|
|
12
|
+
expires_at,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
getToken() {
|
|
16
|
+
return this.state?.access_token ?? null;
|
|
17
|
+
}
|
|
18
|
+
getRefreshToken() {
|
|
19
|
+
return this.state?.refresh_token ?? null;
|
|
20
|
+
}
|
|
21
|
+
clear() {
|
|
22
|
+
this.state = null;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* True if access token is missing or expires within thresholdSeconds.
|
|
26
|
+
*/
|
|
27
|
+
shouldRefresh(thresholdSeconds = DEFAULT_REFRESH_THRESHOLD_SECONDS) {
|
|
28
|
+
const token = this.state?.access_token;
|
|
29
|
+
if (!token)
|
|
30
|
+
return true;
|
|
31
|
+
const { exp } = decodeJwtPayload(token);
|
|
32
|
+
if (exp == null)
|
|
33
|
+
return false; // No exp claim → don't refresh
|
|
34
|
+
const now = Math.floor(Date.now() / 1000);
|
|
35
|
+
return exp - now < thresholdSeconds;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Return access token, or refresh if shouldRefresh(thresholdSeconds) and refresh_token exists.
|
|
39
|
+
* refreshFn(apiUrl, refresh_token) must return { access_token, refresh_token?, expires_in }.
|
|
40
|
+
*/
|
|
41
|
+
async getTokenOrRefresh(apiUrl, thresholdSeconds = DEFAULT_REFRESH_THRESHOLD_SECONDS, refreshFn) {
|
|
42
|
+
const token = this.getToken();
|
|
43
|
+
if (!token)
|
|
44
|
+
return null;
|
|
45
|
+
if (!this.shouldRefresh(thresholdSeconds))
|
|
46
|
+
return token;
|
|
47
|
+
const refreshToken = this.getRefreshToken();
|
|
48
|
+
if (!refreshToken)
|
|
49
|
+
return token; // No refresh token, return current
|
|
50
|
+
try {
|
|
51
|
+
const result = await refreshFn(apiUrl.replace(/\/$/, ''), refreshToken);
|
|
52
|
+
const expiresAt = result.expires_in != null ? Math.floor(Date.now() / 1000) + result.expires_in : undefined;
|
|
53
|
+
this.setToken(result.access_token, result.refresh_token ?? refreshToken, expiresAt);
|
|
54
|
+
return this.state?.access_token ?? null;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return token; // On refresh failure, return current token
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=token-manager.js.map
|