@teamkeel/functions-runtime 0.407.0 → 0.408.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/package.json +2 -2
- package/src/handleRoute.js +112 -0
- package/src/index.js +2 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@teamkeel/functions-runtime",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.408.0",
|
|
4
4
|
"description": "Internal package used by @teamkeel/sdk",
|
|
5
5
|
"main": "src/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
18
|
"prettier": "3.1.1",
|
|
19
|
-
"vitest": "
|
|
19
|
+
"vitest": "3.0.8"
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
22
|
"@aws-sdk/client-s3": "~3.722.0",
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
const {
|
|
2
|
+
createJSONRPCErrorResponse,
|
|
3
|
+
createJSONRPCSuccessResponse,
|
|
4
|
+
JSONRPCErrorCode,
|
|
5
|
+
} = require("json-rpc-2.0");
|
|
6
|
+
const { createDatabaseClient, withDatabase } = require("./database");
|
|
7
|
+
const { withAuditContext } = require("./auditing");
|
|
8
|
+
const { errorToJSONRPCResponse, RuntimeErrors } = require("./errors");
|
|
9
|
+
const opentelemetry = require("@opentelemetry/api");
|
|
10
|
+
const { withSpan } = require("./tracing");
|
|
11
|
+
|
|
12
|
+
async function handleRoute(request, config) {
|
|
13
|
+
// Try to extract trace context from caller
|
|
14
|
+
const activeContext = opentelemetry.propagation.extract(
|
|
15
|
+
opentelemetry.context.active(),
|
|
16
|
+
request.meta?.tracing
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
// Run the whole request with the extracted context
|
|
20
|
+
return opentelemetry.context.with(activeContext, () => {
|
|
21
|
+
// Wrapping span for the whole request
|
|
22
|
+
return withSpan(request.method, async (span) => {
|
|
23
|
+
let db = null;
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const { createContextAPI, functions } = config;
|
|
27
|
+
|
|
28
|
+
if (!(request.method in functions)) {
|
|
29
|
+
const message = `no route function found for '${request.method}'`;
|
|
30
|
+
span.setStatus({
|
|
31
|
+
code: opentelemetry.SpanStatusCode.ERROR,
|
|
32
|
+
message: message,
|
|
33
|
+
});
|
|
34
|
+
return createJSONRPCErrorResponse(
|
|
35
|
+
request.id,
|
|
36
|
+
JSONRPCErrorCode.MethodNotFound,
|
|
37
|
+
message
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// For route functions context doesn't need request headers or the response object as this is handled by
|
|
42
|
+
// params and the function response respectively
|
|
43
|
+
const {
|
|
44
|
+
headers,
|
|
45
|
+
response: __,
|
|
46
|
+
...ctx
|
|
47
|
+
} = createContextAPI({
|
|
48
|
+
responseHeaders: new Headers(),
|
|
49
|
+
meta: request.meta,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Add request headers to params
|
|
53
|
+
request.params.headers = headers;
|
|
54
|
+
|
|
55
|
+
db = createDatabaseClient({
|
|
56
|
+
connString: request.meta?.secrets?.KEEL_DB_CONN,
|
|
57
|
+
});
|
|
58
|
+
const routeHandler = functions[request.method];
|
|
59
|
+
|
|
60
|
+
const result = await withDatabase(db, false, () => {
|
|
61
|
+
return withAuditContext(request, () => {
|
|
62
|
+
return routeHandler(request.params, ctx);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (result instanceof Error) {
|
|
67
|
+
span.recordException(result);
|
|
68
|
+
span.setStatus({
|
|
69
|
+
code: opentelemetry.SpanStatusCode.ERROR,
|
|
70
|
+
message: result.message,
|
|
71
|
+
});
|
|
72
|
+
return errorToJSONRPCResponse(request, result);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const response = createJSONRPCSuccessResponse(request.id, result);
|
|
76
|
+
|
|
77
|
+
return response;
|
|
78
|
+
} catch (e) {
|
|
79
|
+
if (e instanceof Error) {
|
|
80
|
+
span.recordException(e);
|
|
81
|
+
span.setStatus({
|
|
82
|
+
code: opentelemetry.SpanStatusCode.ERROR,
|
|
83
|
+
message: e.message,
|
|
84
|
+
});
|
|
85
|
+
return errorToJSONRPCResponse(request, e);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const message = JSON.stringify(e);
|
|
89
|
+
|
|
90
|
+
span.setStatus({
|
|
91
|
+
code: opentelemetry.SpanStatusCode.ERROR,
|
|
92
|
+
message: message,
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return createJSONRPCErrorResponse(
|
|
96
|
+
request.id,
|
|
97
|
+
RuntimeErrors.UnknownError,
|
|
98
|
+
message
|
|
99
|
+
);
|
|
100
|
+
} finally {
|
|
101
|
+
if (db) {
|
|
102
|
+
await db.destroy();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
module.exports = {
|
|
110
|
+
handleRoute,
|
|
111
|
+
RuntimeErrors,
|
|
112
|
+
};
|
package/src/index.js
CHANGED
|
@@ -3,6 +3,7 @@ const { RequestHeaders } = require("./RequestHeaders");
|
|
|
3
3
|
const { handleRequest } = require("./handleRequest");
|
|
4
4
|
const { handleJob } = require("./handleJob");
|
|
5
5
|
const { handleSubscriber } = require("./handleSubscriber");
|
|
6
|
+
const { handleRoute } = require("./handleRoute");
|
|
6
7
|
const KSUID = require("ksuid");
|
|
7
8
|
const { useDatabase } = require("./database");
|
|
8
9
|
const {
|
|
@@ -21,6 +22,7 @@ module.exports = {
|
|
|
21
22
|
handleRequest,
|
|
22
23
|
handleJob,
|
|
23
24
|
handleSubscriber,
|
|
25
|
+
handleRoute,
|
|
24
26
|
useDatabase,
|
|
25
27
|
Duration,
|
|
26
28
|
InlineFile,
|