@mycreat-labs/integrations-sdk 0.0.0-stage → 0.1.1
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 +14 -0
- package/README.md +54 -2
- package/dist/adapters/bullmq.cjs +110 -0
- package/dist/adapters/bullmq.cjs.map +1 -0
- package/dist/adapters/bullmq.d.cts +11 -0
- package/dist/adapters/bullmq.d.ts +11 -0
- package/dist/adapters/bullmq.js +85 -0
- package/dist/adapters/bullmq.js.map +1 -0
- package/dist/adapters/postgres.cjs +396 -0
- package/dist/adapters/postgres.cjs.map +1 -0
- package/dist/adapters/postgres.d.cts +51 -0
- package/dist/adapters/postgres.d.ts +51 -0
- package/dist/adapters/postgres.js +368 -0
- package/dist/adapters/postgres.js.map +1 -0
- package/dist/adapters/prisma.cjs +414 -0
- package/dist/adapters/prisma.cjs.map +1 -0
- package/dist/adapters/prisma.d.cts +15 -0
- package/dist/adapters/prisma.d.ts +15 -0
- package/dist/adapters/prisma.js +386 -0
- package/dist/adapters/prisma.js.map +1 -0
- package/dist/adapters/redis.cjs +125 -0
- package/dist/adapters/redis.cjs.map +1 -0
- package/dist/adapters/redis.d.cts +20 -0
- package/dist/adapters/redis.d.ts +20 -0
- package/dist/adapters/redis.js +98 -0
- package/dist/adapters/redis.js.map +1 -0
- package/dist/errors-3hDEtzuZ.d.cts +11 -0
- package/dist/errors-3hDEtzuZ.d.ts +11 -0
- package/dist/index.cjs +1328 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +128 -0
- package/dist/index.d.ts +128 -0
- package/dist/index.js +1297 -0
- package/dist/index.js.map +1 -0
- package/dist/providers/index.cjs +1287 -0
- package/dist/providers/index.cjs.map +1 -0
- package/dist/providers/index.d.cts +144 -0
- package/dist/providers/index.d.ts +144 -0
- package/dist/providers/index.js +1252 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/testing.cjs +275 -0
- package/dist/testing.cjs.map +1 -0
- package/dist/testing.d.cts +20 -0
- package/dist/testing.d.ts +20 -0
- package/dist/testing.js +248 -0
- package/dist/testing.js.map +1 -0
- package/dist/types-Y4-DoJ1A.d.cts +260 -0
- package/dist/types-Y4-DoJ1A.d.ts +260 -0
- package/docs/migration.md +23 -0
- package/docs/releases/0.1.0.md +46 -0
- package/docs/security.md +26 -0
- package/docs/verification.md +22 -0
- package/examples/embedded-host.ts +62 -0
- package/migrations/0001_initial.sql +40 -0
- package/package.json +91 -4
- package/schema.prisma +80 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/crypto.ts","../src/sdk.ts","../src/runtime.ts"],"sourcesContent":["export * from \"./types\";\nexport * from \"./errors\";\nexport * from \"./crypto\";\nexport * from \"./sdk\";\nexport * from \"./runtime\";\n","export type FailureDisposition =\n \"retryable\" | \"requires_reauth\" | \"outcome_unknown\" | \"permanent_failure\";\nexport class IntegrationError extends Error {\n readonly sdkError = \"@mycreat-labs/integrations-sdk/v1\";\n constructor(\n readonly code: string,\n readonly disposition: FailureDisposition = \"permanent_failure\",\n readonly retryAfterMs?: number,\n ) {\n super(code);\n this.name = \"IntegrationError\";\n }\n}\nexport function integrationError(error: unknown): IntegrationError {\n if (error instanceof IntegrationError) return error;\n // Bundled subpath entries and independently installed copies have separate class identities.\n if (\n error instanceof Error &&\n \"sdkError\" in error &&\n error.sdkError === \"@mycreat-labs/integrations-sdk/v1\" &&\n \"code\" in error &&\n typeof error.code === \"string\" &&\n /^[a-zA-Z0-9_]{1,100}$/.test(error.code) &&\n \"disposition\" in error &&\n [\n \"retryable\",\n \"requires_reauth\",\n \"outcome_unknown\",\n \"permanent_failure\",\n ].includes(String(error.disposition))\n ) {\n const delay =\n \"retryAfterMs\" in error &&\n typeof error.retryAfterMs === \"number\" &&\n Number.isFinite(error.retryAfterMs) &&\n error.retryAfterMs >= 0\n ? error.retryAfterMs\n : undefined;\n return new IntegrationError(\n error.code,\n error.disposition as FailureDisposition,\n delay,\n );\n }\n return new IntegrationError(\"provider_unavailable\", \"outcome_unknown\");\n}\n","import { createCipheriv, createDecipheriv, randomBytes } from \"node:crypto\";\nimport { IntegrationError } from \"./errors\";\nimport type { Json, TokenVault } from \"./types\";\n\nexport function createTokenVault(options: {\n activeKeyId: string;\n keys: Record<string, string>;\n}): TokenVault {\n const keys = new Map(\n Object.entries(options.keys).map(([id, value]) => [\n id,\n Buffer.from(value, \"base64\"),\n ]),\n );\n if (\n !keys.has(options.activeKeyId) ||\n [...keys.values()].some((value) => value.length !== 32)\n )\n throw new IntegrationError(\"invalid_vault_configuration\");\n return {\n async seal(value, context) {\n const iv = randomBytes(12);\n const cipher = createCipheriv(\n \"aes-256-gcm\",\n keys.get(options.activeKeyId)!,\n iv,\n );\n cipher.setAAD(\n Buffer.from(`integration-sdk:v1:${options.activeKeyId}:${context}`),\n );\n const data = Buffer.concat([\n cipher.update(JSON.stringify(value), \"utf8\"),\n cipher.final(),\n ]);\n return {\n keyId: options.activeKeyId,\n value: Buffer.concat([iv, cipher.getAuthTag(), data]).toString(\n \"base64url\",\n ),\n };\n },\n async open(sealed, context) {\n try {\n const key = keys.get(sealed.keyId);\n if (!key) throw new Error(\"unknown key\");\n const buffer = Buffer.from(sealed.value, \"base64url\");\n if (buffer.length < 28) throw new Error(\"invalid ciphertext\");\n const decipher = createDecipheriv(\n \"aes-256-gcm\",\n key,\n buffer.subarray(0, 12),\n );\n decipher.setAAD(\n Buffer.from(`integration-sdk:v1:${sealed.keyId}:${context}`),\n );\n decipher.setAuthTag(buffer.subarray(12, 28));\n return JSON.parse(\n Buffer.concat([\n decipher.update(buffer.subarray(28)),\n decipher.final(),\n ]).toString(\"utf8\"),\n ) as Json;\n } catch {\n throw new IntegrationError(\"credential_decryption_failed\");\n }\n },\n };\n}\n","import { createHash, randomBytes, randomUUID } from \"node:crypto\";\nimport { IntegrationError, integrationError } from \"./errors\";\nimport type {\n ActionContext,\n ApiRateLimiter,\n Connection,\n CredentialMaterial,\n Flow,\n Grant,\n HostHooks,\n IntegrationEvent,\n IntegrationProvider,\n IntegrationStore,\n Json,\n Operation,\n Purpose,\n ResourcePage,\n Scope,\n SdkLogger,\n TaskMessage,\n TokenVault,\n VerifiedIdentity,\n} from \"./types\";\n\nconst hash = (value: string) =>\n createHash(\"sha256\").update(value).digest(\"hex\");\nconst pkce = (value: string) =>\n createHash(\"sha256\").update(value).digest(\"base64url\");\nconst random = () => randomBytes(32).toString(\"base64url\");\nfunction canonical(value: Json): string {\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n if (value !== null && typeof value === \"object\")\n return `{${Object.keys(value)\n .sort()\n .map((key) => `${JSON.stringify(key)}:${canonical(value[key]!)}`)\n .join(\",\")}}`;\n return JSON.stringify(value);\n}\nconst required = (value: string, name: string, max = 512) => {\n if (typeof value !== \"string\" || !value.trim() || value.length > max)\n throw new IntegrationError(`invalid_${name}`);\n return value;\n};\nexport type SdkOptions = {\n namespace: string;\n store: IntegrationStore;\n vault: TokenVault;\n providers: readonly IntegrationProvider[];\n hooks?: HostHooks;\n fetch?: typeof globalThis.fetch;\n logger?: SdkLogger;\n clock?: () => number;\n leaseMs?: number;\n maximumAttempts?: number;\n failedPayloadRetentionMs?: number;\n rateLimiter?: ApiRateLimiter;\n};\nexport type EnqueueInput = {\n ownerId: string;\n connectionId: string;\n action: string;\n input: unknown;\n idempotencyKey: string;\n hostContext?: Json;\n};\nexport type AuthorizationStart = {\n state: string;\n nonce: string;\n authorizationUrl: string;\n};\nexport type StartInput = {\n ownerId: string;\n provider: string;\n binding: string;\n connectionId?: string;\n};\nexport type CompleteInput = {\n ownerId: string;\n state: string;\n binding: string;\n code: string;\n};\nexport interface IntegrationSdk {\n readonly namespace: string;\n withStore(store: IntegrationStore): IntegrationSdk;\n assertCompatible(): Promise<void>;\n catalog(): Array<{\n key: string;\n registrationId: string;\n purposes: Purpose[];\n resources: boolean;\n actions: string[];\n remoteRevocationSupported: boolean;\n }>;\n identity: {\n start(input: StartInput): Promise<AuthorizationStart>;\n startNative(input: StartInput): Promise<AuthorizationStart>;\n complete(input: CompleteInput): Promise<VerifiedIdentity>;\n verifyNative(input: {\n ownerId: string;\n state: string;\n binding: string;\n idToken: string;\n authorizationCode?: string;\n }): Promise<VerifiedIdentity>;\n };\n connections: {\n start(input: StartInput): Promise<AuthorizationStart>;\n complete(input: CompleteInput): Promise<Connection>;\n list(ownerId: string): Promise<Connection[]>;\n disconnect(\n ownerId: string,\n id: string,\n ): Promise<{ disconnected: boolean; remoteRevocationSupported: boolean }>;\n };\n resources: {\n list(input: {\n ownerId: string;\n connectionId: string;\n cursor?: string;\n query?: string;\n parentId?: string;\n }): Promise<ResourcePage>;\n };\n operations: {\n enqueue(input: EnqueueInput): Promise<Operation>;\n get(ownerId: string, id: string): Promise<Operation>;\n list(ownerId: string, connectionId?: string): Promise<Operation[]>;\n recover(ownerId: string, id: string): Promise<Operation>;\n };\n events: {\n list(ownerId: string, after?: string): Promise<IntegrationEvent[]>;\n };\n eraseOwner(ownerId: string): Promise<void>;\n runtime: {\n process(message: TaskMessage): Promise<void>;\n due(limit?: number): Promise<Array<{ id: string; version: number }>>;\n };\n}\n\nexport function createIntegrationSdk(options: SdkOptions): IntegrationSdk {\n required(options.namespace, \"namespace\", 128);\n const providers = new Map<string, IntegrationProvider>();\n for (const provider of options.providers) {\n if (providers.has(provider.key))\n throw new IntegrationError(\"duplicate_provider\");\n required(provider.registrationId, \"registration\");\n providers.set(provider.key, provider);\n }\n const now = options.clock ?? Date.now;\n const request = options.fetch ?? globalThis.fetch;\n const apiFetch =\n (provider: IntegrationProvider, budget = \"api\"): typeof globalThis.fetch =>\n async (input, init) => {\n if (options.rateLimiter) {\n const signal = init?.signal;\n const deadline = Date.now() + 10_000;\n for (;;) {\n let admission;\n let timeout: ReturnType<typeof setTimeout> | undefined;\n try {\n admission = await Promise.race([\n options.rateLimiter.take(\n hash(\n `${options.namespace}\\0${provider.key}\\0${provider.registrationId}\\0${budget}`,\n ),\n ),\n new Promise<never>((_, reject) => {\n timeout = setTimeout(\n () => reject(new Error(\"admission timeout\")),\n 1000,\n );\n }),\n ]);\n if (\n typeof admission.allowed !== \"boolean\" ||\n !Number.isFinite(admission.retryAfterMs) ||\n admission.retryAfterMs < 0\n )\n throw new Error(\"invalid admission\");\n } catch {\n throw Object.assign(\n new IntegrationError(\"rate_limited\", \"retryable\", 1000),\n { definite: true },\n );\n } finally {\n if (timeout) clearTimeout(timeout);\n }\n if (signal?.aborted)\n throw Object.assign(\n new IntegrationError(\"rate_limited\", \"retryable\", 1000),\n { definite: true },\n );\n if (admission.allowed) break;\n const delay = Math.max(1, admission.retryAfterMs);\n if (Date.now() + delay > deadline)\n throw Object.assign(\n new IntegrationError(\n \"rate_limited\",\n \"retryable\",\n Math.min(delay, 86_400_000),\n ),\n { definite: true },\n );\n await new Promise<void>((resolve, reject) => {\n const onAbort = () => {\n clearTimeout(wait);\n signal?.removeEventListener(\"abort\", onAbort);\n reject(\n Object.assign(\n new IntegrationError(\"rate_limited\", \"retryable\", 1000),\n { definite: true },\n ),\n );\n };\n const wait = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, delay);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (signal?.aborted) onAbort();\n });\n }\n }\n return request(input, init);\n };\n const leaseMs = options.leaseMs ?? 120_000;\n const maxAttempts = options.maximumAttempts ?? 12;\n const scope = (ownerId: string): Scope => ({\n namespace: options.namespace,\n ownerId: required(ownerId, \"owner\"),\n });\n const providerFor = (key: string, registrationId?: string) => {\n const provider = providers.get(key);\n if (\n !provider ||\n (registrationId && provider.registrationId !== registrationId)\n )\n throw new IntegrationError(\"provider_unavailable\");\n return provider;\n };\n const authorizationKey = (provider: IntegrationProvider) =>\n hash(`${provider.key}\\0${provider.registrationId}`);\n const grantContext = (\n grant: Pick<Grant, \"namespace\" | \"ownerId\" | \"registrationId\" | \"id\">,\n ) =>\n `${grant.namespace}:grant:${grant.ownerId}:${grant.registrationId}:${grant.id}`;\n const flowContext = (flow: Pick<Flow, \"namespace\" | \"id\" | \"purpose\">) =>\n `${flow.namespace}:flow:${flow.purpose}:${flow.id}`;\n const operationContext = (\n op: Pick<Operation, \"namespace\" | \"ownerId\" | \"id\">,\n ) => `${op.namespace}:operation:${op.ownerId}:${op.id}`;\n async function connection(ownerId: string, id: string) {\n const value = await options.store.transaction(async (tx) => {\n await tx.lockScope(scope(ownerId));\n return tx.getConnection(scope(ownerId), id);\n });\n if (!value) throw new IntegrationError(\"connection_not_found\");\n providerFor(value.provider, value.registrationId);\n if (value.status !== \"active\")\n throw new IntegrationError(\"reauth_required\", \"requires_reauth\");\n return value;\n }\n async function start(\n input: {\n ownerId: string;\n provider: string;\n binding: string;\n connectionId?: string;\n },\n purpose: Purpose,\n native = false,\n ) {\n const owner = scope(input.ownerId);\n required(input.binding, \"binding\");\n if (input.binding.length < 32)\n throw new IntegrationError(\"invalid_binding\");\n const provider = providerFor(input.provider);\n if (\n !provider.purposes.includes(purpose) ||\n (!native && !provider.authorization) ||\n (native && !provider.verifyNative)\n )\n throw new IntegrationError(\"unsupported_capability\");\n let current: Connection | undefined;\n if (input.connectionId) {\n const existing = await options.store.transaction((tx) =>\n tx.getConnection(owner, input.connectionId!),\n );\n if (\n !existing ||\n existing.provider !== provider.key ||\n existing.registrationId !== provider.registrationId ||\n existing.status === \"revoked\"\n )\n throw new IntegrationError(\"connection_not_found\");\n current = existing;\n }\n const state = random();\n const verifier = random();\n const nonce = random();\n const flow: Flow = {\n id: hash(state),\n ...owner,\n provider: provider.key,\n registrationId: provider.registrationId,\n purpose,\n bindingHash: hash(input.binding),\n expiresAt: now() + 600_000,\n secret: { keyId: \"\", value: \"\" },\n ...(current\n ? { connectionId: current.id, generation: current.generation }\n : {}),\n };\n flow.secret = await options.vault.seal(\n { verifier, nonce, native },\n flowContext(flow),\n );\n await options.store.transaction(async (tx) => {\n if (purpose === \"connect\") {\n await tx.lockScope(owner);\n const connections = await tx.listConnections(owner);\n for (const connection of connections.filter(\n (c) =>\n c.provider === provider.key &&\n c.registrationId === provider.registrationId &&\n c.status === \"revoked\",\n )) {\n if (await tx.hasPendingRevocation(owner, connection.id))\n throw new IntegrationError(\"revocation_pending\", \"retryable\", 3000);\n }\n flow.authorizationEpoch = await tx.authorizationEpoch(\n owner,\n authorizationKey(provider),\n true,\n );\n }\n await tx.insertFlow(flow);\n });\n return {\n state,\n nonce,\n authorizationUrl: native\n ? \"\"\n : provider.authorization!.url({\n state,\n verifier,\n challenge: pkce(verifier),\n nonce,\n purpose,\n }),\n };\n }\n async function consume(\n input: { ownerId: string; state: string; binding: string },\n purpose: Purpose,\n native = false,\n ) {\n required(input.state, \"state\");\n required(input.binding, \"binding\");\n const flow = await options.store.transaction((tx) =>\n tx.consumeFlow(\n options.namespace,\n hash(input.state),\n hash(input.binding),\n purpose,\n now(),\n ),\n );\n if (!flow || flow.ownerId !== input.ownerId)\n throw new IntegrationError(\"authorization_expired\");\n const secret = (await options.vault.open(\n flow.secret,\n flowContext(flow),\n )) as { verifier: string; nonce: string; native: boolean };\n if (secret.native !== native)\n throw new IntegrationError(\"authorization_purpose_mismatch\");\n return {\n flow,\n secret,\n provider: providerFor(flow.provider, flow.registrationId),\n };\n }\n async function credentials(\n current: Connection,\n signal?: AbortSignal,\n force = false,\n rejectedAccessToken?: string,\n ): Promise<CredentialMaterial> {\n const provider = providerFor(current.provider, current.registrationId);\n const owner = scope(current.ownerId);\n const lease = randomUUID();\n const result = await options.store.transaction(async (tx) => {\n await tx.lockScope(owner);\n const live = await tx.getConnection(owner, current.id, true);\n if (\n !live ||\n live.status !== \"active\" ||\n live.generation !== current.generation\n )\n throw new IntegrationError(\"connection_revoked\", \"requires_reauth\");\n const grant = await tx.getGrant(owner, live.grantId, true);\n if (!grant || grant.status !== \"active\")\n throw new IntegrationError(\"reauth_required\", \"requires_reauth\");\n if (grant.authorizationLease) {\n if ((grant.authorizationUntil ?? 0) > now())\n throw new IntegrationError(\n \"authorization_in_progress\",\n \"retryable\",\n 2000,\n );\n const invalidated: Grant = {\n ...grant,\n status: \"reauth_required\",\n version: grant.version + 1,\n authorizationLease: undefined,\n authorizationUntil: undefined,\n };\n await tx.saveGrant(invalidated, grant.version);\n return { grant: invalidated, refresh: false };\n }\n if (!force && (!grant.expiresAt || grant.expiresAt > now() + 30_000))\n return { grant, refresh: false };\n if (force && rejectedAccessToken !== undefined) {\n const latest = (await options.vault.open(\n grant.credentials,\n grantContext(grant),\n )) as CredentialMaterial;\n // A concurrent owner may already have replaced the rejected access token.\n if (latest.accessToken !== rejectedAccessToken)\n return { grant, refresh: false };\n }\n if (!provider.refresh)\n throw new IntegrationError(\"reauth_required\", \"requires_reauth\");\n if (grant.refreshLease && (grant.refreshUntil ?? 0) > now())\n throw new IntegrationError(\"refresh_in_progress\", \"retryable\", 2000);\n if (grant.refreshLease) {\n // A dead refresh owner may already have consumed a rotating token.\n const invalidated: Grant = {\n ...grant,\n status: \"reauth_required\",\n version: grant.version + 1,\n refreshLease: undefined,\n refreshUntil: undefined,\n };\n await tx.saveGrant(invalidated, grant.version);\n return { grant: invalidated, refresh: false };\n }\n if (\n !(await tx.saveGrant(\n { ...grant, refreshLease: lease, refreshUntil: now() + leaseMs },\n grant.version,\n ))\n )\n throw new IntegrationError(\"credential_conflict\", \"retryable\", 2000);\n return { grant, refresh: true };\n });\n if (result.grant.status !== \"active\")\n throw new IntegrationError(\"reauth_required\", \"requires_reauth\");\n const material = (await options.vault.open(\n result.grant.credentials,\n grantContext(result.grant),\n )) as CredentialMaterial;\n if (!result.refresh) return material;\n let refreshReturned = false;\n try {\n const refreshed = await provider.refresh!(material, {\n fetch: apiFetch(provider, \"credentials\"),\n signal,\n });\n refreshReturned = true;\n const sealed = await options.vault.seal(\n refreshed as unknown as Json,\n grantContext(result.grant),\n );\n await options.store.transaction(async (tx) => {\n const live = await tx.getConnection(owner, current.id, true);\n const grant = await tx.getGrant(owner, current.grantId, true);\n if (\n !live ||\n live.status !== \"active\" ||\n live.generation !== current.generation ||\n !grant ||\n grant.status !== \"active\" ||\n grant.version !== result.grant.version ||\n grant.refreshLease !== lease ||\n (grant.refreshUntil ?? 0) <= now()\n )\n throw new IntegrationError(\"credential_conflict\", \"requires_reauth\");\n if (\n !(await tx.saveGrant(\n {\n ...grant,\n credentials: sealed,\n expiresAt: refreshed.expiresAt,\n version: grant.version + 1,\n refreshLease: undefined,\n refreshUntil: undefined,\n },\n grant.version,\n ))\n )\n throw new IntegrationError(\"credential_conflict\", \"requires_reauth\");\n });\n return refreshed;\n } catch (error) {\n const failure = integrationError(error);\n const definiteRetry =\n !refreshReturned &&\n failure.disposition === \"retryable\" &&\n error instanceof Error &&\n \"definite\" in error &&\n error.definite === true;\n await options.store.transaction(async (tx) => {\n const grant = await tx.getGrant(owner, current.grantId, true);\n if (\n grant?.version === result.grant.version &&\n grant.refreshLease === lease\n )\n await tx.saveGrant(\n {\n ...grant,\n status: definiteRetry ? \"active\" : \"reauth_required\",\n version: grant.version + 1,\n refreshLease: undefined,\n refreshUntil: undefined,\n },\n grant.version,\n );\n });\n if (definiteRetry) throw failure;\n options.logger?.warn?.(\n { provider: provider.key, code: integrationError(error).code },\n \"Credential refresh requires authorization\",\n );\n throw new IntegrationError(\"reauth_required\", \"requires_reauth\");\n }\n }\n async function enqueue(input: EnqueueInput) {\n required(input.idempotencyKey, \"idempotency_key\");\n const current = await connection(input.ownerId, input.connectionId);\n const action = providerFor(current.provider, current.registrationId)\n .actions?.[input.action];\n if (!action) throw new IntegrationError(\"unsupported_action\");\n const validated = action.validate(input.input);\n const payload = canonical(validated);\n if (Buffer.byteLength(payload) > 2_000_000)\n throw new IntegrationError(\"input_too_large\");\n const operation: Operation = {\n id: randomUUID(),\n ...scope(input.ownerId),\n connectionId: current.id,\n generation: current.generation,\n action: input.action,\n idempotencyKey: input.idempotencyKey,\n fingerprint: hash(\n canonical({\n connectionId: current.id,\n generation: current.generation,\n input: validated,\n hostContext: input.hostContext ?? null,\n }),\n ),\n input: { keyId: \"\", value: \"\" },\n ...(input.hostContext !== undefined\n ? { hostContext: input.hostContext }\n : {}),\n status: \"pending\",\n version: 1,\n attempts: 0,\n availableAt: now(),\n checkpoint: null,\n dispatching: false,\n createdAt: now(),\n updatedAt: now(),\n };\n operation.input = await options.vault.seal(\n validated,\n operationContext(operation),\n );\n return options.store.transaction(async (tx) => {\n await tx.lockScope(scope(input.ownerId));\n const live = await tx.getConnection(\n scope(input.ownerId),\n current.id,\n true,\n );\n if (\n !live ||\n live.status !== \"active\" ||\n live.generation !== current.generation\n )\n throw new IntegrationError(\"connection_revoked\");\n const persisted = await tx.insertOperation(operation);\n if (persisted.fingerprint !== operation.fingerprint)\n throw new IntegrationError(\"idempotency_conflict\");\n return persisted;\n });\n }\n async function getOperation(ownerId: string, id: string) {\n const op = await options.store.transaction((tx) =>\n tx.getOperation(scope(ownerId), id),\n );\n if (!op) throw new IntegrationError(\"operation_not_found\");\n return op;\n }\n async function process(message: TaskMessage) {\n const lease = randomUUID();\n let operation = await options.store.transaction((tx) =>\n tx.claimOperation(\n options.namespace,\n message.taskId,\n message.version,\n now(),\n lease,\n now() + leaseMs,\n ),\n );\n if (!operation) return;\n const owner = scope(operation.ownerId);\n let lost = false;\n let renewing: Promise<void> | undefined;\n const abort = new AbortController();\n const renew = async () => {\n await options.store.transaction(async (tx) => {\n const live = await tx.getOperation(owner, operation!.id, true);\n if (\n !live ||\n live.status !== \"running\" ||\n live.leaseToken !== lease ||\n (live.leaseUntil ?? 0) <= now()\n )\n throw new IntegrationError(\"lease_lost\");\n const next = { ...live, leaseUntil: now() + leaseMs, updatedAt: now() };\n if (!(await tx.saveOperation(next, live.version, lease)))\n throw new IntegrationError(\"lease_lost\");\n operation = next;\n });\n };\n const timer = setInterval(\n () => {\n if (renewing) return;\n renewing = renew()\n .catch(() => {\n lost = true;\n abort.abort();\n })\n .finally(() => {\n renewing = undefined;\n });\n },\n Math.max(100, Math.floor(leaseMs / 3)),\n );\n timer.unref?.();\n let input: Json = null;\n let attemptedWrite = false;\n let remoteSucceeded = false;\n let dispatchedConnection: Connection | undefined;\n let dispatchedAccessToken: string | undefined;\n let authenticationRecovered = false;\n try {\n input = await options.vault.open(\n operation.input,\n operationContext(operation),\n );\n const current = await options.store.transaction((tx) =>\n tx.getConnection(owner, operation!.connectionId),\n );\n if (\n !current ||\n current.generation !== operation.generation ||\n (current.status !== \"active\" && operation.action !== \"__sdk.revoke\")\n )\n throw new IntegrationError(\"connection_revoked\");\n if (\n operation.action === \"__sdk.revoke\" &&\n !providers.has(current.provider)\n )\n throw new IntegrationError(\n \"provider_configuration_missing\",\n \"retryable\",\n 60_000,\n );\n const provider = providerFor(current.provider, current.registrationId);\n let material: CredentialMaterial;\n if (operation.action === \"__sdk.revoke\") {\n const grant = await options.store.transaction((tx) =>\n tx.getGrant(owner, current.grantId),\n );\n if (!grant || grant.status !== \"revoked\")\n throw new IntegrationError(\"invalid_revocation\");\n material = (await options.vault.open(\n grant.credentials,\n grantContext(grant),\n )) as CredentialMaterial;\n } else material = await credentials(current, abort.signal);\n const context: ActionContext = {\n credentials: material,\n fetch: apiFetch(provider),\n signal: abort.signal,\n operationId: operation.id,\n checkpoint: operation.checkpoint,\n saveCheckpoint: async (checkpoint) => {\n await options.store.transaction(async (tx) => {\n const live = await tx.getOperation(owner, operation!.id, true);\n if (!live || live.leaseToken !== lease || live.status !== \"running\")\n throw new IntegrationError(\"lease_lost\");\n const next = { ...live, checkpoint, updatedAt: now() };\n if (!(await tx.saveOperation(next, live.version, lease)))\n throw new IntegrationError(\"lease_lost\");\n operation = next;\n });\n },\n };\n let result: Json;\n const action = provider.actions?.[operation.action];\n if (operation.action === \"__sdk.revoke\") {\n await provider.revoke?.(material, {\n fetch: request,\n signal: abort.signal,\n });\n result = { revoked: true };\n remoteSucceeded = true;\n } else if (!action) throw new IntegrationError(\"unsupported_action\");\n else if (operation.dispatching) {\n await options.store.transaction(async (tx) => {\n await tx.lockScope(owner);\n await options.hooks?.beforeExecute?.(\n tx.nativeContext,\n operation!,\n input,\n );\n });\n if (!action.reconcile)\n throw new IntegrationError(\"outcome_unknown\", \"outcome_unknown\");\n const reconciled = await action.reconcile(input, context);\n if (!reconciled.resolved)\n throw new IntegrationError(\"outcome_unknown\", \"outcome_unknown\");\n result = reconciled.result;\n remoteSucceeded = true;\n } else {\n await options.store.transaction(async (tx) => {\n await tx.lockScope(owner);\n const live = await tx.getOperation(owner, operation!.id, true);\n const active = await tx.getConnection(owner, current.id, true);\n if (\n !active ||\n active.generation !== current.generation ||\n active.status !== \"active\"\n )\n throw new IntegrationError(\"connection_revoked\");\n if (!live || live.leaseToken !== lease)\n throw new IntegrationError(\"lease_lost\");\n await options.hooks?.beforeExecute?.(tx.nativeContext, live, input);\n const next = { ...live, dispatching: true, updatedAt: now() };\n if (!(await tx.saveOperation(next, live.version, lease)))\n throw new IntegrationError(\"lease_lost\");\n operation = next;\n });\n attemptedWrite = true;\n dispatchedConnection = current;\n dispatchedAccessToken = material.accessToken;\n result = await action.execute(input, context);\n remoteSucceeded = true;\n }\n if (renewing) await renewing;\n if (lost || abort.signal.aborted) return;\n await options.store.transaction(async (tx) => {\n const erased = await tx.lockScope(\n owner,\n operation!.action === \"__sdk.revoke\",\n );\n const live = await tx.getOperation(owner, operation!.id, true);\n const active = await tx.getConnection(owner, current.id, true);\n if (!live || live.leaseToken !== lease || live.status !== \"running\")\n throw new IntegrationError(\"lease_lost\");\n if (\n !active ||\n active.generation !== current.generation ||\n (active.status !== \"active\" && operation!.action !== \"__sdk.revoke\")\n )\n throw new IntegrationError(\"connection_revoked\");\n const next: Operation = {\n ...live,\n status: \"succeeded\",\n result,\n input: await options.vault.seal(null, operationContext(live)),\n checkpoint: null,\n leaseToken: undefined,\n leaseUntil: undefined,\n errorCode: undefined,\n version: live.version + 1,\n updatedAt: now(),\n };\n const event: IntegrationEvent = {\n id: randomUUID(),\n ...owner,\n operationId: next.id,\n type: \"operation.succeeded\",\n createdAt: now(),\n data: result,\n };\n if (!(await tx.saveOperation(next, live.version, lease)))\n throw new IntegrationError(\"lease_lost\");\n await tx.insertEvent(event);\n if (operation!.action !== \"__sdk.revoke\")\n await options.hooks?.onResult?.(tx.nativeContext, next, event, input);\n if (operation!.action === \"__sdk.revoke\" && erased)\n await tx.eraseOwner(owner, true);\n });\n } catch (error) {\n if (renewing) await renewing;\n if (lost) return;\n let failure = integrationError(error);\n const definiteUnauthorized =\n failure.disposition === \"requires_reauth\" &&\n error instanceof Error &&\n \"status\" in error &&\n error.status === 401 &&\n \"definite\" in error &&\n error.definite === true;\n // Only a fresh write that the vendor definitely rejected may be retried with refreshed credentials.\n // Read-only reconciliation must never turn an earlier uncertain write into a new dispatch.\n if (\n definiteUnauthorized &&\n attemptedWrite &&\n !remoteSucceeded &&\n dispatchedConnection &&\n providerFor(\n dispatchedConnection.provider,\n dispatchedConnection.registrationId,\n ).refresh\n ) {\n if ((operation.authRecoveries ?? 0) > 0) {\n failure = new IntegrationError(\n \"credential_refresh_exhausted\",\n \"requires_reauth\",\n );\n } else {\n try {\n await credentials(\n dispatchedConnection,\n abort.signal,\n true,\n dispatchedAccessToken,\n );\n authenticationRecovered = true;\n failure = new IntegrationError(\n \"credential_refreshed\",\n \"retryable\",\n 0,\n );\n } catch (refreshError) {\n failure = integrationError(refreshError);\n }\n }\n }\n await options.store.transaction(async (tx) => {\n const live = await tx.getOperation(owner, operation!.id, true);\n if (\n !live ||\n live.leaseToken !== lease ||\n live.status !== \"running\" ||\n (live.leaseUntil ?? 0) <= now()\n )\n return;\n const retry =\n failure.disposition === \"retryable\" && live.attempts < maxAttempts;\n const unknown =\n failure.disposition === \"outcome_unknown\" ||\n (live.dispatching && (!attemptedWrite || remoteSucceeded));\n const next: Operation = {\n ...live,\n authRecoveries: Math.min(\n 1,\n (live.authRecoveries ?? 0) + (authenticationRecovered ? 1 : 0),\n ),\n status: [\"connection_revoked\", \"owner_erased\"].includes(failure.code)\n ? \"cancelled\"\n : unknown\n ? \"outcome_unknown\"\n : retry\n ? \"pending\"\n : failure.disposition === \"requires_reauth\"\n ? \"blocked\"\n : \"failed\",\n dispatching: unknown ? live.dispatching : false,\n availableAt:\n now() +\n Math.max(\n failure.retryAfterMs ?? 0,\n Math.min(3_600_000, 15000 * 2 ** Math.min(live.attempts, 8)),\n ),\n leaseToken: undefined,\n leaseUntil: undefined,\n errorCode: failure.code,\n version: live.version + 1,\n updatedAt: now(),\n };\n // Unknown outcomes require explicit recovery after the retry budget; never recreate the write.\n if (unknown && live.attempts >= maxAttempts)\n next.availableAt = Number.MAX_SAFE_INTEGER;\n if (!(await tx.saveOperation(next, live.version, lease))) return;\n await tx.insertEvent({\n id: randomUUID(),\n ...owner,\n operationId: next.id,\n type: `operation.${next.status}`,\n createdAt: now(),\n data: { code: failure.code },\n });\n });\n options.logger?.warn?.(\n { code: failure.code },\n \"Integration operation interrupted\",\n );\n } finally {\n clearInterval(timer);\n abort.abort();\n }\n }\n const sdk: IntegrationSdk = {\n namespace: options.namespace,\n withStore: (store: IntegrationStore) =>\n createIntegrationSdk({ ...options, store }),\n assertCompatible: () => options.store.assertCompatible(),\n catalog: () =>\n [...providers.values()].map((p) => ({\n key: p.key,\n registrationId: p.registrationId,\n purposes: [...p.purposes],\n resources: Boolean(p.resources),\n actions: Object.keys(p.actions ?? {}),\n remoteRevocationSupported: Boolean(p.revoke),\n })),\n identity: {\n start: (input: { ownerId: string; provider: string; binding: string }) =>\n start(input, \"identity\"),\n startNative: (input: {\n ownerId: string;\n provider: string;\n binding: string;\n }) => start(input, \"identity\", true),\n async complete(input: {\n ownerId: string;\n state: string;\n binding: string;\n code: string;\n }) {\n const { provider, secret } = await consume(input, \"identity\");\n const result = await provider.authorization!.exchange(\n {\n code: required(input.code, \"code\", 4096),\n verifier: secret.verifier,\n nonce: secret.nonce,\n purpose: \"identity\",\n },\n request,\n );\n if (!result.identity) throw new IntegrationError(\"invalid_identity\");\n return result.identity;\n },\n async verifyNative(input: {\n ownerId: string;\n state: string;\n binding: string;\n idToken: string;\n authorizationCode?: string;\n }) {\n const { provider, secret } = await consume(input, \"identity\", true);\n return provider.verifyNative!(\n {\n idToken: input.idToken,\n nonce: secret.nonce,\n authorizationCode: input.authorizationCode,\n },\n request,\n );\n },\n },\n connections: {\n start: (input: {\n ownerId: string;\n provider: string;\n binding: string;\n connectionId?: string;\n }) => start(input, \"connect\"),\n async complete(input: {\n ownerId: string;\n state: string;\n binding: string;\n code: string;\n }) {\n const { flow, secret, provider } = await consume(input, \"connect\");\n const reservation = randomUUID();\n const reserved: string[] = [];\n await options.store.transaction(async (tx) => {\n await tx.lockScope(scope(input.ownerId));\n if (\n flow.authorizationEpoch !==\n (await tx.authorizationEpoch(\n scope(input.ownerId),\n authorizationKey(provider),\n ))\n )\n throw new IntegrationError(\"authorization_conflict\");\n for (const current of (\n await tx.listConnections(scope(input.ownerId))\n ).filter(\n (c) =>\n c.provider === provider.key &&\n c.registrationId === provider.registrationId &&\n c.status !== \"revoked\",\n )) {\n const previous = await tx.getGrant(\n scope(input.ownerId),\n current.grantId,\n true,\n );\n if (!previous || previous.status === \"revoked\") continue;\n if (\n previous.refreshLease ||\n (previous.authorizationLease &&\n (previous.authorizationUntil ?? 0) > now())\n )\n throw new IntegrationError(\"credential_busy\", \"retryable\", 2000);\n if (\n !(await tx.saveGrant(\n {\n ...previous,\n version: previous.version + 1,\n authorizationLease: reservation,\n authorizationUntil: now() + 60_000,\n },\n previous.version,\n ))\n )\n throw new IntegrationError(\"authorization_conflict\");\n reserved.push(previous.id);\n }\n });\n let completed = false;\n try {\n const result = await provider.authorization!.exchange(\n {\n code: required(input.code, \"code\", 4096),\n verifier: secret.verifier,\n nonce: secret.nonce,\n purpose: \"connect\",\n },\n request,\n );\n if (!result.credentials || !result.account)\n throw new IntegrationError(\"invalid_connection\");\n const grant: Grant = {\n id: randomUUID(),\n ...scope(input.ownerId),\n provider: provider.key,\n registrationId: provider.registrationId,\n account: result.account,\n version: 1,\n status: \"active\",\n credentials: { keyId: \"\", value: \"\" },\n expiresAt: result.credentials.expiresAt,\n };\n grant.credentials = await options.vault.seal(\n result.credentials as unknown as Json,\n grantContext(grant),\n );\n const connected = await options.store.transaction(async (tx) => {\n await tx.lockScope(scope(input.ownerId));\n if (\n flow.authorizationEpoch !==\n (await tx.authorizationEpoch(\n scope(input.ownerId),\n authorizationKey(provider),\n ))\n )\n throw new IntegrationError(\"authorization_conflict\");\n await tx.assertAccountOwner(\n scope(input.ownerId),\n provider.key,\n provider.registrationId,\n result.account!.id,\n );\n const existing = flow.connectionId\n ? await tx.getConnection(\n scope(input.ownerId),\n flow.connectionId,\n true,\n )\n : (await tx.listConnections(scope(input.ownerId))).find(\n (c) =>\n c.provider === provider.key &&\n c.registrationId === provider.registrationId &&\n c.account.id === result.account!.id,\n );\n if (\n flow.connectionId &&\n (!existing ||\n existing.generation !== flow.generation ||\n existing.status === \"revoked\" ||\n existing.account.id !== result.account!.id)\n )\n throw new IntegrationError(\"authorization_conflict\");\n if (existing) {\n const previous = await tx.getGrant(\n scope(input.ownerId),\n existing.grantId,\n true,\n );\n if (\n previous &&\n previous.status !== \"revoked\" &&\n (previous.authorizationLease !== reservation ||\n (previous.authorizationUntil ?? 0) <= now())\n )\n throw new IntegrationError(\"authorization_conflict\");\n if (previous)\n await tx.saveGrant(\n {\n ...previous,\n status: \"revoked\",\n version: previous.version + 1,\n authorizationLease: undefined,\n authorizationUntil: undefined,\n },\n previous.version,\n );\n await tx.insertGrant(grant);\n const updated: Connection = {\n ...existing,\n grantId: grant.id,\n generation: existing.generation + 1,\n status: \"active\",\n account: result.account!,\n updatedAt: now(),\n };\n if (!(await tx.saveConnection(updated, existing.generation)))\n throw new IntegrationError(\"authorization_conflict\");\n return updated;\n }\n await tx.insertGrant(grant);\n const created: Connection = {\n id: randomUUID(),\n ...scope(input.ownerId),\n provider: provider.key,\n registrationId: provider.registrationId,\n grantId: grant.id,\n account: result.account!,\n generation: 1,\n status: \"active\",\n createdAt: now(),\n updatedAt: now(),\n };\n await tx.insertConnection(created);\n return created;\n });\n completed = true;\n return connected;\n } finally {\n await options.store\n .transaction(async (tx) => {\n await tx.lockScope(scope(input.ownerId), true);\n for (const id of reserved) {\n const grant = await tx.getGrant(scope(input.ownerId), id, true);\n if (grant?.authorizationLease !== reservation) continue;\n await tx.saveGrant(\n {\n ...grant,\n status:\n !completed && grant.status === \"active\"\n ? \"reauth_required\"\n : grant.status,\n version: grant.version + 1,\n authorizationLease: undefined,\n authorizationUntil: undefined,\n },\n grant.version,\n );\n }\n })\n .catch(() => {\n options.logger?.warn?.(\n { code: \"authorization_cleanup_pending\" },\n \"Authorization lease awaits recovery\",\n );\n });\n }\n },\n async list(ownerId: string) {\n return options.store.transaction(async (tx) => {\n const values = await tx.listConnections(scope(ownerId));\n return Promise.all(\n values.map(async (value) => {\n const grant = await tx.getGrant(scope(ownerId), value.grantId);\n return value.status === \"active\" &&\n grant?.status === \"reauth_required\"\n ? { ...value, status: \"reauth_required\" as const }\n : value;\n }),\n );\n });\n },\n async disconnect(ownerId: string, id: string) {\n return options.store.transaction(async (tx) => {\n await tx.lockScope(scope(ownerId), true);\n const current = await tx.getConnection(scope(ownerId), id, true);\n if (!current) throw new IntegrationError(\"connection_not_found\");\n const provider = providers.get(current.provider);\n if (current.status === \"revoked\")\n return {\n disconnected: true,\n remoteRevocationSupported: Boolean(provider?.revoke),\n };\n await tx.authorizationEpoch(\n scope(ownerId),\n hash(`${current.provider}\\0${current.registrationId}`),\n true,\n );\n const grant = await tx.getGrant(\n scope(ownerId),\n current.grantId,\n true,\n );\n const next = {\n ...current,\n status: \"revoked\" as const,\n generation: current.generation + 1,\n updatedAt: now(),\n };\n if (!(await tx.saveConnection(next, current.generation)))\n throw new IntegrationError(\"connection_conflict\");\n if (grant)\n await tx.saveGrant(\n {\n ...grant,\n status: \"revoked\",\n version: grant.version + 1,\n refreshLease: undefined,\n refreshUntil: undefined,\n authorizationLease: undefined,\n authorizationUntil: undefined,\n },\n grant.version,\n );\n if (grant && (!provider || provider.revoke)) {\n const op: Operation = {\n id: randomUUID(),\n ...scope(ownerId),\n connectionId: id,\n generation: next.generation,\n action: \"__sdk.revoke\",\n idempotencyKey: `disconnect:${id}:${next.generation}`,\n fingerprint: hash(id),\n input: { keyId: \"\", value: \"\" },\n status: \"pending\",\n version: 1,\n attempts: 0,\n availableAt: now(),\n checkpoint: null,\n dispatching: false,\n createdAt: now(),\n updatedAt: now(),\n };\n op.input = await options.vault.seal(null, operationContext(op));\n await tx.insertOperation(op);\n }\n return {\n disconnected: true,\n remoteRevocationSupported: Boolean(provider?.revoke),\n };\n });\n },\n },\n async eraseOwner(ownerId: string) {\n await options.store.transaction(async (tx) => {\n await tx.lockScope(scope(ownerId), true);\n await tx.markOwnerErased(scope(ownerId));\n });\n const existing = await options.store.transaction((tx) =>\n tx.listConnections(scope(ownerId)),\n );\n for (const current of existing)\n await sdk.connections.disconnect(ownerId, current.id);\n await options.store.transaction(async (tx) => {\n await tx.eraseOwner(scope(ownerId), true);\n });\n },\n resources: {\n async list(input: {\n ownerId: string;\n connectionId: string;\n cursor?: string;\n query?: string;\n parentId?: string;\n }) {\n const current = await connection(input.ownerId, input.connectionId);\n const provider = providerFor(current.provider, current.registrationId);\n if (!provider.resources)\n throw new IntegrationError(\"unsupported_capability\");\n let material = await credentials(current);\n let result: ResourcePage;\n try {\n result = await provider.resources(input, {\n credentials: material,\n fetch: apiFetch(provider),\n });\n } catch (error) {\n const failure = integrationError(error);\n const definiteUnauthorized =\n failure.disposition === \"requires_reauth\" &&\n error instanceof Error &&\n \"status\" in error &&\n error.status === 401 &&\n \"definite\" in error &&\n error.definite === true;\n if (!definiteUnauthorized || !provider.refresh) throw error;\n material = await credentials(\n current,\n undefined,\n true,\n material.accessToken,\n );\n result = await provider.resources(input, {\n credentials: material,\n fetch: apiFetch(provider),\n });\n }\n const live = await connection(input.ownerId, input.connectionId);\n if (live.generation !== current.generation)\n throw new IntegrationError(\"connection_changed\");\n return result;\n },\n },\n operations: {\n enqueue,\n get: getOperation,\n list: (ownerId: string, connectionId?: string) =>\n options.store.transaction((tx) =>\n tx.listOperations(scope(ownerId), connectionId),\n ),\n async recover(ownerId: string, id: string) {\n return options.store.transaction(async (tx) => {\n const current = await tx.getOperation(scope(ownerId), id, true);\n if (!current) throw new IntegrationError(\"operation_not_found\");\n if (current.errorCode === \"payload_expired\")\n throw new IntegrationError(\"payload_expired\");\n if (\n ![\"outcome_unknown\", \"blocked\", \"failed\"].includes(current.status)\n )\n return current;\n const connection = await tx.getConnection(\n scope(ownerId),\n current.connectionId,\n true,\n );\n const revoke = current.action === \"__sdk.revoke\";\n if (\n !connection ||\n connection.generation !== current.generation ||\n (revoke\n ? connection.status !== \"revoked\"\n : connection.status !== \"active\")\n )\n throw new IntegrationError(\"connection_revoked\");\n const next = {\n ...current,\n status: current.dispatching\n ? (\"outcome_unknown\" as const)\n : (\"pending\" as const),\n attempts: 0,\n availableAt: now(),\n version: current.version + 1,\n updatedAt: now(),\n };\n if (!(await tx.saveOperation(next, current.version)))\n throw new IntegrationError(\"operation_conflict\");\n return next;\n });\n },\n },\n events: {\n list: (ownerId: string, after?: string) =>\n options.store.transaction((tx) => tx.listEvents(scope(ownerId), after)),\n },\n runtime: {\n process,\n async due(limit = 100) {\n await options.store.transaction(async (tx) => {\n await tx.recoverOperations(options.namespace, now());\n await tx.collectGarbage(\n options.namespace,\n now(),\n options.failedPayloadRetentionMs ?? 7 * 86_400_000,\n );\n });\n return options.store.transaction((tx) =>\n tx.dueOperations(options.namespace, now(), limit),\n );\n },\n },\n };\n return sdk;\n}\n","import { IntegrationError } from \"./errors\";\nimport type { IntegrationSdk } from \"./sdk\";\nimport type { QueueTransport } from \"./types\";\n\nexport function createRuntime(options: {\n sdk: IntegrationSdk;\n queue: QueueTransport;\n intervalMs?: number;\n batchSize?: number;\n}) {\n let timer: ReturnType<typeof setInterval> | undefined;\n let ticking: Promise<void> | undefined;\n let lifecycle: Promise<void> = Promise.resolve();\n let starting: Promise<void> | undefined;\n let stopping: Promise<void> | undefined;\n let desiredRunning = false;\n let running = false;\n let generation = 0;\n let queueStarted = false;\n let lastSuccess: number | undefined;\n let lastError: string | undefined;\n const current = (epoch: number) =>\n desiredRunning && running && generation === epoch;\n const clearTimer = () => {\n if (timer) clearInterval(timer);\n timer = undefined;\n };\n const serialize = (work: () => Promise<void>) => {\n const pending = lifecycle.then(work);\n lifecycle = pending.catch(() => undefined);\n return pending;\n };\n const tick = (epoch: number): Promise<void> => {\n if (!current(epoch)) return Promise.resolve();\n if (ticking) return ticking;\n ticking = (async () => {\n try {\n const messages = await options.sdk.runtime.due(\n options.batchSize ?? 100,\n );\n // Shutdown may have started while the database query was in flight.\n if (!current(epoch)) return;\n await options.queue.publish(\n messages.map((message) => ({\n taskId: message.id,\n version: message.version,\n })),\n );\n if (!current(epoch)) return;\n lastSuccess = Date.now();\n lastError = undefined;\n } catch {\n if (current(epoch)) lastError = \"dispatch_unavailable\";\n }\n })().finally(() => {\n ticking = undefined;\n });\n return ticking;\n };\n return {\n start(): Promise<void> {\n if (desiredRunning && (starting || running))\n return starting ?? Promise.resolve();\n desiredRunning = true;\n const epoch = ++generation;\n const pending = serialize(async () => {\n if (!desiredRunning || generation !== epoch) return;\n let queueAttempted = false;\n try {\n // A previous failed shutdown may have left a worker with an obsolete callback.\n if (queueStarted) {\n await options.queue.stop();\n queueStarted = false;\n }\n await options.sdk.assertCompatible();\n if (!desiredRunning || generation !== epoch) return;\n queueAttempted = true;\n queueStarted = true;\n await options.queue.start((message) => {\n if (!desiredRunning || generation !== epoch)\n return Promise.resolve();\n return options.sdk.runtime.process(message);\n });\n if (!desiredRunning || generation !== epoch) return;\n lastSuccess = undefined;\n lastError = undefined;\n running = true;\n await tick(epoch);\n if (!current(epoch)) return;\n timer = setInterval(() => {\n void tick(epoch);\n }, options.intervalMs ?? 3000);\n timer.unref?.();\n } catch (error) {\n running = false;\n clearTimer();\n if (generation === epoch) desiredRunning = false;\n if (queueAttempted) {\n try {\n await options.queue.stop();\n queueStarted = false;\n } catch {\n /* Keep the original startup failure; retry cleanup on the next start/stop. */\n }\n }\n throw error;\n }\n });\n starting = pending;\n void pending.then(\n () => {\n if (starting === pending) starting = undefined;\n },\n () => {\n if (starting === pending) starting = undefined;\n },\n );\n return pending;\n },\n stop(): Promise<void> {\n if (!desiredRunning && stopping) return stopping;\n // Invalidate callbacks immediately, before waiting for pending startup or dispatch.\n desiredRunning = false;\n running = false;\n generation++;\n clearTimer();\n const pending = serialize(async () => {\n if (ticking) await ticking;\n if (queueStarted) {\n await options.queue.stop();\n queueStarted = false;\n }\n });\n stopping = pending;\n void pending.then(\n () => {\n if (stopping === pending) stopping = undefined;\n },\n () => {\n if (stopping === pending) stopping = undefined;\n },\n );\n return pending;\n },\n async dispatch() {\n if (!running || !desiredRunning)\n throw new IntegrationError(\"runtime_not_started\");\n await tick(generation);\n },\n health() {\n return {\n running,\n ready:\n running &&\n !lastError &&\n lastSuccess !== undefined &&\n Date.now() - lastSuccess < 90_000,\n lastSuccess,\n lastError,\n };\n },\n };\n}\n"],"mappings":"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","names":["import_node_crypto","connection"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { T as TokenVault, J as Json, I as IntegrationStore, P as Purpose, V as VerifiedIdentity, C as Connection, R as ResourcePage, O as Operation, b as IntegrationEvent, c as TaskMessage, d as IntegrationProvider, H as HostHooks, e as SdkLogger, A as ApiRateLimiter, Q as QueueTransport } from './types-Y4-DoJ1A.cjs';
|
|
2
|
+
export { f as ActionContext, g as ActionDefinition, h as AuthorizationInput, i as AuthorizationResult, j as CredentialMaterial, F as Flow, G as Grant, a as IntegrationTransaction, k as OperationStatus, l as ProviderContext, m as RemoteAccount, n as Resource, S as Scope, o as SealedValue } from './types-Y4-DoJ1A.cjs';
|
|
3
|
+
export { F as FailureDisposition, I as IntegrationError, i as integrationError } from './errors-3hDEtzuZ.cjs';
|
|
4
|
+
|
|
5
|
+
declare function createTokenVault(options: {
|
|
6
|
+
activeKeyId: string;
|
|
7
|
+
keys: Record<string, string>;
|
|
8
|
+
}): TokenVault;
|
|
9
|
+
|
|
10
|
+
type SdkOptions = {
|
|
11
|
+
namespace: string;
|
|
12
|
+
store: IntegrationStore;
|
|
13
|
+
vault: TokenVault;
|
|
14
|
+
providers: readonly IntegrationProvider[];
|
|
15
|
+
hooks?: HostHooks;
|
|
16
|
+
fetch?: typeof globalThis.fetch;
|
|
17
|
+
logger?: SdkLogger;
|
|
18
|
+
clock?: () => number;
|
|
19
|
+
leaseMs?: number;
|
|
20
|
+
maximumAttempts?: number;
|
|
21
|
+
failedPayloadRetentionMs?: number;
|
|
22
|
+
rateLimiter?: ApiRateLimiter;
|
|
23
|
+
};
|
|
24
|
+
type EnqueueInput = {
|
|
25
|
+
ownerId: string;
|
|
26
|
+
connectionId: string;
|
|
27
|
+
action: string;
|
|
28
|
+
input: unknown;
|
|
29
|
+
idempotencyKey: string;
|
|
30
|
+
hostContext?: Json;
|
|
31
|
+
};
|
|
32
|
+
type AuthorizationStart = {
|
|
33
|
+
state: string;
|
|
34
|
+
nonce: string;
|
|
35
|
+
authorizationUrl: string;
|
|
36
|
+
};
|
|
37
|
+
type StartInput = {
|
|
38
|
+
ownerId: string;
|
|
39
|
+
provider: string;
|
|
40
|
+
binding: string;
|
|
41
|
+
connectionId?: string;
|
|
42
|
+
};
|
|
43
|
+
type CompleteInput = {
|
|
44
|
+
ownerId: string;
|
|
45
|
+
state: string;
|
|
46
|
+
binding: string;
|
|
47
|
+
code: string;
|
|
48
|
+
};
|
|
49
|
+
interface IntegrationSdk {
|
|
50
|
+
readonly namespace: string;
|
|
51
|
+
withStore(store: IntegrationStore): IntegrationSdk;
|
|
52
|
+
assertCompatible(): Promise<void>;
|
|
53
|
+
catalog(): Array<{
|
|
54
|
+
key: string;
|
|
55
|
+
registrationId: string;
|
|
56
|
+
purposes: Purpose[];
|
|
57
|
+
resources: boolean;
|
|
58
|
+
actions: string[];
|
|
59
|
+
remoteRevocationSupported: boolean;
|
|
60
|
+
}>;
|
|
61
|
+
identity: {
|
|
62
|
+
start(input: StartInput): Promise<AuthorizationStart>;
|
|
63
|
+
startNative(input: StartInput): Promise<AuthorizationStart>;
|
|
64
|
+
complete(input: CompleteInput): Promise<VerifiedIdentity>;
|
|
65
|
+
verifyNative(input: {
|
|
66
|
+
ownerId: string;
|
|
67
|
+
state: string;
|
|
68
|
+
binding: string;
|
|
69
|
+
idToken: string;
|
|
70
|
+
authorizationCode?: string;
|
|
71
|
+
}): Promise<VerifiedIdentity>;
|
|
72
|
+
};
|
|
73
|
+
connections: {
|
|
74
|
+
start(input: StartInput): Promise<AuthorizationStart>;
|
|
75
|
+
complete(input: CompleteInput): Promise<Connection>;
|
|
76
|
+
list(ownerId: string): Promise<Connection[]>;
|
|
77
|
+
disconnect(ownerId: string, id: string): Promise<{
|
|
78
|
+
disconnected: boolean;
|
|
79
|
+
remoteRevocationSupported: boolean;
|
|
80
|
+
}>;
|
|
81
|
+
};
|
|
82
|
+
resources: {
|
|
83
|
+
list(input: {
|
|
84
|
+
ownerId: string;
|
|
85
|
+
connectionId: string;
|
|
86
|
+
cursor?: string;
|
|
87
|
+
query?: string;
|
|
88
|
+
parentId?: string;
|
|
89
|
+
}): Promise<ResourcePage>;
|
|
90
|
+
};
|
|
91
|
+
operations: {
|
|
92
|
+
enqueue(input: EnqueueInput): Promise<Operation>;
|
|
93
|
+
get(ownerId: string, id: string): Promise<Operation>;
|
|
94
|
+
list(ownerId: string, connectionId?: string): Promise<Operation[]>;
|
|
95
|
+
recover(ownerId: string, id: string): Promise<Operation>;
|
|
96
|
+
};
|
|
97
|
+
events: {
|
|
98
|
+
list(ownerId: string, after?: string): Promise<IntegrationEvent[]>;
|
|
99
|
+
};
|
|
100
|
+
eraseOwner(ownerId: string): Promise<void>;
|
|
101
|
+
runtime: {
|
|
102
|
+
process(message: TaskMessage): Promise<void>;
|
|
103
|
+
due(limit?: number): Promise<Array<{
|
|
104
|
+
id: string;
|
|
105
|
+
version: number;
|
|
106
|
+
}>>;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
declare function createIntegrationSdk(options: SdkOptions): IntegrationSdk;
|
|
110
|
+
|
|
111
|
+
declare function createRuntime(options: {
|
|
112
|
+
sdk: IntegrationSdk;
|
|
113
|
+
queue: QueueTransport;
|
|
114
|
+
intervalMs?: number;
|
|
115
|
+
batchSize?: number;
|
|
116
|
+
}): {
|
|
117
|
+
start(): Promise<void>;
|
|
118
|
+
stop(): Promise<void>;
|
|
119
|
+
dispatch(): Promise<void>;
|
|
120
|
+
health(): {
|
|
121
|
+
running: boolean;
|
|
122
|
+
ready: boolean;
|
|
123
|
+
lastSuccess: number | undefined;
|
|
124
|
+
lastError: string | undefined;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export { ApiRateLimiter, type AuthorizationStart, type CompleteInput, Connection, type EnqueueInput, HostHooks, IntegrationEvent, IntegrationProvider, type IntegrationSdk, IntegrationStore, Json, Operation, Purpose, QueueTransport, ResourcePage, SdkLogger, type SdkOptions, type StartInput, TaskMessage, TokenVault, VerifiedIdentity, createIntegrationSdk, createRuntime, createTokenVault };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { T as TokenVault, J as Json, I as IntegrationStore, P as Purpose, V as VerifiedIdentity, C as Connection, R as ResourcePage, O as Operation, b as IntegrationEvent, c as TaskMessage, d as IntegrationProvider, H as HostHooks, e as SdkLogger, A as ApiRateLimiter, Q as QueueTransport } from './types-Y4-DoJ1A.js';
|
|
2
|
+
export { f as ActionContext, g as ActionDefinition, h as AuthorizationInput, i as AuthorizationResult, j as CredentialMaterial, F as Flow, G as Grant, a as IntegrationTransaction, k as OperationStatus, l as ProviderContext, m as RemoteAccount, n as Resource, S as Scope, o as SealedValue } from './types-Y4-DoJ1A.js';
|
|
3
|
+
export { F as FailureDisposition, I as IntegrationError, i as integrationError } from './errors-3hDEtzuZ.js';
|
|
4
|
+
|
|
5
|
+
declare function createTokenVault(options: {
|
|
6
|
+
activeKeyId: string;
|
|
7
|
+
keys: Record<string, string>;
|
|
8
|
+
}): TokenVault;
|
|
9
|
+
|
|
10
|
+
type SdkOptions = {
|
|
11
|
+
namespace: string;
|
|
12
|
+
store: IntegrationStore;
|
|
13
|
+
vault: TokenVault;
|
|
14
|
+
providers: readonly IntegrationProvider[];
|
|
15
|
+
hooks?: HostHooks;
|
|
16
|
+
fetch?: typeof globalThis.fetch;
|
|
17
|
+
logger?: SdkLogger;
|
|
18
|
+
clock?: () => number;
|
|
19
|
+
leaseMs?: number;
|
|
20
|
+
maximumAttempts?: number;
|
|
21
|
+
failedPayloadRetentionMs?: number;
|
|
22
|
+
rateLimiter?: ApiRateLimiter;
|
|
23
|
+
};
|
|
24
|
+
type EnqueueInput = {
|
|
25
|
+
ownerId: string;
|
|
26
|
+
connectionId: string;
|
|
27
|
+
action: string;
|
|
28
|
+
input: unknown;
|
|
29
|
+
idempotencyKey: string;
|
|
30
|
+
hostContext?: Json;
|
|
31
|
+
};
|
|
32
|
+
type AuthorizationStart = {
|
|
33
|
+
state: string;
|
|
34
|
+
nonce: string;
|
|
35
|
+
authorizationUrl: string;
|
|
36
|
+
};
|
|
37
|
+
type StartInput = {
|
|
38
|
+
ownerId: string;
|
|
39
|
+
provider: string;
|
|
40
|
+
binding: string;
|
|
41
|
+
connectionId?: string;
|
|
42
|
+
};
|
|
43
|
+
type CompleteInput = {
|
|
44
|
+
ownerId: string;
|
|
45
|
+
state: string;
|
|
46
|
+
binding: string;
|
|
47
|
+
code: string;
|
|
48
|
+
};
|
|
49
|
+
interface IntegrationSdk {
|
|
50
|
+
readonly namespace: string;
|
|
51
|
+
withStore(store: IntegrationStore): IntegrationSdk;
|
|
52
|
+
assertCompatible(): Promise<void>;
|
|
53
|
+
catalog(): Array<{
|
|
54
|
+
key: string;
|
|
55
|
+
registrationId: string;
|
|
56
|
+
purposes: Purpose[];
|
|
57
|
+
resources: boolean;
|
|
58
|
+
actions: string[];
|
|
59
|
+
remoteRevocationSupported: boolean;
|
|
60
|
+
}>;
|
|
61
|
+
identity: {
|
|
62
|
+
start(input: StartInput): Promise<AuthorizationStart>;
|
|
63
|
+
startNative(input: StartInput): Promise<AuthorizationStart>;
|
|
64
|
+
complete(input: CompleteInput): Promise<VerifiedIdentity>;
|
|
65
|
+
verifyNative(input: {
|
|
66
|
+
ownerId: string;
|
|
67
|
+
state: string;
|
|
68
|
+
binding: string;
|
|
69
|
+
idToken: string;
|
|
70
|
+
authorizationCode?: string;
|
|
71
|
+
}): Promise<VerifiedIdentity>;
|
|
72
|
+
};
|
|
73
|
+
connections: {
|
|
74
|
+
start(input: StartInput): Promise<AuthorizationStart>;
|
|
75
|
+
complete(input: CompleteInput): Promise<Connection>;
|
|
76
|
+
list(ownerId: string): Promise<Connection[]>;
|
|
77
|
+
disconnect(ownerId: string, id: string): Promise<{
|
|
78
|
+
disconnected: boolean;
|
|
79
|
+
remoteRevocationSupported: boolean;
|
|
80
|
+
}>;
|
|
81
|
+
};
|
|
82
|
+
resources: {
|
|
83
|
+
list(input: {
|
|
84
|
+
ownerId: string;
|
|
85
|
+
connectionId: string;
|
|
86
|
+
cursor?: string;
|
|
87
|
+
query?: string;
|
|
88
|
+
parentId?: string;
|
|
89
|
+
}): Promise<ResourcePage>;
|
|
90
|
+
};
|
|
91
|
+
operations: {
|
|
92
|
+
enqueue(input: EnqueueInput): Promise<Operation>;
|
|
93
|
+
get(ownerId: string, id: string): Promise<Operation>;
|
|
94
|
+
list(ownerId: string, connectionId?: string): Promise<Operation[]>;
|
|
95
|
+
recover(ownerId: string, id: string): Promise<Operation>;
|
|
96
|
+
};
|
|
97
|
+
events: {
|
|
98
|
+
list(ownerId: string, after?: string): Promise<IntegrationEvent[]>;
|
|
99
|
+
};
|
|
100
|
+
eraseOwner(ownerId: string): Promise<void>;
|
|
101
|
+
runtime: {
|
|
102
|
+
process(message: TaskMessage): Promise<void>;
|
|
103
|
+
due(limit?: number): Promise<Array<{
|
|
104
|
+
id: string;
|
|
105
|
+
version: number;
|
|
106
|
+
}>>;
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
declare function createIntegrationSdk(options: SdkOptions): IntegrationSdk;
|
|
110
|
+
|
|
111
|
+
declare function createRuntime(options: {
|
|
112
|
+
sdk: IntegrationSdk;
|
|
113
|
+
queue: QueueTransport;
|
|
114
|
+
intervalMs?: number;
|
|
115
|
+
batchSize?: number;
|
|
116
|
+
}): {
|
|
117
|
+
start(): Promise<void>;
|
|
118
|
+
stop(): Promise<void>;
|
|
119
|
+
dispatch(): Promise<void>;
|
|
120
|
+
health(): {
|
|
121
|
+
running: boolean;
|
|
122
|
+
ready: boolean;
|
|
123
|
+
lastSuccess: number | undefined;
|
|
124
|
+
lastError: string | undefined;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
export { ApiRateLimiter, type AuthorizationStart, type CompleteInput, Connection, type EnqueueInput, HostHooks, IntegrationEvent, IntegrationProvider, type IntegrationSdk, IntegrationStore, Json, Operation, Purpose, QueueTransport, ResourcePage, SdkLogger, type SdkOptions, type StartInput, TaskMessage, TokenVault, VerifiedIdentity, createIntegrationSdk, createRuntime, createTokenVault };
|