@teamkeel/functions-runtime 0.407.1 → 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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@teamkeel/functions-runtime",
3
- "version": "0.407.1",
3
+ "version": "0.408.0",
4
4
  "description": "Internal package used by @teamkeel/sdk",
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -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,