@digimuza/saas-core 0.0.2
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/CLAUDE.md +1165 -0
- package/LICENSE +21 -0
- package/README.md +234 -0
- package/dist/api-keys/index.d.ts +9 -0
- package/dist/api-keys/index.d.ts.map +1 -0
- package/dist/api-keys/index.js +37 -0
- package/dist/api-keys/index.js.map +1 -0
- package/dist/api-keys/keys.d.ts +55 -0
- package/dist/api-keys/keys.d.ts.map +1 -0
- package/dist/api-keys/keys.js +92 -0
- package/dist/api-keys/keys.js.map +1 -0
- package/dist/api-keys/service.d.ts +111 -0
- package/dist/api-keys/service.d.ts.map +1 -0
- package/dist/api-keys/service.js +210 -0
- package/dist/api-keys/service.js.map +1 -0
- package/dist/audit/index.d.ts +5 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +44 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/audit/service.d.ts +88 -0
- package/dist/audit/service.d.ts.map +1 -0
- package/dist/audit/service.js +128 -0
- package/dist/audit/service.js.map +1 -0
- package/dist/auth/client.d.ts +5 -0
- package/dist/auth/client.d.ts.map +1 -0
- package/dist/auth/client.js +26 -0
- package/dist/auth/client.js.map +1 -0
- package/dist/auth/cookies.d.ts +51 -0
- package/dist/auth/cookies.d.ts.map +1 -0
- package/dist/auth/cookies.js +58 -0
- package/dist/auth/cookies.js.map +1 -0
- package/dist/auth/index.d.ts +14 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +46 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/service.d.ts +67 -0
- package/dist/auth/service.d.ts.map +1 -0
- package/dist/auth/service.js +275 -0
- package/dist/auth/service.js.map +1 -0
- package/dist/auth/types.d.ts +56 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +2 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/authorization/index.d.ts +4 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +24 -0
- package/dist/authorization/index.js.map +1 -0
- package/dist/authorization/service.d.ts +92 -0
- package/dist/authorization/service.d.ts.map +1 -0
- package/dist/authorization/service.js +254 -0
- package/dist/authorization/service.js.map +1 -0
- package/dist/billing/index.d.ts +16 -0
- package/dist/billing/index.d.ts.map +1 -0
- package/dist/billing/index.js +47 -0
- package/dist/billing/index.js.map +1 -0
- package/dist/billing/provider.d.ts +114 -0
- package/dist/billing/provider.d.ts.map +1 -0
- package/dist/billing/provider.js +2 -0
- package/dist/billing/provider.js.map +1 -0
- package/dist/billing/revolut.d.ts +68 -0
- package/dist/billing/revolut.d.ts.map +1 -0
- package/dist/billing/revolut.js +181 -0
- package/dist/billing/revolut.js.map +1 -0
- package/dist/billing/service.d.ts +124 -0
- package/dist/billing/service.d.ts.map +1 -0
- package/dist/billing/service.js +470 -0
- package/dist/billing/service.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +43 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +212 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/project.d.ts +12 -0
- package/dist/cli/commands/project.d.ts.map +1 -0
- package/dist/cli/commands/project.js +49 -0
- package/dist/cli/commands/project.js.map +1 -0
- package/dist/cli/docker.d.ts +50 -0
- package/dist/cli/docker.d.ts.map +1 -0
- package/dist/cli/docker.js +84 -0
- package/dist/cli/docker.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +198 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/output.d.ts +30 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +66 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/templates.d.ts +52 -0
- package/dist/cli/templates.d.ts.map +1 -0
- package/dist/cli/templates.js +225 -0
- package/dist/cli/templates.js.map +1 -0
- package/dist/config/client.d.ts +60 -0
- package/dist/config/client.d.ts.map +1 -0
- package/dist/config/client.js +94 -0
- package/dist/config/client.js.map +1 -0
- package/dist/config/config-loader.d.ts +2 -0
- package/dist/config/config-loader.d.ts.map +1 -0
- package/dist/config/config-loader.js +2 -0
- package/dist/config/config-loader.js.map +1 -0
- package/dist/config/env.d.ts +24 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +40 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/errors.d.ts +17 -0
- package/dist/config/errors.d.ts.map +1 -0
- package/dist/config/errors.js +26 -0
- package/dist/config/errors.js.map +1 -0
- package/dist/config/index.d.ts +72 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +106 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/runtime.d.ts +15 -0
- package/dist/config/runtime.d.ts.map +1 -0
- package/dist/config/runtime.js +22 -0
- package/dist/config/runtime.js.map +1 -0
- package/dist/config/sections.d.ts +226 -0
- package/dist/config/sections.d.ts.map +1 -0
- package/dist/config/sections.js +141 -0
- package/dist/config/sections.js.map +1 -0
- package/dist/db/client.d.ts +43 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +77 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/errors.d.ts +39 -0
- package/dist/db/errors.d.ts.map +1 -0
- package/dist/db/errors.js +67 -0
- package/dist/db/errors.js.map +1 -0
- package/dist/db/index.d.ts +10 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +10 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/migrate.d.ts +21 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +28 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/schema/_shared.d.ts +30 -0
- package/dist/db/schema/_shared.d.ts.map +1 -0
- package/dist/db/schema/_shared.js +36 -0
- package/dist/db/schema/_shared.js.map +1 -0
- package/dist/db/schema/apikeys.d.ts +263 -0
- package/dist/db/schema/apikeys.d.ts.map +1 -0
- package/dist/db/schema/apikeys.js +70 -0
- package/dist/db/schema/apikeys.js.map +1 -0
- package/dist/db/schema/authorization.d.ts +465 -0
- package/dist/db/schema/authorization.d.ts.map +1 -0
- package/dist/db/schema/authorization.js +134 -0
- package/dist/db/schema/authorization.js.map +1 -0
- package/dist/db/schema/billing.d.ts +1100 -0
- package/dist/db/schema/billing.d.ts.map +1 -0
- package/dist/db/schema/billing.js +223 -0
- package/dist/db/schema/billing.js.map +1 -0
- package/dist/db/schema/events.d.ts +161 -0
- package/dist/db/schema/events.d.ts.map +1 -0
- package/dist/db/schema/events.js +66 -0
- package/dist/db/schema/events.js.map +1 -0
- package/dist/db/schema/features.d.ts +243 -0
- package/dist/db/schema/features.d.ts.map +1 -0
- package/dist/db/schema/features.js +87 -0
- package/dist/db/schema/features.js.map +1 -0
- package/dist/db/schema/files.d.ts +253 -0
- package/dist/db/schema/files.d.ts.map +1 -0
- package/dist/db/schema/files.js +74 -0
- package/dist/db/schema/files.js.map +1 -0
- package/dist/db/schema/index.d.ts +38 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/index.js +38 -0
- package/dist/db/schema/index.js.map +1 -0
- package/dist/db/schema/invitations.d.ts +214 -0
- package/dist/db/schema/invitations.d.ts.map +1 -0
- package/dist/db/schema/invitations.js +80 -0
- package/dist/db/schema/invitations.js.map +1 -0
- package/dist/db/schema/messaging.d.ts +442 -0
- package/dist/db/schema/messaging.d.ts.map +1 -0
- package/dist/db/schema/messaging.js +120 -0
- package/dist/db/schema/messaging.js.map +1 -0
- package/dist/db/schema/users.d.ts +246 -0
- package/dist/db/schema/users.d.ts.map +1 -0
- package/dist/db/schema/users.js +60 -0
- package/dist/db/schema/users.js.map +1 -0
- package/dist/db/schema/webhooks.d.ts +693 -0
- package/dist/db/schema/webhooks.d.ts.map +1 -0
- package/dist/db/schema/webhooks.js +147 -0
- package/dist/db/schema/webhooks.js.map +1 -0
- package/dist/db/schema/workspaces.d.ts +196 -0
- package/dist/db/schema/workspaces.d.ts.map +1 -0
- package/dist/db/schema/workspaces.js +57 -0
- package/dist/db/schema/workspaces.js.map +1 -0
- package/dist/db/types.d.ts +18 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +2 -0
- package/dist/db/types.js.map +1 -0
- package/dist/email/adapters.d.ts +29 -0
- package/dist/email/adapters.d.ts.map +1 -0
- package/dist/email/adapters.js +60 -0
- package/dist/email/adapters.js.map +1 -0
- package/dist/email/index.d.ts +20 -0
- package/dist/email/index.d.ts.map +1 -0
- package/dist/email/index.js +79 -0
- package/dist/email/index.js.map +1 -0
- package/dist/email/provider.d.ts +47 -0
- package/dist/email/provider.d.ts.map +1 -0
- package/dist/email/provider.js +7 -0
- package/dist/email/provider.js.map +1 -0
- package/dist/email/resend.d.ts +22 -0
- package/dist/email/resend.d.ts.map +1 -0
- package/dist/email/resend.js +51 -0
- package/dist/email/resend.js.map +1 -0
- package/dist/email/service.d.ts +55 -0
- package/dist/email/service.d.ts.map +1 -0
- package/dist/email/service.js +87 -0
- package/dist/email/service.js.map +1 -0
- package/dist/email/templates.d.ts +81 -0
- package/dist/email/templates.d.ts.map +1 -0
- package/dist/email/templates.js +84 -0
- package/dist/email/templates.js.map +1 -0
- package/dist/entitlements/index.d.ts +10 -0
- package/dist/entitlements/index.d.ts.map +1 -0
- package/dist/entitlements/index.js +28 -0
- package/dist/entitlements/index.js.map +1 -0
- package/dist/entitlements/service.d.ts +83 -0
- package/dist/entitlements/service.d.ts.map +1 -0
- package/dist/entitlements/service.js +158 -0
- package/dist/entitlements/service.js.map +1 -0
- package/dist/errors.d.ts +85 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +95 -0
- package/dist/errors.js.map +1 -0
- package/dist/events/core-events.d.ts +120 -0
- package/dist/events/core-events.d.ts.map +1 -0
- package/dist/events/core-events.js +109 -0
- package/dist/events/core-events.js.map +1 -0
- package/dist/events/index.d.ts +15 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +58 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/publisher.d.ts +46 -0
- package/dist/events/publisher.d.ts.map +1 -0
- package/dist/events/publisher.js +54 -0
- package/dist/events/publisher.js.map +1 -0
- package/dist/events/registry.d.ts +87 -0
- package/dist/events/registry.d.ts.map +1 -0
- package/dist/events/registry.js +34 -0
- package/dist/events/registry.js.map +1 -0
- package/dist/events/service.d.ts +78 -0
- package/dist/events/service.d.ts.map +1 -0
- package/dist/events/service.js +182 -0
- package/dist/events/service.js.map +1 -0
- package/dist/features/bucket.d.ts +22 -0
- package/dist/features/bucket.d.ts.map +1 -0
- package/dist/features/bucket.js +42 -0
- package/dist/features/bucket.js.map +1 -0
- package/dist/features/index.d.ts +15 -0
- package/dist/features/index.d.ts.map +1 -0
- package/dist/features/index.js +78 -0
- package/dist/features/index.js.map +1 -0
- package/dist/features/registry.d.ts +51 -0
- package/dist/features/registry.d.ts.map +1 -0
- package/dist/features/registry.js +52 -0
- package/dist/features/registry.js.map +1 -0
- package/dist/features/service.d.ts +78 -0
- package/dist/features/service.d.ts.map +1 -0
- package/dist/features/service.js +207 -0
- package/dist/features/service.js.map +1 -0
- package/dist/files/index.d.ts +6 -0
- package/dist/files/index.d.ts.map +1 -0
- package/dist/files/index.js +64 -0
- package/dist/files/index.js.map +1 -0
- package/dist/files/service.d.ts +92 -0
- package/dist/files/service.d.ts.map +1 -0
- package/dist/files/service.js +303 -0
- package/dist/files/service.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/backend.d.ts +23 -0
- package/dist/jobs/backend.d.ts.map +1 -0
- package/dist/jobs/backend.js +23 -0
- package/dist/jobs/backend.js.map +1 -0
- package/dist/jobs/index.d.ts +29 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +114 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/jobs/service.d.ts +67 -0
- package/dist/jobs/service.d.ts.map +1 -0
- package/dist/jobs/service.js +139 -0
- package/dist/jobs/service.js.map +1 -0
- package/dist/jobs/types.d.ts +78 -0
- package/dist/jobs/types.d.ts.map +1 -0
- package/dist/jobs/types.js +4 -0
- package/dist/jobs/types.js.map +1 -0
- package/dist/logger/default.d.ts +7 -0
- package/dist/logger/default.d.ts.map +1 -0
- package/dist/logger/default.js +28 -0
- package/dist/logger/default.js.map +1 -0
- package/dist/logger/index.d.ts +24 -0
- package/dist/logger/index.d.ts.map +1 -0
- package/dist/logger/index.js +90 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/redact.d.ts +40 -0
- package/dist/logger/redact.d.ts.map +1 -0
- package/dist/logger/redact.js +178 -0
- package/dist/logger/redact.js.map +1 -0
- package/dist/logger/service.d.ts +14 -0
- package/dist/logger/service.d.ts.map +1 -0
- package/dist/logger/service.js +56 -0
- package/dist/logger/service.js.map +1 -0
- package/dist/logger/sinks.d.ts +37 -0
- package/dist/logger/sinks.d.ts.map +1 -0
- package/dist/logger/sinks.js +135 -0
- package/dist/logger/sinks.js.map +1 -0
- package/dist/logger/types.d.ts +47 -0
- package/dist/logger/types.d.ts.map +1 -0
- package/dist/logger/types.js +8 -0
- package/dist/logger/types.js.map +1 -0
- package/dist/notifications/index.d.ts +8 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +72 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/service.d.ts +79 -0
- package/dist/notifications/service.d.ts.map +1 -0
- package/dist/notifications/service.js +164 -0
- package/dist/notifications/service.js.map +1 -0
- package/dist/realtime/channels.d.ts +37 -0
- package/dist/realtime/channels.d.ts.map +1 -0
- package/dist/realtime/channels.js +58 -0
- package/dist/realtime/channels.js.map +1 -0
- package/dist/realtime/index.d.ts +19 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/index.js +118 -0
- package/dist/realtime/index.js.map +1 -0
- package/dist/realtime/postgres.d.ts +48 -0
- package/dist/realtime/postgres.d.ts.map +1 -0
- package/dist/realtime/postgres.js +151 -0
- package/dist/realtime/postgres.js.map +1 -0
- package/dist/realtime/service.d.ts +75 -0
- package/dist/realtime/service.d.ts.map +1 -0
- package/dist/realtime/service.js +103 -0
- package/dist/realtime/service.js.map +1 -0
- package/dist/realtime/sse.d.ts +55 -0
- package/dist/realtime/sse.d.ts.map +1 -0
- package/dist/realtime/sse.js +123 -0
- package/dist/realtime/sse.js.map +1 -0
- package/dist/realtime/transport.d.ts +52 -0
- package/dist/realtime/transport.d.ts.map +1 -0
- package/dist/realtime/transport.js +2 -0
- package/dist/realtime/transport.js.map +1 -0
- package/dist/storage/index.d.ts +18 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +89 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/keys.d.ts +50 -0
- package/dist/storage/keys.d.ts.map +1 -0
- package/dist/storage/keys.js +120 -0
- package/dist/storage/keys.js.map +1 -0
- package/dist/storage/memory.d.ts +32 -0
- package/dist/storage/memory.d.ts.map +1 -0
- package/dist/storage/memory.js +84 -0
- package/dist/storage/memory.js.map +1 -0
- package/dist/storage/provider.d.ts +93 -0
- package/dist/storage/provider.d.ts.map +1 -0
- package/dist/storage/provider.js +2 -0
- package/dist/storage/provider.js.map +1 -0
- package/dist/storage/s3.d.ts +34 -0
- package/dist/storage/s3.d.ts.map +1 -0
- package/dist/storage/s3.js +175 -0
- package/dist/storage/s3.js.map +1 -0
- package/dist/storage/service.d.ts +86 -0
- package/dist/storage/service.d.ts.map +1 -0
- package/dist/storage/service.js +107 -0
- package/dist/storage/service.js.map +1 -0
- package/dist/storage/sigv4.d.ts +58 -0
- package/dist/storage/sigv4.d.ts.map +1 -0
- package/dist/storage/sigv4.js +114 -0
- package/dist/storage/sigv4.js.map +1 -0
- package/dist/streams/client.d.ts +91 -0
- package/dist/streams/client.d.ts.map +1 -0
- package/dist/streams/client.js +128 -0
- package/dist/streams/client.js.map +1 -0
- package/dist/streams/events.d.ts +68 -0
- package/dist/streams/events.d.ts.map +1 -0
- package/dist/streams/events.js +81 -0
- package/dist/streams/events.js.map +1 -0
- package/dist/streams/index.d.ts +47 -0
- package/dist/streams/index.d.ts.map +1 -0
- package/dist/streams/index.js +47 -0
- package/dist/streams/index.js.map +1 -0
- package/dist/streams/realtime.d.ts +27 -0
- package/dist/streams/realtime.d.ts.map +1 -0
- package/dist/streams/realtime.js +50 -0
- package/dist/streams/realtime.js.map +1 -0
- package/dist/streams/state.d.ts +26 -0
- package/dist/streams/state.d.ts.map +1 -0
- package/dist/streams/state.js +34 -0
- package/dist/streams/state.js.map +1 -0
- package/dist/users/index.d.ts +9 -0
- package/dist/users/index.d.ts.map +1 -0
- package/dist/users/index.js +23 -0
- package/dist/users/index.js.map +1 -0
- package/dist/users/service.d.ts +43 -0
- package/dist/users/service.d.ts.map +1 -0
- package/dist/users/service.js +113 -0
- package/dist/users/service.js.map +1 -0
- package/dist/webhooks/inbound.d.ts +70 -0
- package/dist/webhooks/inbound.d.ts.map +1 -0
- package/dist/webhooks/inbound.js +146 -0
- package/dist/webhooks/inbound.js.map +1 -0
- package/dist/webhooks/index.d.ts +12 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +65 -0
- package/dist/webhooks/index.js.map +1 -0
- package/dist/webhooks/outgoing.d.ts +89 -0
- package/dist/webhooks/outgoing.d.ts.map +1 -0
- package/dist/webhooks/outgoing.js +375 -0
- package/dist/webhooks/outgoing.js.map +1 -0
- package/dist/webhooks/signature.d.ts +40 -0
- package/dist/webhooks/signature.d.ts.map +1 -0
- package/dist/webhooks/signature.js +77 -0
- package/dist/webhooks/signature.js.map +1 -0
- package/dist/workspaces/context.d.ts +30 -0
- package/dist/workspaces/context.d.ts.map +1 -0
- package/dist/workspaces/context.js +12 -0
- package/dist/workspaces/context.js.map +1 -0
- package/dist/workspaces/index.d.ts +5 -0
- package/dist/workspaces/index.d.ts.map +1 -0
- package/dist/workspaces/index.js +21 -0
- package/dist/workspaces/index.js.map +1 -0
- package/dist/workspaces/service.d.ts +126 -0
- package/dist/workspaces/service.d.ts.map +1 -0
- package/dist/workspaces/service.js +495 -0
- package/dist/workspaces/service.js.map +1 -0
- package/docs/README.md +71 -0
- package/docs/api-keys.md +184 -0
- package/docs/audit.md +198 -0
- package/docs/auth.md +196 -0
- package/docs/authorization.md +225 -0
- package/docs/billing.md +293 -0
- package/docs/cli.md +238 -0
- package/docs/config.md +163 -0
- package/docs/db.md +219 -0
- package/docs/email.md +222 -0
- package/docs/entitlements.md +194 -0
- package/docs/errors.md +158 -0
- package/docs/events.md +279 -0
- package/docs/feature-flags.md +237 -0
- package/docs/files.md +229 -0
- package/docs/jobs.md +288 -0
- package/docs/logger.md +269 -0
- package/docs/notifications.md +179 -0
- package/docs/publishing.md +128 -0
- package/docs/realtime.md +360 -0
- package/docs/storage.md +279 -0
- package/docs/streams.md +296 -0
- package/docs/users.md +117 -0
- package/docs/webhooks.md +272 -0
- package/docs/workspaces.md +269 -0
- package/drizzle/0000_init_users.sql +21 -0
- package/drizzle/0001_workspaces_roles_permissions.sql +86 -0
- package/drizzle/0002_billing_entitlements.sql +97 -0
- package/drizzle/0003_events.sql +17 -0
- package/drizzle/0004_notifications_audit.sql +64 -0
- package/drizzle/0005_api_keys_webhooks.sql +77 -0
- package/drizzle/0006_feature_flags.sql +22 -0
- package/drizzle/0007_files.sql +23 -0
- package/drizzle/meta/0000_snapshot.json +160 -0
- package/drizzle/meta/0001_snapshot.json +837 -0
- package/drizzle/meta/0002_snapshot.json +1580 -0
- package/drizzle/meta/0003_snapshot.json +1751 -0
- package/drizzle/meta/0004_snapshot.json +2109 -0
- package/drizzle/meta/0005_snapshot.json +2719 -0
- package/drizzle/meta/0006_snapshot.json +2909 -0
- package/drizzle/meta/0007_snapshot.json +3113 -0
- package/drizzle/meta/_journal.json +62 -0
- package/package.json +180 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { createHmac, timingSafeEqual } from "node:crypto";
|
|
2
|
+
import { InvalidInputError } from "../errors.js";
|
|
3
|
+
const DEFAULT_TIMESTAMP_TOLERANCE_SECONDS = 300;
|
|
4
|
+
/**
|
|
5
|
+
* Map Revolut order/payment states onto the core's vocabulary.
|
|
6
|
+
*
|
|
7
|
+
* Unknown states deliberately fall through to `incomplete` rather than `active`:
|
|
8
|
+
* treating an unrecognised state as paid would grant entitlements the customer
|
|
9
|
+
* may not have.
|
|
10
|
+
*/
|
|
11
|
+
export function mapRevolutStatus(state) {
|
|
12
|
+
switch (state.toLowerCase()) {
|
|
13
|
+
case "completed":
|
|
14
|
+
case "paid":
|
|
15
|
+
case "authorised":
|
|
16
|
+
case "authorized":
|
|
17
|
+
return "active";
|
|
18
|
+
case "pending":
|
|
19
|
+
case "processing":
|
|
20
|
+
return "incomplete";
|
|
21
|
+
case "failed":
|
|
22
|
+
case "declined":
|
|
23
|
+
return "past_due";
|
|
24
|
+
case "cancelled":
|
|
25
|
+
case "canceled":
|
|
26
|
+
return "canceled";
|
|
27
|
+
default:
|
|
28
|
+
return "incomplete";
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Verify a Revolut webhook signature.
|
|
33
|
+
*
|
|
34
|
+
* Revolut signs `v1.{timestamp}.{raw body}` with HMAC-SHA256 under the webhook
|
|
35
|
+
* signing secret, and sends the result as `Revolut-Signature: v1=<hex>`. During
|
|
36
|
+
* secret rotation the header may carry several comma-separated signatures, any
|
|
37
|
+
* one of which may match.
|
|
38
|
+
*
|
|
39
|
+
* Exported separately from the adapter so a route handler can verify without
|
|
40
|
+
* constructing API credentials it does not need.
|
|
41
|
+
*/
|
|
42
|
+
export function verifyRevolutSignature(input) {
|
|
43
|
+
const timestampMs = Number(input.timestamp);
|
|
44
|
+
if (!Number.isFinite(timestampMs)) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const tolerance = (input.toleranceSeconds ?? DEFAULT_TIMESTAMP_TOLERANCE_SECONDS) * 1000;
|
|
48
|
+
const now = (input.now ?? Date.now)();
|
|
49
|
+
/**
|
|
50
|
+
* Reject stale timestamps, and future ones beyond the same tolerance: a clock
|
|
51
|
+
* far ahead would otherwise extend a captured request's replay window.
|
|
52
|
+
*/
|
|
53
|
+
if (Math.abs(now - timestampMs) > tolerance) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const expected = createHmac("sha256", input.secret)
|
|
57
|
+
.update(`v1.${input.timestamp}.${input.rawBody}`)
|
|
58
|
+
.digest("hex");
|
|
59
|
+
// Rotation can present several signatures; any match is sufficient.
|
|
60
|
+
const presented = input.signature
|
|
61
|
+
.split(",")
|
|
62
|
+
.map((part) => part.trim())
|
|
63
|
+
.map((part) => (part.startsWith("v1=") ? part.slice(3) : part))
|
|
64
|
+
.filter((part) => part.length > 0);
|
|
65
|
+
const expectedBuffer = Buffer.from(expected, "utf8");
|
|
66
|
+
return presented.some((candidate) => {
|
|
67
|
+
const candidateBuffer = Buffer.from(candidate, "utf8");
|
|
68
|
+
if (candidateBuffer.length !== expectedBuffer.length) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return timingSafeEqual(candidateBuffer, expectedBuffer);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
export function createRevolutProvider(options) {
|
|
75
|
+
const fetchImpl = options.fetchImpl ?? globalThis.fetch;
|
|
76
|
+
const baseUrl = options.apiUrl.replace(/\/+$/, "");
|
|
77
|
+
async function request(path, body) {
|
|
78
|
+
const response = await fetchImpl(`${baseUrl}${path}`, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: {
|
|
81
|
+
Authorization: `Bearer ${options.apiKey}`,
|
|
82
|
+
"Content-Type": "application/json",
|
|
83
|
+
Accept: "application/json",
|
|
84
|
+
// Revolut requires an explicit API version.
|
|
85
|
+
"Revolut-Api-Version": "2024-09-01",
|
|
86
|
+
},
|
|
87
|
+
body: JSON.stringify(body),
|
|
88
|
+
});
|
|
89
|
+
if (!response.ok) {
|
|
90
|
+
/**
|
|
91
|
+
* The response body is not included in the error: provider error payloads
|
|
92
|
+
* can echo request contents, and this message may reach logs.
|
|
93
|
+
*/
|
|
94
|
+
throw new Error(`Revolut request to ${path} failed with status ${response.status}.`);
|
|
95
|
+
}
|
|
96
|
+
return (await response.json());
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
name: "revolut",
|
|
100
|
+
async createCustomer(input) {
|
|
101
|
+
const created = await request("/api/customers", {
|
|
102
|
+
full_name: input.workspaceName,
|
|
103
|
+
...(input.email !== undefined ? { email: input.email } : {}),
|
|
104
|
+
});
|
|
105
|
+
return { providerCustomerId: created.id };
|
|
106
|
+
},
|
|
107
|
+
async createCheckout(input) {
|
|
108
|
+
const quantity = input.quantity ?? 1;
|
|
109
|
+
const order = await request("/api/orders", {
|
|
110
|
+
amount: input.plan.amountCents * quantity,
|
|
111
|
+
currency: input.plan.currency,
|
|
112
|
+
customer: { id: input.providerCustomerId },
|
|
113
|
+
description: input.plan.name,
|
|
114
|
+
// Correlates the webhook back to the workspace that is paying.
|
|
115
|
+
merchant_order_ext_ref: `${input.workspaceId}:${input.plan.key}`,
|
|
116
|
+
redirect_url: input.successUrl,
|
|
117
|
+
cancel_url: input.cancelUrl,
|
|
118
|
+
...(input.metadata !== undefined ? { metadata: input.metadata } : {}),
|
|
119
|
+
});
|
|
120
|
+
if (order.checkout_url === undefined) {
|
|
121
|
+
throw new Error("Revolut did not return a checkout URL for the created order.");
|
|
122
|
+
}
|
|
123
|
+
return { url: order.checkout_url, providerCheckoutId: order.id };
|
|
124
|
+
},
|
|
125
|
+
verifyWebhook(input) {
|
|
126
|
+
if (input.timestamp === undefined) {
|
|
127
|
+
// No timestamp means no replay protection, so the request is not trusted.
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
return verifyRevolutSignature({
|
|
131
|
+
rawBody: input.rawBody,
|
|
132
|
+
signature: input.signature,
|
|
133
|
+
timestamp: input.timestamp,
|
|
134
|
+
secret: options.webhookSecret,
|
|
135
|
+
...(options.timestampToleranceSeconds !== undefined
|
|
136
|
+
? { toleranceSeconds: options.timestampToleranceSeconds }
|
|
137
|
+
: {}),
|
|
138
|
+
...(options.now !== undefined ? { now: options.now } : {}),
|
|
139
|
+
});
|
|
140
|
+
},
|
|
141
|
+
parseWebhookEvent(rawBody) {
|
|
142
|
+
let body;
|
|
143
|
+
try {
|
|
144
|
+
body = JSON.parse(rawBody);
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
throw new InvalidInputError("Webhook body is not valid JSON.", { cause: error });
|
|
148
|
+
}
|
|
149
|
+
const type = typeof body.event === "string" ? body.event : "unknown";
|
|
150
|
+
const orderId = typeof body.order_id === "string" ? body.order_id : undefined;
|
|
151
|
+
const eventId = typeof body.id === "string" ? body.id : orderId;
|
|
152
|
+
if (eventId === undefined) {
|
|
153
|
+
/**
|
|
154
|
+
* Without a stable provider event id there is nothing to deduplicate on,
|
|
155
|
+
* and accepting the event would risk applying it repeatedly.
|
|
156
|
+
*/
|
|
157
|
+
throw new InvalidInputError("Webhook has no event or order identifier.");
|
|
158
|
+
}
|
|
159
|
+
const customerId = typeof body.customer_id === "string" ? body.customer_id : undefined;
|
|
160
|
+
const state = typeof body.state === "string" ? body.state : undefined;
|
|
161
|
+
const externalRef = typeof body.merchant_order_ext_ref === "string" ? body.merchant_order_ext_ref : undefined;
|
|
162
|
+
// `workspaceId:planKey`, as set when the order was created.
|
|
163
|
+
const planKey = externalRef?.split(":")[1];
|
|
164
|
+
const base = { providerEventId: eventId, type, payload: body };
|
|
165
|
+
if (orderId === undefined || customerId === undefined || state === undefined) {
|
|
166
|
+
return base;
|
|
167
|
+
}
|
|
168
|
+
return {
|
|
169
|
+
...base,
|
|
170
|
+
subscription: {
|
|
171
|
+
providerSubscriptionId: orderId,
|
|
172
|
+
providerCustomerId: customerId,
|
|
173
|
+
status: mapRevolutStatus(state),
|
|
174
|
+
// Revolut has no price catalogue; the plan travels in the order ref.
|
|
175
|
+
...(planKey !== undefined ? { planKey } : {}),
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=revolut.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"revolut.js","sourceRoot":"","sources":["../../src/billing/revolut.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { CoreDatabase } from "../db/types.ts";
|
|
2
|
+
import { type CoreEventPublisher } from "../events/publisher.ts";
|
|
3
|
+
import type { BillingCustomer, EntitlementKindValue, Plan, Subscription } from "../db/schema/index.ts";
|
|
4
|
+
import type { WorkspaceContext } from "../workspaces/context.ts";
|
|
5
|
+
import type { BillingProvider, CheckoutSession } from "./provider.ts";
|
|
6
|
+
/** Raised when a webhook's signature does not verify. */
|
|
7
|
+
export declare class InvalidWebhookSignatureError extends Error {
|
|
8
|
+
readonly name = "InvalidWebhookSignatureError";
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
export interface SubscriptionWithPlan {
|
|
12
|
+
readonly subscription: Subscription;
|
|
13
|
+
readonly plan: Plan;
|
|
14
|
+
}
|
|
15
|
+
export interface EntitlementDefinition {
|
|
16
|
+
readonly key: string;
|
|
17
|
+
readonly kind: EntitlementKindValue;
|
|
18
|
+
/** Quota for `kind: "limit"`. Null means unlimited. Ignored for features. */
|
|
19
|
+
readonly limitValue?: number | null;
|
|
20
|
+
}
|
|
21
|
+
export interface UpsertPlanInput {
|
|
22
|
+
readonly key: string;
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly description?: string;
|
|
25
|
+
readonly providerPriceId?: string;
|
|
26
|
+
readonly amountCents?: number;
|
|
27
|
+
readonly currency?: string;
|
|
28
|
+
readonly interval?: "month" | "year" | "one_time";
|
|
29
|
+
readonly isActive?: boolean;
|
|
30
|
+
readonly sortOrder?: number;
|
|
31
|
+
/** Replaces the plan's entitlements when provided. */
|
|
32
|
+
readonly entitlements?: readonly EntitlementDefinition[];
|
|
33
|
+
}
|
|
34
|
+
export interface CreateCheckoutOptions {
|
|
35
|
+
readonly planKey: string;
|
|
36
|
+
readonly successUrl: string;
|
|
37
|
+
readonly cancelUrl: string;
|
|
38
|
+
readonly quantity?: number;
|
|
39
|
+
readonly metadata?: Record<string, string>;
|
|
40
|
+
}
|
|
41
|
+
export type WebhookOutcome =
|
|
42
|
+
/** Applied for the first time. */
|
|
43
|
+
{
|
|
44
|
+
readonly status: "processed";
|
|
45
|
+
readonly eventId: string;
|
|
46
|
+
readonly type: string;
|
|
47
|
+
}
|
|
48
|
+
/** Already handled; the provider is retrying. Nothing was re-applied. */
|
|
49
|
+
| {
|
|
50
|
+
readonly status: "duplicate";
|
|
51
|
+
readonly type: string;
|
|
52
|
+
}
|
|
53
|
+
/** Verified and stored, but not actionable — unknown customer or event type. */
|
|
54
|
+
| {
|
|
55
|
+
readonly status: "ignored";
|
|
56
|
+
readonly eventId: string;
|
|
57
|
+
readonly type: string;
|
|
58
|
+
};
|
|
59
|
+
export interface WebhookRequest {
|
|
60
|
+
/** The request body exactly as received. Must not be parsed first. */
|
|
61
|
+
readonly rawBody: string;
|
|
62
|
+
readonly signature: string;
|
|
63
|
+
readonly timestamp?: string;
|
|
64
|
+
}
|
|
65
|
+
export interface BillingService {
|
|
66
|
+
/** The workspace's provider customer, if one has been created. */
|
|
67
|
+
getCustomer(context: WorkspaceContext): Promise<BillingCustomer | undefined>;
|
|
68
|
+
/** Get or lazily create the provider customer for this workspace. */
|
|
69
|
+
ensureCustomer(context: WorkspaceContext, options?: {
|
|
70
|
+
email?: string;
|
|
71
|
+
}): Promise<BillingCustomer>;
|
|
72
|
+
createCheckout(context: WorkspaceContext, options: CreateCheckoutOptions): Promise<CheckoutSession>;
|
|
73
|
+
/** The workspace's live subscription and its plan, if any. */
|
|
74
|
+
getSubscription(context: WorkspaceContext): Promise<SubscriptionWithPlan | undefined>;
|
|
75
|
+
/**
|
|
76
|
+
* Cancel the live subscription.
|
|
77
|
+
*
|
|
78
|
+
* Tells the provider when it supports cancellation, and always records the
|
|
79
|
+
* local state change so entitlements follow even for providers that do not.
|
|
80
|
+
*/
|
|
81
|
+
cancelSubscription(context: WorkspaceContext, options?: {
|
|
82
|
+
atPeriodEnd?: boolean;
|
|
83
|
+
}): Promise<Subscription>;
|
|
84
|
+
/**
|
|
85
|
+
* A hosted billing portal URL, or `undefined` when the provider has none.
|
|
86
|
+
*
|
|
87
|
+
* Callers must handle `undefined` rather than assume a URL: Revolut has no
|
|
88
|
+
* portal, so an application needs its own billing screen.
|
|
89
|
+
*/
|
|
90
|
+
getPortal(context: WorkspaceContext, options: {
|
|
91
|
+
returnUrl: string;
|
|
92
|
+
}): Promise<{
|
|
93
|
+
url: string | undefined;
|
|
94
|
+
}>;
|
|
95
|
+
readonly plans: {
|
|
96
|
+
list(options?: {
|
|
97
|
+
includeInactive?: boolean;
|
|
98
|
+
}): Promise<Plan[]>;
|
|
99
|
+
getByKey(key: string): Promise<Plan | undefined>;
|
|
100
|
+
/** Idempotent: safe to run on every boot to sync the catalogue. */
|
|
101
|
+
upsert(input: UpsertPlanInput): Promise<Plan>;
|
|
102
|
+
setEntitlements(planKey: string, definitions: readonly EntitlementDefinition[]): Promise<void>;
|
|
103
|
+
};
|
|
104
|
+
readonly webhooks: {
|
|
105
|
+
/**
|
|
106
|
+
* Verify, record and apply a provider webhook.
|
|
107
|
+
*
|
|
108
|
+
* @throws InvalidWebhookSignatureError before any state is touched.
|
|
109
|
+
*/
|
|
110
|
+
handle(request: WebhookRequest): Promise<WebhookOutcome>;
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export interface BillingServiceDeps {
|
|
114
|
+
readonly db: CoreDatabase;
|
|
115
|
+
readonly provider: BillingProvider;
|
|
116
|
+
/** Optional event publisher. Omit it and the service emits nothing. */
|
|
117
|
+
readonly events?: CoreEventPublisher;
|
|
118
|
+
}
|
|
119
|
+
export declare function createBillingService(deps: BillingServiceDeps): BillingService;
|
|
120
|
+
/** Validate an entitlement definition set before it reaches the database. */
|
|
121
|
+
export declare function assertEntitlementDefinitions(definitions: readonly EntitlementDefinition[]): void;
|
|
122
|
+
/** Exposed for diagnostics: how many events are awaiting replay. */
|
|
123
|
+
export declare function countFailedBillingEvents(db: CoreDatabase): Promise<number>;
|
|
124
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/billing/service.ts"],"names":[],"mappings":"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"}
|