glasswork 1.1.0 → 1.3.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/CHANGELOG.md +57 -1
- package/README.md +3 -0
- package/dist/auth/better-auth-provider.d.ts +11 -3
- package/dist/auth/better-auth-provider.d.ts.map +1 -1
- package/dist/auth/better-auth-provider.js +15 -6
- package/dist/auth/better-auth-provider.js.map +1 -1
- package/dist/auth/middleware.d.ts +1 -1
- package/dist/auth/middleware.d.ts.map +1 -1
- package/dist/auth/middleware.js +18 -10
- package/dist/auth/middleware.js.map +1 -1
- package/dist/auth/types.d.ts +6 -2
- package/dist/auth/types.d.ts.map +1 -1
- package/dist/core/bootstrap.d.ts.map +1 -1
- package/dist/core/bootstrap.js +16 -7
- package/dist/core/bootstrap.js.map +1 -1
- package/dist/core/module-graph.js +3 -0
- package/dist/core/module-graph.js.map +1 -1
- package/dist/core/request-scope.d.ts +12 -0
- package/dist/core/request-scope.d.ts.map +1 -0
- package/dist/core/request-scope.js +86 -0
- package/dist/core/request-scope.js.map +1 -0
- package/dist/core/route-factory.d.ts +1 -0
- package/dist/core/route-factory.d.ts.map +1 -1
- package/dist/core/types.d.ts +6 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/email/compiler/compiler.d.ts.map +1 -1
- package/dist/email/compiler/compiler.js +69 -17
- package/dist/email/compiler/compiler.js.map +1 -1
- package/dist/email/compiler/tokenizer.js +4 -2
- package/dist/email/compiler/tokenizer.js.map +1 -1
- package/dist/email/compiler/types.d.ts +2 -0
- package/dist/email/compiler/types.d.ts.map +1 -1
- package/dist/email/transports/ses-transport.d.ts +8 -0
- package/dist/email/transports/ses-transport.d.ts.map +1 -1
- package/dist/email/transports/ses-transport.js +132 -25
- package/dist/email/transports/ses-transport.js.map +1 -1
- package/dist/email/webhooks/handler-factory.d.ts +1 -0
- package/dist/email/webhooks/handler-factory.d.ts.map +1 -1
- package/dist/email/webhooks/handler-factory.js +40 -38
- package/dist/email/webhooks/handler-factory.js.map +1 -1
- package/dist/email/webhooks/notification-parser.d.ts +1 -1
- package/dist/email/webhooks/notification-parser.js +1 -1
- package/dist/email/webhooks/signature-verification.d.ts +4 -2
- package/dist/email/webhooks/signature-verification.d.ts.map +1 -1
- package/dist/email/webhooks/signature-verification.js +63 -8
- package/dist/email/webhooks/signature-verification.js.map +1 -1
- package/dist/email/webhooks/subscription-handler.d.ts +4 -2
- package/dist/email/webhooks/subscription-handler.d.ts.map +1 -1
- package/dist/email/webhooks/subscription-handler.js +42 -6
- package/dist/email/webhooks/subscription-handler.js.map +1 -1
- package/dist/email/webhooks/types.d.ts +17 -2
- package/dist/email/webhooks/types.d.ts.map +1 -1
- package/dist/jobs/define-job.d.ts +4 -4
- package/dist/jobs/define-job.d.ts.map +1 -1
- package/dist/jobs/drivers/mock-driver.d.ts.map +1 -1
- package/dist/jobs/drivers/mock-driver.js +11 -1
- package/dist/jobs/drivers/mock-driver.js.map +1 -1
- package/dist/jobs/index.d.ts +2 -2
- package/dist/jobs/index.d.ts.map +1 -1
- package/dist/jobs/index.js +1 -1
- package/dist/jobs/index.js.map +1 -1
- package/dist/jobs/job-service.d.ts +6 -6
- package/dist/jobs/job-service.d.ts.map +1 -1
- package/dist/jobs/job-service.js +8 -0
- package/dist/jobs/job-service.js.map +1 -1
- package/dist/jobs/observability/emf.d.ts +5 -15
- package/dist/jobs/observability/emf.d.ts.map +1 -1
- package/dist/jobs/observability/emf.js +87 -67
- package/dist/jobs/observability/emf.js.map +1 -1
- package/dist/jobs/observability/index.d.ts +2 -4
- package/dist/jobs/observability/index.d.ts.map +1 -1
- package/dist/jobs/observability/index.js +1 -3
- package/dist/jobs/observability/index.js.map +1 -1
- package/dist/jobs/observability/types.d.ts +16 -193
- package/dist/jobs/observability/types.d.ts.map +1 -1
- package/dist/jobs/types.d.ts +4 -4
- package/dist/jobs/types.d.ts.map +1 -1
- package/dist/jobs/worker.d.ts +5 -0
- package/dist/jobs/worker.d.ts.map +1 -1
- package/dist/jobs/worker.js +73 -12
- package/dist/jobs/worker.js.map +1 -1
- package/dist/list-query/builder.d.ts +2 -1
- package/dist/list-query/builder.d.ts.map +1 -1
- package/dist/list-query/builder.js +23 -15
- package/dist/list-query/builder.js.map +1 -1
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +60 -92
- package/dist/middleware/rate-limit.js.map +1 -1
- package/dist/openapi/openapi.d.ts +1 -4
- package/dist/openapi/openapi.d.ts.map +1 -1
- package/dist/openapi/openapi.js +15 -35
- package/dist/openapi/openapi.js.map +1 -1
- package/dist/sse/index.d.ts +6 -0
- package/dist/sse/index.d.ts.map +1 -0
- package/dist/sse/index.js +18 -0
- package/dist/sse/index.js.map +1 -0
- package/dist/sse/sse-broadcaster.d.ts +38 -0
- package/dist/sse/sse-broadcaster.d.ts.map +1 -0
- package/dist/sse/sse-broadcaster.js +118 -0
- package/dist/sse/sse-broadcaster.js.map +1 -0
- package/dist/utils/get-client-ip.d.ts.map +1 -1
- package/dist/utils/get-client-ip.js +22 -13
- package/dist/utils/get-client-ip.js.map +1 -1
- package/package.json +11 -3
- package/dist/jobs/observability/client.d.ts +0 -26
- package/dist/jobs/observability/client.d.ts.map +0 -1
- package/dist/jobs/observability/client.js +0 -286
- package/dist/jobs/observability/client.js.map +0 -1
- package/dist/jobs/observability/dashboard.d.ts +0 -19
- package/dist/jobs/observability/dashboard.d.ts.map +0 -1
- package/dist/jobs/observability/dashboard.js +0 -144
- package/dist/jobs/observability/dashboard.js.map +0 -1
- package/dist/jobs/scheduler.d.ts +0 -17
- package/dist/jobs/scheduler.d.ts.map +0 -1
- package/dist/jobs/scheduler.js +0 -83
- package/dist/jobs/scheduler.js.map +0 -1
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
const DEFAULT_HEARTBEAT_INTERVAL_MS = 15_000;
|
|
2
|
+
const DEFAULT_MAX_BUFFERED_BYTES = 65_536;
|
|
3
|
+
const CONNECTED_FRAME = 'retry: 3000\n: connected\n\n';
|
|
4
|
+
const HEARTBEAT_FRAME = ': heartbeat\n\n';
|
|
5
|
+
/**
|
|
6
|
+
* In-process, best-effort notifications for a single authorized audience.
|
|
7
|
+
* Mount stream() behind application middleware. Clients must refresh state on
|
|
8
|
+
* every connection: events are not persisted or replayed across reconnects.
|
|
9
|
+
*/
|
|
10
|
+
export class SseBroadcaster {
|
|
11
|
+
connections = new Set();
|
|
12
|
+
encoder = new TextEncoder();
|
|
13
|
+
heartbeatIntervalMs;
|
|
14
|
+
maxBufferedBytes;
|
|
15
|
+
isStopped = false;
|
|
16
|
+
constructor(options = {}) {
|
|
17
|
+
this.heartbeatIntervalMs = options.heartbeatIntervalMs ?? DEFAULT_HEARTBEAT_INTERVAL_MS;
|
|
18
|
+
this.maxBufferedBytes = options.maxBufferedBytes ?? DEFAULT_MAX_BUFFERED_BYTES;
|
|
19
|
+
if (!Number.isFinite(this.heartbeatIntervalMs) || this.heartbeatIntervalMs < 0) {
|
|
20
|
+
throw new RangeError('heartbeatIntervalMs must be a finite non-negative number');
|
|
21
|
+
}
|
|
22
|
+
if (!Number.isSafeInteger(this.maxBufferedBytes) || this.maxBufferedBytes < 64) {
|
|
23
|
+
throw new RangeError('maxBufferedBytes must be an integer of at least 64');
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
get clientCount() {
|
|
27
|
+
return this.connections.size;
|
|
28
|
+
}
|
|
29
|
+
/** Open an ordinary HTTP response; authentication/authorization belongs to the route. */
|
|
30
|
+
stream(context) {
|
|
31
|
+
if (this.isStopped) {
|
|
32
|
+
return context.body(null, 503);
|
|
33
|
+
}
|
|
34
|
+
let connection;
|
|
35
|
+
const body = new ReadableStream({
|
|
36
|
+
start: (controller) => {
|
|
37
|
+
connection = this.createConnection(controller, context.req.raw.signal);
|
|
38
|
+
},
|
|
39
|
+
cancel: () => connection?.cancel(),
|
|
40
|
+
}, { highWaterMark: this.maxBufferedBytes, size: (chunk) => chunk.byteLength });
|
|
41
|
+
context.header('Content-Type', 'text/event-stream; charset=utf-8');
|
|
42
|
+
context.header('Cache-Control', 'no-cache, no-transform');
|
|
43
|
+
context.header('X-Accel-Buffering', 'no');
|
|
44
|
+
return context.newResponse(body);
|
|
45
|
+
}
|
|
46
|
+
/** Serialize once and deliver without letting slow consumers block the publisher. */
|
|
47
|
+
broadcast(event, payload) {
|
|
48
|
+
if (!event || /[\r\n\0]/.test(event)) {
|
|
49
|
+
throw new TypeError('SSE event names must be non-empty and contain no CR, LF or NUL');
|
|
50
|
+
}
|
|
51
|
+
const data = JSON.stringify(payload);
|
|
52
|
+
if (data === undefined) {
|
|
53
|
+
throw new TypeError('SSE payload must be JSON serializable');
|
|
54
|
+
}
|
|
55
|
+
const frame = this.encoder.encode(`event: ${event}\ndata: ${data}\n\n`);
|
|
56
|
+
if (frame.byteLength > this.maxBufferedBytes) {
|
|
57
|
+
throw new RangeError('SSE event exceeds maxBufferedBytes');
|
|
58
|
+
}
|
|
59
|
+
for (const connection of this.connections) {
|
|
60
|
+
connection.send(frame);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/** Synchronous cleanup also works when a consumer never reads its response. */
|
|
64
|
+
onModuleDestroy() {
|
|
65
|
+
this.isStopped = true;
|
|
66
|
+
for (const connection of this.connections) {
|
|
67
|
+
connection.close();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
createConnection(controller, signal) {
|
|
71
|
+
let isClosed = false;
|
|
72
|
+
let heartbeat;
|
|
73
|
+
const connection = {
|
|
74
|
+
cancel: () => {
|
|
75
|
+
if (isClosed) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
isClosed = true;
|
|
79
|
+
clearInterval(heartbeat);
|
|
80
|
+
signal.removeEventListener('abort', connection.close);
|
|
81
|
+
this.connections.delete(connection);
|
|
82
|
+
},
|
|
83
|
+
close: () => {
|
|
84
|
+
if (isClosed) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
connection.cancel();
|
|
88
|
+
// Close synchronously without waiting for the bounded queue to drain.
|
|
89
|
+
controller.close();
|
|
90
|
+
},
|
|
91
|
+
send: (frame) => {
|
|
92
|
+
if (isClosed) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if ((controller.desiredSize ?? 0) < frame.byteLength) {
|
|
96
|
+
connection.cancel();
|
|
97
|
+
controller.error(new Error('SSE client exceeded its buffer limit'));
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
controller.enqueue(frame);
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
this.connections.add(connection);
|
|
104
|
+
signal.addEventListener('abort', connection.close, { once: true });
|
|
105
|
+
if (signal.aborted) {
|
|
106
|
+
connection.close();
|
|
107
|
+
return connection;
|
|
108
|
+
}
|
|
109
|
+
// Flush response headers and tell native EventSource how long to wait before retrying.
|
|
110
|
+
connection.send(this.encoder.encode(CONNECTED_FRAME));
|
|
111
|
+
if (this.heartbeatIntervalMs > 0) {
|
|
112
|
+
const frame = this.encoder.encode(HEARTBEAT_FRAME);
|
|
113
|
+
heartbeat = setInterval(() => connection.send(frame), this.heartbeatIntervalMs);
|
|
114
|
+
}
|
|
115
|
+
return connection;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=sse-broadcaster.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse-broadcaster.js","sourceRoot":"","sources":["../../src/sse/sse-broadcaster.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-client-ip.d.ts","sourceRoot":"","sources":["../../src/utils/get-client-ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"get-client-ip.d.ts","sourceRoot":"","sources":["../../src/utils/get-client-ip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,CAyB9C"}
|
|
@@ -20,6 +20,9 @@
|
|
|
20
20
|
* ```
|
|
21
21
|
*/
|
|
22
22
|
export function getClientIp(c) {
|
|
23
|
+
const lambdaIp = getLambdaClientIp(c.env);
|
|
24
|
+
if (lambdaIp)
|
|
25
|
+
return lambdaIp;
|
|
23
26
|
const trustProxy = c.get('trustProxy') === true;
|
|
24
27
|
// Only honor proxy headers when explicitly trusted
|
|
25
28
|
if (trustProxy) {
|
|
@@ -36,19 +39,25 @@ export function getClientIp(c) {
|
|
|
36
39
|
return trimmed;
|
|
37
40
|
}
|
|
38
41
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// This will throw in non-Node environments
|
|
43
|
-
const { getConnInfo } = require('@hono/node-server/conninfo');
|
|
44
|
-
const info = getConnInfo(c);
|
|
45
|
-
if (info?.remote?.address) {
|
|
46
|
-
return info.remote.address;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
// Not in Node.js environment or module not available
|
|
51
|
-
}
|
|
42
|
+
const nodeIp = getNodeClientIp(c.env);
|
|
43
|
+
if (nodeIp)
|
|
44
|
+
return nodeIp;
|
|
52
45
|
return 'unknown';
|
|
53
46
|
}
|
|
47
|
+
function getLambdaClientIp(environment) {
|
|
48
|
+
if (!environment || typeof environment !== 'object')
|
|
49
|
+
return undefined;
|
|
50
|
+
const env = environment;
|
|
51
|
+
const sourceIp = env.requestContext?.http?.sourceIp ?? env.requestContext?.identity?.sourceIp;
|
|
52
|
+
return typeof sourceIp === 'string' && sourceIp.trim() ? sourceIp.trim() : undefined;
|
|
53
|
+
}
|
|
54
|
+
function getNodeClientIp(environment) {
|
|
55
|
+
if (!environment || typeof environment !== 'object')
|
|
56
|
+
return undefined;
|
|
57
|
+
const remoteAddress = environment
|
|
58
|
+
.incoming?.socket?.remoteAddress;
|
|
59
|
+
return typeof remoteAddress === 'string' && remoteAddress.trim()
|
|
60
|
+
? remoteAddress.trim()
|
|
61
|
+
: undefined;
|
|
62
|
+
}
|
|
54
63
|
//# sourceMappingURL=get-client-ip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-client-ip.js","sourceRoot":"","sources":["../../src/utils/get-client-ip.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAEhD,mDAAmD;IACnD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC/C,IAAI,EAAE;gBAAE,OAAO,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,
|
|
1
|
+
{"version":3,"file":"get-client-ip.js","sourceRoot":"","sources":["../../src/utils/get-client-ip.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,CAAU;IACpC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC1C,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,MAAM,UAAU,GAAG,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAEhD,mDAAmD;IACnD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,aAAa,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACtD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;YAC/C,IAAI,EAAE;gBAAE,OAAO,EAAE,CAAC;QACpB,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;YAC/B,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,iBAAiB,CAAC,WAAoB;IAC7C,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEtE,MAAM,GAAG,GAAG,WAKX,CAAC;IACF,MAAM,QAAQ,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,QAAQ,IAAI,GAAG,CAAC,cAAc,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAC9F,OAAO,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACvF,CAAC;AAED,SAAS,eAAe,CAAC,WAAoB;IAC3C,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAEtE,MAAM,aAAa,GAAI,WAAuE;SAC3F,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC;IACnC,OAAO,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,CAAC,IAAI,EAAE;QAC9D,CAAC,CAAC,aAAa,CAAC,IAAI,EAAE;QACtB,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "glasswork",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "A transparent, Lambda-optimized web framework for building OpenAPI-compliant REST APIs.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -61,7 +61,12 @@
|
|
|
61
61
|
"import": "./dist/audit/index.js",
|
|
62
62
|
"default": "./dist/audit/index.js"
|
|
63
63
|
},
|
|
64
|
-
"./package.json": "./package.json"
|
|
64
|
+
"./package.json": "./package.json",
|
|
65
|
+
"./sse": {
|
|
66
|
+
"types": "./dist/sse/index.d.ts",
|
|
67
|
+
"import": "./dist/sse/index.js",
|
|
68
|
+
"default": "./dist/sse/index.js"
|
|
69
|
+
}
|
|
65
70
|
},
|
|
66
71
|
"files": [
|
|
67
72
|
"dist",
|
|
@@ -204,11 +209,13 @@
|
|
|
204
209
|
"@types/node": "^26.5.0",
|
|
205
210
|
"@vitest/coverage-v8": "^4.1.11",
|
|
206
211
|
"awilix": "^13.0.5",
|
|
212
|
+
"better-auth": "^1.7.5",
|
|
207
213
|
"dotenv": "^17.4.2",
|
|
208
214
|
"hono": "^4.13.7",
|
|
209
215
|
"hono-openapi": "^1.3.2",
|
|
210
216
|
"mermaid": "^11.17.2",
|
|
211
217
|
"mjml": "^5.4.0",
|
|
218
|
+
"postal-mime": "^2.7.6",
|
|
212
219
|
"prisma": "7.10.0",
|
|
213
220
|
"typescript": "^7.0.2",
|
|
214
221
|
"valibot": "^1.4.2",
|
|
@@ -216,7 +223,8 @@
|
|
|
216
223
|
"vitepress-plugin-llms": "^1.13.5",
|
|
217
224
|
"vitepress-plugin-mermaid": "^2.0.17",
|
|
218
225
|
"vitest": "^4.1.11",
|
|
219
|
-
"vue": "^3.5.42"
|
|
226
|
+
"vue": "^3.5.42",
|
|
227
|
+
"yaml": "^2.9.1"
|
|
220
228
|
},
|
|
221
229
|
"dependencies": {
|
|
222
230
|
"@hono/standard-validator": "^0.2.3",
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { FailedJobDTO, GetFailedJobsOptions, GetJobSummaryOptions, JobStatsSummaryDTO, JobsObservabilityClientOptions, JobTypeStatsDTO } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Interface for the background jobs observability client.
|
|
4
|
-
*/
|
|
5
|
-
export interface JobsObservabilityClient {
|
|
6
|
-
/**
|
|
7
|
-
* Fetch an aggregated summary of background jobs over a time window.
|
|
8
|
-
*/
|
|
9
|
-
getSummary(options?: GetJobSummaryOptions): Promise<JobStatsSummaryDTO>;
|
|
10
|
-
/**
|
|
11
|
-
* Fetch recent failed and dead-letter jobs with their error details.
|
|
12
|
-
*/
|
|
13
|
-
getFailedJobs(options?: GetFailedJobsOptions): Promise<FailedJobDTO[]>;
|
|
14
|
-
/**
|
|
15
|
-
* Fetch detailed statistics for a specific job name.
|
|
16
|
-
*/
|
|
17
|
-
getJobTypeStats(jobName: string, options?: GetJobSummaryOptions): Promise<JobTypeStatsDTO>;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Create an observability client for querying background job metrics and execution logs.
|
|
21
|
-
*
|
|
22
|
-
* @param options - Configuration options including namespace, logGroupName, and region.
|
|
23
|
-
* @returns A JobsObservabilityClient instance.
|
|
24
|
-
*/
|
|
25
|
-
export declare function createJobsObservabilityClient(options?: JobsObservabilityClientOptions): JobsObservabilityClient;
|
|
26
|
-
//# sourceMappingURL=client.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/jobs/observability/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,8BAA8B,EAC9B,eAAe,EAChB,MAAM,YAAY,CAAC;AAMpB;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC;;OAEG;IACH,UAAU,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAExE;;OAEG;IACH,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAEvE;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CAC5F;AAoND;;;;;GAKG;AACH,wBAAgB,6BAA6B,CAC3C,OAAO,GAAE,8BAAmC,GAC3C,uBAAuB,CA+JzB"}
|
|
@@ -1,286 +0,0 @@
|
|
|
1
|
-
function createJobMetricStat(namespace, jobName, metricName, id, period, stat) {
|
|
2
|
-
return {
|
|
3
|
-
Id: id,
|
|
4
|
-
MetricStat: {
|
|
5
|
-
Metric: {
|
|
6
|
-
Namespace: namespace,
|
|
7
|
-
MetricName: metricName,
|
|
8
|
-
Dimensions: [{ Name: 'JobName', Value: jobName }],
|
|
9
|
-
},
|
|
10
|
-
Period: period,
|
|
11
|
-
Stat: stat,
|
|
12
|
-
},
|
|
13
|
-
ReturnData: true,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
function buildMetricDataQueries(namespace, periodSeconds, jobNames) {
|
|
17
|
-
const queries = [
|
|
18
|
-
{
|
|
19
|
-
Id: 'm_total',
|
|
20
|
-
MetricStat: {
|
|
21
|
-
Metric: { Namespace: namespace, MetricName: 'JobCount' },
|
|
22
|
-
Period: periodSeconds,
|
|
23
|
-
Stat: 'Sum',
|
|
24
|
-
},
|
|
25
|
-
ReturnData: true,
|
|
26
|
-
},
|
|
27
|
-
{
|
|
28
|
-
Id: 'm_errors',
|
|
29
|
-
MetricStat: {
|
|
30
|
-
Metric: { Namespace: namespace, MetricName: 'JobErrorCount' },
|
|
31
|
-
Period: periodSeconds,
|
|
32
|
-
Stat: 'Sum',
|
|
33
|
-
},
|
|
34
|
-
ReturnData: true,
|
|
35
|
-
},
|
|
36
|
-
{
|
|
37
|
-
Id: 'm_retries',
|
|
38
|
-
MetricStat: {
|
|
39
|
-
Metric: { Namespace: namespace, MetricName: 'RetryCount' },
|
|
40
|
-
Period: periodSeconds,
|
|
41
|
-
Stat: 'Sum',
|
|
42
|
-
},
|
|
43
|
-
ReturnData: true,
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
Id: 'm_duration_avg',
|
|
47
|
-
MetricStat: {
|
|
48
|
-
Metric: { Namespace: namespace, MetricName: 'JobDuration' },
|
|
49
|
-
Period: periodSeconds,
|
|
50
|
-
Stat: 'Average',
|
|
51
|
-
},
|
|
52
|
-
ReturnData: true,
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
Id: 'm_duration_p95',
|
|
56
|
-
MetricStat: {
|
|
57
|
-
Metric: { Namespace: namespace, MetricName: 'JobDuration' },
|
|
58
|
-
Period: periodSeconds,
|
|
59
|
-
Stat: 'p95',
|
|
60
|
-
},
|
|
61
|
-
ReturnData: true,
|
|
62
|
-
},
|
|
63
|
-
];
|
|
64
|
-
for (let i = 0; i < jobNames.length; i++) {
|
|
65
|
-
const name = jobNames[i];
|
|
66
|
-
if (!name)
|
|
67
|
-
continue;
|
|
68
|
-
queries.push(createJobMetricStat(namespace, name, 'JobCount', `j_${i}_total`, periodSeconds, 'Sum'), createJobMetricStat(namespace, name, 'JobErrorCount', `j_${i}_errors`, periodSeconds, 'Sum'), createJobMetricStat(namespace, name, 'RetryCount', `j_${i}_retries`, periodSeconds, 'Sum'), createJobMetricStat(namespace, name, 'JobDuration', `j_${i}_duration_avg`, periodSeconds, 'Average'), createJobMetricStat(namespace, name, 'JobDuration', `j_${i}_duration_p95`, periodSeconds, 'p95'));
|
|
69
|
-
}
|
|
70
|
-
return queries;
|
|
71
|
-
}
|
|
72
|
-
function extractJobTypeStats(resultMap, jobNames) {
|
|
73
|
-
const byJob = {};
|
|
74
|
-
for (let i = 0; i < jobNames.length; i++) {
|
|
75
|
-
const name = jobNames[i];
|
|
76
|
-
if (!name)
|
|
77
|
-
continue;
|
|
78
|
-
const count = resultMap.get(`j_${i}_total`) ?? 0;
|
|
79
|
-
const failedCount = resultMap.get(`j_${i}_errors`) ?? 0;
|
|
80
|
-
byJob[name] = {
|
|
81
|
-
jobName: name,
|
|
82
|
-
count,
|
|
83
|
-
succeededCount: Math.max(0, count - failedCount),
|
|
84
|
-
failedCount,
|
|
85
|
-
retryCount: resultMap.get(`j_${i}_retries`) ?? 0,
|
|
86
|
-
avgDurationMs: Math.round(resultMap.get(`j_${i}_duration_avg`) ?? 0),
|
|
87
|
-
p95DurationMs: Math.round(resultMap.get(`j_${i}_duration_p95`) ?? 0),
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
return byJob;
|
|
91
|
-
}
|
|
92
|
-
function parseMetricResults(metricResults, jobNames) {
|
|
93
|
-
const resultMap = new Map();
|
|
94
|
-
for (const res of metricResults ?? []) {
|
|
95
|
-
const val = res.Values && res.Values.length > 0 ? res.Values.reduce((a, b) => a + b, 0) : 0;
|
|
96
|
-
resultMap.set(res.Id, val);
|
|
97
|
-
}
|
|
98
|
-
const totalExecuted = resultMap.get('m_total') ?? 0;
|
|
99
|
-
const totalFailed = resultMap.get('m_errors') ?? 0;
|
|
100
|
-
const totalRetried = resultMap.get('m_retries') ?? 0;
|
|
101
|
-
const totalSucceeded = Math.max(0, totalExecuted - totalFailed);
|
|
102
|
-
const avgDurationMs = Math.round(resultMap.get('m_duration_avg') ?? 0);
|
|
103
|
-
const p95DurationMs = Math.round(resultMap.get('m_duration_p95') ?? 0);
|
|
104
|
-
const successRate = totalExecuted > 0
|
|
105
|
-
? Math.round(((totalExecuted - totalFailed) / totalExecuted) * 10000) / 100
|
|
106
|
-
: 100;
|
|
107
|
-
return {
|
|
108
|
-
totalExecuted,
|
|
109
|
-
totalSucceeded,
|
|
110
|
-
totalFailed,
|
|
111
|
-
totalRetried,
|
|
112
|
-
successRate,
|
|
113
|
-
avgDurationMs,
|
|
114
|
-
p95DurationMs,
|
|
115
|
-
byJob: extractJobTypeStats(resultMap, jobNames),
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
async function pollLogsQuery(client, queryId,
|
|
119
|
-
// biome-ignore lint/suspicious/noExplicitAny: Dynamic command class constructor
|
|
120
|
-
GetQueryResultsClass) {
|
|
121
|
-
for (let i = 0; i < 10; i++) {
|
|
122
|
-
const res = (await client.send(new GetQueryResultsClass({ queryId })));
|
|
123
|
-
if (res.status === 'Complete') {
|
|
124
|
-
return res.results ?? [];
|
|
125
|
-
}
|
|
126
|
-
if (res.status === 'Failed' || res.status === 'Cancelled') {
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
130
|
-
}
|
|
131
|
-
return [];
|
|
132
|
-
}
|
|
133
|
-
function mapFailedJobRow(row) {
|
|
134
|
-
const map = new Map();
|
|
135
|
-
for (const cell of row) {
|
|
136
|
-
if (cell.field && cell.value) {
|
|
137
|
-
map.set(cell.field, cell.value);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const timestampStr = map.get('@timestamp') ?? new Date().toISOString();
|
|
141
|
-
const durationStr = map.get('JobDuration');
|
|
142
|
-
const queueWaitStr = map.get('QueueWaitTime');
|
|
143
|
-
return {
|
|
144
|
-
jobId: map.get('JobId') ?? '',
|
|
145
|
-
jobName: map.get('JobName') ?? '',
|
|
146
|
-
attemptNumber: Number(map.get('AttemptNumber') ?? '1'),
|
|
147
|
-
errorMessage: map.get('ErrorMessage') ?? '',
|
|
148
|
-
errorName: map.get('ErrorName'),
|
|
149
|
-
errorStack: map.get('ErrorStack'),
|
|
150
|
-
failedAt: new Date(timestampStr),
|
|
151
|
-
durationMs: durationStr ? Number(durationStr) : undefined,
|
|
152
|
-
queueWaitTimeMs: queueWaitStr ? Number(queueWaitStr) : undefined,
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* Create an observability client for querying background job metrics and execution logs.
|
|
157
|
-
*
|
|
158
|
-
* @param options - Configuration options including namespace, logGroupName, and region.
|
|
159
|
-
* @returns A JobsObservabilityClient instance.
|
|
160
|
-
*/
|
|
161
|
-
export function createJobsObservabilityClient(options = {}) {
|
|
162
|
-
const { namespace = 'Glasswork/Jobs', logGroupName, region = process.env.AWS_REGION || 'eu-west-1', } = options;
|
|
163
|
-
let cwClient = options.cloudWatchClient ?? null;
|
|
164
|
-
let cwLogsClient = options.cloudWatchLogsClient ?? null;
|
|
165
|
-
async function getCloudWatchClient() {
|
|
166
|
-
if (cwClient)
|
|
167
|
-
return cwClient;
|
|
168
|
-
try {
|
|
169
|
-
const sdk = (await import('@aws-sdk/client-cloudwatch'));
|
|
170
|
-
const CloudWatchClient = sdk.CloudWatchClient;
|
|
171
|
-
cwClient = new CloudWatchClient({ region });
|
|
172
|
-
return cwClient;
|
|
173
|
-
}
|
|
174
|
-
catch {
|
|
175
|
-
throw new Error('Package "@aws-sdk/client-cloudwatch" is required to query metrics. Please install it or inject a cloudWatchClient.');
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
async function getCloudWatchLogsClient() {
|
|
179
|
-
if (cwLogsClient)
|
|
180
|
-
return cwLogsClient;
|
|
181
|
-
try {
|
|
182
|
-
const sdk = (await import('@aws-sdk/client-cloudwatch-logs'));
|
|
183
|
-
const CloudWatchLogsClient = sdk.CloudWatchLogsClient;
|
|
184
|
-
cwLogsClient = new CloudWatchLogsClient({ region });
|
|
185
|
-
return cwLogsClient;
|
|
186
|
-
}
|
|
187
|
-
catch {
|
|
188
|
-
throw new Error('Package "@aws-sdk/client-cloudwatch-logs" is required to query logs. Please install it or inject a cloudWatchLogsClient.');
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return {
|
|
192
|
-
async getSummary(queryOptions = {}) {
|
|
193
|
-
const client = await getCloudWatchClient();
|
|
194
|
-
const hours = queryOptions.hours ?? 24;
|
|
195
|
-
const endTime = queryOptions.endTime ?? new Date();
|
|
196
|
-
const startTime = queryOptions.startTime ?? new Date(endTime.getTime() - hours * 60 * 60 * 1000);
|
|
197
|
-
const period = Math.max(60, Math.floor((endTime.getTime() - startTime.getTime()) / 1000));
|
|
198
|
-
const jobNames = queryOptions.jobNames ?? [];
|
|
199
|
-
const metricDataQueries = buildMetricDataQueries(namespace, period, jobNames);
|
|
200
|
-
// biome-ignore lint/suspicious/noExplicitAny: Dynamic command invocation
|
|
201
|
-
let CommandClass;
|
|
202
|
-
try {
|
|
203
|
-
const sdk = (await import('@aws-sdk/client-cloudwatch'));
|
|
204
|
-
CommandClass = sdk.GetMetricDataCommand;
|
|
205
|
-
}
|
|
206
|
-
catch {
|
|
207
|
-
CommandClass = class GetMetricDataCommand {
|
|
208
|
-
input;
|
|
209
|
-
constructor(input) {
|
|
210
|
-
this.input = input;
|
|
211
|
-
}
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
const response = (await client.send(new CommandClass({
|
|
215
|
-
StartTime: startTime,
|
|
216
|
-
EndTime: endTime,
|
|
217
|
-
MetricDataQueries: metricDataQueries,
|
|
218
|
-
})));
|
|
219
|
-
return parseMetricResults(response.MetricDataResults, jobNames);
|
|
220
|
-
},
|
|
221
|
-
async getJobTypeStats(jobName, queryOptions = {}) {
|
|
222
|
-
const summary = await this.getSummary({
|
|
223
|
-
...queryOptions,
|
|
224
|
-
jobNames: [jobName],
|
|
225
|
-
});
|
|
226
|
-
return (summary.byJob[jobName] ?? {
|
|
227
|
-
jobName,
|
|
228
|
-
count: 0,
|
|
229
|
-
succeededCount: 0,
|
|
230
|
-
failedCount: 0,
|
|
231
|
-
retryCount: 0,
|
|
232
|
-
avgDurationMs: 0,
|
|
233
|
-
p95DurationMs: 0,
|
|
234
|
-
});
|
|
235
|
-
},
|
|
236
|
-
async getFailedJobs(failedOptions = {}) {
|
|
237
|
-
if (!logGroupName) {
|
|
238
|
-
throw new Error('Option "logGroupName" is required to query failed jobs from CloudWatch Logs.');
|
|
239
|
-
}
|
|
240
|
-
const client = await getCloudWatchLogsClient();
|
|
241
|
-
const limit = failedOptions.limit ?? 25;
|
|
242
|
-
const endTime = failedOptions.endTime ?? new Date();
|
|
243
|
-
const startTime = failedOptions.startTime ?? new Date(endTime.getTime() - 24 * 60 * 60 * 1000);
|
|
244
|
-
const jobNameFilter = failedOptions.jobName ? `and JobName = "${failedOptions.jobName}"` : '';
|
|
245
|
-
const queryString = `fields @timestamp, JobName, JobId, AttemptNumber, ErrorName, ErrorMessage, ErrorStack, JobDuration, QueueWaitTime
|
|
246
|
-
| filter Status in ["failed", "dead_letter"] ${jobNameFilter}
|
|
247
|
-
| sort @timestamp desc
|
|
248
|
-
| limit ${limit}`;
|
|
249
|
-
// biome-ignore lint/suspicious/noExplicitAny: Dynamic command invocation
|
|
250
|
-
let StartQueryCommandClass;
|
|
251
|
-
// biome-ignore lint/suspicious/noExplicitAny: Dynamic command invocation
|
|
252
|
-
let GetQueryResultsCommandClass;
|
|
253
|
-
try {
|
|
254
|
-
const sdk = (await import('@aws-sdk/client-cloudwatch-logs'));
|
|
255
|
-
StartQueryCommandClass = sdk.StartQueryCommand;
|
|
256
|
-
GetQueryResultsCommandClass = sdk.GetQueryResultsCommand;
|
|
257
|
-
}
|
|
258
|
-
catch {
|
|
259
|
-
StartQueryCommandClass = class StartQueryCommand {
|
|
260
|
-
input;
|
|
261
|
-
constructor(input) {
|
|
262
|
-
this.input = input;
|
|
263
|
-
}
|
|
264
|
-
};
|
|
265
|
-
GetQueryResultsCommandClass = class GetQueryResultsCommand {
|
|
266
|
-
input;
|
|
267
|
-
constructor(input) {
|
|
268
|
-
this.input = input;
|
|
269
|
-
}
|
|
270
|
-
};
|
|
271
|
-
}
|
|
272
|
-
const startRes = (await client.send(new StartQueryCommandClass({
|
|
273
|
-
logGroupName,
|
|
274
|
-
startTime: Math.floor(startTime.getTime() / 1000),
|
|
275
|
-
endTime: Math.floor(endTime.getTime() / 1000),
|
|
276
|
-
queryString,
|
|
277
|
-
})));
|
|
278
|
-
if (!startRes.queryId) {
|
|
279
|
-
return [];
|
|
280
|
-
}
|
|
281
|
-
const rows = await pollLogsQuery(client, startRes.queryId, GetQueryResultsCommandClass);
|
|
282
|
-
return rows.map(mapFailedJobRow);
|
|
283
|
-
},
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
//# sourceMappingURL=client.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/jobs/observability/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import type { CloudWatchDashboardDefinition, GenerateJobsDashboardOptions, GetJobsInsightsQueriesOptions, JobsInsightsQueries } from './types.js';
|
|
2
|
-
/**
|
|
3
|
-
* Generate a production-ready AWS CloudWatch Dashboard JSON definition for background jobs.
|
|
4
|
-
*
|
|
5
|
-
* Can be deployed via AWS CLI (`aws cloudwatch put-dashboard`), AWS CDK (`CfnDashboard`),
|
|
6
|
-
* or Terraform (`aws_cloudwatch_dashboard`).
|
|
7
|
-
*
|
|
8
|
-
* @param options - Dashboard configuration options (names, widgets, region).
|
|
9
|
-
* @returns An object with dashboardName and serialized dashboardBody JSON.
|
|
10
|
-
*/
|
|
11
|
-
export declare function generateJobsDashboard(options: GenerateJobsDashboardOptions): CloudWatchDashboardDefinition;
|
|
12
|
-
/**
|
|
13
|
-
* Returns a set of pre-canned CloudWatch Logs Insights queries for monitoring and troubleshooting jobs.
|
|
14
|
-
*
|
|
15
|
-
* @param options - Optional configuration for logGroupName and namespace filter.
|
|
16
|
-
* @returns Queries for recent failures, slowest jobs, retries, and job tracing.
|
|
17
|
-
*/
|
|
18
|
-
export declare function getJobsInsightsQueries(options?: GetJobsInsightsQueriesOptions): JobsInsightsQueries;
|
|
19
|
-
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../../src/jobs/observability/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,6BAA6B,EAC7B,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,4BAA4B,GACpC,6BAA6B,CAqI/B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,6BAAkC,GAC1C,mBAAmB,CAerB"}
|