@celerity-sdk/common 0.3.1 → 0.4.0
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/dist/index.cjs +52 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -1
- package/dist/index.d.ts +25 -1
- package/dist/index.js +44 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -21,8 +21,15 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
// src/index.ts
|
|
22
22
|
var index_exports = {};
|
|
23
23
|
__export(index_exports, {
|
|
24
|
+
CONFIG_SERVICE_TOKEN: () => CONFIG_SERVICE_TOKEN,
|
|
25
|
+
INJECT_METADATA: () => INJECT_METADATA,
|
|
26
|
+
LOGGER_TOKEN: () => LOGGER_TOKEN,
|
|
27
|
+
TRACER_TOKEN: () => TRACER_TOKEN,
|
|
28
|
+
USE_RESOURCE_METADATA: () => USE_RESOURCE_METADATA,
|
|
24
29
|
extractUserId: () => extractUserId,
|
|
25
|
-
joinHandlerPath: () => joinHandlerPath
|
|
30
|
+
joinHandlerPath: () => joinHandlerPath,
|
|
31
|
+
mapBucketEventType: () => mapBucketEventType,
|
|
32
|
+
mapDatastoreEventType: () => mapDatastoreEventType
|
|
26
33
|
});
|
|
27
34
|
module.exports = __toCommonJS(index_exports);
|
|
28
35
|
|
|
@@ -55,9 +62,52 @@ function joinHandlerPath(prefix, methodPath) {
|
|
|
55
62
|
return path;
|
|
56
63
|
}
|
|
57
64
|
__name(joinHandlerPath, "joinHandlerPath");
|
|
65
|
+
|
|
66
|
+
// src/tokens.ts
|
|
67
|
+
var LOGGER_TOKEN = "CelerityLogger";
|
|
68
|
+
var TRACER_TOKEN = "CelerityTracer";
|
|
69
|
+
var CONFIG_SERVICE_TOKEN = "ConfigService";
|
|
70
|
+
var INJECT_METADATA = /* @__PURE__ */ Symbol.for("celerity:inject");
|
|
71
|
+
var USE_RESOURCE_METADATA = /* @__PURE__ */ Symbol.for("celerity:useResource");
|
|
72
|
+
|
|
73
|
+
// src/event-type-mapping.ts
|
|
74
|
+
function mapBucketEventType(cloudEventName) {
|
|
75
|
+
const name = cloudEventName.startsWith("s3:") ? cloudEventName.slice(3) : cloudEventName;
|
|
76
|
+
if (name.startsWith("ObjectCreated:") || name.startsWith("ObjectRestore:")) {
|
|
77
|
+
return "created";
|
|
78
|
+
}
|
|
79
|
+
if (name.startsWith("ObjectRemoved:")) {
|
|
80
|
+
return "deleted";
|
|
81
|
+
}
|
|
82
|
+
if (name.startsWith("ObjectTagging:") || name.startsWith("ObjectAcl:")) {
|
|
83
|
+
return "metadataUpdated";
|
|
84
|
+
}
|
|
85
|
+
return void 0;
|
|
86
|
+
}
|
|
87
|
+
__name(mapBucketEventType, "mapBucketEventType");
|
|
88
|
+
function mapDatastoreEventType(cloudEventName) {
|
|
89
|
+
switch (cloudEventName) {
|
|
90
|
+
case "INSERT":
|
|
91
|
+
return "inserted";
|
|
92
|
+
case "MODIFY":
|
|
93
|
+
return "modified";
|
|
94
|
+
case "REMOVE":
|
|
95
|
+
return "removed";
|
|
96
|
+
default:
|
|
97
|
+
return void 0;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
__name(mapDatastoreEventType, "mapDatastoreEventType");
|
|
58
101
|
// Annotate the CommonJS export names for ESM import in node:
|
|
59
102
|
0 && (module.exports = {
|
|
103
|
+
CONFIG_SERVICE_TOKEN,
|
|
104
|
+
INJECT_METADATA,
|
|
105
|
+
LOGGER_TOKEN,
|
|
106
|
+
TRACER_TOKEN,
|
|
107
|
+
USE_RESOURCE_METADATA,
|
|
60
108
|
extractUserId,
|
|
61
|
-
joinHandlerPath
|
|
109
|
+
joinHandlerPath,
|
|
110
|
+
mapBucketEventType,
|
|
111
|
+
mapDatastoreEventType
|
|
62
112
|
});
|
|
63
113
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/auth.ts","../src/path.ts"],"sourcesContent":["export { extractUserId } from \"./auth\";\nexport { joinHandlerPath } from \"./path\";\n","/**\n * Extract a user identifier from the auth context.\n *\n * Auth context is a guard-name-keyed map, e.g.:\n * { jwt: { claims: { sub: \"user-42\", ... } }, customGuard: { userId: \"104932\" } }\n *\n * Walks all guard results looking for the first string match in priority order:\n * 1. claims.sub (standard JWT — jwt guard wraps claims in a \"claims\" key)\n * 2. sub (custom guard returning standard OIDC claims directly)\n * 3. userId (common custom guard convention)\n * 4. user_id (snake_case variant)\n */\nexport function extractUserId(auth: Record<string, unknown> | null): string | undefined {\n if (!auth) return undefined;\n\n for (const guardResult of Object.values(auth)) {\n if (typeof guardResult !== \"object\" || guardResult === null) continue;\n const g = guardResult as Record<string, unknown>;\n\n // JWT guard: { claims: { sub: \"...\" } }\n if (typeof g.claims === \"object\" && g.claims !== null) {\n const claims = g.claims as Record<string, unknown>;\n if (isStringOrNumber(claims.sub)) return String(claims.sub);\n }\n\n // Direct sub / userId / user_id on the guard result\n if (isStringOrNumber(g.sub)) return String(g.sub);\n if (isStringOrNumber(g.userId)) return String(g.userId);\n if (isStringOrNumber(g.user_id)) return String(g.user_id);\n }\n\n return undefined;\n}\n\nfunction isStringOrNumber(value: unknown): value is string | number {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n","/**\n * Joins a handler class prefix with a method-level path.\n * Both use the `{param}` format (matching blueprints).\n *\n * @example\n * joinHandlerPath(\"/orders\", \"/{orderId}\") => \"/orders/{orderId}\"\n * joinHandlerPath(\"/\", \"/health\") => \"/health\"\n * joinHandlerPath(\"/api/v1\", \"/users\") => \"/api/v1/users\"\n */\nexport function joinHandlerPath(prefix: string, methodPath: string): string {\n const base = prefix || \"\";\n const path = `/${base}/${methodPath}`.replaceAll(/\\/+/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n return path;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/auth.ts","../src/path.ts","../src/tokens.ts","../src/event-type-mapping.ts"],"sourcesContent":["export { extractUserId } from \"./auth\";\nexport { joinHandlerPath } from \"./path\";\nexport {\n LOGGER_TOKEN,\n TRACER_TOKEN,\n CONFIG_SERVICE_TOKEN,\n INJECT_METADATA,\n USE_RESOURCE_METADATA,\n} from \"./tokens\";\nexport { mapBucketEventType, mapDatastoreEventType } from \"./event-type-mapping\";\n","/**\n * Extract a user identifier from the auth context.\n *\n * Auth context is a guard-name-keyed map, e.g.:\n * { jwt: { claims: { sub: \"user-42\", ... } }, customGuard: { userId: \"104932\" } }\n *\n * Walks all guard results looking for the first string match in priority order:\n * 1. claims.sub (standard JWT — jwt guard wraps claims in a \"claims\" key)\n * 2. sub (custom guard returning standard OIDC claims directly)\n * 3. userId (common custom guard convention)\n * 4. user_id (snake_case variant)\n */\nexport function extractUserId(auth: Record<string, unknown> | null): string | undefined {\n if (!auth) return undefined;\n\n for (const guardResult of Object.values(auth)) {\n if (typeof guardResult !== \"object\" || guardResult === null) continue;\n const g = guardResult as Record<string, unknown>;\n\n // JWT guard: { claims: { sub: \"...\" } }\n if (typeof g.claims === \"object\" && g.claims !== null) {\n const claims = g.claims as Record<string, unknown>;\n if (isStringOrNumber(claims.sub)) return String(claims.sub);\n }\n\n // Direct sub / userId / user_id on the guard result\n if (isStringOrNumber(g.sub)) return String(g.sub);\n if (isStringOrNumber(g.userId)) return String(g.userId);\n if (isStringOrNumber(g.user_id)) return String(g.user_id);\n }\n\n return undefined;\n}\n\nfunction isStringOrNumber(value: unknown): value is string | number {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n","/**\n * Joins a handler class prefix with a method-level path.\n * Both use the `{param}` format (matching blueprints).\n *\n * @example\n * joinHandlerPath(\"/orders\", \"/{orderId}\") => \"/orders/{orderId}\"\n * joinHandlerPath(\"/\", \"/health\") => \"/health\"\n * joinHandlerPath(\"/api/v1\", \"/users\") => \"/api/v1/users\"\n */\nexport function joinHandlerPath(prefix: string, methodPath: string): string {\n const base = prefix || \"\";\n const path = `/${base}/${methodPath}`.replaceAll(/\\/+/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n return path;\n}\n","// -- DI service tokens (string constants for container registration) --\n\n/** DI token for the CelerityLogger service. */\nexport const LOGGER_TOKEN = \"CelerityLogger\";\n\n/** DI token for the CelerityTracer service. */\nexport const TRACER_TOKEN = \"CelerityTracer\";\n\n/** DI token for the ConfigService. */\nexport const CONFIG_SERVICE_TOKEN = \"ConfigService\";\n\n// -- Cross-package decorator metadata symbols --\n// Used by resource-type packages (bucket, queue, etc.) to write DI and\n// resource metadata without depending on @celerity-sdk/core.\n\n/** Metadata key for `@Inject()` parameter overrides. */\nexport const INJECT_METADATA = Symbol.for(\"celerity:inject\");\n\n/** Metadata key for `@UseResource()` / resource-type param decorators. */\nexport const USE_RESOURCE_METADATA = Symbol.for(\"celerity:useResource\");\n","/**\n * Maps an AWS S3 (or MinIO) event name to a Celerity-standard bucket event type.\n * Handles both the subscription format (`s3:ObjectCreated:Put`) used by\n * MinIO/runtime and the notification format (`ObjectCreated:Put`) in S3 notification JSON.\n * Returns `undefined` for unrecognised event names.\n */\nexport function mapBucketEventType(cloudEventName: string): string | undefined {\n // Normalise: strip optional \"s3:\" prefix so both formats work\n const name = cloudEventName.startsWith(\"s3:\") ? cloudEventName.slice(3) : cloudEventName;\n\n if (name.startsWith(\"ObjectCreated:\") || name.startsWith(\"ObjectRestore:\")) {\n return \"created\";\n }\n if (name.startsWith(\"ObjectRemoved:\")) {\n return \"deleted\";\n }\n if (name.startsWith(\"ObjectTagging:\") || name.startsWith(\"ObjectAcl:\")) {\n return \"metadataUpdated\";\n }\n return undefined;\n}\n\n/**\n * Maps an AWS DynamoDB Streams event name to a Celerity-standard datastore event type.\n * Returns `undefined` for unrecognised event names.\n */\nexport function mapDatastoreEventType(cloudEventName: string): string | undefined {\n switch (cloudEventName) {\n case \"INSERT\":\n return \"inserted\";\n case \"MODIFY\":\n return \"modified\";\n case \"REMOVE\":\n return \"removed\";\n default:\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;;;;ACYO,SAASA,cAAcC,MAAoC;AAChE,MAAI,CAACA,KAAM,QAAOC;AAElB,aAAWC,eAAeC,OAAOC,OAAOJ,IAAAA,GAAO;AAC7C,QAAI,OAAOE,gBAAgB,YAAYA,gBAAgB,KAAM;AAC7D,UAAMG,IAAIH;AAGV,QAAI,OAAOG,EAAEC,WAAW,YAAYD,EAAEC,WAAW,MAAM;AACrD,YAAMA,SAASD,EAAEC;AACjB,UAAIC,iBAAiBD,OAAOE,GAAG,EAAG,QAAOC,OAAOH,OAAOE,GAAG;IAC5D;AAGA,QAAID,iBAAiBF,EAAEG,GAAG,EAAG,QAAOC,OAAOJ,EAAEG,GAAG;AAChD,QAAID,iBAAiBF,EAAEK,MAAM,EAAG,QAAOD,OAAOJ,EAAEK,MAAM;AACtD,QAAIH,iBAAiBF,EAAEM,OAAO,EAAG,QAAOF,OAAOJ,EAAEM,OAAO;EAC1D;AAEA,SAAOV;AACT;AApBgBF;AAsBhB,SAASQ,iBAAiBK,OAAc;AACtC,SAAO,OAAOA,UAAU,YAAY,OAAOA,UAAU;AACvD;AAFSL;;;ACzBF,SAASM,gBAAgBC,QAAgBC,YAAkB;AAChE,QAAMC,OAAOF,UAAU;AACvB,QAAMG,OAAO,IAAID,IAAAA,IAAQD,UAAAA,GAAaG,WAAW,QAAQ,GAAA,EAAKC,QAAQ,OAAO,EAAA,KAAO;AACpF,SAAOF;AACT;AAJgBJ;;;ACNT,IAAMO,eAAe;AAGrB,IAAMC,eAAe;AAGrB,IAAMC,uBAAuB;AAO7B,IAAMC,kBAAkBC,uBAAOC,IAAI,iBAAA;AAGnC,IAAMC,wBAAwBF,uBAAOC,IAAI,sBAAA;;;ACbzC,SAASE,mBAAmBC,gBAAsB;AAEvD,QAAMC,OAAOD,eAAeE,WAAW,KAAA,IAASF,eAAeG,MAAM,CAAA,IAAKH;AAE1E,MAAIC,KAAKC,WAAW,gBAAA,KAAqBD,KAAKC,WAAW,gBAAA,GAAmB;AAC1E,WAAO;EACT;AACA,MAAID,KAAKC,WAAW,gBAAA,GAAmB;AACrC,WAAO;EACT;AACA,MAAID,KAAKC,WAAW,gBAAA,KAAqBD,KAAKC,WAAW,YAAA,GAAe;AACtE,WAAO;EACT;AACA,SAAOE;AACT;AAdgBL;AAoBT,SAASM,sBAAsBL,gBAAsB;AAC1D,UAAQA,gBAAAA;IACN,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT;AACE,aAAOI;EACX;AACF;AAXgBC;","names":["extractUserId","auth","undefined","guardResult","Object","values","g","claims","isStringOrNumber","sub","String","userId","user_id","value","joinHandlerPath","prefix","methodPath","base","path","replaceAll","replace","LOGGER_TOKEN","TRACER_TOKEN","CONFIG_SERVICE_TOKEN","INJECT_METADATA","Symbol","for","USE_RESOURCE_METADATA","mapBucketEventType","cloudEventName","name","startsWith","slice","undefined","mapDatastoreEventType"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -23,4 +23,28 @@ declare function extractUserId(auth: Record<string, unknown> | null): string | u
|
|
|
23
23
|
*/
|
|
24
24
|
declare function joinHandlerPath(prefix: string, methodPath: string): string;
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
/** DI token for the CelerityLogger service. */
|
|
27
|
+
declare const LOGGER_TOKEN = "CelerityLogger";
|
|
28
|
+
/** DI token for the CelerityTracer service. */
|
|
29
|
+
declare const TRACER_TOKEN = "CelerityTracer";
|
|
30
|
+
/** DI token for the ConfigService. */
|
|
31
|
+
declare const CONFIG_SERVICE_TOKEN = "ConfigService";
|
|
32
|
+
/** Metadata key for `@Inject()` parameter overrides. */
|
|
33
|
+
declare const INJECT_METADATA: unique symbol;
|
|
34
|
+
/** Metadata key for `@UseResource()` / resource-type param decorators. */
|
|
35
|
+
declare const USE_RESOURCE_METADATA: unique symbol;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Maps an AWS S3 (or MinIO) event name to a Celerity-standard bucket event type.
|
|
39
|
+
* Handles both the subscription format (`s3:ObjectCreated:Put`) used by
|
|
40
|
+
* MinIO/runtime and the notification format (`ObjectCreated:Put`) in S3 notification JSON.
|
|
41
|
+
* Returns `undefined` for unrecognised event names.
|
|
42
|
+
*/
|
|
43
|
+
declare function mapBucketEventType(cloudEventName: string): string | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Maps an AWS DynamoDB Streams event name to a Celerity-standard datastore event type.
|
|
46
|
+
* Returns `undefined` for unrecognised event names.
|
|
47
|
+
*/
|
|
48
|
+
declare function mapDatastoreEventType(cloudEventName: string): string | undefined;
|
|
49
|
+
|
|
50
|
+
export { CONFIG_SERVICE_TOKEN, INJECT_METADATA, LOGGER_TOKEN, TRACER_TOKEN, USE_RESOURCE_METADATA, extractUserId, joinHandlerPath, mapBucketEventType, mapDatastoreEventType };
|
package/dist/index.d.ts
CHANGED
|
@@ -23,4 +23,28 @@ declare function extractUserId(auth: Record<string, unknown> | null): string | u
|
|
|
23
23
|
*/
|
|
24
24
|
declare function joinHandlerPath(prefix: string, methodPath: string): string;
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
/** DI token for the CelerityLogger service. */
|
|
27
|
+
declare const LOGGER_TOKEN = "CelerityLogger";
|
|
28
|
+
/** DI token for the CelerityTracer service. */
|
|
29
|
+
declare const TRACER_TOKEN = "CelerityTracer";
|
|
30
|
+
/** DI token for the ConfigService. */
|
|
31
|
+
declare const CONFIG_SERVICE_TOKEN = "ConfigService";
|
|
32
|
+
/** Metadata key for `@Inject()` parameter overrides. */
|
|
33
|
+
declare const INJECT_METADATA: unique symbol;
|
|
34
|
+
/** Metadata key for `@UseResource()` / resource-type param decorators. */
|
|
35
|
+
declare const USE_RESOURCE_METADATA: unique symbol;
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Maps an AWS S3 (or MinIO) event name to a Celerity-standard bucket event type.
|
|
39
|
+
* Handles both the subscription format (`s3:ObjectCreated:Put`) used by
|
|
40
|
+
* MinIO/runtime and the notification format (`ObjectCreated:Put`) in S3 notification JSON.
|
|
41
|
+
* Returns `undefined` for unrecognised event names.
|
|
42
|
+
*/
|
|
43
|
+
declare function mapBucketEventType(cloudEventName: string): string | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Maps an AWS DynamoDB Streams event name to a Celerity-standard datastore event type.
|
|
46
|
+
* Returns `undefined` for unrecognised event names.
|
|
47
|
+
*/
|
|
48
|
+
declare function mapDatastoreEventType(cloudEventName: string): string | undefined;
|
|
49
|
+
|
|
50
|
+
export { CONFIG_SERVICE_TOKEN, INJECT_METADATA, LOGGER_TOKEN, TRACER_TOKEN, USE_RESOURCE_METADATA, extractUserId, joinHandlerPath, mapBucketEventType, mapDatastoreEventType };
|
package/dist/index.js
CHANGED
|
@@ -30,8 +30,51 @@ function joinHandlerPath(prefix, methodPath) {
|
|
|
30
30
|
return path;
|
|
31
31
|
}
|
|
32
32
|
__name(joinHandlerPath, "joinHandlerPath");
|
|
33
|
+
|
|
34
|
+
// src/tokens.ts
|
|
35
|
+
var LOGGER_TOKEN = "CelerityLogger";
|
|
36
|
+
var TRACER_TOKEN = "CelerityTracer";
|
|
37
|
+
var CONFIG_SERVICE_TOKEN = "ConfigService";
|
|
38
|
+
var INJECT_METADATA = /* @__PURE__ */ Symbol.for("celerity:inject");
|
|
39
|
+
var USE_RESOURCE_METADATA = /* @__PURE__ */ Symbol.for("celerity:useResource");
|
|
40
|
+
|
|
41
|
+
// src/event-type-mapping.ts
|
|
42
|
+
function mapBucketEventType(cloudEventName) {
|
|
43
|
+
const name = cloudEventName.startsWith("s3:") ? cloudEventName.slice(3) : cloudEventName;
|
|
44
|
+
if (name.startsWith("ObjectCreated:") || name.startsWith("ObjectRestore:")) {
|
|
45
|
+
return "created";
|
|
46
|
+
}
|
|
47
|
+
if (name.startsWith("ObjectRemoved:")) {
|
|
48
|
+
return "deleted";
|
|
49
|
+
}
|
|
50
|
+
if (name.startsWith("ObjectTagging:") || name.startsWith("ObjectAcl:")) {
|
|
51
|
+
return "metadataUpdated";
|
|
52
|
+
}
|
|
53
|
+
return void 0;
|
|
54
|
+
}
|
|
55
|
+
__name(mapBucketEventType, "mapBucketEventType");
|
|
56
|
+
function mapDatastoreEventType(cloudEventName) {
|
|
57
|
+
switch (cloudEventName) {
|
|
58
|
+
case "INSERT":
|
|
59
|
+
return "inserted";
|
|
60
|
+
case "MODIFY":
|
|
61
|
+
return "modified";
|
|
62
|
+
case "REMOVE":
|
|
63
|
+
return "removed";
|
|
64
|
+
default:
|
|
65
|
+
return void 0;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
__name(mapDatastoreEventType, "mapDatastoreEventType");
|
|
33
69
|
export {
|
|
70
|
+
CONFIG_SERVICE_TOKEN,
|
|
71
|
+
INJECT_METADATA,
|
|
72
|
+
LOGGER_TOKEN,
|
|
73
|
+
TRACER_TOKEN,
|
|
74
|
+
USE_RESOURCE_METADATA,
|
|
34
75
|
extractUserId,
|
|
35
|
-
joinHandlerPath
|
|
76
|
+
joinHandlerPath,
|
|
77
|
+
mapBucketEventType,
|
|
78
|
+
mapDatastoreEventType
|
|
36
79
|
};
|
|
37
80
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth.ts","../src/path.ts"],"sourcesContent":["/**\n * Extract a user identifier from the auth context.\n *\n * Auth context is a guard-name-keyed map, e.g.:\n * { jwt: { claims: { sub: \"user-42\", ... } }, customGuard: { userId: \"104932\" } }\n *\n * Walks all guard results looking for the first string match in priority order:\n * 1. claims.sub (standard JWT — jwt guard wraps claims in a \"claims\" key)\n * 2. sub (custom guard returning standard OIDC claims directly)\n * 3. userId (common custom guard convention)\n * 4. user_id (snake_case variant)\n */\nexport function extractUserId(auth: Record<string, unknown> | null): string | undefined {\n if (!auth) return undefined;\n\n for (const guardResult of Object.values(auth)) {\n if (typeof guardResult !== \"object\" || guardResult === null) continue;\n const g = guardResult as Record<string, unknown>;\n\n // JWT guard: { claims: { sub: \"...\" } }\n if (typeof g.claims === \"object\" && g.claims !== null) {\n const claims = g.claims as Record<string, unknown>;\n if (isStringOrNumber(claims.sub)) return String(claims.sub);\n }\n\n // Direct sub / userId / user_id on the guard result\n if (isStringOrNumber(g.sub)) return String(g.sub);\n if (isStringOrNumber(g.userId)) return String(g.userId);\n if (isStringOrNumber(g.user_id)) return String(g.user_id);\n }\n\n return undefined;\n}\n\nfunction isStringOrNumber(value: unknown): value is string | number {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n","/**\n * Joins a handler class prefix with a method-level path.\n * Both use the `{param}` format (matching blueprints).\n *\n * @example\n * joinHandlerPath(\"/orders\", \"/{orderId}\") => \"/orders/{orderId}\"\n * joinHandlerPath(\"/\", \"/health\") => \"/health\"\n * joinHandlerPath(\"/api/v1\", \"/users\") => \"/api/v1/users\"\n */\nexport function joinHandlerPath(prefix: string, methodPath: string): string {\n const base = prefix || \"\";\n const path = `/${base}/${methodPath}`.replaceAll(/\\/+/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n return path;\n}\n"],"mappings":";;;;AAYO,SAASA,cAAcC,MAAoC;AAChE,MAAI,CAACA,KAAM,QAAOC;AAElB,aAAWC,eAAeC,OAAOC,OAAOJ,IAAAA,GAAO;AAC7C,QAAI,OAAOE,gBAAgB,YAAYA,gBAAgB,KAAM;AAC7D,UAAMG,IAAIH;AAGV,QAAI,OAAOG,EAAEC,WAAW,YAAYD,EAAEC,WAAW,MAAM;AACrD,YAAMA,SAASD,EAAEC;AACjB,UAAIC,iBAAiBD,OAAOE,GAAG,EAAG,QAAOC,OAAOH,OAAOE,GAAG;IAC5D;AAGA,QAAID,iBAAiBF,EAAEG,GAAG,EAAG,QAAOC,OAAOJ,EAAEG,GAAG;AAChD,QAAID,iBAAiBF,EAAEK,MAAM,EAAG,QAAOD,OAAOJ,EAAEK,MAAM;AACtD,QAAIH,iBAAiBF,EAAEM,OAAO,EAAG,QAAOF,OAAOJ,EAAEM,OAAO;EAC1D;AAEA,SAAOV;AACT;AApBgBF;AAsBhB,SAASQ,iBAAiBK,OAAc;AACtC,SAAO,OAAOA,UAAU,YAAY,OAAOA,UAAU;AACvD;AAFSL;;;ACzBF,SAASM,gBAAgBC,QAAgBC,YAAkB;AAChE,QAAMC,OAAOF,UAAU;AACvB,QAAMG,OAAO,IAAID,IAAAA,IAAQD,UAAAA,GAAaG,WAAW,QAAQ,GAAA,EAAKC,QAAQ,OAAO,EAAA,KAAO;AACpF,SAAOF;AACT;AAJgBJ;","names":["extractUserId","auth","undefined","guardResult","Object","values","g","claims","isStringOrNumber","sub","String","userId","user_id","value","joinHandlerPath","prefix","methodPath","base","path","replaceAll","replace"]}
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/path.ts","../src/tokens.ts","../src/event-type-mapping.ts"],"sourcesContent":["/**\n * Extract a user identifier from the auth context.\n *\n * Auth context is a guard-name-keyed map, e.g.:\n * { jwt: { claims: { sub: \"user-42\", ... } }, customGuard: { userId: \"104932\" } }\n *\n * Walks all guard results looking for the first string match in priority order:\n * 1. claims.sub (standard JWT — jwt guard wraps claims in a \"claims\" key)\n * 2. sub (custom guard returning standard OIDC claims directly)\n * 3. userId (common custom guard convention)\n * 4. user_id (snake_case variant)\n */\nexport function extractUserId(auth: Record<string, unknown> | null): string | undefined {\n if (!auth) return undefined;\n\n for (const guardResult of Object.values(auth)) {\n if (typeof guardResult !== \"object\" || guardResult === null) continue;\n const g = guardResult as Record<string, unknown>;\n\n // JWT guard: { claims: { sub: \"...\" } }\n if (typeof g.claims === \"object\" && g.claims !== null) {\n const claims = g.claims as Record<string, unknown>;\n if (isStringOrNumber(claims.sub)) return String(claims.sub);\n }\n\n // Direct sub / userId / user_id on the guard result\n if (isStringOrNumber(g.sub)) return String(g.sub);\n if (isStringOrNumber(g.userId)) return String(g.userId);\n if (isStringOrNumber(g.user_id)) return String(g.user_id);\n }\n\n return undefined;\n}\n\nfunction isStringOrNumber(value: unknown): value is string | number {\n return typeof value === \"string\" || typeof value === \"number\";\n}\n","/**\n * Joins a handler class prefix with a method-level path.\n * Both use the `{param}` format (matching blueprints).\n *\n * @example\n * joinHandlerPath(\"/orders\", \"/{orderId}\") => \"/orders/{orderId}\"\n * joinHandlerPath(\"/\", \"/health\") => \"/health\"\n * joinHandlerPath(\"/api/v1\", \"/users\") => \"/api/v1/users\"\n */\nexport function joinHandlerPath(prefix: string, methodPath: string): string {\n const base = prefix || \"\";\n const path = `/${base}/${methodPath}`.replaceAll(/\\/+/g, \"/\").replace(/\\/$/, \"\") || \"/\";\n return path;\n}\n","// -- DI service tokens (string constants for container registration) --\n\n/** DI token for the CelerityLogger service. */\nexport const LOGGER_TOKEN = \"CelerityLogger\";\n\n/** DI token for the CelerityTracer service. */\nexport const TRACER_TOKEN = \"CelerityTracer\";\n\n/** DI token for the ConfigService. */\nexport const CONFIG_SERVICE_TOKEN = \"ConfigService\";\n\n// -- Cross-package decorator metadata symbols --\n// Used by resource-type packages (bucket, queue, etc.) to write DI and\n// resource metadata without depending on @celerity-sdk/core.\n\n/** Metadata key for `@Inject()` parameter overrides. */\nexport const INJECT_METADATA = Symbol.for(\"celerity:inject\");\n\n/** Metadata key for `@UseResource()` / resource-type param decorators. */\nexport const USE_RESOURCE_METADATA = Symbol.for(\"celerity:useResource\");\n","/**\n * Maps an AWS S3 (or MinIO) event name to a Celerity-standard bucket event type.\n * Handles both the subscription format (`s3:ObjectCreated:Put`) used by\n * MinIO/runtime and the notification format (`ObjectCreated:Put`) in S3 notification JSON.\n * Returns `undefined` for unrecognised event names.\n */\nexport function mapBucketEventType(cloudEventName: string): string | undefined {\n // Normalise: strip optional \"s3:\" prefix so both formats work\n const name = cloudEventName.startsWith(\"s3:\") ? cloudEventName.slice(3) : cloudEventName;\n\n if (name.startsWith(\"ObjectCreated:\") || name.startsWith(\"ObjectRestore:\")) {\n return \"created\";\n }\n if (name.startsWith(\"ObjectRemoved:\")) {\n return \"deleted\";\n }\n if (name.startsWith(\"ObjectTagging:\") || name.startsWith(\"ObjectAcl:\")) {\n return \"metadataUpdated\";\n }\n return undefined;\n}\n\n/**\n * Maps an AWS DynamoDB Streams event name to a Celerity-standard datastore event type.\n * Returns `undefined` for unrecognised event names.\n */\nexport function mapDatastoreEventType(cloudEventName: string): string | undefined {\n switch (cloudEventName) {\n case \"INSERT\":\n return \"inserted\";\n case \"MODIFY\":\n return \"modified\";\n case \"REMOVE\":\n return \"removed\";\n default:\n return undefined;\n }\n}\n"],"mappings":";;;;AAYO,SAASA,cAAcC,MAAoC;AAChE,MAAI,CAACA,KAAM,QAAOC;AAElB,aAAWC,eAAeC,OAAOC,OAAOJ,IAAAA,GAAO;AAC7C,QAAI,OAAOE,gBAAgB,YAAYA,gBAAgB,KAAM;AAC7D,UAAMG,IAAIH;AAGV,QAAI,OAAOG,EAAEC,WAAW,YAAYD,EAAEC,WAAW,MAAM;AACrD,YAAMA,SAASD,EAAEC;AACjB,UAAIC,iBAAiBD,OAAOE,GAAG,EAAG,QAAOC,OAAOH,OAAOE,GAAG;IAC5D;AAGA,QAAID,iBAAiBF,EAAEG,GAAG,EAAG,QAAOC,OAAOJ,EAAEG,GAAG;AAChD,QAAID,iBAAiBF,EAAEK,MAAM,EAAG,QAAOD,OAAOJ,EAAEK,MAAM;AACtD,QAAIH,iBAAiBF,EAAEM,OAAO,EAAG,QAAOF,OAAOJ,EAAEM,OAAO;EAC1D;AAEA,SAAOV;AACT;AApBgBF;AAsBhB,SAASQ,iBAAiBK,OAAc;AACtC,SAAO,OAAOA,UAAU,YAAY,OAAOA,UAAU;AACvD;AAFSL;;;ACzBF,SAASM,gBAAgBC,QAAgBC,YAAkB;AAChE,QAAMC,OAAOF,UAAU;AACvB,QAAMG,OAAO,IAAID,IAAAA,IAAQD,UAAAA,GAAaG,WAAW,QAAQ,GAAA,EAAKC,QAAQ,OAAO,EAAA,KAAO;AACpF,SAAOF;AACT;AAJgBJ;;;ACNT,IAAMO,eAAe;AAGrB,IAAMC,eAAe;AAGrB,IAAMC,uBAAuB;AAO7B,IAAMC,kBAAkBC,uBAAOC,IAAI,iBAAA;AAGnC,IAAMC,wBAAwBF,uBAAOC,IAAI,sBAAA;;;ACbzC,SAASE,mBAAmBC,gBAAsB;AAEvD,QAAMC,OAAOD,eAAeE,WAAW,KAAA,IAASF,eAAeG,MAAM,CAAA,IAAKH;AAE1E,MAAIC,KAAKC,WAAW,gBAAA,KAAqBD,KAAKC,WAAW,gBAAA,GAAmB;AAC1E,WAAO;EACT;AACA,MAAID,KAAKC,WAAW,gBAAA,GAAmB;AACrC,WAAO;EACT;AACA,MAAID,KAAKC,WAAW,gBAAA,KAAqBD,KAAKC,WAAW,YAAA,GAAe;AACtE,WAAO;EACT;AACA,SAAOE;AACT;AAdgBL;AAoBT,SAASM,sBAAsBL,gBAAsB;AAC1D,UAAQA,gBAAAA;IACN,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT,KAAK;AACH,aAAO;IACT;AACE,aAAOI;EACX;AACF;AAXgBC;","names":["extractUserId","auth","undefined","guardResult","Object","values","g","claims","isStringOrNumber","sub","String","userId","user_id","value","joinHandlerPath","prefix","methodPath","base","path","replaceAll","replace","LOGGER_TOKEN","TRACER_TOKEN","CONFIG_SERVICE_TOKEN","INJECT_METADATA","Symbol","for","USE_RESOURCE_METADATA","mapBucketEventType","cloudEventName","name","startsWith","slice","undefined","mapDatastoreEventType"]}
|