@connexia/infrastructure 1.0.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/LICENSE +190 -0
- package/dist/config/config-manager.d.ts +29 -0
- package/dist/config/config-manager.d.ts.map +1 -0
- package/dist/config/config-manager.js +120 -0
- package/dist/config/config-manager.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/schemas.d.ts +557 -0
- package/dist/config/schemas.d.ts.map +1 -0
- package/dist/config/schemas.js +79 -0
- package/dist/config/schemas.js.map +1 -0
- package/dist/database/database-config.d.ts +123 -0
- package/dist/database/database-config.d.ts.map +1 -0
- package/dist/database/database-config.js +42 -0
- package/dist/database/database-config.js.map +1 -0
- package/dist/database/database-connection.d.ts +29 -0
- package/dist/database/database-connection.d.ts.map +1 -0
- package/dist/database/database-connection.js +149 -0
- package/dist/database/database-connection.js.map +1 -0
- package/dist/database/drizzle/drizzle-manager.d.ts +12 -0
- package/dist/database/drizzle/drizzle-manager.d.ts.map +1 -0
- package/dist/database/drizzle/drizzle-manager.js +26 -0
- package/dist/database/drizzle/drizzle-manager.js.map +1 -0
- package/dist/database/drizzle/migrate.d.ts +30 -0
- package/dist/database/drizzle/migrate.d.ts.map +1 -0
- package/dist/database/drizzle/migrate.js +148 -0
- package/dist/database/drizzle/migrate.js.map +1 -0
- package/dist/database/drizzle/schema/domain.d.ts +2217 -0
- package/dist/database/drizzle/schema/domain.d.ts.map +1 -0
- package/dist/database/drizzle/schema/domain.js +163 -0
- package/dist/database/drizzle/schema/domain.js.map +1 -0
- package/dist/database/drizzle/schema/index.d.ts +8 -0
- package/dist/database/drizzle/schema/index.d.ts.map +1 -0
- package/dist/database/drizzle/schema/index.js +8 -0
- package/dist/database/drizzle/schema/index.js.map +1 -0
- package/dist/database/drizzle/schema/migrations.d.ts +104 -0
- package/dist/database/drizzle/schema/migrations.d.ts.map +1 -0
- package/dist/database/drizzle/schema/migrations.js +10 -0
- package/dist/database/drizzle/schema/migrations.js.map +1 -0
- package/dist/database/drizzle/schema/providers.d.ts +248 -0
- package/dist/database/drizzle/schema/providers.d.ts.map +1 -0
- package/dist/database/drizzle/schema/providers.js +19 -0
- package/dist/database/drizzle/schema/providers.js.map +1 -0
- package/dist/database/index.d.ts +5 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +5 -0
- package/dist/database/index.js.map +1 -0
- package/dist/diagnostics/index.d.ts +3 -0
- package/dist/diagnostics/index.d.ts.map +1 -0
- package/dist/diagnostics/index.js +2 -0
- package/dist/diagnostics/index.js.map +1 -0
- package/dist/diagnostics/infrastructure-doctor.d.ts +33 -0
- package/dist/diagnostics/infrastructure-doctor.d.ts.map +1 -0
- package/dist/diagnostics/infrastructure-doctor.js +57 -0
- package/dist/diagnostics/infrastructure-doctor.js.map +1 -0
- package/dist/health/health-manager.d.ts +29 -0
- package/dist/health/health-manager.d.ts.map +1 -0
- package/dist/health/health-manager.js +74 -0
- package/dist/health/health-manager.js.map +1 -0
- package/dist/health/index.d.ts +3 -0
- package/dist/health/index.d.ts.map +1 -0
- package/dist/health/index.js +2 -0
- package/dist/health/index.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/metrics/index.d.ts +3 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics-collector.d.ts +105 -0
- package/dist/metrics/metrics-collector.d.ts.map +1 -0
- package/dist/metrics/metrics-collector.js +320 -0
- package/dist/metrics/metrics-collector.js.map +1 -0
- package/dist/providers/bullmq/index.d.ts +8 -0
- package/dist/providers/bullmq/index.d.ts.map +1 -0
- package/dist/providers/bullmq/index.js +5 -0
- package/dist/providers/bullmq/index.js.map +1 -0
- package/dist/providers/bullmq/job-runner.d.ts +16 -0
- package/dist/providers/bullmq/job-runner.d.ts.map +1 -0
- package/dist/providers/bullmq/job-runner.js +17 -0
- package/dist/providers/bullmq/job-runner.js.map +1 -0
- package/dist/providers/bullmq/queue-provider-bullmq.d.ts +38 -0
- package/dist/providers/bullmq/queue-provider-bullmq.d.ts.map +1 -0
- package/dist/providers/bullmq/queue-provider-bullmq.js +248 -0
- package/dist/providers/bullmq/queue-provider-bullmq.js.map +1 -0
- package/dist/providers/bullmq/queue-provider.d.ts +74 -0
- package/dist/providers/bullmq/queue-provider.d.ts.map +1 -0
- package/dist/providers/bullmq/queue-provider.js +101 -0
- package/dist/providers/bullmq/queue-provider.js.map +1 -0
- package/dist/providers/bullmq/worker-runtime.d.ts +41 -0
- package/dist/providers/bullmq/worker-runtime.d.ts.map +1 -0
- package/dist/providers/bullmq/worker-runtime.js +49 -0
- package/dist/providers/bullmq/worker-runtime.js.map +1 -0
- package/dist/providers/filesystem/artifact-store-filesystem.d.ts +30 -0
- package/dist/providers/filesystem/artifact-store-filesystem.d.ts.map +1 -0
- package/dist/providers/filesystem/artifact-store-filesystem.js +178 -0
- package/dist/providers/filesystem/artifact-store-filesystem.js.map +1 -0
- package/dist/providers/filesystem/artifact-store.d.ts +43 -0
- package/dist/providers/filesystem/artifact-store.d.ts.map +1 -0
- package/dist/providers/filesystem/artifact-store.js +55 -0
- package/dist/providers/filesystem/artifact-store.js.map +1 -0
- package/dist/providers/filesystem/index.d.ts +4 -0
- package/dist/providers/filesystem/index.d.ts.map +1 -0
- package/dist/providers/filesystem/index.js +3 -0
- package/dist/providers/filesystem/index.js.map +1 -0
- package/dist/providers/search/index.d.ts +3 -0
- package/dist/providers/search/index.d.ts.map +1 -0
- package/dist/providers/search/index.js +2 -0
- package/dist/providers/search/index.js.map +1 -0
- package/dist/providers/search/search-provider.d.ts +46 -0
- package/dist/providers/search/search-provider.d.ts.map +1 -0
- package/dist/providers/search/search-provider.js +59 -0
- package/dist/providers/search/search-provider.js.map +1 -0
- package/dist/providers/valkey/cache-provider-valkey.d.ts +34 -0
- package/dist/providers/valkey/cache-provider-valkey.d.ts.map +1 -0
- package/dist/providers/valkey/cache-provider-valkey.js +136 -0
- package/dist/providers/valkey/cache-provider-valkey.js.map +1 -0
- package/dist/providers/valkey/cache-provider.d.ts +40 -0
- package/dist/providers/valkey/cache-provider.d.ts.map +1 -0
- package/dist/providers/valkey/cache-provider.js +57 -0
- package/dist/providers/valkey/cache-provider.js.map +1 -0
- package/dist/providers/valkey/index.d.ts +13 -0
- package/dist/providers/valkey/index.d.ts.map +1 -0
- package/dist/providers/valkey/index.js +9 -0
- package/dist/providers/valkey/index.js.map +1 -0
- package/dist/providers/valkey/lock-provider-valkey.d.ts +24 -0
- package/dist/providers/valkey/lock-provider-valkey.d.ts.map +1 -0
- package/dist/providers/valkey/lock-provider-valkey.js +133 -0
- package/dist/providers/valkey/lock-provider-valkey.js.map +1 -0
- package/dist/providers/valkey/lock-provider.d.ts +29 -0
- package/dist/providers/valkey/lock-provider.d.ts.map +1 -0
- package/dist/providers/valkey/lock-provider.js +48 -0
- package/dist/providers/valkey/lock-provider.js.map +1 -0
- package/dist/providers/valkey/pubsub-provider-valkey.d.ts +24 -0
- package/dist/providers/valkey/pubsub-provider-valkey.d.ts.map +1 -0
- package/dist/providers/valkey/pubsub-provider-valkey.js +139 -0
- package/dist/providers/valkey/pubsub-provider-valkey.js.map +1 -0
- package/dist/providers/valkey/pubsub-provider.d.ts +21 -0
- package/dist/providers/valkey/pubsub-provider.d.ts.map +1 -0
- package/dist/providers/valkey/pubsub-provider.js +30 -0
- package/dist/providers/valkey/pubsub-provider.js.map +1 -0
- package/dist/providers/valkey/session-provider-valkey.d.ts +27 -0
- package/dist/providers/valkey/session-provider-valkey.d.ts.map +1 -0
- package/dist/providers/valkey/session-provider-valkey.js +148 -0
- package/dist/providers/valkey/session-provider-valkey.js.map +1 -0
- package/dist/providers/valkey/session-provider.d.ts +34 -0
- package/dist/providers/valkey/session-provider.d.ts.map +1 -0
- package/dist/providers/valkey/session-provider.js +45 -0
- package/dist/providers/valkey/session-provider.js.map +1 -0
- package/dist/recovery/circuit-breaker.d.ts +27 -0
- package/dist/recovery/circuit-breaker.d.ts.map +1 -0
- package/dist/recovery/circuit-breaker.js +78 -0
- package/dist/recovery/circuit-breaker.js.map +1 -0
- package/dist/recovery/index.d.ts +5 -0
- package/dist/recovery/index.d.ts.map +1 -0
- package/dist/recovery/index.js +3 -0
- package/dist/recovery/index.js.map +1 -0
- package/dist/recovery/reconnect-handler.d.ts +23 -0
- package/dist/recovery/reconnect-handler.d.ts.map +1 -0
- package/dist/recovery/reconnect-handler.js +53 -0
- package/dist/recovery/reconnect-handler.js.map +1 -0
- package/dist/repositories/drizzle-audit-event-repository.d.ts +22 -0
- package/dist/repositories/drizzle-audit-event-repository.d.ts.map +1 -0
- package/dist/repositories/drizzle-audit-event-repository.js +172 -0
- package/dist/repositories/drizzle-audit-event-repository.js.map +1 -0
- package/dist/repositories/drizzle-build-repository.d.ts +21 -0
- package/dist/repositories/drizzle-build-repository.d.ts.map +1 -0
- package/dist/repositories/drizzle-build-repository.js +167 -0
- package/dist/repositories/drizzle-build-repository.js.map +1 -0
- package/dist/repositories/drizzle-deployment-repository.d.ts +22 -0
- package/dist/repositories/drizzle-deployment-repository.d.ts.map +1 -0
- package/dist/repositories/drizzle-deployment-repository.js +175 -0
- package/dist/repositories/drizzle-deployment-repository.js.map +1 -0
- package/dist/repositories/drizzle-environment-repository.d.ts +19 -0
- package/dist/repositories/drizzle-environment-repository.d.ts.map +1 -0
- package/dist/repositories/drizzle-environment-repository.js +115 -0
- package/dist/repositories/drizzle-environment-repository.js.map +1 -0
- package/dist/repositories/drizzle-organization-repository.d.ts +20 -0
- package/dist/repositories/drizzle-organization-repository.d.ts.map +1 -0
- package/dist/repositories/drizzle-organization-repository.js +139 -0
- package/dist/repositories/drizzle-organization-repository.js.map +1 -0
- package/dist/repositories/drizzle-project-repository.d.ts +20 -0
- package/dist/repositories/drizzle-project-repository.d.ts.map +1 -0
- package/dist/repositories/drizzle-project-repository.js +149 -0
- package/dist/repositories/drizzle-project-repository.js.map +1 -0
- package/dist/repositories/drizzle-secret-repository.d.ts +20 -0
- package/dist/repositories/drizzle-secret-repository.d.ts.map +1 -0
- package/dist/repositories/drizzle-secret-repository.js +139 -0
- package/dist/repositories/drizzle-secret-repository.js.map +1 -0
- package/dist/repositories/drizzle-user-repository.d.ts +21 -0
- package/dist/repositories/drizzle-user-repository.d.ts.map +1 -0
- package/dist/repositories/drizzle-user-repository.js +153 -0
- package/dist/repositories/drizzle-user-repository.js.map +1 -0
- package/dist/repositories/in-memory-audit-event-repository.d.ts +19 -0
- package/dist/repositories/in-memory-audit-event-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-audit-event-repository.js +54 -0
- package/dist/repositories/in-memory-audit-event-repository.js.map +1 -0
- package/dist/repositories/in-memory-build-repository.d.ts +18 -0
- package/dist/repositories/in-memory-build-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-build-repository.js +44 -0
- package/dist/repositories/in-memory-build-repository.js.map +1 -0
- package/dist/repositories/in-memory-deployment-repository.d.ts +19 -0
- package/dist/repositories/in-memory-deployment-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-deployment-repository.js +48 -0
- package/dist/repositories/in-memory-deployment-repository.js.map +1 -0
- package/dist/repositories/in-memory-organization-repository.d.ts +17 -0
- package/dist/repositories/in-memory-organization-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-organization-repository.js +34 -0
- package/dist/repositories/in-memory-organization-repository.js.map +1 -0
- package/dist/repositories/in-memory-plugin-repository.d.ts +20 -0
- package/dist/repositories/in-memory-plugin-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-plugin-repository.js +37 -0
- package/dist/repositories/in-memory-plugin-repository.js.map +1 -0
- package/dist/repositories/in-memory-project-repository.d.ts +17 -0
- package/dist/repositories/in-memory-project-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-project-repository.js +38 -0
- package/dist/repositories/in-memory-project-repository.js.map +1 -0
- package/dist/repositories/in-memory-recommendation-repository.d.ts +22 -0
- package/dist/repositories/in-memory-recommendation-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-recommendation-repository.js +57 -0
- package/dist/repositories/in-memory-recommendation-repository.js.map +1 -0
- package/dist/repositories/in-memory-user-repository.d.ts +18 -0
- package/dist/repositories/in-memory-user-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-user-repository.js +42 -0
- package/dist/repositories/in-memory-user-repository.js.map +1 -0
- package/dist/repositories/in-memory-workspace-repository.d.ts +20 -0
- package/dist/repositories/in-memory-workspace-repository.d.ts.map +1 -0
- package/dist/repositories/in-memory-workspace-repository.js +37 -0
- package/dist/repositories/in-memory-workspace-repository.js.map +1 -0
- package/dist/repositories/index.d.ts +18 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +18 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/runtime/health-runtime.d.ts +65 -0
- package/dist/runtime/health-runtime.d.ts.map +1 -0
- package/dist/runtime/health-runtime.js +227 -0
- package/dist/runtime/health-runtime.js.map +1 -0
- package/dist/runtime/index.d.ts +9 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +9 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/infrastructure-runtime.d.ts +45 -0
- package/dist/runtime/infrastructure-runtime.d.ts.map +1 -0
- package/dist/runtime/infrastructure-runtime.js +133 -0
- package/dist/runtime/infrastructure-runtime.js.map +1 -0
- package/dist/runtime/provider-factory.d.ts +42 -0
- package/dist/runtime/provider-factory.d.ts.map +1 -0
- package/dist/runtime/provider-factory.js +111 -0
- package/dist/runtime/provider-factory.js.map +1 -0
- package/dist/runtime/provider-lifecycle.d.ts +30 -0
- package/dist/runtime/provider-lifecycle.d.ts.map +1 -0
- package/dist/runtime/provider-lifecycle.js +149 -0
- package/dist/runtime/provider-lifecycle.js.map +1 -0
- package/dist/runtime/provider-registry.d.ts +25 -0
- package/dist/runtime/provider-registry.d.ts.map +1 -0
- package/dist/runtime/provider-registry.js +52 -0
- package/dist/runtime/provider-registry.js.map +1 -0
- package/dist/runtime/recovery-runtime.d.ts +66 -0
- package/dist/runtime/recovery-runtime.d.ts.map +1 -0
- package/dist/runtime/recovery-runtime.js +177 -0
- package/dist/runtime/recovery-runtime.js.map +1 -0
- package/dist/runtime/resource-manager.d.ts +51 -0
- package/dist/runtime/resource-manager.d.ts.map +1 -0
- package/dist/runtime/resource-manager.js +156 -0
- package/dist/runtime/resource-manager.js.map +1 -0
- package/dist/runtime/runtime-lifecycle.d.ts +77 -0
- package/dist/runtime/runtime-lifecycle.d.ts.map +1 -0
- package/dist/runtime/runtime-lifecycle.js +260 -0
- package/dist/runtime/runtime-lifecycle.js.map +1 -0
- package/dist/security/connection-validator.d.ts +21 -0
- package/dist/security/connection-validator.d.ts.map +1 -0
- package/dist/security/connection-validator.js +30 -0
- package/dist/security/connection-validator.js.map +1 -0
- package/dist/security/index.d.ts +3 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/index.js +3 -0
- package/dist/security/index.js.map +1 -0
- package/dist/security/secret-masking.d.ts +4 -0
- package/dist/security/secret-masking.d.ts.map +1 -0
- package/dist/security/secret-masking.js +39 -0
- package/dist/security/secret-masking.js.map +1 -0
- package/dist/shared/branding.d.ts +10 -0
- package/dist/shared/branding.d.ts.map +1 -0
- package/dist/shared/branding.js +11 -0
- package/dist/shared/branding.js.map +1 -0
- package/dist/shared/constants.d.ts +29 -0
- package/dist/shared/constants.d.ts.map +1 -0
- package/dist/shared/constants.js +45 -0
- package/dist/shared/constants.js.map +1 -0
- package/dist/shared/equality.d.ts +6 -0
- package/dist/shared/equality.d.ts.map +1 -0
- package/dist/shared/equality.js +63 -0
- package/dist/shared/equality.js.map +1 -0
- package/dist/shared/errors.d.ts +74 -0
- package/dist/shared/errors.d.ts.map +1 -0
- package/dist/shared/errors.js +110 -0
- package/dist/shared/errors.js.map +1 -0
- package/dist/shared/hashing.d.ts +8 -0
- package/dist/shared/hashing.d.ts.map +1 -0
- package/dist/shared/hashing.js +28 -0
- package/dist/shared/hashing.js.map +1 -0
- package/dist/shared/index.d.ts +11 -0
- package/dist/shared/index.d.ts.map +1 -0
- package/dist/shared/index.js +10 -0
- package/dist/shared/index.js.map +1 -0
- package/dist/shared/timing.d.ts +19 -0
- package/dist/shared/timing.d.ts.map +1 -0
- package/dist/shared/timing.js +45 -0
- package/dist/shared/timing.js.map +1 -0
- package/dist/shared/types.d.ts +62 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +5 -0
- package/dist/shared/types.js.map +1 -0
- package/package.json +75 -0
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { ok } from "@connexia/domain";
|
|
2
|
+
export class InMemoryProjectRepository {
|
|
3
|
+
store = new Map();
|
|
4
|
+
async findById(id, _options) {
|
|
5
|
+
return ok(this.store.get(id) ?? null);
|
|
6
|
+
}
|
|
7
|
+
async findByOrganization(organizationId, _options) {
|
|
8
|
+
const items = Array.from(this.store.values()).filter(p => p.organizationId === organizationId);
|
|
9
|
+
return ok({
|
|
10
|
+
items,
|
|
11
|
+
totalCount: items.length,
|
|
12
|
+
hasMore: false,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async findByStatus(status, _options) {
|
|
16
|
+
const items = Array.from(this.store.values()).filter(p => p.status === status);
|
|
17
|
+
return ok({
|
|
18
|
+
items,
|
|
19
|
+
totalCount: items.length,
|
|
20
|
+
hasMore: false,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
async save(project, _options) {
|
|
24
|
+
this.store.set(project.id, project);
|
|
25
|
+
return ok(project);
|
|
26
|
+
}
|
|
27
|
+
async delete(id, _options) {
|
|
28
|
+
this.store.delete(id);
|
|
29
|
+
return ok(undefined);
|
|
30
|
+
}
|
|
31
|
+
async exists(id, _options) {
|
|
32
|
+
return ok(this.store.has(id));
|
|
33
|
+
}
|
|
34
|
+
async count(_options) {
|
|
35
|
+
return ok(this.store.size);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=in-memory-project-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-project-repository.js","sourceRoot":"","sources":["../../src/repositories/in-memory-project-repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAQtC,MAAM,OAAO,yBAAyB;IACnB,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEpD,KAAK,CAAC,QAAQ,CAAC,EAAa,EAAE,QAA4B;QACxD,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAY,CAAC,IAAI,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,cAAsB,EAAE,QAA4B;QAC3E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,CAAC;QAC/F,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAqB,EAAE,QAA4B;QACpE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC/E,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAgB,EAAE,QAA4B;QACvD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAY,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAa,EAAE,QAA4B;QACtD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAY,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAa,EAAE,QAA4B;QACtD,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAA4B;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Recommendation Repository Implementation
|
|
3
|
+
*/
|
|
4
|
+
import type { Result } from "@connexia/domain";
|
|
5
|
+
import type { PaginatedResult } from "@connexia/domain";
|
|
6
|
+
import type { RepositoryOptions, FindOptions } from "@connexia/domain";
|
|
7
|
+
import type { RecommendationId, ProjectId } from "@connexia/domain";
|
|
8
|
+
import type { RecommendationRepository } from "@connexia/domain";
|
|
9
|
+
import { Recommendation, type RecommendationCategory, type RecommendationSeverity, type RecommendationStatus } from "@connexia/domain";
|
|
10
|
+
export declare class InMemoryRecommendationRepository implements RecommendationRepository {
|
|
11
|
+
private readonly store;
|
|
12
|
+
findById(id: RecommendationId, _options?: RepositoryOptions): Promise<Result<Recommendation | null>>;
|
|
13
|
+
findByProject(projectId: ProjectId, options?: FindOptions): Promise<Result<PaginatedResult<Recommendation>>>;
|
|
14
|
+
findByStatus(status: RecommendationStatus, options?: FindOptions): Promise<Result<PaginatedResult<Recommendation>>>;
|
|
15
|
+
findByCategory(category: RecommendationCategory, options?: FindOptions): Promise<Result<PaginatedResult<Recommendation>>>;
|
|
16
|
+
findBySeverity(severity: RecommendationSeverity, options?: FindOptions): Promise<Result<PaginatedResult<Recommendation>>>;
|
|
17
|
+
save(recommendation: Recommendation, _options?: RepositoryOptions): Promise<Result<Recommendation>>;
|
|
18
|
+
delete(id: RecommendationId, _options?: RepositoryOptions): Promise<Result<void>>;
|
|
19
|
+
exists(id: RecommendationId, _options?: RepositoryOptions): Promise<Result<boolean>>;
|
|
20
|
+
count(_options?: RepositoryOptions): Promise<Result<number>>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=in-memory-recommendation-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-recommendation-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/in-memory-recommendation-repository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEpE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,KAAK,sBAAsB,EAAE,KAAK,sBAAsB,EAAE,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAEvI,qBAAa,gCAAiC,YAAW,wBAAwB;IAC/E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqC;IAErD,QAAQ,CAAC,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAIpG,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC;IAS5G,YAAY,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC;IASnH,cAAc,CAAC,QAAQ,EAAE,sBAAsB,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC;IASzH,cAAc,CAAC,QAAQ,EAAE,sBAAsB,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC;IASzH,IAAI,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;IAKnG,MAAM,CAAC,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKjF,MAAM,CAAC,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAIpF,KAAK,CAAC,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CAGnE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Recommendation Repository Implementation
|
|
3
|
+
*/
|
|
4
|
+
import { ok } from "@connexia/domain";
|
|
5
|
+
export class InMemoryRecommendationRepository {
|
|
6
|
+
store = new Map();
|
|
7
|
+
async findById(id, _options) {
|
|
8
|
+
return ok(this.store.get(id) ?? null);
|
|
9
|
+
}
|
|
10
|
+
async findByProject(projectId, options) {
|
|
11
|
+
const items = Array.from(this.store.values()).filter(r => r.projectId === projectId);
|
|
12
|
+
return ok({
|
|
13
|
+
items,
|
|
14
|
+
totalCount: items.length,
|
|
15
|
+
hasMore: false,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async findByStatus(status, options) {
|
|
19
|
+
const items = Array.from(this.store.values()).filter(r => r.status === status);
|
|
20
|
+
return ok({
|
|
21
|
+
items,
|
|
22
|
+
totalCount: items.length,
|
|
23
|
+
hasMore: false,
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async findByCategory(category, options) {
|
|
27
|
+
const items = Array.from(this.store.values()).filter(r => r.category === category);
|
|
28
|
+
return ok({
|
|
29
|
+
items,
|
|
30
|
+
totalCount: items.length,
|
|
31
|
+
hasMore: false,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
async findBySeverity(severity, options) {
|
|
35
|
+
const items = Array.from(this.store.values()).filter(r => r.severity === severity);
|
|
36
|
+
return ok({
|
|
37
|
+
items,
|
|
38
|
+
totalCount: items.length,
|
|
39
|
+
hasMore: false,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async save(recommendation, _options) {
|
|
43
|
+
this.store.set(recommendation.id, recommendation);
|
|
44
|
+
return ok(recommendation);
|
|
45
|
+
}
|
|
46
|
+
async delete(id, _options) {
|
|
47
|
+
this.store.delete(id);
|
|
48
|
+
return ok(undefined);
|
|
49
|
+
}
|
|
50
|
+
async exists(id, _options) {
|
|
51
|
+
return ok(this.store.has(id));
|
|
52
|
+
}
|
|
53
|
+
async count(_options) {
|
|
54
|
+
return ok(this.store.size);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=in-memory-recommendation-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-recommendation-repository.js","sourceRoot":"","sources":["../../src/repositories/in-memory-recommendation-repository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,EAAE,EAAO,MAAM,kBAAkB,CAAC;AAQ3C,MAAM,OAAO,gCAAgC;IAC1B,KAAK,GAAG,IAAI,GAAG,EAA0B,CAAC;IAE3D,KAAK,CAAC,QAAQ,CAAC,EAAoB,EAAE,QAA4B;QAC/D,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAY,CAAC,IAAI,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,SAAoB,EAAE,OAAqB;QAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;QACrF,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAA4B,EAAE,OAAqB;QACpE,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC/E,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgC,EAAE,OAAqB;QAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACnF,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgC,EAAE,OAAqB;QAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;QACnF,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,cAA8B,EAAE,QAA4B;QACrE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,EAAY,EAAE,cAAc,CAAC,CAAC;QAC5D,OAAO,EAAE,CAAC,cAAc,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAoB,EAAE,QAA4B;QAC7D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAY,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAoB,EAAE,QAA4B;QAC7D,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAA4B;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Result } from "@connexia/domain";
|
|
2
|
+
import type { PaginatedResult } from "@connexia/domain";
|
|
3
|
+
import type { RepositoryOptions } from "@connexia/domain";
|
|
4
|
+
import type { UserId, OrganizationId } from "@connexia/domain";
|
|
5
|
+
import type { UserRepository } from "@connexia/domain";
|
|
6
|
+
import { type User, type UserStatus } from "@connexia/domain";
|
|
7
|
+
export declare class InMemoryUserRepository implements UserRepository {
|
|
8
|
+
private readonly store;
|
|
9
|
+
findById(id: UserId, _options?: RepositoryOptions): Promise<Result<User | null>>;
|
|
10
|
+
findByEmail(email: string, organizationId: OrganizationId, _options?: RepositoryOptions): Promise<Result<User | null>>;
|
|
11
|
+
findByOrganization(organizationId: OrganizationId, _options?: RepositoryOptions): Promise<Result<PaginatedResult<User>>>;
|
|
12
|
+
findByStatus(status: UserStatus, organizationId: OrganizationId, _options?: RepositoryOptions): Promise<Result<PaginatedResult<User>>>;
|
|
13
|
+
save(user: User, _options?: RepositoryOptions): Promise<Result<User>>;
|
|
14
|
+
delete(id: UserId, _options?: RepositoryOptions): Promise<Result<void>>;
|
|
15
|
+
exists(id: UserId, _options?: RepositoryOptions): Promise<Result<boolean>>;
|
|
16
|
+
count(_options?: RepositoryOptions): Promise<Result<number>>;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=in-memory-user-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-user-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/in-memory-user-repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9D,qBAAa,sBAAuB,YAAW,cAAc;IAC3D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;IAE3C,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAIhF,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAKtH,kBAAkB,CAAC,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IASxH,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;IAStI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKrE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKvE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAI1E,KAAK,CAAC,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CAGnE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ok } from "@connexia/domain";
|
|
2
|
+
export class InMemoryUserRepository {
|
|
3
|
+
store = new Map();
|
|
4
|
+
async findById(id, _options) {
|
|
5
|
+
return ok(this.store.get(id) ?? null);
|
|
6
|
+
}
|
|
7
|
+
async findByEmail(email, organizationId, _options) {
|
|
8
|
+
const user = Array.from(this.store.values()).find(u => u.profile.email === email && u.organizationId === organizationId);
|
|
9
|
+
return ok(user ?? null);
|
|
10
|
+
}
|
|
11
|
+
async findByOrganization(organizationId, _options) {
|
|
12
|
+
const items = Array.from(this.store.values()).filter(u => u.organizationId === organizationId);
|
|
13
|
+
return ok({
|
|
14
|
+
items,
|
|
15
|
+
totalCount: items.length,
|
|
16
|
+
hasMore: false,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
async findByStatus(status, organizationId, _options) {
|
|
20
|
+
const items = Array.from(this.store.values()).filter(u => u.status === status && u.organizationId === organizationId);
|
|
21
|
+
return ok({
|
|
22
|
+
items,
|
|
23
|
+
totalCount: items.length,
|
|
24
|
+
hasMore: false,
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
async save(user, _options) {
|
|
28
|
+
this.store.set(user.id, user);
|
|
29
|
+
return ok(user);
|
|
30
|
+
}
|
|
31
|
+
async delete(id, _options) {
|
|
32
|
+
this.store.delete(id);
|
|
33
|
+
return ok(undefined);
|
|
34
|
+
}
|
|
35
|
+
async exists(id, _options) {
|
|
36
|
+
return ok(this.store.has(id));
|
|
37
|
+
}
|
|
38
|
+
async count(_options) {
|
|
39
|
+
return ok(this.store.size);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=in-memory-user-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-user-repository.js","sourceRoot":"","sources":["../../src/repositories/in-memory-user-repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAQtC,MAAM,OAAO,sBAAsB;IAChB,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAEjD,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,QAA4B;QACrD,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAY,CAAC,IAAI,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAa,EAAE,cAA8B,EAAE,QAA4B;QAC3F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,CAAC;QACzH,OAAO,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,cAA8B,EAAE,QAA4B;QACnF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,CAAC;QAC/F,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAkB,EAAE,cAA8B,EAAE,QAA4B;QACjG,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,cAAc,KAAK,cAAc,CAAC,CAAC;QACtH,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAU,EAAE,QAA4B;QACjD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAY,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,QAA4B;QACnD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAY,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,QAA4B;QACnD,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAY,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAA4B;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Workspace Repository Implementation
|
|
3
|
+
*/
|
|
4
|
+
import type { Result } from "@connexia/domain";
|
|
5
|
+
import type { PaginatedResult } from "@connexia/domain";
|
|
6
|
+
import type { RepositoryOptions, FindOptions } from "@connexia/domain";
|
|
7
|
+
import type { UserId } from "@connexia/domain";
|
|
8
|
+
import type { WorkspaceRepository } from "@connexia/domain";
|
|
9
|
+
import { Workspace } from "@connexia/domain";
|
|
10
|
+
export declare class InMemoryWorkspaceRepository implements WorkspaceRepository {
|
|
11
|
+
private readonly store;
|
|
12
|
+
findById(id: string, _options?: RepositoryOptions): Promise<Result<Workspace | null>>;
|
|
13
|
+
findByUserId(userId: UserId, options?: FindOptions): Promise<Result<PaginatedResult<Workspace>>>;
|
|
14
|
+
findDefaultByUserId(userId: UserId, _options?: RepositoryOptions): Promise<Result<Workspace | null>>;
|
|
15
|
+
save(workspace: Workspace, _options?: RepositoryOptions): Promise<Result<Workspace>>;
|
|
16
|
+
delete(id: string, _options?: RepositoryOptions): Promise<Result<void>>;
|
|
17
|
+
exists(id: string, _options?: RepositoryOptions): Promise<Result<boolean>>;
|
|
18
|
+
count(_options?: RepositoryOptions): Promise<Result<number>>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=in-memory-workspace-repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-workspace-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/in-memory-workspace-repository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,qBAAa,2BAA4B,YAAW,mBAAmB;IACrE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IAEhD,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAIrF,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC;IAShG,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAKpG,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAKpF,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAKvE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAI1E,KAAK,CAAC,QAAQ,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;CAGnE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-Memory Workspace Repository Implementation
|
|
3
|
+
*/
|
|
4
|
+
import { ok } from "@connexia/domain";
|
|
5
|
+
export class InMemoryWorkspaceRepository {
|
|
6
|
+
store = new Map();
|
|
7
|
+
async findById(id, _options) {
|
|
8
|
+
return ok(this.store.get(id) ?? null);
|
|
9
|
+
}
|
|
10
|
+
async findByUserId(userId, options) {
|
|
11
|
+
const items = Array.from(this.store.values()).filter(w => w.userId === userId);
|
|
12
|
+
return ok({
|
|
13
|
+
items,
|
|
14
|
+
totalCount: items.length,
|
|
15
|
+
hasMore: false,
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
async findDefaultByUserId(userId, _options) {
|
|
19
|
+
const defaultId = `ws-default-${userId}`;
|
|
20
|
+
return ok(this.store.get(defaultId) ?? null);
|
|
21
|
+
}
|
|
22
|
+
async save(workspace, _options) {
|
|
23
|
+
this.store.set(workspace.id, workspace);
|
|
24
|
+
return ok(workspace);
|
|
25
|
+
}
|
|
26
|
+
async delete(id, _options) {
|
|
27
|
+
this.store.delete(id);
|
|
28
|
+
return ok(undefined);
|
|
29
|
+
}
|
|
30
|
+
async exists(id, _options) {
|
|
31
|
+
return ok(this.store.has(id));
|
|
32
|
+
}
|
|
33
|
+
async count(_options) {
|
|
34
|
+
return ok(this.store.size);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=in-memory-workspace-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-workspace-repository.js","sourceRoot":"","sources":["../../src/repositories/in-memory-workspace-repository.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,EAAE,EAAO,MAAM,kBAAkB,CAAC;AAQ3C,MAAM,OAAO,2BAA2B;IACrB,KAAK,GAAG,IAAI,GAAG,EAAqB,CAAC;IAEtD,KAAK,CAAC,QAAQ,CAAC,EAAU,EAAE,QAA4B;QACrD,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,MAAc,EAAE,OAAqB;QACtD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;QAC/E,OAAO,EAAE,CAAC;YACR,KAAK;YACL,UAAU,EAAE,KAAK,CAAC,MAAoB;YACtC,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,QAA4B;QACpE,MAAM,SAAS,GAAG,cAAc,MAAM,EAAE,CAAC;QACzC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,SAAoB,EAAE,QAA4B;QAC3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;QACxC,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,QAA4B;QACnD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,OAAO,EAAE,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,QAA4B;QACnD,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,QAA4B;QACtC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { DrizzleProjectRepository } from "./drizzle-project-repository.js";
|
|
2
|
+
export { DrizzleBuildRepository } from "./drizzle-build-repository.js";
|
|
3
|
+
export { DrizzleOrganizationRepository } from "./drizzle-organization-repository.js";
|
|
4
|
+
export { DrizzleDeploymentRepository } from "./drizzle-deployment-repository.js";
|
|
5
|
+
export { DrizzleUserRepository } from "./drizzle-user-repository.js";
|
|
6
|
+
export { DrizzleAuditEventRepository } from "./drizzle-audit-event-repository.js";
|
|
7
|
+
export { DrizzleEnvironmentRepository } from "./drizzle-environment-repository.js";
|
|
8
|
+
export { DrizzleSecretRepository } from "./drizzle-secret-repository.js";
|
|
9
|
+
export { InMemoryProjectRepository } from "./in-memory-project-repository.js";
|
|
10
|
+
export { InMemoryBuildRepository } from "./in-memory-build-repository.js";
|
|
11
|
+
export { InMemoryOrganizationRepository } from "./in-memory-organization-repository.js";
|
|
12
|
+
export { InMemoryDeploymentRepository } from "./in-memory-deployment-repository.js";
|
|
13
|
+
export { InMemoryAuditEventRepository } from "./in-memory-audit-event-repository.js";
|
|
14
|
+
export { InMemoryUserRepository } from "./in-memory-user-repository.js";
|
|
15
|
+
export { InMemoryRecommendationRepository } from "./in-memory-recommendation-repository.js";
|
|
16
|
+
export { InMemoryPluginRepository } from "./in-memory-plugin-repository.js";
|
|
17
|
+
export { InMemoryWorkspaceRepository } from "./in-memory-workspace-repository.js";
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repositories/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { DrizzleProjectRepository } from "./drizzle-project-repository.js";
|
|
2
|
+
export { DrizzleBuildRepository } from "./drizzle-build-repository.js";
|
|
3
|
+
export { DrizzleOrganizationRepository } from "./drizzle-organization-repository.js";
|
|
4
|
+
export { DrizzleDeploymentRepository } from "./drizzle-deployment-repository.js";
|
|
5
|
+
export { DrizzleUserRepository } from "./drizzle-user-repository.js";
|
|
6
|
+
export { DrizzleAuditEventRepository } from "./drizzle-audit-event-repository.js";
|
|
7
|
+
export { DrizzleEnvironmentRepository } from "./drizzle-environment-repository.js";
|
|
8
|
+
export { DrizzleSecretRepository } from "./drizzle-secret-repository.js";
|
|
9
|
+
export { InMemoryProjectRepository } from "./in-memory-project-repository.js";
|
|
10
|
+
export { InMemoryBuildRepository } from "./in-memory-build-repository.js";
|
|
11
|
+
export { InMemoryOrganizationRepository } from "./in-memory-organization-repository.js";
|
|
12
|
+
export { InMemoryDeploymentRepository } from "./in-memory-deployment-repository.js";
|
|
13
|
+
export { InMemoryAuditEventRepository } from "./in-memory-audit-event-repository.js";
|
|
14
|
+
export { InMemoryUserRepository } from "./in-memory-user-repository.js";
|
|
15
|
+
export { InMemoryRecommendationRepository } from "./in-memory-recommendation-repository.js";
|
|
16
|
+
export { InMemoryPluginRepository } from "./in-memory-plugin-repository.js";
|
|
17
|
+
export { InMemoryWorkspaceRepository } from "./in-memory-workspace-repository.js";
|
|
18
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repositories/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAC3E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AACrF,OAAO,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,qCAAqC,CAAC;AACnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AAEzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,EAAE,8BAA8B,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sCAAsC,CAAC;AACpF,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,gCAAgC,EAAE,MAAM,0CAA0C,CAAC;AAC5F,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,OAAO,EAAE,2BAA2B,EAAE,MAAM,qCAAqC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Runtime
|
|
3
|
+
*
|
|
4
|
+
* Production health subsystem. Collects real provider health,
|
|
5
|
+
* computes readiness/liveness, dependency-aware aggregation.
|
|
6
|
+
* Never hardcodes health values.
|
|
7
|
+
*/
|
|
8
|
+
import type { HealthStatus } from "../shared/constants.js";
|
|
9
|
+
import type { ProviderLifecycleManager, ProviderHandle } from "./provider-lifecycle.js";
|
|
10
|
+
import { ResourceManager } from "./resource-manager.js";
|
|
11
|
+
export interface HealthRuntimeConfig {
|
|
12
|
+
readonly pollIntervalMs: number;
|
|
13
|
+
readonly checkTimeoutMs: number;
|
|
14
|
+
readonly degradedThresholdMs: number;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_HEALTH_CONFIG: HealthRuntimeConfig;
|
|
17
|
+
export interface ProviderHealthState {
|
|
18
|
+
readonly providerId: string;
|
|
19
|
+
readonly status: HealthStatus;
|
|
20
|
+
readonly latencyMs: number;
|
|
21
|
+
readonly lastCheckedAt: string;
|
|
22
|
+
readonly message?: string;
|
|
23
|
+
readonly consecutiveFailures: number;
|
|
24
|
+
}
|
|
25
|
+
export interface ReadinessResult {
|
|
26
|
+
readonly ready: boolean;
|
|
27
|
+
readonly details: Record<string, HealthStatus>;
|
|
28
|
+
readonly unhealthyCount: number;
|
|
29
|
+
readonly degradedCount: number;
|
|
30
|
+
}
|
|
31
|
+
export interface LivenessResult {
|
|
32
|
+
readonly alive: boolean;
|
|
33
|
+
readonly uptimeMs: number;
|
|
34
|
+
readonly stage: string;
|
|
35
|
+
}
|
|
36
|
+
export type HealthChangeHandler = (providerId: string, from: HealthStatus, to: HealthStatus) => void;
|
|
37
|
+
export declare class HealthRuntime {
|
|
38
|
+
private config;
|
|
39
|
+
private providerLifecycle;
|
|
40
|
+
private resourceManager?;
|
|
41
|
+
private providerHealth;
|
|
42
|
+
private pollTimer;
|
|
43
|
+
private changeListeners;
|
|
44
|
+
private running;
|
|
45
|
+
private startTime;
|
|
46
|
+
private currentStage;
|
|
47
|
+
constructor(config: HealthRuntimeConfig | undefined, providerLifecycle: ProviderLifecycleManager, resourceManager?: ResourceManager | undefined);
|
|
48
|
+
start(): void;
|
|
49
|
+
stop(): void;
|
|
50
|
+
setStage(stage: string): void;
|
|
51
|
+
getProviderHealth(providerId: string): ProviderHealthState | undefined;
|
|
52
|
+
getAllHealth(): ProviderHealthState[];
|
|
53
|
+
isReady(): boolean;
|
|
54
|
+
isAlive(): boolean;
|
|
55
|
+
getOverallStatus(): HealthStatus;
|
|
56
|
+
getReadinessStatus(): ReadinessResult;
|
|
57
|
+
getLivenessStatus(): LivenessResult;
|
|
58
|
+
onHealthChange(handler: HealthChangeHandler): void;
|
|
59
|
+
pollAll(): Promise<ProviderHealthState[]>;
|
|
60
|
+
pollOne(providerId: string): Promise<ProviderHealthState | undefined>;
|
|
61
|
+
pollOne(handle: ProviderHandle): Promise<ProviderHealthState>;
|
|
62
|
+
getDependencyAwareStatus(providerId: string): HealthStatus;
|
|
63
|
+
private withTimeout;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=health-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-runtime.d.ts","sourceRoot":"","sources":["../../src/runtime/health-runtime.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAExD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,eAAO,MAAM,qBAAqB,EAAE,mBAInC,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC/C,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,mBAAmB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,KAAK,IAAI,CAAC;AAErG,qBAAa,aAAa;IAStB,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,iBAAiB;IACzB,OAAO,CAAC,eAAe,CAAC;IAV1B,OAAO,CAAC,cAAc,CAA0C;IAChE,OAAO,CAAC,SAAS,CAA+C;IAChE,OAAO,CAAC,eAAe,CAA6B;IACpD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,YAAY,CAAa;gBAGvB,MAAM,EAAE,mBAAmB,YAAwB,EACnD,iBAAiB,EAAE,wBAAwB,EAC3C,eAAe,CAAC,EAAE,eAAe,YAAA;IAK3C,KAAK,IAAI,IAAI;IAkBb,IAAI,IAAI,IAAI;IAQZ,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAM7B,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAItE,YAAY,IAAI,mBAAmB,EAAE;IAIrC,OAAO,IAAI,OAAO;IAUlB,OAAO,IAAI,OAAO;IAMlB,gBAAgB,IAAI,YAAY;IAUhC,kBAAkB,IAAI,eAAe;IAwBrC,iBAAiB,IAAI,cAAc;IAUnC,cAAc,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI;IAM5C,OAAO,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAYzC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IACrE,OAAO,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+EnE,wBAAwB,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY;YAmB5C,WAAW;CAkB1B"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Health Runtime
|
|
3
|
+
*
|
|
4
|
+
* Production health subsystem. Collects real provider health,
|
|
5
|
+
* computes readiness/liveness, dependency-aware aggregation.
|
|
6
|
+
* Never hardcodes health values.
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_HEALTH_CONFIG = {
|
|
9
|
+
pollIntervalMs: 30_000,
|
|
10
|
+
checkTimeoutMs: 5_000,
|
|
11
|
+
degradedThresholdMs: 2_000,
|
|
12
|
+
};
|
|
13
|
+
export class HealthRuntime {
|
|
14
|
+
config;
|
|
15
|
+
providerLifecycle;
|
|
16
|
+
resourceManager;
|
|
17
|
+
providerHealth = new Map();
|
|
18
|
+
pollTimer = null;
|
|
19
|
+
changeListeners = [];
|
|
20
|
+
running = false;
|
|
21
|
+
startTime = Date.now();
|
|
22
|
+
currentStage = "created";
|
|
23
|
+
constructor(config = DEFAULT_HEALTH_CONFIG, providerLifecycle, resourceManager) {
|
|
24
|
+
this.config = config;
|
|
25
|
+
this.providerLifecycle = providerLifecycle;
|
|
26
|
+
this.resourceManager = resourceManager;
|
|
27
|
+
}
|
|
28
|
+
// ─── Lifecycle ─────────────────────────────────────────────
|
|
29
|
+
start() {
|
|
30
|
+
if (this.running)
|
|
31
|
+
return;
|
|
32
|
+
this.running = true;
|
|
33
|
+
this.startTime = Date.now();
|
|
34
|
+
if (this.resourceManager) {
|
|
35
|
+
this.resourceManager.createInterval(() => { this.pollAll().catch(() => { }); }, this.config.pollIntervalMs, "health-runtime-poll");
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
this.pollTimer = setInterval(() => {
|
|
39
|
+
this.pollAll().catch(() => { });
|
|
40
|
+
}, this.config.pollIntervalMs);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
stop() {
|
|
44
|
+
this.running = false;
|
|
45
|
+
if (this.pollTimer) {
|
|
46
|
+
clearInterval(this.pollTimer);
|
|
47
|
+
this.pollTimer = null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
setStage(stage) {
|
|
51
|
+
this.currentStage = stage;
|
|
52
|
+
}
|
|
53
|
+
// ─── Health Queries ────────────────────────────────────────
|
|
54
|
+
getProviderHealth(providerId) {
|
|
55
|
+
return this.providerHealth.get(providerId);
|
|
56
|
+
}
|
|
57
|
+
getAllHealth() {
|
|
58
|
+
return Array.from(this.providerHealth.values());
|
|
59
|
+
}
|
|
60
|
+
isReady() {
|
|
61
|
+
const handles = this.providerLifecycle.getAll();
|
|
62
|
+
for (const handle of handles) {
|
|
63
|
+
const health = this.providerHealth.get(handle.descriptor.id);
|
|
64
|
+
// Unknown (not yet checked) is acceptable — only unhealthy blocks readiness
|
|
65
|
+
if (health && health.status === "unhealthy")
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return this.currentStage === "running";
|
|
69
|
+
}
|
|
70
|
+
isAlive() {
|
|
71
|
+
return this.currentStage !== "stopping" && this.currentStage !== "stopped";
|
|
72
|
+
}
|
|
73
|
+
// ─── Aggregation ───────────────────────────────────────────
|
|
74
|
+
getOverallStatus() {
|
|
75
|
+
const allHealth = this.getAllHealth();
|
|
76
|
+
if (allHealth.length === 0)
|
|
77
|
+
return "unknown";
|
|
78
|
+
if (allHealth.some((h) => h.status === "unhealthy"))
|
|
79
|
+
return "unhealthy";
|
|
80
|
+
if (allHealth.some((h) => h.status === "degraded"))
|
|
81
|
+
return "degraded";
|
|
82
|
+
if (allHealth.every((h) => h.status === "healthy"))
|
|
83
|
+
return "healthy";
|
|
84
|
+
return "unknown";
|
|
85
|
+
}
|
|
86
|
+
getReadinessStatus() {
|
|
87
|
+
const handles = this.providerLifecycle.getAll();
|
|
88
|
+
const details = {};
|
|
89
|
+
let unhealthyCount = 0;
|
|
90
|
+
let degradedCount = 0;
|
|
91
|
+
for (const handle of handles) {
|
|
92
|
+
const id = handle.descriptor.id;
|
|
93
|
+
const health = this.providerHealth.get(id);
|
|
94
|
+
const status = health?.status ?? "unknown";
|
|
95
|
+
details[id] = status;
|
|
96
|
+
if (status === "unhealthy")
|
|
97
|
+
unhealthyCount++;
|
|
98
|
+
if (status === "degraded")
|
|
99
|
+
degradedCount++;
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
ready: this.isReady(),
|
|
103
|
+
details,
|
|
104
|
+
unhealthyCount,
|
|
105
|
+
degradedCount,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
getLivenessStatus() {
|
|
109
|
+
return {
|
|
110
|
+
alive: this.isAlive(),
|
|
111
|
+
uptimeMs: Date.now() - this.startTime,
|
|
112
|
+
stage: this.currentStage,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
// ─── Events ────────────────────────────────────────────────
|
|
116
|
+
onHealthChange(handler) {
|
|
117
|
+
this.changeListeners.push(handler);
|
|
118
|
+
}
|
|
119
|
+
// ─── Manual Poll ───────────────────────────────────────────
|
|
120
|
+
async pollAll() {
|
|
121
|
+
const handles = this.providerLifecycle.getAll();
|
|
122
|
+
const results = [];
|
|
123
|
+
for (const handle of handles) {
|
|
124
|
+
const state = await this.pollOne(handle);
|
|
125
|
+
results.push(state);
|
|
126
|
+
}
|
|
127
|
+
return results;
|
|
128
|
+
}
|
|
129
|
+
async pollOne(handleOrId) {
|
|
130
|
+
const handle = typeof handleOrId === "string"
|
|
131
|
+
? this.providerLifecycle.getHandle(handleOrId)
|
|
132
|
+
: handleOrId;
|
|
133
|
+
if (!handle) {
|
|
134
|
+
return {
|
|
135
|
+
providerId: typeof handleOrId === "string" ? handleOrId : handleOrId.descriptor.id,
|
|
136
|
+
status: "unknown",
|
|
137
|
+
latencyMs: 0,
|
|
138
|
+
lastCheckedAt: new Date().toISOString(),
|
|
139
|
+
consecutiveFailures: 0,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const id = handle.descriptor.id;
|
|
143
|
+
const previousHealth = this.providerHealth.get(id);
|
|
144
|
+
const startTime = Date.now();
|
|
145
|
+
let status;
|
|
146
|
+
let message;
|
|
147
|
+
try {
|
|
148
|
+
if (handle.descriptor.healthCheck) {
|
|
149
|
+
const result = await this.withTimeout(handle.descriptor.healthCheck(), this.config.checkTimeoutMs);
|
|
150
|
+
status = typeof result === "string" ? result : "healthy";
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
// No health check defined — genuinely unknown, not hardcoded
|
|
154
|
+
status = "unknown";
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
status = "unhealthy";
|
|
159
|
+
message = error instanceof Error ? error.message : String(error);
|
|
160
|
+
}
|
|
161
|
+
const latencyMs = Date.now() - startTime;
|
|
162
|
+
// Check if degraded due to slow response
|
|
163
|
+
if (status === "healthy" && latencyMs > this.config.degradedThresholdMs) {
|
|
164
|
+
status = "degraded";
|
|
165
|
+
message = `Response time ${latencyMs}ms exceeds threshold ${this.config.degradedThresholdMs}ms`;
|
|
166
|
+
}
|
|
167
|
+
const consecutiveFailures = status === "unhealthy"
|
|
168
|
+
? (previousHealth?.consecutiveFailures ?? 0) + 1
|
|
169
|
+
: 0;
|
|
170
|
+
const newState = {
|
|
171
|
+
providerId: id,
|
|
172
|
+
status,
|
|
173
|
+
latencyMs,
|
|
174
|
+
lastCheckedAt: new Date().toISOString(),
|
|
175
|
+
message,
|
|
176
|
+
consecutiveFailures,
|
|
177
|
+
};
|
|
178
|
+
this.providerHealth.set(id, newState);
|
|
179
|
+
// Emit change event (including initial state when no previous health)
|
|
180
|
+
if (!previousHealth || previousHealth.status !== status) {
|
|
181
|
+
const fromStatus = previousHealth?.status ?? "unknown";
|
|
182
|
+
for (const listener of this.changeListeners) {
|
|
183
|
+
try {
|
|
184
|
+
listener(id, fromStatus, status);
|
|
185
|
+
}
|
|
186
|
+
catch {
|
|
187
|
+
// listener errors must not crash health runtime
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return newState;
|
|
192
|
+
}
|
|
193
|
+
// ─── Dependency-Aware Aggregation ──────────────────────────
|
|
194
|
+
getDependencyAwareStatus(providerId) {
|
|
195
|
+
const health = this.providerHealth.get(providerId);
|
|
196
|
+
if (!health)
|
|
197
|
+
return "unknown";
|
|
198
|
+
// Check if any dependency is unhealthy
|
|
199
|
+
const handle = this.providerLifecycle.getHandle(providerId);
|
|
200
|
+
if (handle) {
|
|
201
|
+
for (const depId of handle.descriptor.dependencies) {
|
|
202
|
+
const depHealth = this.providerHealth.get(depId);
|
|
203
|
+
if (depHealth?.status === "unhealthy")
|
|
204
|
+
return "degraded";
|
|
205
|
+
if (depHealth?.status === "degraded" && health.status === "healthy")
|
|
206
|
+
return "degraded";
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
return health.status;
|
|
210
|
+
}
|
|
211
|
+
// ─── Internal ──────────────────────────────────────────────
|
|
212
|
+
async withTimeout(promise, timeoutMs) {
|
|
213
|
+
return new Promise((resolve, reject) => {
|
|
214
|
+
const timer = setTimeout(() => {
|
|
215
|
+
reject(new Error(`Health check timeout after ${timeoutMs}ms`));
|
|
216
|
+
}, timeoutMs);
|
|
217
|
+
promise.then((value) => {
|
|
218
|
+
clearTimeout(timer);
|
|
219
|
+
resolve(value);
|
|
220
|
+
}, (error) => {
|
|
221
|
+
clearTimeout(timer);
|
|
222
|
+
reject(error);
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=health-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health-runtime.js","sourceRoot":"","sources":["../../src/runtime/health-runtime.ts"],"names":[],"mappings":"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"}
|