@getstrata/bootstrap 0.2.6 → 0.2.7

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.
Files changed (35) hide show
  1. package/dist/bootstrap/contracts.d.ts +2 -0
  2. package/dist/bootstrap/providers/storage.d.ts +3 -0
  3. package/dist/bootstrap/scimRoutes.d.ts +1 -1
  4. package/dist/core/auth/membershipScope.d.ts +16 -0
  5. package/dist/core/auth/membershipService.d.ts +24 -0
  6. package/dist/core/database/baseRepository.d.ts +6 -1
  7. package/dist/core/database/connectionContext.d.ts +2 -1
  8. package/dist/core/database/defaultConnection.d.ts +6 -0
  9. package/dist/core/database/queryProxy.d.ts +3 -0
  10. package/dist/core/database/repositoryConnection.d.ts +3 -3
  11. package/dist/core/jobs/dispatchWebhookJob.d.ts +0 -1
  12. package/dist/core/queue/queueMetrics.d.ts +15 -0
  13. package/dist/core/security/safeFetch.d.ts +2 -0
  14. package/dist/core/security/safeUrl.d.ts +16 -1
  15. package/dist/core/tenant/tenantDatabaseScope.d.ts +2 -1
  16. package/dist/db/connection/index.d.ts +1 -1
  17. package/dist/domain/workhub.d.ts +35 -0
  18. package/dist/entries/applicationRegistry.js +185 -0
  19. package/dist/entries/config.js +42 -0
  20. package/dist/entries/context.js +4208 -0
  21. package/dist/entries/contracts.js +92 -0
  22. package/dist/entries/createWebRoutes.js +996 -0
  23. package/dist/entries/httpKernel.js +264 -0
  24. package/dist/entries/providers/view.js +635 -0
  25. package/dist/entries/providers.js +4094 -0
  26. package/dist/framework/public-api.d.ts +29 -6
  27. package/dist/index.js +290 -109
  28. package/dist/modules/organization/repository.d.ts +14 -0
  29. package/dist/modules/organization/table.d.ts +3 -0
  30. package/dist/modules/organization/types.d.ts +10 -0
  31. package/dist/modules/scim/controller.d.ts +2 -1
  32. package/dist/modules/scim/scimResponse.d.ts +1 -1
  33. package/dist/modules/scim/service.d.ts +4 -7
  34. package/dist/modules/user/repository.d.ts +1 -0
  35. package/package.json +5 -4
@@ -1,3 +1,4 @@
1
+ import type { StorageManager } from "../core/storage/storage";
1
2
  import type { CacheLike } from "../types/services";
2
3
  type CachedJson = <T>(cacheKey: string, loader: () => Promise<T>, tags?: string[], request?: Request) => Promise<Response>;
3
4
  type AppRouteMap = Record<string, any>;
@@ -23,6 +24,7 @@ declare class ConfigStore {
23
24
  interface AppDependencies {
24
25
  container: ServiceContainer;
25
26
  cache: CacheLike;
27
+ storage: StorageManager;
26
28
  }
27
29
  type MutableAppDependencies = Partial<Omit<AppDependencies, "container">> & Pick<AppDependencies, "container">;
28
30
  interface ProviderContext {
@@ -0,0 +1,3 @@
1
+ import type { ServiceProvider } from "../contracts";
2
+ declare const storageProvider: ServiceProvider;
3
+ export default storageProvider;
@@ -1,4 +1,4 @@
1
- import type { RouteHandler } from "../core/http/middleware";
1
+ import { type RouteHandler } from "@getstrata/core";
2
2
  import type { AppDependencies } from "./contracts";
3
3
  declare function createScimRoutes(dependencies: AppDependencies): {
4
4
  "/scim/v2/ServiceProviderConfig": {
@@ -0,0 +1,16 @@
1
+ declare function resolveOrganizationScope(): number[] | null;
2
+ declare function scopedOrganizationIds(requestedOrganizationId?: number): number[] | null;
3
+ declare function appendOrganizationScope<T extends object>(where: T, requestedOrganizationId?: number): T;
4
+ declare function appendProjectScope<T extends object>(where: T, accessibleProjectIds: number[] | null, requestedProjectId?: number): T;
5
+ declare function emptyPaginateResult<T>(page: number, perPage: number): {
6
+ data: T[];
7
+ meta: {
8
+ page: number;
9
+ per_page: number;
10
+ total: number;
11
+ last_page: number;
12
+ };
13
+ };
14
+ declare function assertResourceInCurrentTenant(resourceTenantId: number, resourceLabel: string, resourceId: number): void;
15
+ declare function assertOrganizationReadable(organizationId: number): void;
16
+ export { appendOrganizationScope, appendProjectScope, assertOrganizationReadable, assertResourceInCurrentTenant, emptyPaginateResult, resolveOrganizationScope, scopedOrganizationIds, };
@@ -0,0 +1,24 @@
1
+ import type { OrganizationMemberRole } from "../../modules/organization/memberTypes";
2
+ import { type AuthUser } from "./authContext";
3
+ import { membershipRepository as defaultMembershipRepository } from "./membershipContext";
4
+ type MembershipRepositoryLike = Pick<typeof defaultMembershipRepository, "listForUser" | "findMembership" | "listForOrganization" | "addMember" | "removeMember">;
5
+ declare class MembershipService {
6
+ private readonly members;
7
+ constructor(members?: MembershipRepositoryLike);
8
+ listOrganizationIdsForUser(userId: number): Promise<number[]>;
9
+ getOrgRole(userId: number, organizationId: number): Promise<OrganizationMemberRole | null>;
10
+ requireOrgAccess(organizationId: number, minimumRole?: OrganizationMemberRole, user?: AuthUser | null): Promise<OrganizationMemberRole>;
11
+ filterAccessibleOrganizationIds(organizationIds: number[], user?: AuthUser | null): Promise<number[]>;
12
+ addOwnerOnOrganizationCreate(organizationId: number, userId: number): Promise<void>;
13
+ listMembersForOrganization(organizationId: number): Promise<import("../../modules/organization/memberTypes").OrganizationMemberRecord[]>;
14
+ addMember(input: {
15
+ organizationId: number;
16
+ userId: number;
17
+ role?: OrganizationMemberRole;
18
+ }): Promise<import("../../modules/organization/memberTypes").OrganizationMemberRecord>;
19
+ removeMember(organizationId: number, userId: number): Promise<boolean>;
20
+ }
21
+ declare function resolveMembershipService(): MembershipService;
22
+ export type { MembershipRepositoryLike };
23
+ export default MembershipService;
24
+ export { resolveMembershipService };
@@ -9,6 +9,11 @@ type ExtendedQueryOptions<TEntity extends object> = QueryOptions<TEntity> & {
9
9
  };
10
10
  interface DatabaseConnection {
11
11
  unsafe<T>(query: string, params?: readonly unknown[]): Promise<T[]>;
12
+ begin?<T>(callback: (transaction: DatabaseConnection) => Promise<T>): Promise<T>;
13
+ close?(): Promise<void>;
14
+ }
15
+ interface SqlDatabaseConnection extends DatabaseConnection {
16
+ (strings: TemplateStringsArray, ...values: unknown[]): Promise<unknown[]>;
12
17
  }
13
18
  type ErrorFactory<TValue> = (value: TValue) => Error;
14
19
  declare class BaseRepository<TEntity extends object, PrimaryKey extends keyof TEntity & string> {
@@ -59,4 +64,4 @@ declare class BaseRepository<TEntity extends object, PrimaryKey extends keyof TE
59
64
  loadMorphToForChildren<TChild extends object, TParent extends object, MorphTypeKey extends keyof TChild & string, MorphIdKey extends keyof TChild & string, OwnerKey extends keyof TParent & string>(children: readonly TChild[], relation: MorphToRelation<TChild, MorphTypeKey, MorphIdKey>, repositoriesByType: ReadonlyMap<string, BaseRepository<TParent, OwnerKey>>, options?: Omit<QueryOptions<TParent>, "where">): Promise<Map<TChild[MorphIdKey], TParent>>;
60
65
  }
61
66
  export default BaseRepository;
62
- export type { DatabaseConnection };
67
+ export type { DatabaseConnection, SqlDatabaseConnection };
@@ -3,5 +3,6 @@ type ActiveDatabaseHandle = {
3
3
  };
4
4
  declare function runWithDatabaseConnection<T>(connection: ActiveDatabaseHandle, callback: () => T | Promise<T>): T | Promise<T>;
5
5
  declare function getActiveDatabaseConnection<T extends ActiveDatabaseHandle>(fallback: T): T;
6
+ declare function hasActiveDatabaseConnection(): boolean;
6
7
  export type { ActiveDatabaseHandle };
7
- export { getActiveDatabaseConnection, runWithDatabaseConnection };
8
+ export { getActiveDatabaseConnection, hasActiveDatabaseConnection, runWithDatabaseConnection };
@@ -0,0 +1,6 @@
1
+ import type { SqlDatabaseConnection } from "./baseRepository";
2
+ declare function registerDefaultDatabasePool(connection: SqlDatabaseConnection): void;
3
+ declare function getDefaultDatabasePool(): SqlDatabaseConnection;
4
+ declare function getDefaultDatabaseQuery(): SqlDatabaseConnection;
5
+ declare function resetDefaultDatabasePoolForTests(): void;
6
+ export { getDefaultDatabasePool, getDefaultDatabaseQuery, registerDefaultDatabasePool, resetDefaultDatabasePoolForTests, };
@@ -0,0 +1,3 @@
1
+ import type { SqlDatabaseConnection } from "./baseRepository";
2
+ declare function createDatabaseQueryProxy(pool: SqlDatabaseConnection): SqlDatabaseConnection;
3
+ export { createDatabaseQueryProxy };
@@ -1,4 +1,4 @@
1
- import type { DatabaseConnection } from "./baseRepository";
2
- declare function resolveRepositoryConnection(): DatabaseConnection;
3
- declare const repositoryConnection: DatabaseConnection;
1
+ import type { SqlDatabaseConnection } from "./baseRepository";
2
+ declare function resolveRepositoryConnection(): SqlDatabaseConnection;
3
+ declare const repositoryConnection: SqlDatabaseConnection;
4
4
  export { repositoryConnection, resolveRepositoryConnection };
@@ -5,7 +5,6 @@ interface DispatchWebhookPayload {
5
5
  payload: Record<string, unknown>;
6
6
  }
7
7
  declare class DispatchWebhookJob extends Job<DispatchWebhookPayload> {
8
- constructor();
9
8
  readonly maxAttempts = 3;
10
9
  readonly backoffMs = 2000;
11
10
  handle(payload: DispatchWebhookPayload): Promise<void>;
@@ -0,0 +1,15 @@
1
+ interface QueueDepthMetrics {
2
+ high: number;
3
+ default: number;
4
+ low: number;
5
+ total: number;
6
+ }
7
+ interface QueueMetricsSnapshot {
8
+ driver: string;
9
+ pending: QueueDepthMetrics;
10
+ failedCount: number;
11
+ }
12
+ declare function readRedisQueueDepth(redisUrl: string): Promise<QueueDepthMetrics>;
13
+ declare function collectQueueMetrics(): Promise<QueueMetricsSnapshot>;
14
+ export type { QueueDepthMetrics, QueueMetricsSnapshot };
15
+ export { collectQueueMetrics, readRedisQueueDepth };
@@ -2,6 +2,8 @@ declare const DEFAULT_FETCH_TIMEOUT_MS = 10000;
2
2
  interface SafeFetchOptions {
3
3
  timeoutMs?: number;
4
4
  maxRedirects?: number;
5
+ allowHttp?: boolean;
6
+ resolveDns?: boolean;
5
7
  }
6
8
  declare function safeFetch(input: string, init?: RequestInit, options?: SafeFetchOptions): Promise<Response>;
7
9
  export type { SafeFetchOptions };
@@ -1,5 +1,20 @@
1
+ type DnsLookupResult = {
2
+ address: string;
3
+ family: number;
4
+ };
5
+ type DnsLookup = (hostname: string, options: {
6
+ all: true;
7
+ verbatim: true;
8
+ }) => Promise<DnsLookupResult[]>;
1
9
  declare function isBlockedHostname(hostname: string): boolean;
2
10
  declare function assertSafeOutboundUrl(rawUrl: string, options?: {
3
11
  allowHttp?: boolean;
4
12
  }): URL;
5
- export { assertSafeOutboundUrl, isBlockedHostname };
13
+ declare function isBlockedIpAddress(address: string): boolean;
14
+ declare function assertSafeOutboundUrlResolved(rawUrl: string, options?: {
15
+ allowHttp?: boolean;
16
+ resolveDns?: boolean;
17
+ }): Promise<URL>;
18
+ declare function setDnsLookupForTests(lookupFn: DnsLookup): void;
19
+ declare function resetDnsLookupForTests(): void;
20
+ export { assertSafeOutboundUrl, assertSafeOutboundUrlResolved, isBlockedHostname, isBlockedIpAddress, resetDnsLookupForTests, setDnsLookupForTests, };
@@ -4,4 +4,5 @@ type TransactionHandle = {
4
4
  };
5
5
  declare function applyTenantContextToTransaction(transaction: TransactionHandle, tenantId: number): Promise<void>;
6
6
  declare function runWithTenantDatabase<T>(tenant: TenantContext, callback: () => T | Promise<T>): Promise<T>;
7
- export { applyTenantContextToTransaction, runWithTenantDatabase };
7
+ declare function isInsideTenantDatabaseScope(tenantId?: number | undefined): boolean;
8
+ export { applyTenantContextToTransaction, isInsideTenantDatabaseScope, runWithTenantDatabase };
@@ -1,4 +1,4 @@
1
- import { type DatabaseConnection } from "./createConnection";
1
+ import type { DatabaseConnection } from "./createConnection";
2
2
  declare function getDatabase(): DatabaseConnection;
3
3
  declare function pingDatabase(connection?: DatabaseConnection): Promise<boolean>;
4
4
  declare function ensureDatabaseConnection(): Promise<DatabaseConnection>;
@@ -0,0 +1,35 @@
1
+ /**
2
+ * WorkHub — complex reference domain for framework stress-testing.
3
+ *
4
+ * Replaces character/nemesis/secret over time. Module layout:
5
+ *
6
+ * organization/ top-level tenant (CRUD, unique slug)
7
+ * project/ belongsTo organization (CRUD, status enum, composite unique name)
8
+ * task/ belongsTo project (CRUD, priority, status enum) — Phase 2
9
+ * comment/ belongsTo task (CRUD, nested create) — Phase 2
10
+ * report/ cross-module aggregations — Phase 2
11
+ *
12
+ * Relationship graph:
13
+ *
14
+ * organization 1──* project 1──* task 1──* comment
15
+ *
16
+ * Edge cases this domain is meant to exercise:
17
+ * - unique violations (organization.slug, project per-org name)
18
+ * - FK violations (project.organization_id, task.project_id)
19
+ * - enum/check constraints (project.status, task.priority)
20
+ * - transactions (create project + default task atomically)
21
+ * - belongsTo eager loading (project → organization)
22
+ * - cache invalidation on writes
23
+ * - PATCH partial updates without nulling omitted fields
24
+ */
25
+ declare const ORGANIZATION_TABLE: "organization";
26
+ declare const PROJECT_TABLE: "project";
27
+ declare const TASK_TABLE: "task";
28
+ declare const COMMENT_TABLE: "comment";
29
+ declare const TASK_ATTACHMENT_TABLE: "task_attachment";
30
+ declare const PROJECT_STATUSES: readonly ["draft", "active", "archived"];
31
+ declare const TASK_STATUSES: readonly ["todo", "in_progress", "done"];
32
+ type ProjectStatus = (typeof PROJECT_STATUSES)[number];
33
+ type TaskStatus = (typeof TASK_STATUSES)[number];
34
+ export type { ProjectStatus, TaskStatus };
35
+ export { COMMENT_TABLE, ORGANIZATION_TABLE, PROJECT_STATUSES, PROJECT_TABLE, TASK_ATTACHMENT_TABLE, TASK_STATUSES, TASK_TABLE, };
@@ -0,0 +1,185 @@
1
+ // @bun
2
+ // ../../src/core/logging/logger.ts
3
+ class Logger {
4
+ channel;
5
+ constructor(channel = "app") {
6
+ this.channel = channel;
7
+ }
8
+ write(level, message, context = {}) {
9
+ const entry = {
10
+ level,
11
+ channel: this.channel,
12
+ message,
13
+ timestamp: new Date().toISOString(),
14
+ ...context
15
+ };
16
+ const line = JSON.stringify(entry);
17
+ if (level === "error") {
18
+ console.error(line);
19
+ return;
20
+ }
21
+ console.log(line);
22
+ }
23
+ debug(message, context) {
24
+ this.write("debug", message, context);
25
+ }
26
+ info(message, context) {
27
+ this.write("info", message, context);
28
+ }
29
+ warn(message, context) {
30
+ this.write("warn", message, context);
31
+ }
32
+ error(message, context) {
33
+ this.write("error", message, context);
34
+ }
35
+ }
36
+ var appLogger = new Logger("app");
37
+
38
+ // ../../src/bootstrap/config.ts
39
+ var APP_PORT_CONFIG_KEY = "app.port";
40
+ var CACHE_TTL_MS_CONFIG_KEY = "cache.ttlMs";
41
+ var CACHE_MAX_ENTRIES_CONFIG_KEY = "cache.maxEntries";
42
+ var CACHE_DRIVER_CONFIG_KEY = "cache.driver";
43
+ var REDIS_URL_CONFIG_KEY = "cache.redisUrl";
44
+ var DATABASE_URL_CONFIG_KEY = "database.url";
45
+ var CORE_CONFIG_TOKEN = "core.config";
46
+ var CORE_CACHE_TOKEN = "core.cache";
47
+ var CORE_QUEUE_TOKEN = "core.queue";
48
+ var CORE_POLICY_GATE_TOKEN = "core.policyGate";
49
+ var CORE_AUTH_TOKEN = "core.auth";
50
+ var CORE_TOKEN_SERVICE_TOKEN = "core.tokenService";
51
+ var AUTH_DEV_HEADERS_CONFIG_KEY = "auth.allowDevHeaders";
52
+ var DEFAULT_APP_PORT = 3000;
53
+ var DEFAULT_CACHE_TTL_MS = 3600000;
54
+ var DEFAULT_CACHE_MAX_ENTRIES = 100;
55
+ var DEFAULT_CACHE_DRIVER = "array";
56
+ var DEFAULT_API_TOKEN = "";
57
+ var DEFAULT_QUEUE_DRIVER = "sync";
58
+
59
+ // ../../src/bootstrap/contracts.ts
60
+ class ServiceContainer {
61
+ services = new Map;
62
+ singletonFactories = new Map;
63
+ bindings = new Map;
64
+ set(key, value) {
65
+ this.singletonFactories.delete(key);
66
+ this.bindings.delete(key);
67
+ this.services.set(key, value);
68
+ return value;
69
+ }
70
+ singleton(key, factory) {
71
+ this.bindings.delete(key);
72
+ this.services.delete(key);
73
+ this.singletonFactories.set(key, factory);
74
+ }
75
+ bind(key, factory) {
76
+ this.singletonFactories.delete(key);
77
+ this.services.delete(key);
78
+ this.bindings.set(key, factory);
79
+ }
80
+ get(key) {
81
+ if (this.services.has(key)) {
82
+ return this.services.get(key);
83
+ }
84
+ const singletonFactory = this.singletonFactories.get(key);
85
+ if (singletonFactory) {
86
+ const value = singletonFactory(this);
87
+ this.services.set(key, value);
88
+ return value;
89
+ }
90
+ const binding = this.bindings.get(key);
91
+ if (binding) {
92
+ return binding(this);
93
+ }
94
+ throw new Error(`Service "${key}" is not registered.`);
95
+ }
96
+ resolve(key) {
97
+ return this.get(key);
98
+ }
99
+ has(key) {
100
+ return this.services.has(key) || this.singletonFactories.has(key) || this.bindings.has(key);
101
+ }
102
+ }
103
+
104
+ class ConfigStore {
105
+ values = new Map;
106
+ set(key, value) {
107
+ this.values.set(key, value);
108
+ return value;
109
+ }
110
+ get(key) {
111
+ return this.values.get(key);
112
+ }
113
+ require(key) {
114
+ if (!this.values.has(key)) {
115
+ throw new Error(`Config key "${key}" is not defined.`);
116
+ }
117
+ return this.values.get(key);
118
+ }
119
+ has(key) {
120
+ return this.values.has(key);
121
+ }
122
+ }
123
+ var requiredDependencyKeys = [
124
+ "container",
125
+ "cache",
126
+ "storage"
127
+ ];
128
+ function getRequiredDependency(dependencies, key) {
129
+ const dependency = dependencies[key];
130
+ if (dependency === undefined) {
131
+ throw new Error(`Required dependency "${key}" is not registered.`);
132
+ }
133
+ return dependency;
134
+ }
135
+ function assertAppDependenciesComplete(dependencies) {
136
+ for (const key of requiredDependencyKeys) {
137
+ getRequiredDependency(dependencies, key);
138
+ }
139
+ }
140
+ function resolveService(dependencies, token) {
141
+ return dependencies.container.resolve(token);
142
+ }
143
+
144
+ // ../../src/bootstrap/applicationRegistry.ts
145
+ var activeContext;
146
+ function setActiveApplicationContext(context) {
147
+ activeContext = context;
148
+ }
149
+ function requireActiveApplicationContext() {
150
+ if (!activeContext) {
151
+ throw new Error("The application context has not been bootstrapped.");
152
+ }
153
+ return activeContext;
154
+ }
155
+ function resolveApplicationCache() {
156
+ return getRequiredDependency(requireActiveApplicationContext().dependencies, "cache");
157
+ }
158
+ function resolveApplicationQueue() {
159
+ return requireActiveApplicationContext().container.resolve(CORE_QUEUE_TOKEN);
160
+ }
161
+ function resolveApplicationAuth() {
162
+ return requireActiveApplicationContext().container.resolve(CORE_AUTH_TOKEN);
163
+ }
164
+ function resolveApplicationPolicyGate() {
165
+ return requireActiveApplicationContext().container.resolve(CORE_POLICY_GATE_TOKEN);
166
+ }
167
+ function resolveApplicationConfig() {
168
+ return requireActiveApplicationContext().config;
169
+ }
170
+ function resolveApplicationLogger() {
171
+ return appLogger;
172
+ }
173
+ function resolveApplicationDependencies() {
174
+ return requireActiveApplicationContext().dependencies;
175
+ }
176
+ export {
177
+ setActiveApplicationContext,
178
+ resolveApplicationQueue,
179
+ resolveApplicationPolicyGate,
180
+ resolveApplicationLogger,
181
+ resolveApplicationDependencies,
182
+ resolveApplicationConfig,
183
+ resolveApplicationCache,
184
+ resolveApplicationAuth
185
+ };
@@ -0,0 +1,42 @@
1
+ // @bun
2
+ // ../../src/bootstrap/config.ts
3
+ var APP_PORT_CONFIG_KEY = "app.port";
4
+ var CACHE_TTL_MS_CONFIG_KEY = "cache.ttlMs";
5
+ var CACHE_MAX_ENTRIES_CONFIG_KEY = "cache.maxEntries";
6
+ var CACHE_DRIVER_CONFIG_KEY = "cache.driver";
7
+ var REDIS_URL_CONFIG_KEY = "cache.redisUrl";
8
+ var DATABASE_URL_CONFIG_KEY = "database.url";
9
+ var CORE_CONFIG_TOKEN = "core.config";
10
+ var CORE_CACHE_TOKEN = "core.cache";
11
+ var CORE_QUEUE_TOKEN = "core.queue";
12
+ var CORE_POLICY_GATE_TOKEN = "core.policyGate";
13
+ var CORE_AUTH_TOKEN = "core.auth";
14
+ var CORE_TOKEN_SERVICE_TOKEN = "core.tokenService";
15
+ var AUTH_DEV_HEADERS_CONFIG_KEY = "auth.allowDevHeaders";
16
+ var DEFAULT_APP_PORT = 3000;
17
+ var DEFAULT_CACHE_TTL_MS = 3600000;
18
+ var DEFAULT_CACHE_MAX_ENTRIES = 100;
19
+ var DEFAULT_CACHE_DRIVER = "array";
20
+ var DEFAULT_API_TOKEN = "";
21
+ var DEFAULT_QUEUE_DRIVER = "sync";
22
+ export {
23
+ REDIS_URL_CONFIG_KEY,
24
+ DEFAULT_QUEUE_DRIVER,
25
+ DEFAULT_CACHE_TTL_MS,
26
+ DEFAULT_CACHE_MAX_ENTRIES,
27
+ DEFAULT_CACHE_DRIVER,
28
+ DEFAULT_APP_PORT,
29
+ DEFAULT_API_TOKEN,
30
+ DATABASE_URL_CONFIG_KEY,
31
+ CORE_TOKEN_SERVICE_TOKEN,
32
+ CORE_QUEUE_TOKEN,
33
+ CORE_POLICY_GATE_TOKEN,
34
+ CORE_CONFIG_TOKEN,
35
+ CORE_CACHE_TOKEN,
36
+ CORE_AUTH_TOKEN,
37
+ CACHE_TTL_MS_CONFIG_KEY,
38
+ CACHE_MAX_ENTRIES_CONFIG_KEY,
39
+ CACHE_DRIVER_CONFIG_KEY,
40
+ AUTH_DEV_HEADERS_CONFIG_KEY,
41
+ APP_PORT_CONFIG_KEY
42
+ };