happy2 0.0.5
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/README.md +82 -0
- package/package.json +74 -0
- package/packages/happy2-server/Dockerfile +18 -0
- package/packages/happy2-server/README.md +418 -0
- package/packages/happy2-server/bin/happy2.js +3 -0
- package/packages/happy2-server/dist/cli.d.ts +3 -0
- package/packages/happy2-server/dist/cli.d.ts.map +1 -0
- package/packages/happy2-server/dist/cli.js +44 -0
- package/packages/happy2-server/dist/cli.js.map +1 -0
- package/packages/happy2-server/dist/index.d.ts +24 -0
- package/packages/happy2-server/dist/index.d.ts.map +1 -0
- package/packages/happy2-server/dist/index.js +22 -0
- package/packages/happy2-server/dist/index.js.map +1 -0
- package/packages/happy2-server/dist/modules/agents/builtin-images.d.ts +8 -0
- package/packages/happy2-server/dist/modules/agents/builtin-images.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/agents/builtin-images.js +283 -0
- package/packages/happy2-server/dist/modules/agents/builtin-images.js.map +1 -0
- package/packages/happy2-server/dist/modules/agents/command.d.ts +3 -0
- package/packages/happy2-server/dist/modules/agents/command.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/agents/command.js +7 -0
- package/packages/happy2-server/dist/modules/agents/command.js.map +1 -0
- package/packages/happy2-server/dist/modules/agents/daemon.d.ts +106 -0
- package/packages/happy2-server/dist/modules/agents/daemon.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/agents/daemon.js +522 -0
- package/packages/happy2-server/dist/modules/agents/daemon.js.map +1 -0
- package/packages/happy2-server/dist/modules/agents/docker.d.ts +51 -0
- package/packages/happy2-server/dist/modules/agents/docker.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/agents/docker.js +256 -0
- package/packages/happy2-server/dist/modules/agents/docker.js.map +1 -0
- package/packages/happy2-server/dist/modules/agents/docker.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/agents/docker.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/agents/docker.test.js +155 -0
- package/packages/happy2-server/dist/modules/agents/docker.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/agents/index.d.ts +5 -0
- package/packages/happy2-server/dist/modules/agents/index.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/agents/index.js +4 -0
- package/packages/happy2-server/dist/modules/agents/index.js.map +1 -0
- package/packages/happy2-server/dist/modules/agents/service.d.ts +140 -0
- package/packages/happy2-server/dist/modules/agents/service.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/agents/service.js +1283 -0
- package/packages/happy2-server/dist/modules/agents/service.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/cloudflare-access.d.ts +15 -0
- package/packages/happy2-server/dist/modules/auth/cloudflare-access.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/cloudflare-access.js +49 -0
- package/packages/happy2-server/dist/modules/auth/cloudflare-access.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/crypto.d.ts +4 -0
- package/packages/happy2-server/dist/modules/auth/crypto.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/crypto.js +31 -0
- package/packages/happy2-server/dist/modules/auth/crypto.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/crypto.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/auth/crypto.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/crypto.test.js +11 -0
- package/packages/happy2-server/dist/modules/auth/crypto.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/email.d.ts +3 -0
- package/packages/happy2-server/dist/modules/auth/email.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/email.js +22 -0
- package/packages/happy2-server/dist/modules/auth/email.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/metadata.d.ts +5 -0
- package/packages/happy2-server/dist/modules/auth/metadata.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/metadata.js +28 -0
- package/packages/happy2-server/dist/modules/auth/metadata.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/metadata.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/auth/metadata.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/metadata.test.js +10 -0
- package/packages/happy2-server/dist/modules/auth/metadata.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/methods.d.ts +10 -0
- package/packages/happy2-server/dist/modules/auth/methods.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/methods.js +21 -0
- package/packages/happy2-server/dist/modules/auth/methods.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/methods.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/auth/methods.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/methods.test.js +16 -0
- package/packages/happy2-server/dist/modules/auth/methods.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/oidc.d.ts +9 -0
- package/packages/happy2-server/dist/modules/auth/oidc.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/oidc.js +68 -0
- package/packages/happy2-server/dist/modules/auth/oidc.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/service.d.ts +44 -0
- package/packages/happy2-server/dist/modules/auth/service.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/service.js +208 -0
- package/packages/happy2-server/dist/modules/auth/service.js.map +1 -0
- package/packages/happy2-server/dist/modules/auth/tokens.d.ts +21 -0
- package/packages/happy2-server/dist/modules/auth/tokens.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/auth/tokens.js +79 -0
- package/packages/happy2-server/dist/modules/auth/tokens.js.map +1 -0
- package/packages/happy2-server/dist/modules/automation/repository.d.ts +127 -0
- package/packages/happy2-server/dist/modules/automation/repository.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/automation/repository.js +821 -0
- package/packages/happy2-server/dist/modules/automation/repository.js.map +1 -0
- package/packages/happy2-server/dist/modules/collaboration/repository.d.ts +839 -0
- package/packages/happy2-server/dist/modules/collaboration/repository.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/collaboration/repository.js +5795 -0
- package/packages/happy2-server/dist/modules/collaboration/repository.js.map +1 -0
- package/packages/happy2-server/dist/modules/collaboration/repository.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/collaboration/repository.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/collaboration/repository.test.js +620 -0
- package/packages/happy2-server/dist/modules/collaboration/repository.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/collaboration/types.d.ts +243 -0
- package/packages/happy2-server/dist/modules/collaboration/types.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/collaboration/types.js +8 -0
- package/packages/happy2-server/dist/modules/collaboration/types.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/defaults.d.ts +8 -0
- package/packages/happy2-server/dist/modules/config/defaults.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/defaults.js +70 -0
- package/packages/happy2-server/dist/modules/config/defaults.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/defaults.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/config/defaults.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/defaults.test.js +27 -0
- package/packages/happy2-server/dist/modules/config/defaults.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/environment.d.ts +4 -0
- package/packages/happy2-server/dist/modules/config/environment.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/environment.js +92 -0
- package/packages/happy2-server/dist/modules/config/environment.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/loader.d.ts +5 -0
- package/packages/happy2-server/dist/modules/config/loader.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/loader.js +251 -0
- package/packages/happy2-server/dist/modules/config/loader.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/loader.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/config/loader.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/loader.test.js +108 -0
- package/packages/happy2-server/dist/modules/config/loader.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/paths.d.ts +7 -0
- package/packages/happy2-server/dist/modules/config/paths.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/paths.js +15 -0
- package/packages/happy2-server/dist/modules/config/paths.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/paths.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/config/paths.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/paths.test.js +22 -0
- package/packages/happy2-server/dist/modules/config/paths.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/runtime.d.ts +6 -0
- package/packages/happy2-server/dist/modules/config/runtime.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/runtime.js +14 -0
- package/packages/happy2-server/dist/modules/config/runtime.js.map +1 -0
- package/packages/happy2-server/dist/modules/config/type.d.ts +88 -0
- package/packages/happy2-server/dist/modules/config/type.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/config/type.js +2 -0
- package/packages/happy2-server/dist/modules/config/type.js.map +1 -0
- package/packages/happy2-server/dist/modules/database.d.ts +105 -0
- package/packages/happy2-server/dist/modules/database.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/database.js +583 -0
- package/packages/happy2-server/dist/modules/database.js.map +1 -0
- package/packages/happy2-server/dist/modules/drizzle.d.ts +11 -0
- package/packages/happy2-server/dist/modules/drizzle.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/drizzle.js +31 -0
- package/packages/happy2-server/dist/modules/drizzle.js.map +1 -0
- package/packages/happy2-server/dist/modules/files/lock.d.ts +3 -0
- package/packages/happy2-server/dist/modules/files/lock.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/files/lock.js +83 -0
- package/packages/happy2-server/dist/modules/files/lock.js.map +1 -0
- package/packages/happy2-server/dist/modules/files/media.d.ts +18 -0
- package/packages/happy2-server/dist/modules/files/media.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/files/media.js +352 -0
- package/packages/happy2-server/dist/modules/files/media.js.map +1 -0
- package/packages/happy2-server/dist/modules/files/provider.d.ts +130 -0
- package/packages/happy2-server/dist/modules/files/provider.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/files/provider.js +448 -0
- package/packages/happy2-server/dist/modules/files/provider.js.map +1 -0
- package/packages/happy2-server/dist/modules/files/quota.d.ts +58 -0
- package/packages/happy2-server/dist/modules/files/quota.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/files/quota.js +180 -0
- package/packages/happy2-server/dist/modules/files/quota.js.map +1 -0
- package/packages/happy2-server/dist/modules/files/routes.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/files/routes.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/files/routes.test.js +163 -0
- package/packages/happy2-server/dist/modules/files/routes.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/files/scanner.d.ts +27 -0
- package/packages/happy2-server/dist/modules/files/scanner.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/files/scanner.js +66 -0
- package/packages/happy2-server/dist/modules/files/scanner.js.map +1 -0
- package/packages/happy2-server/dist/modules/files/storage.d.ts +95 -0
- package/packages/happy2-server/dist/modules/files/storage.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/files/storage.js +855 -0
- package/packages/happy2-server/dist/modules/files/storage.js.map +1 -0
- package/packages/happy2-server/dist/modules/files/storage.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/files/storage.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/files/storage.test.js +170 -0
- package/packages/happy2-server/dist/modules/files/storage.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/index.d.ts +6 -0
- package/packages/happy2-server/dist/modules/integrations/index.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/index.js +6 -0
- package/packages/happy2-server/dist/modules/integrations/index.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/repository.d.ts +136 -0
- package/packages/happy2-server/dist/modules/integrations/repository.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/repository.js +1229 -0
- package/packages/happy2-server/dist/modules/integrations/repository.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/repository.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/integrations/repository.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/repository.test.js +345 -0
- package/packages/happy2-server/dist/modules/integrations/repository.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/routes.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/integrations/routes.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/routes.test.js +161 -0
- package/packages/happy2-server/dist/modules/integrations/routes.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/secrets.d.ts +19 -0
- package/packages/happy2-server/dist/modules/integrations/secrets.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/secrets.js +69 -0
- package/packages/happy2-server/dist/modules/integrations/secrets.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/ssrf.d.ts +32 -0
- package/packages/happy2-server/dist/modules/integrations/ssrf.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/ssrf.js +185 -0
- package/packages/happy2-server/dist/modules/integrations/ssrf.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/ssrf.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/integrations/ssrf.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/ssrf.test.js +56 -0
- package/packages/happy2-server/dist/modules/integrations/ssrf.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/transport.d.ts +21 -0
- package/packages/happy2-server/dist/modules/integrations/transport.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/transport.js +108 -0
- package/packages/happy2-server/dist/modules/integrations/transport.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/transport.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/integrations/transport.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/transport.test.js +66 -0
- package/packages/happy2-server/dist/modules/integrations/transport.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/types.d.ts +155 -0
- package/packages/happy2-server/dist/modules/integrations/types.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/integrations/types.js +26 -0
- package/packages/happy2-server/dist/modules/integrations/types.js.map +1 -0
- package/packages/happy2-server/dist/modules/operations/export-worker.d.ts +16 -0
- package/packages/happy2-server/dist/modules/operations/export-worker.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/operations/export-worker.js +56 -0
- package/packages/happy2-server/dist/modules/operations/export-worker.js.map +1 -0
- package/packages/happy2-server/dist/modules/operations/repository.d.ts +215 -0
- package/packages/happy2-server/dist/modules/operations/repository.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/operations/repository.js +2011 -0
- package/packages/happy2-server/dist/modules/operations/repository.js.map +1 -0
- package/packages/happy2-server/dist/modules/operations/repository.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/operations/repository.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/operations/repository.test.js +610 -0
- package/packages/happy2-server/dist/modules/operations/repository.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/operations/types.d.ts +144 -0
- package/packages/happy2-server/dist/modules/operations/types.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/operations/types.js +9 -0
- package/packages/happy2-server/dist/modules/operations/types.js.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/events.d.ts +99 -0
- package/packages/happy2-server/dist/modules/realtime/events.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/events.js +173 -0
- package/packages/happy2-server/dist/modules/realtime/events.js.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/index.d.ts +4 -0
- package/packages/happy2-server/dist/modules/realtime/index.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/index.js +4 -0
- package/packages/happy2-server/dist/modules/realtime/index.js.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/local.d.ts +37 -0
- package/packages/happy2-server/dist/modules/realtime/local.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/local.js +181 -0
- package/packages/happy2-server/dist/modules/realtime/local.js.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/local.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/realtime/local.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/local.test.js +186 -0
- package/packages/happy2-server/dist/modules/realtime/local.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/pubsub.d.ts +26 -0
- package/packages/happy2-server/dist/modules/realtime/pubsub.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/realtime/pubsub.js +7 -0
- package/packages/happy2-server/dist/modules/realtime/pubsub.js.map +1 -0
- package/packages/happy2-server/dist/modules/request/database-idempotency.d.ts +15 -0
- package/packages/happy2-server/dist/modules/request/database-idempotency.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/request/database-idempotency.js +141 -0
- package/packages/happy2-server/dist/modules/request/database-idempotency.js.map +1 -0
- package/packages/happy2-server/dist/modules/request/idempotency-hook.d.ts +12 -0
- package/packages/happy2-server/dist/modules/request/idempotency-hook.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/request/idempotency-hook.js +98 -0
- package/packages/happy2-server/dist/modules/request/idempotency-hook.js.map +1 -0
- package/packages/happy2-server/dist/modules/request/idempotency.d.ts +146 -0
- package/packages/happy2-server/dist/modules/request/idempotency.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/request/idempotency.js +312 -0
- package/packages/happy2-server/dist/modules/request/idempotency.js.map +1 -0
- package/packages/happy2-server/dist/modules/request/idempotency.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/request/idempotency.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/request/idempotency.test.js +191 -0
- package/packages/happy2-server/dist/modules/request/idempotency.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/request/index.d.ts +5 -0
- package/packages/happy2-server/dist/modules/request/index.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/request/index.js +5 -0
- package/packages/happy2-server/dist/modules/request/index.js.map +1 -0
- package/packages/happy2-server/dist/modules/request/rate-limit.d.ts +100 -0
- package/packages/happy2-server/dist/modules/request/rate-limit.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/request/rate-limit.js +239 -0
- package/packages/happy2-server/dist/modules/request/rate-limit.js.map +1 -0
- package/packages/happy2-server/dist/modules/request/rate-limit.test.d.ts +2 -0
- package/packages/happy2-server/dist/modules/request/rate-limit.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/request/rate-limit.test.js +123 -0
- package/packages/happy2-server/dist/modules/request/rate-limit.test.js.map +1 -0
- package/packages/happy2-server/dist/modules/schema.d.ts +31454 -0
- package/packages/happy2-server/dist/modules/schema.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/schema.js +1081 -0
- package/packages/happy2-server/dist/modules/schema.js.map +1 -0
- package/packages/happy2-server/dist/modules/workspace/index.d.ts +3 -0
- package/packages/happy2-server/dist/modules/workspace/index.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/workspace/index.js +3 -0
- package/packages/happy2-server/dist/modules/workspace/index.js.map +1 -0
- package/packages/happy2-server/dist/modules/workspace/service.d.ts +54 -0
- package/packages/happy2-server/dist/modules/workspace/service.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/workspace/service.js +997 -0
- package/packages/happy2-server/dist/modules/workspace/service.js.map +1 -0
- package/packages/happy2-server/dist/modules/workspace/types.d.ts +58 -0
- package/packages/happy2-server/dist/modules/workspace/types.d.ts.map +1 -0
- package/packages/happy2-server/dist/modules/workspace/types.js +11 -0
- package/packages/happy2-server/dist/modules/workspace/types.js.map +1 -0
- package/packages/happy2-server/dist/routes/agents.d.ts +5 -0
- package/packages/happy2-server/dist/routes/agents.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/agents.js +225 -0
- package/packages/happy2-server/dist/routes/agents.js.map +1 -0
- package/packages/happy2-server/dist/routes/auth.d.ts +5 -0
- package/packages/happy2-server/dist/routes/auth.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/auth.js +128 -0
- package/packages/happy2-server/dist/routes/auth.js.map +1 -0
- package/packages/happy2-server/dist/routes/automation.d.ts +6 -0
- package/packages/happy2-server/dist/routes/automation.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/automation.js +315 -0
- package/packages/happy2-server/dist/routes/automation.js.map +1 -0
- package/packages/happy2-server/dist/routes/basic.d.ts +3 -0
- package/packages/happy2-server/dist/routes/basic.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/basic.js +5 -0
- package/packages/happy2-server/dist/routes/basic.js.map +1 -0
- package/packages/happy2-server/dist/routes/collaboration.d.ts +7 -0
- package/packages/happy2-server/dist/routes/collaboration.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/collaboration.js +1285 -0
- package/packages/happy2-server/dist/routes/collaboration.js.map +1 -0
- package/packages/happy2-server/dist/routes/files.d.ts +9 -0
- package/packages/happy2-server/dist/routes/files.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/files.js +397 -0
- package/packages/happy2-server/dist/routes/files.js.map +1 -0
- package/packages/happy2-server/dist/routes/integrations.d.ts +6 -0
- package/packages/happy2-server/dist/routes/integrations.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/integrations.js +486 -0
- package/packages/happy2-server/dist/routes/integrations.js.map +1 -0
- package/packages/happy2-server/dist/routes/operations.d.ts +5 -0
- package/packages/happy2-server/dist/routes/operations.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/operations.js +588 -0
- package/packages/happy2-server/dist/routes/operations.js.map +1 -0
- package/packages/happy2-server/dist/routes/operations.test.d.ts +2 -0
- package/packages/happy2-server/dist/routes/operations.test.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/operations.test.js +106 -0
- package/packages/happy2-server/dist/routes/operations.test.js.map +1 -0
- package/packages/happy2-server/dist/routes/sync.d.ts +6 -0
- package/packages/happy2-server/dist/routes/sync.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/sync.js +549 -0
- package/packages/happy2-server/dist/routes/sync.js.map +1 -0
- package/packages/happy2-server/dist/routes/workspace.d.ts +5 -0
- package/packages/happy2-server/dist/routes/workspace.d.ts.map +1 -0
- package/packages/happy2-server/dist/routes/workspace.js +240 -0
- package/packages/happy2-server/dist/routes/workspace.js.map +1 -0
- package/packages/happy2-server/dist/runner.d.ts +3 -0
- package/packages/happy2-server/dist/runner.d.ts.map +1 -0
- package/packages/happy2-server/dist/runner.js +30 -0
- package/packages/happy2-server/dist/runner.js.map +1 -0
- package/packages/happy2-server/dist/server.d.ts +32 -0
- package/packages/happy2-server/dist/server.d.ts.map +1 -0
- package/packages/happy2-server/dist/server.js +284 -0
- package/packages/happy2-server/dist/server.js.map +1 -0
- package/packages/happy2-server/dist/standalone.d.ts +13 -0
- package/packages/happy2-server/dist/standalone.d.ts.map +1 -0
- package/packages/happy2-server/dist/standalone.js +99 -0
- package/packages/happy2-server/dist/standalone.js.map +1 -0
- package/packages/happy2-server/dist/web/assets/figtree-latin-wght-normal-D_ZTVpCC.woff2 +0 -0
- package/packages/happy2-server/dist/web/assets/happy-otter-Q2O_g-DT.png +0 -0
- package/packages/happy2-server/dist/web/assets/index-COvbX8JP.css +2 -0
- package/packages/happy2-server/dist/web/assets/index-DdpugxMO.js +57 -0
- package/packages/happy2-server/dist/web/assets/jetbrains-mono-latin-wght-normal-B9CIFXIH.woff2 +0 -0
- package/packages/happy2-server/dist/web/assets/onboarding-CRUpq9xl.png +0 -0
- package/packages/happy2-server/dist/web/index.html +13 -0
- package/packages/happy2-server/drizzle/0000_initial.sql +13 -0
- package/packages/happy2-server/drizzle/0001_accounts_profiles_files.sql +42 -0
- package/packages/happy2-server/drizzle/0002_file_visibility_and_uploader.sql +5 -0
- package/packages/happy2-server/drizzle/0003_collaboration.sql +565 -0
- package/packages/happy2-server/drizzle/0004_collaboration_expansion.sql +1099 -0
- package/packages/happy2-server/drizzle/0005_ai_agents.sql +85 -0
- package/packages/happy2-server/drizzle/0006_rig_global_event_queue.sql +10 -0
- package/packages/happy2-server/drizzle/0007_rename_server_identity.sql +3 -0
- package/packages/happy2-server/drizzle/0008_agent_message_streaming.sql +47 -0
- package/packages/happy2-server/drizzle/0009_chat_workspace_binding_lookup.sql +2 -0
- package/packages/happy2-server/drizzle/0010_rig_secret_assignments.sql +21 -0
- package/packages/happy2-server/drizzle/meta/_journal.json +83 -0
- package/packages/happy2-server/happy2.example.toml +104 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import Fastify, {} from "fastify";
|
|
3
|
+
import cors from "@fastify/cors";
|
|
4
|
+
import multipart from "@fastify/multipart";
|
|
5
|
+
import { AuthService } from "./modules/auth/service.js";
|
|
6
|
+
import { AgentService, LocalAgentDockerRuntime, RigDaemonClient, } from "./modules/agents/index.js";
|
|
7
|
+
import { TokenService } from "./modules/auth/tokens.js";
|
|
8
|
+
import { AutomationRepository } from "./modules/automation/repository.js";
|
|
9
|
+
import { Database } from "./modules/database.js";
|
|
10
|
+
import { CollaborationRepository } from "./modules/collaboration/repository.js";
|
|
11
|
+
import { CollaborationError } from "./modules/collaboration/types.js";
|
|
12
|
+
import { FileStorage } from "./modules/files/storage.js";
|
|
13
|
+
import { IntegrationRepository } from "./modules/integrations/repository.js";
|
|
14
|
+
import { AesGcmSecretProtector } from "./modules/integrations/secrets.js";
|
|
15
|
+
import { NodeWebhookTransport } from "./modules/integrations/transport.js";
|
|
16
|
+
import { OperationsRepository } from "./modules/operations/repository.js";
|
|
17
|
+
import { DataExportWorker } from "./modules/operations/export-worker.js";
|
|
18
|
+
import { OperationsError } from "./modules/operations/types.js";
|
|
19
|
+
import { LocalPubSub, realtimeTopics } from "./modules/realtime/index.js";
|
|
20
|
+
import { WorkspaceService } from "./modules/workspace/index.js";
|
|
21
|
+
import { createRateLimitHook, DatabaseIdempotencyStore, HttpRateLimiter, IdempotencyCoordinator, LocalRateLimitStore, registerIdempotencyHooks, } from "./modules/request/index.js";
|
|
22
|
+
import { registerAuthRoutes } from "./routes/auth.js";
|
|
23
|
+
import { registerAgentRoutes } from "./routes/agents.js";
|
|
24
|
+
import { registerAutomationRoutes } from "./routes/automation.js";
|
|
25
|
+
import { registerBasicRoutes } from "./routes/basic.js";
|
|
26
|
+
import { registerCollaborationRoutes } from "./routes/collaboration.js";
|
|
27
|
+
import { registerFileRoutes } from "./routes/files.js";
|
|
28
|
+
import { registerIntegrationRoutes } from "./routes/integrations.js";
|
|
29
|
+
import { registerOperationsRoutes } from "./routes/operations.js";
|
|
30
|
+
import { registerSyncRoutes } from "./routes/sync.js";
|
|
31
|
+
import { registerWorkspaceRoutes } from "./routes/workspace.js";
|
|
32
|
+
export async function buildServer(config, supplied) {
|
|
33
|
+
const app = Fastify({
|
|
34
|
+
logger: supplied?.logger ?? true,
|
|
35
|
+
trustProxy: config.server.trustedProxyHops,
|
|
36
|
+
});
|
|
37
|
+
const services = supplied ?? {
|
|
38
|
+
database: new Database(config.database.url, config.database.authTokenEnv ? process.env[config.database.authTokenEnv] : undefined),
|
|
39
|
+
tokens: await TokenService.create(config),
|
|
40
|
+
};
|
|
41
|
+
await app.register(cors, { origin: true, credentials: false });
|
|
42
|
+
await app.register(multipart, {
|
|
43
|
+
limits: { files: 1, fileSize: config.files.maxUploadBytes },
|
|
44
|
+
});
|
|
45
|
+
app.setErrorHandler((error, request, reply) => {
|
|
46
|
+
request.log.error(error);
|
|
47
|
+
if (!reply.sent)
|
|
48
|
+
reply.code(500).send({ error: "internal_server_error" });
|
|
49
|
+
});
|
|
50
|
+
registerBasicRoutes(app);
|
|
51
|
+
const auth = new AuthService(config, services.database, services.tokens);
|
|
52
|
+
const rateLimiter = services.rateLimiter ??
|
|
53
|
+
new HttpRateLimiter(new LocalRateLimitStore(), {
|
|
54
|
+
onStoreError: (error) => app.log.error(error),
|
|
55
|
+
});
|
|
56
|
+
if (config.security.rateLimit.enabled)
|
|
57
|
+
app.addHook("preHandler", createRateLimitHook({
|
|
58
|
+
limiter: rateLimiter,
|
|
59
|
+
policy: (request) => {
|
|
60
|
+
const authenticationAction = request.method === "POST" && request.url.startsWith("/v0/auth/");
|
|
61
|
+
const limit = authenticationAction
|
|
62
|
+
? config.security.rateLimit.authPerMinute
|
|
63
|
+
: request.method === "POST"
|
|
64
|
+
? config.security.rateLimit.writesPerMinute
|
|
65
|
+
: config.security.rateLimit.readsPerMinute;
|
|
66
|
+
return {
|
|
67
|
+
scope: `${request.method}:${request.routeOptions.url ?? request.url.split("?", 1)[0]}`,
|
|
68
|
+
ip: { limit, windowMs: 60_000 },
|
|
69
|
+
actor: authenticationAction ? false : { limit, windowMs: 60_000 },
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
actorId: async (request) => (await auth.authenticate(request))?.user.id,
|
|
73
|
+
}));
|
|
74
|
+
const idempotency = services.idempotency ??
|
|
75
|
+
(config.security.idempotency.enabled
|
|
76
|
+
? new IdempotencyCoordinator(new DatabaseIdempotencyStore(services.database.extensionClient()), {
|
|
77
|
+
leaseMs: config.security.idempotency.leaseSeconds * 1_000,
|
|
78
|
+
retentionMs: config.security.idempotency.retentionSeconds * 1_000,
|
|
79
|
+
})
|
|
80
|
+
: undefined);
|
|
81
|
+
if (idempotency)
|
|
82
|
+
registerIdempotencyHooks(app, auth, idempotency);
|
|
83
|
+
registerAuthRoutes(app, config, auth);
|
|
84
|
+
let collaboration;
|
|
85
|
+
let pubsub;
|
|
86
|
+
let automation;
|
|
87
|
+
let integrations;
|
|
88
|
+
let operations;
|
|
89
|
+
let webhookTransport;
|
|
90
|
+
let fileStorage;
|
|
91
|
+
let dataExportWorker;
|
|
92
|
+
let unsubscribeWebhookEvents;
|
|
93
|
+
let agentService;
|
|
94
|
+
let workspaceService;
|
|
95
|
+
let expiryTimer;
|
|
96
|
+
let pendingSweep = Promise.resolve();
|
|
97
|
+
const productServer = config.server.role !== "auth";
|
|
98
|
+
if (productServer) {
|
|
99
|
+
collaboration =
|
|
100
|
+
services.collaboration ??
|
|
101
|
+
new CollaborationRepository(services.database.extensionClient());
|
|
102
|
+
await collaboration.initialize();
|
|
103
|
+
pubsub =
|
|
104
|
+
services.pubsub ??
|
|
105
|
+
new LocalPubSub({
|
|
106
|
+
onSubscriberError: (error) => app.log.error(error),
|
|
107
|
+
});
|
|
108
|
+
agentService =
|
|
109
|
+
services.agents ??
|
|
110
|
+
(config.agents.enabled
|
|
111
|
+
? new AgentService(collaboration, pubsub, new RigDaemonClient(config.agents), services.agentDocker ?? new LocalAgentDockerRuntime(), config.agents.defaultCwd, (error) => app.log.error(error))
|
|
112
|
+
: undefined);
|
|
113
|
+
operations =
|
|
114
|
+
services.operations ?? new OperationsRepository(collaboration.extensionClient());
|
|
115
|
+
automation =
|
|
116
|
+
services.automation ??
|
|
117
|
+
new AutomationRepository(collaboration.extensionClient(), collaboration, {
|
|
118
|
+
moderate: async (input) => {
|
|
119
|
+
try {
|
|
120
|
+
const result = await operations.takeModerationAction(input);
|
|
121
|
+
return { sync: result.sync };
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
if (error instanceof OperationsError)
|
|
125
|
+
throw new CollaborationError(error.code, error.message);
|
|
126
|
+
throw error;
|
|
127
|
+
}
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
integrations =
|
|
131
|
+
services.integrations ??
|
|
132
|
+
new IntegrationRepository(collaboration.extensionClient(), {
|
|
133
|
+
secretProtector: integrationSecretProtector(config, Boolean(supplied)),
|
|
134
|
+
});
|
|
135
|
+
webhookTransport = services.webhookTransport ?? new NodeWebhookTransport();
|
|
136
|
+
fileStorage = services.fileStorage ?? new FileStorage(config, services.database);
|
|
137
|
+
dataExportWorker = new DataExportWorker(operations, services.database, fileStorage);
|
|
138
|
+
workspaceService = new WorkspaceService(collaboration, pubsub, (error) => app.log.error(error));
|
|
139
|
+
registerFileRoutes(app, config, auth, services.database, services.tokens, fileStorage, collaboration);
|
|
140
|
+
registerCollaborationRoutes(app, auth, collaboration, pubsub, agentService);
|
|
141
|
+
if (agentService)
|
|
142
|
+
registerAgentRoutes(app, auth, agentService);
|
|
143
|
+
registerAutomationRoutes(app, auth, automation, pubsub);
|
|
144
|
+
registerOperationsRoutes(app, auth, operations);
|
|
145
|
+
registerIntegrationRoutes(app, auth, integrations, {
|
|
146
|
+
incomingWebhook: {
|
|
147
|
+
sendMessage: async (message) => {
|
|
148
|
+
const sent = await collaboration.sendAutomatedMessage({
|
|
149
|
+
actorUserId: message.actorUserId,
|
|
150
|
+
chatId: message.chatId,
|
|
151
|
+
text: message.text,
|
|
152
|
+
attachmentFileIds: message.attachmentFileIds,
|
|
153
|
+
botId: message.botId,
|
|
154
|
+
clientMutationId: message.idempotencyKey
|
|
155
|
+
? `incoming:${message.subscriptionId}:${createHash("sha256").update(message.idempotencyKey).digest("hex")}`
|
|
156
|
+
: `incoming:${message.subscriptionId}:${randomBytes(12).toString("base64url")}`,
|
|
157
|
+
});
|
|
158
|
+
const event = { type: "sync", ...sent.hint };
|
|
159
|
+
await Promise.all([
|
|
160
|
+
pubsub.publish(realtimeTopics.server, event),
|
|
161
|
+
...sent.hint.chats.map(({ chatId }) => pubsub.publish(realtimeTopics.chat(chatId), event)),
|
|
162
|
+
]);
|
|
163
|
+
return { messageId: sent.message.id, sync: sent.hint };
|
|
164
|
+
},
|
|
165
|
+
},
|
|
166
|
+
onChange: async (change) => {
|
|
167
|
+
await pubsub.publish(realtimeTopics.server, {
|
|
168
|
+
type: "sync",
|
|
169
|
+
sequence: change.sequence,
|
|
170
|
+
chats: [],
|
|
171
|
+
areas: [change.kind.startsWith("bot.") ? "bots" : "integrations"],
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
});
|
|
175
|
+
registerSyncRoutes(app, auth, collaboration, pubsub);
|
|
176
|
+
registerWorkspaceRoutes(app, auth, workspaceService);
|
|
177
|
+
await agentService?.start();
|
|
178
|
+
unsubscribeWebhookEvents = pubsub.subscribe(realtimeTopics.server, async (event) => {
|
|
179
|
+
if (event.type === "sync")
|
|
180
|
+
await integrations.enqueueSyncSequence(event.sequence);
|
|
181
|
+
});
|
|
182
|
+
let sweepRunning = false;
|
|
183
|
+
let lastCompactionAt = 0;
|
|
184
|
+
let lastFileMaintenanceAt = 0;
|
|
185
|
+
let lastObservedSequence = BigInt((await collaboration.getState()).sequence);
|
|
186
|
+
expiryTimer = setInterval(() => {
|
|
187
|
+
if (sweepRunning || !collaboration || !pubsub)
|
|
188
|
+
return;
|
|
189
|
+
sweepRunning = true;
|
|
190
|
+
const compact = Date.now() - lastCompactionAt >= 60_000;
|
|
191
|
+
if (compact)
|
|
192
|
+
lastCompactionAt = Date.now();
|
|
193
|
+
const maintainFiles = Date.now() - lastFileMaintenanceAt >= 60 * 60_000;
|
|
194
|
+
if (maintainFiles)
|
|
195
|
+
lastFileMaintenanceAt = Date.now();
|
|
196
|
+
// Every repository shares one libSQL client. Run write-capable maintenance in
|
|
197
|
+
// sequence so the local SQLite adapter never opens competing write transactions.
|
|
198
|
+
pendingSweep = (async () => {
|
|
199
|
+
const expiryHint = await collaboration.expireDueMessages();
|
|
200
|
+
const scheduledHints = (await automation?.publishDueScheduledMessages()) ?? [];
|
|
201
|
+
const automationHints = (await automation?.runDueAutomations()) ?? [];
|
|
202
|
+
const eventAutomationHints = (await automation?.runPendingEventAutomations()) ?? [];
|
|
203
|
+
if (compact)
|
|
204
|
+
await collaboration.compactSync();
|
|
205
|
+
await operations?.expireDueBans();
|
|
206
|
+
await dataExportWorker?.runDue();
|
|
207
|
+
if (integrations && webhookTransport) {
|
|
208
|
+
await integrations.enqueuePendingSyncEvents();
|
|
209
|
+
await integrations.dispatchDueWebhooks(webhookTransport);
|
|
210
|
+
}
|
|
211
|
+
if (maintainFiles && fileStorage) {
|
|
212
|
+
const referencedFiles = await services.database.listStoredFiles();
|
|
213
|
+
await fileStorage.runMaintenance({ referencedFiles });
|
|
214
|
+
}
|
|
215
|
+
return { expiryHint, scheduledHints, automationHints, eventAutomationHints };
|
|
216
|
+
})()
|
|
217
|
+
.then(async ({ expiryHint, scheduledHints, automationHints, eventAutomationHints, }) => {
|
|
218
|
+
if (!pubsub)
|
|
219
|
+
return;
|
|
220
|
+
const hints = [
|
|
221
|
+
...(expiryHint ? [expiryHint] : []),
|
|
222
|
+
...scheduledHints,
|
|
223
|
+
...automationHints,
|
|
224
|
+
...eventAutomationHints,
|
|
225
|
+
];
|
|
226
|
+
for (const hint of hints) {
|
|
227
|
+
const event = { type: "sync", ...hint };
|
|
228
|
+
await pubsub.publish(realtimeTopics.server, event);
|
|
229
|
+
await Promise.all(hint.chats.map(({ chatId }) => pubsub.publish(realtimeTopics.chat(chatId), event)));
|
|
230
|
+
}
|
|
231
|
+
const state = await collaboration.getState();
|
|
232
|
+
const currentSequence = BigInt(state.sequence);
|
|
233
|
+
if (currentSequence > lastObservedSequence) {
|
|
234
|
+
lastObservedSequence = currentSequence;
|
|
235
|
+
await pubsub.publish(realtimeTopics.server, {
|
|
236
|
+
type: "sync",
|
|
237
|
+
sequence: state.sequence,
|
|
238
|
+
chats: [],
|
|
239
|
+
areas: ["all"],
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
})
|
|
243
|
+
.catch((error) => app.log.error(error))
|
|
244
|
+
.finally(() => {
|
|
245
|
+
sweepRunning = false;
|
|
246
|
+
});
|
|
247
|
+
}, 1_000);
|
|
248
|
+
expiryTimer.unref();
|
|
249
|
+
}
|
|
250
|
+
app.addHook("onClose", async () => {
|
|
251
|
+
await workspaceService?.close();
|
|
252
|
+
await agentService?.close();
|
|
253
|
+
if (expiryTimer)
|
|
254
|
+
clearInterval(expiryTimer);
|
|
255
|
+
await pendingSweep;
|
|
256
|
+
unsubscribeWebhookEvents?.();
|
|
257
|
+
if (!services.pubsub)
|
|
258
|
+
await pubsub?.close();
|
|
259
|
+
if (!services.integrations)
|
|
260
|
+
integrations?.close();
|
|
261
|
+
if (!services.operations)
|
|
262
|
+
operations?.close();
|
|
263
|
+
if (!services.automation)
|
|
264
|
+
automation?.close();
|
|
265
|
+
if (!services.rateLimiter)
|
|
266
|
+
await rateLimiter.close();
|
|
267
|
+
if (!services.idempotency)
|
|
268
|
+
await idempotency?.close();
|
|
269
|
+
if (!services.collaboration)
|
|
270
|
+
collaboration?.close();
|
|
271
|
+
if (!supplied)
|
|
272
|
+
services.database.close();
|
|
273
|
+
});
|
|
274
|
+
return app;
|
|
275
|
+
}
|
|
276
|
+
function integrationSecretProtector(config, allowEphemeral) {
|
|
277
|
+
const configured = process.env[config.security.integrationSecretEnv];
|
|
278
|
+
if (configured)
|
|
279
|
+
return AesGcmSecretProtector.fromBase64(configured);
|
|
280
|
+
if (allowEphemeral)
|
|
281
|
+
return new AesGcmSecretProtector(randomBytes(32));
|
|
282
|
+
throw new Error(`${config.security.integrationSecretEnv} is required; run managed environment initialization before building the product server`);
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../sources/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ServerConfig } from "./modules/config/type.js";
|
|
2
|
+
export interface StandaloneHappy2 extends AsyncDisposable {
|
|
3
|
+
/** Actual bound public URL. This differs from config.server.publicUrl when port 0 is used. */
|
|
4
|
+
url: string;
|
|
5
|
+
close(): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface StandaloneOptions {
|
|
8
|
+
logger?: boolean;
|
|
9
|
+
webRoot?: string;
|
|
10
|
+
}
|
|
11
|
+
/** Starts the private API server and the public web/static reverse proxy. */
|
|
12
|
+
export declare function startStandaloneHappy2(config: ServerConfig, options?: StandaloneOptions): Promise<StandaloneHappy2>;
|
|
13
|
+
//# sourceMappingURL=standalone.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../sources/standalone.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI7D,MAAM,WAAW,gBAAiB,SAAQ,eAAe;IACrD,8FAA8F;IAC9F,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,6EAA6E;AAC7E,wBAAsB,qBAAqB,CACvC,MAAM,EAAE,YAAY,EACpB,OAAO,GAAE,iBAAsB,GAChC,OAAO,CAAC,gBAAgB,CAAC,CA4F3B"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { access } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import Fastify, {} from "fastify";
|
|
4
|
+
import proxy from "@fastify/http-proxy";
|
|
5
|
+
import staticFiles from "@fastify/static";
|
|
6
|
+
import { TokenService } from "./modules/auth/tokens.js";
|
|
7
|
+
import { Database } from "./modules/database.js";
|
|
8
|
+
import { buildServer } from "./server.js";
|
|
9
|
+
/** Starts the private API server and the public web/static reverse proxy. */
|
|
10
|
+
export async function startStandaloneHappy2(config, options = {}) {
|
|
11
|
+
const webRoot = options.webRoot ?? join(import.meta.dirname, "web");
|
|
12
|
+
await access(join(webRoot, "index.html"));
|
|
13
|
+
const database = new Database(config.database.url, config.database.authTokenEnv ? process.env[config.database.authTokenEnv] : undefined);
|
|
14
|
+
let backend;
|
|
15
|
+
let gateway;
|
|
16
|
+
try {
|
|
17
|
+
await database.migrate();
|
|
18
|
+
const backendConfig = {
|
|
19
|
+
...config,
|
|
20
|
+
server: {
|
|
21
|
+
...config.server,
|
|
22
|
+
host: "127.0.0.1",
|
|
23
|
+
port: 0,
|
|
24
|
+
// Only the gateway can reach this loopback listener. It supplies one
|
|
25
|
+
// sanitized forwarding hop after applying the configured outer boundary.
|
|
26
|
+
trustedProxyHops: 1,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
backend = await buildServer(backendConfig, {
|
|
30
|
+
database,
|
|
31
|
+
tokens: await TokenService.create(backendConfig),
|
|
32
|
+
logger: options.logger,
|
|
33
|
+
});
|
|
34
|
+
const backendUrl = await backend.listen({ host: "127.0.0.1", port: 0 });
|
|
35
|
+
gateway = Fastify({
|
|
36
|
+
logger: options.logger ?? true,
|
|
37
|
+
trustProxy: config.server.trustedProxyHops,
|
|
38
|
+
});
|
|
39
|
+
await gateway.register(proxy, {
|
|
40
|
+
upstream: backendUrl,
|
|
41
|
+
prefix: "/v0",
|
|
42
|
+
rewritePrefix: "/v0",
|
|
43
|
+
httpMethods: ["GET", "POST"],
|
|
44
|
+
replyOptions: {
|
|
45
|
+
rewriteRequestHeaders: (request, headers) => ({
|
|
46
|
+
...headers,
|
|
47
|
+
"x-forwarded-for": request.ip,
|
|
48
|
+
"x-forwarded-host": request.host ?? "",
|
|
49
|
+
"x-forwarded-proto": request.protocol,
|
|
50
|
+
}),
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
await gateway.register(staticFiles, {
|
|
54
|
+
root: webRoot,
|
|
55
|
+
wildcard: false,
|
|
56
|
+
index: "index.html",
|
|
57
|
+
});
|
|
58
|
+
gateway.setNotFoundHandler((request, reply) => {
|
|
59
|
+
if ((request.method === "GET" || request.method === "HEAD") &&
|
|
60
|
+
!request.url.startsWith("/v0") &&
|
|
61
|
+
request.headers.accept?.includes("text/html")) {
|
|
62
|
+
return reply.type("text/html; charset=utf-8").sendFile("index.html");
|
|
63
|
+
}
|
|
64
|
+
return reply.code(404).send({ error: "not_found" });
|
|
65
|
+
});
|
|
66
|
+
const url = await gateway.listen({ host: config.server.host, port: config.server.port });
|
|
67
|
+
let closed = false;
|
|
68
|
+
const close = async () => {
|
|
69
|
+
if (closed)
|
|
70
|
+
return;
|
|
71
|
+
closed = true;
|
|
72
|
+
try {
|
|
73
|
+
await gateway?.close();
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
try {
|
|
77
|
+
await backend?.close();
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
database.close();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
url,
|
|
86
|
+
close,
|
|
87
|
+
async [Symbol.asyncDispose]() {
|
|
88
|
+
await close();
|
|
89
|
+
},
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
await gateway?.close().catch(() => undefined);
|
|
94
|
+
await backend?.close().catch(() => undefined);
|
|
95
|
+
database.close();
|
|
96
|
+
throw error;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=standalone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone.js","sourceRoot":"","sources":["../sources/standalone.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|