@empire-builder-kit/runtime 0.0.1-alpha.8 → 1.0.0-beta.4

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 (68) hide show
  1. package/LICENSE +201 -21
  2. package/NOTICE +5 -0
  3. package/README.md +14 -23
  4. package/package.json +53 -97
  5. package/src/auth-backend.d.ts +44 -0
  6. package/src/auth-backend.js +158 -0
  7. package/src/auth-backend.js.map +1 -0
  8. package/src/auth-session.d.ts +175 -0
  9. package/src/auth-session.js +181 -0
  10. package/src/auth-session.js.map +1 -0
  11. package/src/auth-web.d.ts +79 -0
  12. package/src/auth-web.js +153 -0
  13. package/src/auth-web.js.map +1 -0
  14. package/src/auth.d.ts +143 -0
  15. package/src/auth.js +233 -0
  16. package/src/auth.js.map +1 -0
  17. package/{dist → src}/config.d.ts +0 -1
  18. package/{dist → src}/config.js +9 -21
  19. package/src/config.js.map +1 -0
  20. package/src/events.d.ts +74 -0
  21. package/src/events.js +149 -0
  22. package/src/events.js.map +1 -0
  23. package/{dist → src}/frontend.d.ts +1 -2
  24. package/src/frontend.js +62 -0
  25. package/src/frontend.js.map +1 -0
  26. package/src/hosts.d.ts +9 -0
  27. package/src/hosts.js +38 -0
  28. package/src/hosts.js.map +1 -0
  29. package/src/index.d.ts +15 -0
  30. package/src/index.js +30 -0
  31. package/src/index.js.map +1 -0
  32. package/src/lambda.d.ts +45 -0
  33. package/src/lambda.js +117 -0
  34. package/src/lambda.js.map +1 -0
  35. package/{dist → src}/logging.d.ts +0 -1
  36. package/src/logging.js +113 -0
  37. package/src/logging.js.map +1 -0
  38. package/{dist → src}/observability.d.ts +18 -1
  39. package/{dist → src}/observability.js +72 -62
  40. package/src/observability.js.map +1 -0
  41. package/{dist → src}/request-context.d.ts +12 -2
  42. package/src/request-context.js +68 -0
  43. package/src/request-context.js.map +1 -0
  44. package/{dist → src}/response.d.ts +0 -1
  45. package/src/response.js +66 -0
  46. package/src/response.js.map +1 -0
  47. package/dist/auth-backend.d.ts +0 -18
  48. package/dist/auth-backend.d.ts.map +0 -1
  49. package/dist/auth-backend.js +0 -57
  50. package/dist/auth-web.d.ts +0 -18
  51. package/dist/auth-web.d.ts.map +0 -1
  52. package/dist/auth-web.js +0 -32
  53. package/dist/auth.d.ts +0 -68
  54. package/dist/auth.d.ts.map +0 -1
  55. package/dist/auth.js +0 -107
  56. package/dist/config.d.ts.map +0 -1
  57. package/dist/frontend.d.ts.map +0 -1
  58. package/dist/frontend.js +0 -64
  59. package/dist/index.d.ts +0 -12
  60. package/dist/index.d.ts.map +0 -1
  61. package/dist/index.js +0 -23
  62. package/dist/logging.d.ts.map +0 -1
  63. package/dist/logging.js +0 -129
  64. package/dist/observability.d.ts.map +0 -1
  65. package/dist/request-context.d.ts.map +0 -1
  66. package/dist/request-context.js +0 -58
  67. package/dist/response.d.ts.map +0 -1
  68. package/dist/response.js +0 -66
@@ -0,0 +1,74 @@
1
+ import type { RequestActor, RequestContext } from './request-context.js';
2
+ export interface EventContractRef {
3
+ readonly source: string;
4
+ readonly detailType: string;
5
+ readonly schemaVersion: number;
6
+ }
7
+ export interface EventEnvelopeMeta {
8
+ eventId: string;
9
+ schemaVersion: number;
10
+ occurredAt: string;
11
+ app: string;
12
+ stage: string;
13
+ correlationId: string;
14
+ causationId?: string;
15
+ actor?: RequestActor;
16
+ tenantId?: string;
17
+ traceParent?: string;
18
+ traceState?: string;
19
+ }
20
+ export interface EventEnvelope<TData = unknown> {
21
+ meta: EventEnvelopeMeta;
22
+ data: TData;
23
+ }
24
+ export interface PublishableEventEntry {
25
+ eventBusName: string;
26
+ source: string;
27
+ detailType: string;
28
+ detail: string;
29
+ }
30
+ export interface BuildEventEntryOptions {
31
+ busName: string;
32
+ stage: string;
33
+ context?: Pick<RequestContext, 'actor' | 'correlationId' | 'requestId' | 'tenantId' | 'traceParent' | 'traceState'>;
34
+ actor?: RequestActor;
35
+ eventId?: string;
36
+ occurredAt?: string;
37
+ }
38
+ export interface BuiltEventEntry<TData = unknown> {
39
+ entry: PublishableEventEntry;
40
+ envelope: EventEnvelope<TData>;
41
+ }
42
+ export declare function buildEventEntry<TData>(contract: EventContractRef, data: TData, options: BuildEventEntryOptions): BuiltEventEntry<TData>;
43
+ export interface EventPublisherOptions {
44
+ busName: string;
45
+ stage: string;
46
+ send: (entry: PublishableEventEntry) => Promise<unknown>;
47
+ }
48
+ export interface PublishEventOptions {
49
+ context?: Pick<RequestContext, 'actor' | 'correlationId' | 'requestId' | 'tenantId' | 'traceParent' | 'traceState'>;
50
+ actor?: RequestActor;
51
+ }
52
+ export type EventPublisher = <TData>(contract: EventContractRef, data: TData, options?: PublishEventOptions) => Promise<EventEnvelope<TData>>;
53
+ export declare function createEventPublisher(options: EventPublisherOptions): EventPublisher;
54
+ export declare function parseEventEnvelope<TData = unknown>(detail: unknown): EventEnvelope<TData>;
55
+ export interface SqsRecordLike {
56
+ messageId?: string;
57
+ body: string;
58
+ }
59
+ export interface ParsedEventRecord<TData = unknown> {
60
+ messageId?: string;
61
+ source: string;
62
+ detailType: string;
63
+ envelope: EventEnvelope<TData>;
64
+ }
65
+ export interface FailedEventRecord {
66
+ messageId?: string;
67
+ error: string;
68
+ }
69
+ export interface ParsedEventBatch<TData = unknown> {
70
+ events: ParsedEventRecord<TData>[];
71
+ failures: FailedEventRecord[];
72
+ }
73
+ export declare function parseSqsEventBridgeRecords<TData = unknown>(records: readonly SqsRecordLike[]): ParsedEventBatch<TData>;
74
+ export declare function toEventLogMetadata(meta: EventEnvelopeMeta): Record<string, string | number>;
package/src/events.js ADDED
@@ -0,0 +1,149 @@
1
+ import { __awaiter } from "tslib";
2
+ import { randomUUID } from 'node:crypto';
3
+ // EventBridge caps a PutEvents entry at 256 KB. We guard below the hard limit
4
+ // so envelope overhead never turns a passing payload into a runtime failure.
5
+ const MAX_EVENT_ENTRY_BYTES = 256 * 1024;
6
+ function assertContract(contract) {
7
+ var _a, _b;
8
+ if (!((_a = contract.source) === null || _a === void 0 ? void 0 : _a.trim())) {
9
+ throw new Error('[runtime/events] Event contract is missing a non-empty `source` (the publishing app group).');
10
+ }
11
+ if (!((_b = contract.detailType) === null || _b === void 0 ? void 0 : _b.trim())) {
12
+ throw new Error('[runtime/events] Event contract is missing a non-empty `detailType`.');
13
+ }
14
+ if (!Number.isInteger(contract.schemaVersion) || contract.schemaVersion < 1) {
15
+ throw new Error('[runtime/events] Event contract `schemaVersion` must be a positive integer.');
16
+ }
17
+ }
18
+ // Builds a validated envelope + PutEvents entry for the shared core bus.
19
+ // Pure — no AWS calls — so publishers and tests share the exact same path.
20
+ export function buildEventEntry(contract, data, options) {
21
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
22
+ assertContract(contract);
23
+ if (!((_a = options.stage) === null || _a === void 0 ? void 0 : _a.trim())) {
24
+ throw new Error('[runtime/events] `stage` is required — consumers filter on meta.stage to isolate shared-bus traffic.');
25
+ }
26
+ const eventId = (_b = options.eventId) !== null && _b !== void 0 ? _b : randomUUID();
27
+ const envelope = {
28
+ meta: Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ eventId, schemaVersion: contract.schemaVersion, occurredAt: (_c = options.occurredAt) !== null && _c !== void 0 ? _c : new Date().toISOString(), app: contract.source, stage: options.stage, correlationId: (_e = (_d = options.context) === null || _d === void 0 ? void 0 : _d.correlationId) !== null && _e !== void 0 ? _e : eventId }, (((_f = options.context) === null || _f === void 0 ? void 0 : _f.requestId)
29
+ ? { causationId: options.context.requestId }
30
+ : {})), { actor: (_g = options.actor) !== null && _g !== void 0 ? _g : (_h = options.context) === null || _h === void 0 ? void 0 : _h.actor }), (((_j = options.context) === null || _j === void 0 ? void 0 : _j.tenantId)
31
+ ? { tenantId: options.context.tenantId }
32
+ : {})), (((_k = options.context) === null || _k === void 0 ? void 0 : _k.traceParent)
33
+ ? { traceParent: options.context.traceParent }
34
+ : {})), (((_l = options.context) === null || _l === void 0 ? void 0 : _l.traceState)
35
+ ? { traceState: options.context.traceState }
36
+ : {})),
37
+ data,
38
+ };
39
+ const detail = JSON.stringify(envelope);
40
+ const bytes = Buffer.byteLength(detail, 'utf8');
41
+ if (bytes > MAX_EVENT_ENTRY_BYTES) {
42
+ throw new Error(`[runtime/events] Event ${contract.source}/${contract.detailType} detail is ${bytes} bytes, ` +
43
+ `over the ${MAX_EVENT_ENTRY_BYTES}-byte EventBridge entry limit. ` +
44
+ 'Store the payload (e.g. S3) and publish a claim-check reference instead.');
45
+ }
46
+ return {
47
+ entry: {
48
+ eventBusName: options.busName,
49
+ source: contract.source,
50
+ detailType: contract.detailType,
51
+ detail,
52
+ },
53
+ envelope,
54
+ };
55
+ }
56
+ export function createEventPublisher(options) {
57
+ var _a, _b;
58
+ if (!((_a = options.busName) === null || _a === void 0 ? void 0 : _a.trim())) {
59
+ throw new Error('[runtime/events] `busName` is required.');
60
+ }
61
+ if (!((_b = options.stage) === null || _b === void 0 ? void 0 : _b.trim())) {
62
+ throw new Error('[runtime/events] `stage` is required.');
63
+ }
64
+ return (contract_1, data_1, ...args_1) => __awaiter(this, [contract_1, data_1, ...args_1], void 0, function* (contract, data, publishOptions = {}) {
65
+ const { entry, envelope } = buildEventEntry(contract, data, {
66
+ busName: options.busName,
67
+ stage: options.stage,
68
+ context: publishOptions.context,
69
+ actor: publishOptions.actor,
70
+ });
71
+ yield options.send(entry);
72
+ return envelope;
73
+ });
74
+ }
75
+ // --- Consumer-side parsing -------------------------------------------------
76
+ export function parseEventEnvelope(detail) {
77
+ var _a;
78
+ if (!detail || typeof detail !== 'object') {
79
+ throw new Error('[runtime/events] Event detail is not an object envelope.');
80
+ }
81
+ const candidate = detail;
82
+ if (!candidate.meta || typeof candidate.meta !== 'object') {
83
+ throw new Error('[runtime/events] Event detail is missing the `meta` envelope block.');
84
+ }
85
+ const meta = candidate.meta;
86
+ for (const field of [
87
+ 'eventId',
88
+ 'occurredAt',
89
+ 'app',
90
+ 'stage',
91
+ 'correlationId',
92
+ ]) {
93
+ if (typeof meta[field] !== 'string' || !meta[field]) {
94
+ throw new Error(`[runtime/events] Event envelope meta.${field} is missing or not a string.`);
95
+ }
96
+ }
97
+ if (!Number.isInteger(meta.schemaVersion) || ((_a = meta.schemaVersion) !== null && _a !== void 0 ? _a : 0) < 1) {
98
+ throw new Error('[runtime/events] Event envelope meta.schemaVersion is missing or not a positive integer.');
99
+ }
100
+ for (const field of [
101
+ 'causationId',
102
+ 'tenantId',
103
+ 'traceParent',
104
+ 'traceState',
105
+ ]) {
106
+ if (meta[field] !== undefined && typeof meta[field] !== 'string') {
107
+ throw new Error(`[runtime/events] Event envelope meta.${field} must be a string when present.`);
108
+ }
109
+ }
110
+ return {
111
+ meta: meta,
112
+ data: candidate.data,
113
+ };
114
+ }
115
+ // Consumers receive EventBridge events wrapped in SQS bodies (the buffer
116
+ // queue between the bus rule and the handler). Each body is the EventBridge
117
+ // event JSON: { id, source, "detail-type", detail, ... }.
118
+ export function parseSqsEventBridgeRecords(records) {
119
+ const events = [];
120
+ const failures = [];
121
+ for (const record of records) {
122
+ try {
123
+ const raw = JSON.parse(record.body);
124
+ if (typeof raw.source !== 'string' || !raw.source) {
125
+ throw new Error('EventBridge record is missing `source`.');
126
+ }
127
+ if (typeof raw['detail-type'] !== 'string' || !raw['detail-type']) {
128
+ throw new Error('EventBridge record is missing `detail-type`.');
129
+ }
130
+ events.push({
131
+ messageId: record.messageId,
132
+ source: raw.source,
133
+ detailType: raw['detail-type'],
134
+ envelope: parseEventEnvelope(raw.detail),
135
+ });
136
+ }
137
+ catch (err) {
138
+ failures.push({
139
+ messageId: record.messageId,
140
+ error: err instanceof Error ? err.message : String(err),
141
+ });
142
+ }
143
+ }
144
+ return { events, failures };
145
+ }
146
+ export function toEventLogMetadata(meta) {
147
+ return Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({ app: meta.app }, (meta.causationId ? { causationId: meta.causationId } : {})), { correlationId: meta.correlationId, eventId: meta.eventId, occurredAt: meta.occurredAt, schemaVersion: meta.schemaVersion, stage: meta.stage }), (meta.tenantId ? { tenantId: meta.tenantId } : {})), (meta.traceParent ? { traceParent: meta.traceParent } : {})), (meta.traceState ? { traceState: meta.traceState } : {}));
148
+ }
149
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../../packages/runtime/src/events.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { AuthSessionStatus } from './auth';
1
+ import type { AuthSessionStatus } from './auth.js';
2
2
  export type FrontendRuntime = 'web' | 'mobile';
3
3
  export type FrontendDeploymentMode = 'opennext' | 'container' | 'static-export' | 'expo';
4
4
  export type FrontendSessionTransport = 'cookie' | 'bearer' | 'none';
@@ -39,4 +39,3 @@ export declare const frontendContract: {
39
39
  readonly packageName: "@empire-builder-kit/runtime";
40
40
  };
41
41
  export declare function createFrontendClientContract(input: FrontendClientContractInput): FrontendClientContract;
42
- //# sourceMappingURL=frontend.d.ts.map
@@ -0,0 +1,62 @@
1
+ export const frontendContract = {
2
+ exportPath: '@empire-builder-kit/runtime/frontend',
3
+ packageName: '@empire-builder-kit/runtime',
4
+ };
5
+ function trimOrFallback(value, fallback) {
6
+ const normalized = value === null || value === void 0 ? void 0 : value.trim();
7
+ return normalized && normalized.length > 0 ? normalized : fallback;
8
+ }
9
+ function defaultsForRuntime(runtime) {
10
+ if (runtime === 'mobile') {
11
+ return {
12
+ auth: {
13
+ initialStatus: 'anonymous',
14
+ storage: 'secure-store',
15
+ transport: 'bearer',
16
+ },
17
+ deployment: {
18
+ mode: 'expo',
19
+ publicBaseUrlEnvVar: 'EXPO_PUBLIC_API_BASE_URL',
20
+ stageEnvVar: 'EXPO_PUBLIC_STAGE',
21
+ },
22
+ };
23
+ }
24
+ return {
25
+ auth: {
26
+ initialStatus: 'anonymous',
27
+ storage: 'server',
28
+ transport: 'cookie',
29
+ },
30
+ deployment: {
31
+ mode: 'opennext',
32
+ publicBaseUrlEnvVar: 'NEXT_PUBLIC_APP_URL',
33
+ stageEnvVar: 'NEXT_PUBLIC_STAGE',
34
+ },
35
+ };
36
+ }
37
+ export function createFrontendClientContract(input) {
38
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
39
+ const runtimeDefaults = defaultsForRuntime(input.runtime);
40
+ const app = trimOrFallback(input.app, 'app');
41
+ return {
42
+ api: {
43
+ sameScopeImportPrefix: trimOrFallback((_a = input.api) === null || _a === void 0 ? void 0 : _a.sameScopeImportPrefix, `@${app}/`),
44
+ sdkPackage: trimOrFallback((_b = input.api) === null || _b === void 0 ? void 0 : _b.sdkPackage, `@${app}/sdk/client`),
45
+ },
46
+ app,
47
+ auth: {
48
+ exportPath: '@empire-builder-kit/runtime/auth',
49
+ initialStatus: (_d = (_c = input.auth) === null || _c === void 0 ? void 0 : _c.initialStatus) !== null && _d !== void 0 ? _d : runtimeDefaults.auth.initialStatus,
50
+ storage: (_f = (_e = input.auth) === null || _e === void 0 ? void 0 : _e.storage) !== null && _f !== void 0 ? _f : runtimeDefaults.auth.storage,
51
+ transport: (_h = (_g = input.auth) === null || _g === void 0 ? void 0 : _g.transport) !== null && _h !== void 0 ? _h : runtimeDefaults.auth.transport,
52
+ },
53
+ client: trimOrFallback(input.client, `${app}-${input.runtime}`),
54
+ deployment: {
55
+ mode: (_k = (_j = input.deployment) === null || _j === void 0 ? void 0 : _j.mode) !== null && _k !== void 0 ? _k : runtimeDefaults.deployment.mode,
56
+ publicBaseUrlEnvVar: trimOrFallback((_l = input.deployment) === null || _l === void 0 ? void 0 : _l.publicBaseUrlEnvVar, runtimeDefaults.deployment.publicBaseUrlEnvVar),
57
+ stageEnvVar: trimOrFallback((_m = input.deployment) === null || _m === void 0 ? void 0 : _m.stageEnvVar, runtimeDefaults.deployment.stageEnvVar),
58
+ },
59
+ runtime: input.runtime,
60
+ };
61
+ }
62
+ //# sourceMappingURL=frontend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontend.js","sourceRoot":"","sources":["../../../../packages/runtime/src/frontend.ts"],"names":[],"mappings":"AA+CA,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,UAAU,EAAE,sCAAsC;IAClD,WAAW,EAAE,6BAA6B;CAClC,CAAC;AAEX,SAAS,cAAc,CAAC,KAAyB,EAAE,QAAgB;IACjE,MAAM,UAAU,GAAG,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,IAAI,EAAE,CAAC;IAEjC,OAAO,UAAU,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;AACrE,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAwB;IAClD,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO;YACL,IAAI,EAAE;gBACJ,aAAa,EAAE,WAAoB;gBACnC,OAAO,EAAE,cAAuB;gBAChC,SAAS,EAAE,QAAiB;aAC7B;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,MAAe;gBACrB,mBAAmB,EAAE,0BAA0B;gBAC/C,WAAW,EAAE,mBAAmB;aACjC;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE;YACJ,aAAa,EAAE,WAAoB;YACnC,OAAO,EAAE,QAAiB;YAC1B,SAAS,EAAE,QAAiB;SAC7B;QACD,UAAU,EAAE;YACV,IAAI,EAAE,UAAmB;YACzB,mBAAmB,EAAE,qBAAqB;YAC1C,WAAW,EAAE,mBAAmB;SACjC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,KAAkC;;IAElC,MAAM,eAAe,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAE7C,OAAO;QACL,GAAG,EAAE;YACH,qBAAqB,EAAE,cAAc,CACnC,MAAA,KAAK,CAAC,GAAG,0CAAE,qBAAqB,EAChC,IAAI,GAAG,GAAG,CACX;YACD,UAAU,EAAE,cAAc,CAAC,MAAA,KAAK,CAAC,GAAG,0CAAE,UAAU,EAAE,IAAI,GAAG,aAAa,CAAC;SACxE;QACD,GAAG;QACH,IAAI,EAAE;YACJ,UAAU,EAAE,kCAAkC;YAC9C,aAAa,EACX,MAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,aAAa,mCAAI,eAAe,CAAC,IAAI,CAAC,aAAa;YACjE,OAAO,EAAE,MAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,mCAAI,eAAe,CAAC,IAAI,CAAC,OAAO;YAC5D,SAAS,EAAE,MAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,SAAS,mCAAI,eAAe,CAAC,IAAI,CAAC,SAAS;SACnE;QACD,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC/D,UAAU,EAAE;YACV,IAAI,EAAE,MAAA,MAAA,KAAK,CAAC,UAAU,0CAAE,IAAI,mCAAI,eAAe,CAAC,UAAU,CAAC,IAAI;YAC/D,mBAAmB,EAAE,cAAc,CACjC,MAAA,KAAK,CAAC,UAAU,0CAAE,mBAAmB,EACrC,eAAe,CAAC,UAAU,CAAC,mBAAmB,CAC/C;YACD,WAAW,EAAE,cAAc,CACzB,MAAA,KAAK,CAAC,UAAU,0CAAE,WAAW,EAC7B,eAAe,CAAC,UAAU,CAAC,WAAW,CACvC;SACF;QACD,OAAO,EAAE,KAAK,CAAC,OAAO;KACvB,CAAC;AACJ,CAAC"}
package/src/hosts.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ export interface CreateStageHostnameOptions {
2
+ readonly app: string;
3
+ readonly defaultStage?: string;
4
+ readonly rootDomain: string;
5
+ readonly stage: string;
6
+ }
7
+ export declare function normalizeDnsLabel(value: string, fieldName: string): string;
8
+ export declare function normalizeRootDomain(rootDomain: string): string;
9
+ export declare function createStageHostname({ app, defaultStage, rootDomain, stage, }: CreateStageHostnameOptions): string;
package/src/hosts.js ADDED
@@ -0,0 +1,38 @@
1
+ export function normalizeDnsLabel(value, fieldName) {
2
+ const label = value
3
+ .trim()
4
+ .toLowerCase()
5
+ .replace(/[^a-z0-9-]+/g, '-')
6
+ .replace(/-+/g, '-')
7
+ .replace(/^-|-$/g, '');
8
+ if (!label) {
9
+ throw new Error(`${fieldName} must contain at least one DNS-safe character`);
10
+ }
11
+ if (label.length > 63) {
12
+ throw new Error(`${fieldName} DNS label must be 63 characters or fewer`);
13
+ }
14
+ return label;
15
+ }
16
+ export function normalizeRootDomain(rootDomain) {
17
+ const normalized = rootDomain.trim().toLowerCase().replace(/\.$/, '');
18
+ if (!normalized) {
19
+ throw new Error('rootDomain is required');
20
+ }
21
+ if (normalized
22
+ .split('.')
23
+ .some((label) => normalizeDnsLabel(label, 'rootDomain label') !== label)) {
24
+ throw new Error(`rootDomain must be a valid DNS name: ${rootDomain}`);
25
+ }
26
+ return normalized;
27
+ }
28
+ export function createStageHostname({ app, defaultStage, rootDomain, stage, }) {
29
+ const appLabel = normalizeDnsLabel(app, 'app');
30
+ const stageLabel = normalizeDnsLabel(stage, 'stage');
31
+ const defaultStageLabel = normalizeDnsLabel(defaultStage !== null && defaultStage !== void 0 ? defaultStage : 'production', 'defaultStage');
32
+ const publicLabel = stageLabel === defaultStageLabel ? appLabel : `${appLabel}-${stageLabel}`;
33
+ if (publicLabel.length > 63) {
34
+ throw new Error('combined app and stage DNS label must be 63 characters or fewer');
35
+ }
36
+ return `${publicLabel}.${normalizeRootDomain(rootDomain)}`;
37
+ }
38
+ //# sourceMappingURL=hosts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosts.js","sourceRoot":"","sources":["../../../../packages/runtime/src/hosts.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,SAAiB;IAChE,MAAM,KAAK,GAAG,KAAK;SAChB,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC;SACnB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAEzB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,GAAG,SAAS,+CAA+C,CAC5D,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,2CAA2C,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,UAAkB;IACpD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEtE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,IACE,UAAU;SACP,KAAK,CAAC,GAAG,CAAC;SACV,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,KAAK,CAAC,EAC1E,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,wCAAwC,UAAU,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,EAClC,GAAG,EACH,YAAY,EACZ,UAAU,EACV,KAAK,GACsB;IAC3B,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACrD,MAAM,iBAAiB,GAAG,iBAAiB,CACzC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,YAAY,EAC5B,cAAc,CACf,CAAC;IACF,MAAM,WAAW,GACf,UAAU,KAAK,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC;IAE5E,IAAI,WAAW,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,WAAW,IAAI,mBAAmB,CAAC,UAAU,CAAC,EAAE,CAAC;AAC7D,CAAC"}
package/src/index.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ export * from './auth.js';
2
+ export * from './auth-session.js';
3
+ export * from './config.js';
4
+ export * from './events.js';
5
+ export * from './frontend.js';
6
+ export * from './hosts.js';
7
+ export * from './logging.js';
8
+ export * from './lambda.js';
9
+ export * from './observability.js';
10
+ export * from './request-context.js';
11
+ export * from './response.js';
12
+ export declare const runtimePackage: {
13
+ readonly exports: readonly ["@empire-builder-kit/runtime/auth", "@empire-builder-kit/runtime/auth-backend", "@empire-builder-kit/runtime/auth-web", "@empire-builder-kit/runtime/auth-session", "@empire-builder-kit/runtime/config", "@empire-builder-kit/runtime/events", "@empire-builder-kit/runtime/frontend", "@empire-builder-kit/runtime/hosts", "@empire-builder-kit/runtime/request-context", "@empire-builder-kit/runtime/logging", "@empire-builder-kit/runtime/lambda", "@empire-builder-kit/runtime/observability", "@empire-builder-kit/runtime/response"];
14
+ readonly name: "@empire-builder-kit/runtime";
15
+ };
package/src/index.js ADDED
@@ -0,0 +1,30 @@
1
+ export * from './auth.js';
2
+ export * from './auth-session.js';
3
+ export * from './config.js';
4
+ export * from './events.js';
5
+ export * from './frontend.js';
6
+ export * from './hosts.js';
7
+ export * from './logging.js';
8
+ export * from './lambda.js';
9
+ export * from './observability.js';
10
+ export * from './request-context.js';
11
+ export * from './response.js';
12
+ export const runtimePackage = {
13
+ exports: [
14
+ '@empire-builder-kit/runtime/auth',
15
+ '@empire-builder-kit/runtime/auth-backend',
16
+ '@empire-builder-kit/runtime/auth-web',
17
+ '@empire-builder-kit/runtime/auth-session',
18
+ '@empire-builder-kit/runtime/config',
19
+ '@empire-builder-kit/runtime/events',
20
+ '@empire-builder-kit/runtime/frontend',
21
+ '@empire-builder-kit/runtime/hosts',
22
+ '@empire-builder-kit/runtime/request-context',
23
+ '@empire-builder-kit/runtime/logging',
24
+ '@empire-builder-kit/runtime/lambda',
25
+ '@empire-builder-kit/runtime/observability',
26
+ '@empire-builder-kit/runtime/response',
27
+ ],
28
+ name: '@empire-builder-kit/runtime',
29
+ };
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../packages/runtime/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,eAAe,CAAC;AAE9B,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE;QACP,kCAAkC;QAClC,0CAA0C;QAC1C,sCAAsC;QACtC,0CAA0C;QAC1C,oCAAoC;QACpC,oCAAoC;QACpC,sCAAsC;QACtC,mCAAmC;QACnC,6CAA6C;QAC7C,qCAAqC;QACrC,oCAAoC;QACpC,2CAA2C;QAC3C,sCAAsC;KACvC;IACD,IAAI,EAAE,6BAA6B;CAC3B,CAAC"}
@@ -0,0 +1,45 @@
1
+ import { type Logger } from './logging.js';
2
+ import { type RequestContext } from './request-context.js';
3
+ import { type AppResponse } from './response.js';
4
+ export interface RuntimeHttpEvent {
5
+ body?: string | null;
6
+ headers?: Record<string, string | undefined> | null;
7
+ rawPath?: string;
8
+ requestContext?: {
9
+ http?: {
10
+ method?: string;
11
+ path?: string;
12
+ sourceIp?: string;
13
+ userAgent?: string;
14
+ };
15
+ requestId?: string;
16
+ };
17
+ }
18
+ export interface RuntimeHttpJsonResponse {
19
+ body: string;
20
+ headers: Record<string, string>;
21
+ statusCode: number;
22
+ }
23
+ export interface RuntimeHttpHandlerInput<E extends RuntimeHttpEvent = RuntimeHttpEvent> {
24
+ context: RequestContext;
25
+ event: E;
26
+ logger: Logger;
27
+ }
28
+ export interface CreateHttpJsonHandlerOptions<T, E extends RuntimeHttpEvent = RuntimeHttpEvent> {
29
+ app: string;
30
+ handle(input: RuntimeHttpHandlerInput<E>): Promise<T> | T;
31
+ includeErrorDetails?: boolean;
32
+ logger?: Logger;
33
+ operation: string;
34
+ service?: string;
35
+ stage?: string;
36
+ successStatus?: number;
37
+ }
38
+ export type RuntimeHttpJsonHandler<E extends RuntimeHttpEvent = RuntimeHttpEvent> = (event: E) => Promise<RuntimeHttpJsonResponse>;
39
+ export declare const lambdaContract: {
40
+ readonly defaultResponseFormat: "json";
41
+ readonly exportPath: "@empire-builder-kit/runtime/lambda";
42
+ readonly packageName: "@empire-builder-kit/runtime";
43
+ };
44
+ export declare function toHttpJsonResponse<T>(response: AppResponse<T>): RuntimeHttpJsonResponse;
45
+ export declare function createHttpJsonHandler<T, E extends RuntimeHttpEvent = RuntimeHttpEvent>(options: CreateHttpJsonHandlerOptions<T, E>): RuntimeHttpJsonHandler<E>;
package/src/lambda.js ADDED
@@ -0,0 +1,117 @@
1
+ import { __awaiter } from "tslib";
2
+ import { createLogger } from './logging.js';
3
+ import { createRequestContext, toRequestHeaders, } from './request-context.js';
4
+ import { createErrorResponse, createSuccessResponse, } from './response.js';
5
+ export const lambdaContract = {
6
+ defaultResponseFormat: 'json',
7
+ exportPath: '@empire-builder-kit/runtime/lambda',
8
+ packageName: '@empire-builder-kit/runtime',
9
+ };
10
+ function getHeader(headers, name) {
11
+ if (!headers) {
12
+ return undefined;
13
+ }
14
+ const lowerName = name.toLowerCase();
15
+ const entry = Object.entries(headers).find(([key]) => key.toLowerCase() === lowerName);
16
+ return entry === null || entry === void 0 ? void 0 : entry[1];
17
+ }
18
+ function resolveStage(stage) {
19
+ const resolved = stage !== null && stage !== void 0 ? stage : process.env['EBK_STAGE'];
20
+ if (resolved === undefined || resolved.trim() === '') {
21
+ throw new Error('EBK runtime stage is required. Pass options.stage or set EBK_STAGE.');
22
+ }
23
+ return resolved.trim();
24
+ }
25
+ function createResponseMeta(context) {
26
+ return {
27
+ correlationId: context.correlationId,
28
+ requestId: context.requestId,
29
+ stage: context.stage,
30
+ };
31
+ }
32
+ export function toHttpJsonResponse(response) {
33
+ var _a, _b;
34
+ return {
35
+ body: JSON.stringify(response),
36
+ headers: Object.assign(Object.assign({ 'content-type': 'application/json' }, (((_a = response.meta) === null || _a === void 0 ? void 0 : _a.correlationId)
37
+ ? { 'x-correlation-id': String(response.meta.correlationId) }
38
+ : {})), (((_b = response.meta) === null || _b === void 0 ? void 0 : _b.requestId)
39
+ ? { 'x-request-id': String(response.meta.requestId) }
40
+ : {})),
41
+ statusCode: response.status,
42
+ };
43
+ }
44
+ export function createHttpJsonHandler(options) {
45
+ var _a, _b;
46
+ const stage = resolveStage(options.stage);
47
+ const baseLogger = (_a = options.logger) !== null && _a !== void 0 ? _a : createLogger({
48
+ app: options.app,
49
+ service: (_b = options.service) !== null && _b !== void 0 ? _b : options.operation,
50
+ stage,
51
+ });
52
+ return (event) => __awaiter(this, void 0, void 0, function* () {
53
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t;
54
+ const requestId = (_a = getHeader(event.headers, 'x-request-id')) !== null && _a !== void 0 ? _a : (_b = event.requestContext) === null || _b === void 0 ? void 0 : _b.requestId;
55
+ const context = createRequestContext({
56
+ app: options.app,
57
+ causationId: getHeader(event.headers, 'x-causation-id'),
58
+ correlationId: (_c = getHeader(event.headers, 'x-correlation-id')) !== null && _c !== void 0 ? _c : requestId,
59
+ metadata: {
60
+ method: (_e = (_d = event.requestContext) === null || _d === void 0 ? void 0 : _d.http) === null || _e === void 0 ? void 0 : _e.method,
61
+ path: (_f = event.rawPath) !== null && _f !== void 0 ? _f : (_h = (_g = event.requestContext) === null || _g === void 0 ? void 0 : _g.http) === null || _h === void 0 ? void 0 : _h.path,
62
+ sourceIp: (_k = (_j = event.requestContext) === null || _j === void 0 ? void 0 : _j.http) === null || _k === void 0 ? void 0 : _k.sourceIp,
63
+ userAgent: (_m = (_l = event.requestContext) === null || _l === void 0 ? void 0 : _l.http) === null || _m === void 0 ? void 0 : _m.userAgent,
64
+ },
65
+ operation: options.operation,
66
+ requestId,
67
+ stage,
68
+ tenantId: getHeader(event.headers, 'x-tenant-id'),
69
+ traceParent: getHeader(event.headers, 'traceparent'),
70
+ traceState: getHeader(event.headers, 'tracestate'),
71
+ });
72
+ const requestLogger = baseLogger.child({
73
+ context,
74
+ service: (_o = options.service) !== null && _o !== void 0 ? _o : options.operation,
75
+ stage,
76
+ });
77
+ requestLogger.info(`${options.app}.${options.operation} request received`, {
78
+ metadata: {
79
+ method: (_q = (_p = event.requestContext) === null || _p === void 0 ? void 0 : _p.http) === null || _q === void 0 ? void 0 : _q.method,
80
+ path: (_r = event.rawPath) !== null && _r !== void 0 ? _r : (_t = (_s = event.requestContext) === null || _s === void 0 ? void 0 : _s.http) === null || _t === void 0 ? void 0 : _t.path,
81
+ },
82
+ });
83
+ try {
84
+ const data = yield options.handle({
85
+ context,
86
+ event,
87
+ logger: requestLogger,
88
+ });
89
+ const response = createSuccessResponse(data, {
90
+ meta: createResponseMeta(context),
91
+ status: options.successStatus,
92
+ });
93
+ requestLogger.info(`${options.app}.${options.operation} request completed`, {
94
+ metadata: {
95
+ status: response.status,
96
+ },
97
+ });
98
+ const httpResponse = toHttpJsonResponse(response);
99
+ return Object.assign(Object.assign({}, httpResponse), { headers: Object.assign(Object.assign({}, httpResponse.headers), toRequestHeaders(context)) });
100
+ }
101
+ catch (error) {
102
+ const response = createErrorResponse(error, {
103
+ includeDetails: options.includeErrorDetails,
104
+ meta: createResponseMeta(context),
105
+ });
106
+ requestLogger.error(`${options.app}.${options.operation} request failed`, {
107
+ error,
108
+ metadata: {
109
+ status: response.status,
110
+ },
111
+ });
112
+ const httpResponse = toHttpJsonResponse(response);
113
+ return Object.assign(Object.assign({}, httpResponse), { headers: Object.assign(Object.assign({}, httpResponse.headers), toRequestHeaders(context)) });
114
+ }
115
+ });
116
+ }
117
+ //# sourceMappingURL=lambda.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lambda.js","sourceRoot":"","sources":["../../../../packages/runtime/src/lambda.ts"],"names":[],"mappings":"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"}
@@ -67,4 +67,3 @@ export declare const loggingContract: {
67
67
  export declare function serializeError(error: unknown): SerializedError;
68
68
  export declare function consoleSink(entry: LogEntry): void;
69
69
  export declare function createLogger(options: CreateLoggerOptions): Logger;
70
- //# sourceMappingURL=logging.d.ts.map