@restatedev/restate-sdk-cloudflare-workers 0.0.0-SNAPSHOT-20241001101403
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/esm/src/common_api.d.ts +12 -0
- package/dist/esm/src/common_api.d.ts.map +1 -0
- package/dist/esm/src/common_api.js +16 -0
- package/dist/esm/src/common_api.js.map +1 -0
- package/dist/esm/src/context.d.ts +587 -0
- package/dist/esm/src/context.d.ts.map +1 -0
- package/dist/esm/src/context.js +75 -0
- package/dist/esm/src/context.js.map +1 -0
- package/dist/esm/src/context_impl.d.ts +96 -0
- package/dist/esm/src/context_impl.d.ts.map +1 -0
- package/dist/esm/src/context_impl.js +696 -0
- package/dist/esm/src/context_impl.js.map +1 -0
- package/dist/esm/src/endpoint/endpoint_builder.d.ts +28 -0
- package/dist/esm/src/endpoint/endpoint_builder.d.ts.map +1 -0
- package/dist/esm/src/endpoint/endpoint_builder.js +139 -0
- package/dist/esm/src/endpoint/endpoint_builder.js.map +1 -0
- package/dist/esm/src/endpoint/fetch_endpoint.d.ts +54 -0
- package/dist/esm/src/endpoint/fetch_endpoint.d.ts.map +1 -0
- package/dist/esm/src/endpoint/fetch_endpoint.js +57 -0
- package/dist/esm/src/endpoint/fetch_endpoint.js.map +1 -0
- package/dist/esm/src/endpoint/handlers/fetch.d.ts +6 -0
- package/dist/esm/src/endpoint/handlers/fetch.d.ts.map +1 -0
- package/dist/esm/src/endpoint/handlers/fetch.js +30 -0
- package/dist/esm/src/endpoint/handlers/fetch.js.map +1 -0
- package/dist/esm/src/endpoint/handlers/generic.d.ts +62 -0
- package/dist/esm/src/endpoint/handlers/generic.d.ts.map +1 -0
- package/dist/esm/src/endpoint/handlers/generic.js +289 -0
- package/dist/esm/src/endpoint/handlers/generic.js.map +1 -0
- package/dist/esm/src/endpoint/handlers/lambda.d.ts +8 -0
- package/dist/esm/src/endpoint/handlers/lambda.d.ts.map +1 -0
- package/dist/esm/src/endpoint/handlers/lambda.js +80 -0
- package/dist/esm/src/endpoint/handlers/lambda.js.map +1 -0
- package/dist/esm/src/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.d.ts +270 -0
- package/dist/esm/src/endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js +20 -0
- package/dist/esm/src/endpoint/handlers/vm/sdk_shared_core_wasm_bindings_bg.js +1392 -0
- package/dist/esm/src/endpoint/handlers/vm/sdk_shared_core_wasm_bindings_bg.wasm +0 -0
- package/dist/esm/src/endpoint/handlers/vm/sdk_shared_core_wasm_bindings_bg.wasm.d.ts +61 -0
- package/dist/esm/src/endpoint/lambda_endpoint.d.ts +34 -0
- package/dist/esm/src/endpoint/lambda_endpoint.d.ts.map +1 -0
- package/dist/esm/src/endpoint/lambda_endpoint.js +49 -0
- package/dist/esm/src/endpoint/lambda_endpoint.js.map +1 -0
- package/dist/esm/src/endpoint/node_endpoint.d.ts +21 -0
- package/dist/esm/src/endpoint/node_endpoint.d.ts.map +1 -0
- package/dist/esm/src/endpoint/node_endpoint.js +101 -0
- package/dist/esm/src/endpoint/node_endpoint.js.map +1 -0
- package/dist/esm/src/endpoint/request_signing/basex.d.ts +10 -0
- package/dist/esm/src/endpoint/request_signing/basex.d.ts.map +1 -0
- package/dist/esm/src/endpoint/request_signing/basex.js +136 -0
- package/dist/esm/src/endpoint/request_signing/basex.js.map +1 -0
- package/dist/esm/src/endpoint/request_signing/ed25519.d.ts +17 -0
- package/dist/esm/src/endpoint/request_signing/ed25519.d.ts.map +1 -0
- package/dist/esm/src/endpoint/request_signing/ed25519.js +52 -0
- package/dist/esm/src/endpoint/request_signing/ed25519.js.map +1 -0
- package/dist/esm/src/endpoint/request_signing/v1.d.ts +10 -0
- package/dist/esm/src/endpoint/request_signing/v1.d.ts.map +1 -0
- package/dist/esm/src/endpoint/request_signing/v1.js +143 -0
- package/dist/esm/src/endpoint/request_signing/v1.js.map +1 -0
- package/dist/esm/src/endpoint/request_signing/validate.d.ts +19 -0
- package/dist/esm/src/endpoint/request_signing/validate.d.ts.map +1 -0
- package/dist/esm/src/endpoint/request_signing/validate.js +40 -0
- package/dist/esm/src/endpoint/request_signing/validate.js.map +1 -0
- package/dist/esm/src/endpoint.d.ts +132 -0
- package/dist/esm/src/endpoint.d.ts.map +1 -0
- package/dist/esm/src/endpoint.js +12 -0
- package/dist/esm/src/endpoint.js.map +1 -0
- package/dist/esm/src/fetch.d.ts +8 -0
- package/dist/esm/src/fetch.d.ts.map +1 -0
- package/dist/esm/src/fetch.js +23 -0
- package/dist/esm/src/fetch.js.map +1 -0
- package/dist/esm/src/generated/version.d.ts +2 -0
- package/dist/esm/src/generated/version.d.ts.map +1 -0
- package/dist/esm/src/generated/version.js +2 -0
- package/dist/esm/src/generated/version.js.map +1 -0
- package/dist/esm/src/lambda.d.ts +7 -0
- package/dist/esm/src/lambda.d.ts.map +1 -0
- package/dist/esm/src/lambda.js +19 -0
- package/dist/esm/src/lambda.js.map +1 -0
- package/dist/esm/src/logger.d.ts +35 -0
- package/dist/esm/src/logger.d.ts.map +1 -0
- package/dist/esm/src/logger.js +144 -0
- package/dist/esm/src/logger.js.map +1 -0
- package/dist/esm/src/public_api.d.ts +7 -0
- package/dist/esm/src/public_api.d.ts.map +1 -0
- package/dist/esm/src/public_api.js +19 -0
- package/dist/esm/src/public_api.js.map +1 -0
- package/dist/esm/src/types/components.d.ts +85 -0
- package/dist/esm/src/types/components.d.ts.map +1 -0
- package/dist/esm/src/types/components.js +228 -0
- package/dist/esm/src/types/components.js.map +1 -0
- package/dist/esm/src/types/discovery.d.ts +43 -0
- package/dist/esm/src/types/discovery.d.ts.map +1 -0
- package/dist/esm/src/types/discovery.js +28 -0
- package/dist/esm/src/types/discovery.js.map +1 -0
- package/dist/esm/src/types/errors.d.ts +21 -0
- package/dist/esm/src/types/errors.d.ts.map +1 -0
- package/dist/esm/src/types/errors.js +47 -0
- package/dist/esm/src/types/errors.js.map +1 -0
- package/dist/esm/src/types/rpc.d.ts +417 -0
- package/dist/esm/src/types/rpc.d.ts.map +1 -0
- package/dist/esm/src/types/rpc.js +607 -0
- package/dist/esm/src/types/rpc.js.map +1 -0
- package/dist/esm/src/user_agent.d.ts +2 -0
- package/dist/esm/src/user_agent.d.ts.map +1 -0
- package/dist/esm/src/user_agent.js +13 -0
- package/dist/esm/src/user_agent.js.map +1 -0
- package/dist/esm/src/utils/buffer.d.ts +5 -0
- package/dist/esm/src/utils/buffer.d.ts.map +1 -0
- package/dist/esm/src/utils/buffer.js +53 -0
- package/dist/esm/src/utils/buffer.js.map +1 -0
- package/dist/esm/src/utils/completable_promise.d.ts +9 -0
- package/dist/esm/src/utils/completable_promise.d.ts.map +1 -0
- package/dist/esm/src/utils/completable_promise.js +30 -0
- package/dist/esm/src/utils/completable_promise.js.map +1 -0
- package/dist/esm/src/utils/rand.d.ts +13 -0
- package/dist/esm/src/utils/rand.d.ts.map +1 -0
- package/dist/esm/src/utils/rand.js +106 -0
- package/dist/esm/src/utils/rand.js.map +1 -0
- package/dist/esm/src/utils/streams.d.ts +4 -0
- package/dist/esm/src/utils/streams.d.ts.map +1 -0
- package/dist/esm/src/utils/streams.js +20 -0
- package/dist/esm/src/utils/streams.js.map +1 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/package.json +82 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
5
|
+
* which is released under the MIT license.
|
|
6
|
+
*
|
|
7
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
8
|
+
* directory of this repository or package, or at
|
|
9
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
10
|
+
*/
|
|
11
|
+
import { Buffer } from "node:buffer";
|
|
12
|
+
import { headerValue } from "./validate.js";
|
|
13
|
+
import { importKey, verify } from "./ed25519.js";
|
|
14
|
+
import base from "./basex.js";
|
|
15
|
+
const JWT_HEADER = "x-restate-jwt-v1";
|
|
16
|
+
export const SCHEME_V1 = "v1";
|
|
17
|
+
const BASE58_ALPHABET = "123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz";
|
|
18
|
+
const bs58 = base(BASE58_ALPHABET);
|
|
19
|
+
// SubjectPublicKeyInfo SEQUENCE (2 elem)
|
|
20
|
+
// algorithm AlgorithmIdentifier SEQUENCE (1 elem)
|
|
21
|
+
// algorithm OBJECT IDENTIFIER 1.3.101.112 curveEd25519 (EdDSA 25519 signature algorithm)
|
|
22
|
+
// subjectPublicKey BIT STRING (256 bit) <insert 32 bytes after this>
|
|
23
|
+
const asn1Prefix = Buffer.from("MCowBQYDK2VwAyEA", "base64");
|
|
24
|
+
export function parseKeySetV1(keys) {
|
|
25
|
+
const map = new Map();
|
|
26
|
+
for (const key of keys) {
|
|
27
|
+
if (!key.startsWith("publickeyv1_")) {
|
|
28
|
+
throw new Error("v1 jwt public keys are expected to start with publickeyv1_");
|
|
29
|
+
}
|
|
30
|
+
const pubBytes = Buffer.from(bs58.decode(key.slice("publickeyv1_".length)));
|
|
31
|
+
if (pubBytes.length != 32) {
|
|
32
|
+
throw new Error("v1 jwt public keys are expected to have 32 bytes of data");
|
|
33
|
+
}
|
|
34
|
+
// NB in the webcrypto case (but not node) the key contains a promise that we will only await during verification
|
|
35
|
+
// and so if this promise is in error state, every verification with that key would fail.
|
|
36
|
+
// however, any 32 byte slice is a valid ed25519 public key, so failure here should only be in the case where webcrypto
|
|
37
|
+
// doesn't support ed25519 at all. and deno and cloudflare workers both support it.
|
|
38
|
+
const publicKey = importKey(key, Buffer.concat([asn1Prefix, pubBytes]));
|
|
39
|
+
map.set(key, publicKey);
|
|
40
|
+
}
|
|
41
|
+
return map;
|
|
42
|
+
}
|
|
43
|
+
export async function validateV1(keySet, path, headers) {
|
|
44
|
+
const jwt = headerValue(JWT_HEADER, headers);
|
|
45
|
+
if (!jwt) {
|
|
46
|
+
throw new Error(`v1 signature scheme expects the following headers: ${[JWT_HEADER]}`);
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
return await jwtVerify(keySet, jwt, normalisedPath(path));
|
|
50
|
+
}
|
|
51
|
+
catch (e) {
|
|
52
|
+
return {
|
|
53
|
+
valid: false,
|
|
54
|
+
scheme: SCHEME_V1,
|
|
55
|
+
error: e,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function normalisedPath(path) {
|
|
60
|
+
switch (path.type) {
|
|
61
|
+
case "invoke":
|
|
62
|
+
return `/invoke/${path.componentName}/${path.handlerName}`;
|
|
63
|
+
case "discover":
|
|
64
|
+
return "/discover";
|
|
65
|
+
case "unknown":
|
|
66
|
+
return path.path;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async function jwtVerify(keySet, jwt, expectedAud) {
|
|
70
|
+
const { 0: protectedHeader, 1: payload, 2: signature, length, } = jwt.split(".");
|
|
71
|
+
if (length !== 3) {
|
|
72
|
+
throw new Error("Invalid Compact JWS; expected 3 parts");
|
|
73
|
+
}
|
|
74
|
+
let header = {};
|
|
75
|
+
try {
|
|
76
|
+
header = JSON.parse(Buffer.from(protectedHeader, "base64url").toString());
|
|
77
|
+
}
|
|
78
|
+
catch (e) {
|
|
79
|
+
throw new Error("JWT header is invalid");
|
|
80
|
+
}
|
|
81
|
+
const { typ, alg, kid } = header;
|
|
82
|
+
if (typ != "JWT") {
|
|
83
|
+
throw new Error('JWT must have "typ" header "JWT"');
|
|
84
|
+
}
|
|
85
|
+
if (alg != "EdDSA") {
|
|
86
|
+
throw new Error('JWT must have "alg" header "EdDSA"');
|
|
87
|
+
}
|
|
88
|
+
if (typeof kid !== "string" || !alg) {
|
|
89
|
+
throw new Error('JWT must have "kid" header, which must be a string');
|
|
90
|
+
}
|
|
91
|
+
const key = keySet.get(kid);
|
|
92
|
+
if (!key) {
|
|
93
|
+
throw new Error(`kid ${header.kid} is not present in keySet`);
|
|
94
|
+
}
|
|
95
|
+
let signatureBuf;
|
|
96
|
+
try {
|
|
97
|
+
signatureBuf = Buffer.from(signature, "base64url");
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
throw new Error("JWT header is invalid");
|
|
101
|
+
}
|
|
102
|
+
const verified = await verify(key, signatureBuf, Buffer.from(`${protectedHeader}.${payload}`));
|
|
103
|
+
if (!verified) {
|
|
104
|
+
throw new Error("JWT signature did not validate");
|
|
105
|
+
}
|
|
106
|
+
let payloadData;
|
|
107
|
+
try {
|
|
108
|
+
payloadData = JSON.parse(Buffer.from(payload, "base64url").toString());
|
|
109
|
+
}
|
|
110
|
+
catch (e) {
|
|
111
|
+
throw new Error("JWT payload is invalid");
|
|
112
|
+
}
|
|
113
|
+
return validateClaims(kid, payloadData, expectedAud);
|
|
114
|
+
}
|
|
115
|
+
function validateClaims(kid, payload, expectedAud) {
|
|
116
|
+
const { aud, exp, nbf } = payload;
|
|
117
|
+
if (!aud || !exp || !nbf) {
|
|
118
|
+
throw new Error("JWT must contain all of the following claims: aud, exp, nbf");
|
|
119
|
+
}
|
|
120
|
+
if (typeof aud === "string") {
|
|
121
|
+
if (aud !== expectedAud) {
|
|
122
|
+
throw new Error("JWT aud claim is invalid");
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
throw new Error("JWT aud claim is invalid");
|
|
127
|
+
}
|
|
128
|
+
const now = Math.floor(new Date().getTime() / 1000);
|
|
129
|
+
if (typeof nbf !== "number") {
|
|
130
|
+
throw new Error("nbf claim must be a number");
|
|
131
|
+
}
|
|
132
|
+
if (nbf > now) {
|
|
133
|
+
throw new Error("nbf claim timestamp check failed");
|
|
134
|
+
}
|
|
135
|
+
if (typeof exp !== "number") {
|
|
136
|
+
throw new Error("exp claim must be a number");
|
|
137
|
+
}
|
|
138
|
+
if (exp <= now) {
|
|
139
|
+
throw new Error("exp claim timestamp check failed");
|
|
140
|
+
}
|
|
141
|
+
return { valid: true, validKey: kid, scheme: SCHEME_V1 };
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=v1.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"v1.js","sourceRoot":"","sources":["../../../../../src/endpoint/request_signing/v1.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PathComponents } from "../../types/components.js";
|
|
2
|
+
import type { KeySetV1 } from "./v1.js";
|
|
3
|
+
export type ValidateResponse = ValidateSuccess | {
|
|
4
|
+
valid: false;
|
|
5
|
+
error: unknown;
|
|
6
|
+
scheme: string;
|
|
7
|
+
};
|
|
8
|
+
export type ValidateSuccess = {
|
|
9
|
+
valid: true;
|
|
10
|
+
validKey: string;
|
|
11
|
+
scheme: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function validateRequestSignature(keySet: KeySetV1, path: PathComponents, headers: {
|
|
14
|
+
[name: string]: string | string[] | undefined;
|
|
15
|
+
}): Promise<ValidateResponse>;
|
|
16
|
+
export declare function headerValue(key: string, headers: {
|
|
17
|
+
[name: string]: string | string[] | undefined;
|
|
18
|
+
}): string | null;
|
|
19
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../../../../src/endpoint/request_signing/validate.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKxC,MAAM,MAAM,gBAAgB,GACxB,eAAe,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE;IAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,GACzD,OAAO,CAAC,gBAAgB,CAAC,CAgB3B;AAED,wBAAgB,WAAW,CACzB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,GACzD,MAAM,GAAG,IAAI,CAWf"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
5
|
+
* which is released under the MIT license.
|
|
6
|
+
*
|
|
7
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
8
|
+
* directory of this repository or package, or at
|
|
9
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
10
|
+
*/
|
|
11
|
+
import { SCHEME_V1, validateV1 } from "./v1.js";
|
|
12
|
+
const SIGNATURE_SCHEME_HEADER = "x-restate-signature-scheme";
|
|
13
|
+
export async function validateRequestSignature(keySet, path, headers) {
|
|
14
|
+
const scheme = headerValue(SIGNATURE_SCHEME_HEADER, headers) ?? "unsigned";
|
|
15
|
+
switch (scheme) {
|
|
16
|
+
case "unsigned":
|
|
17
|
+
return {
|
|
18
|
+
valid: false,
|
|
19
|
+
scheme: "unsigned",
|
|
20
|
+
error: new Error("request has no identity"),
|
|
21
|
+
};
|
|
22
|
+
case SCHEME_V1:
|
|
23
|
+
return await validateV1(keySet, path, headers);
|
|
24
|
+
default:
|
|
25
|
+
throw new Error("Unexpected signature scheme: known schemes are 'unsigned', 'v1'");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export function headerValue(key, headers) {
|
|
29
|
+
if (!headers[key]) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
if (typeof headers[key] !== "string") {
|
|
33
|
+
throw new Error(`Unexpected multi-valued header ${key}`);
|
|
34
|
+
}
|
|
35
|
+
if (!headers[key]?.length) {
|
|
36
|
+
throw new Error(`Unexpected empty valued header ${key}`);
|
|
37
|
+
}
|
|
38
|
+
return headers[key];
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../../src/endpoint/request_signing/validate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAEhD,MAAM,uBAAuB,GAAG,4BAA4B,CAAC;AAQ7D,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAgB,EAChB,IAAoB,EACpB,OAA0D;IAE1D,MAAM,MAAM,GAAG,WAAW,CAAC,uBAAuB,EAAE,OAAO,CAAC,IAAI,UAAU,CAAC;IAC3E,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO;gBACL,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,IAAI,KAAK,CAAC,yBAAyB,CAAC;aAC5C,CAAC;QACJ,KAAK,SAAS;YACZ,OAAO,MAAM,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACjD;YACE,MAAM,IAAI,KAAK,CACb,iEAAiE,CAClE,CAAC;IACN,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,GAAW,EACX,OAA0D;IAE1D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,kCAAkC,GAAG,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAW,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import type { Http2ServerRequest, Http2ServerResponse } from "http2";
|
|
3
|
+
import type { VirtualObjectDefinition, ServiceDefinition, WorkflowDefinition } from "@restatedev/restate-sdk-core";
|
|
4
|
+
import type { Logger } from "./logger.js";
|
|
5
|
+
/**
|
|
6
|
+
* Utility interface for a bundle of one or more services belonging together
|
|
7
|
+
* and being registered together.
|
|
8
|
+
*
|
|
9
|
+
* @deprecated Service bundle is unused and will be removed.
|
|
10
|
+
*/
|
|
11
|
+
export interface ServiceBundle {
|
|
12
|
+
/**
|
|
13
|
+
* Called to register the services at the endpoint.
|
|
14
|
+
*
|
|
15
|
+
* @deprecated Service bundle is unused and will be removed.
|
|
16
|
+
*/
|
|
17
|
+
registerServices(endpoint: RestateEndpoint): void;
|
|
18
|
+
}
|
|
19
|
+
export interface RestateEndpointBase<E> {
|
|
20
|
+
/**
|
|
21
|
+
* Binds a new durable service / virtual object / workflow.
|
|
22
|
+
*
|
|
23
|
+
* see restate.service, restate.object, and restate.workflow for more details.
|
|
24
|
+
**/
|
|
25
|
+
bind<P extends string, M>(service: ServiceDefinition<P, M> | VirtualObjectDefinition<P, M> | WorkflowDefinition<P, M>): E;
|
|
26
|
+
/**
|
|
27
|
+
* Adds one or more services to this endpoint. This will call the
|
|
28
|
+
* {@link ServiceBundle.registerServices} function to register all services at this endpoint.
|
|
29
|
+
*
|
|
30
|
+
* @deprecated service bundle is deprecated
|
|
31
|
+
*/
|
|
32
|
+
bindBundle(services: ServiceBundle): E;
|
|
33
|
+
/**
|
|
34
|
+
* Provide a list of v1 request identity public keys eg `publickeyv1_2G8dCQhArfvGpzPw5Vx2ALciR4xCLHfS5YaT93XjNxX9` to validate
|
|
35
|
+
* incoming requests against, limiting requests to Restate clusters with the corresponding private keys. This public key format is
|
|
36
|
+
* logged by the Restate process at startup if a request identity private key is provided.
|
|
37
|
+
*
|
|
38
|
+
* If this function is called, all incoming requests irrelevant of endpoint type will be expected to have
|
|
39
|
+
* `x-restate-signature-scheme: v1` and `x-restate-jwt-v1: <valid jwt signed with one of these keys>`. If not called,
|
|
40
|
+
*
|
|
41
|
+
*/
|
|
42
|
+
withIdentityV1(...keys: string[]): E;
|
|
43
|
+
/**
|
|
44
|
+
* Replace the default console-based {@link Logger}
|
|
45
|
+
* @param logger
|
|
46
|
+
* @example
|
|
47
|
+
* Using console:
|
|
48
|
+
* ```ts
|
|
49
|
+
* restate.setLogger((params, message, ...o) => {console.log(`${params.level}: `, message, ...o)})
|
|
50
|
+
* ```
|
|
51
|
+
* @example
|
|
52
|
+
* Using winston:
|
|
53
|
+
* ```ts
|
|
54
|
+
* const logger = createLogger({ ... })
|
|
55
|
+
* restate.setLogger((params, message, ...o) => {logger.log(params.level, {invocationId: params.context?.invocationId}, [message, ...o].join(' '))})
|
|
56
|
+
* ```
|
|
57
|
+
* @example
|
|
58
|
+
* Using pino:
|
|
59
|
+
* ```ts
|
|
60
|
+
* const logger = pino()
|
|
61
|
+
* restate.setLogger((params, message, ...o) => {logger[params.level]({invocationId: params.context?.invocationId}, [message, ...o].join(' '))})
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
setLogger(logger: Logger): E;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* RestateEndpoint encapsulates all the Restate services served by this endpoint.
|
|
68
|
+
*
|
|
69
|
+
* A RestateEndpoint can either be served either as HTTP2 server, using the methods {@link listen} or {@link http2Handler},
|
|
70
|
+
* or as Lambda, using the method {@link lambdaHandler}.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* A typical endpoint served as HTTP server would look like this:
|
|
74
|
+
* ```
|
|
75
|
+
* import * as restate from "@restatedev/restate-sdk";
|
|
76
|
+
*
|
|
77
|
+
* restate
|
|
78
|
+
* .endpoint()
|
|
79
|
+
* .bind(myService)
|
|
80
|
+
* .listen(8000);
|
|
81
|
+
* ```
|
|
82
|
+
* @example
|
|
83
|
+
* A typical endpoint served as AWS Lambda would look like this:
|
|
84
|
+
* ```
|
|
85
|
+
* import * as restate from "@restatedev/restate-sdk/lambda";
|
|
86
|
+
*
|
|
87
|
+
* export const handler = restate
|
|
88
|
+
* .endpoint()
|
|
89
|
+
* .bind(myService)
|
|
90
|
+
* .handler();
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
export interface RestateEndpoint extends RestateEndpointBase<RestateEndpoint> {
|
|
94
|
+
/**
|
|
95
|
+
* Creates the invocation handler function to be called by AWS Lambda.
|
|
96
|
+
*
|
|
97
|
+
* The returned type of this function is `(event: APIGatewayProxyEvent | APIGatewayProxyEventV2) => Promise<APIGatewayProxyResult | APIGatewayProxyResultV2>`.
|
|
98
|
+
* We use `any` types here to avoid a dependency on the `@types/aws-lambda` dependency for consumers of this API.
|
|
99
|
+
*
|
|
100
|
+
* @returns The invocation handler function for to be called by AWS Lambda.
|
|
101
|
+
* @deprecated import "@restatedev/restate-sdk/lambda" instead
|
|
102
|
+
*/
|
|
103
|
+
lambdaHandler(): (event: any, ctx: any) => Promise<any>;
|
|
104
|
+
/**
|
|
105
|
+
* Serve this Restate Endpoint as HTTP2 server, listening to the given port.
|
|
106
|
+
*
|
|
107
|
+
* If the port is undefined, this method will use the port set in the `PORT`
|
|
108
|
+
* environment variable. If that variable is undefined as well, the method will
|
|
109
|
+
* default to port 9080.
|
|
110
|
+
*
|
|
111
|
+
* This method's result promise never completes.
|
|
112
|
+
*
|
|
113
|
+
* This method is a shorthand for:
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* ```
|
|
117
|
+
* const httpServer = http2.createServer(endpoint.http2Handler());
|
|
118
|
+
* httpServer.listen(port);
|
|
119
|
+
* ```
|
|
120
|
+
*
|
|
121
|
+
* If you need to manually control the server lifecycle, we suggest to manually instantiate the http2 server and use {@link http2Handler}.
|
|
122
|
+
*
|
|
123
|
+
* @param port The port to listen at. May be undefined (see above).
|
|
124
|
+
* @returns a Promise that resolves with the bound port, or rejects with a failure otherwise.
|
|
125
|
+
*/
|
|
126
|
+
listen(port?: number): Promise<number>;
|
|
127
|
+
/**
|
|
128
|
+
* Returns an http2 server handler. See {@link listen} for more details.
|
|
129
|
+
*/
|
|
130
|
+
http2Handler(): (request: Http2ServerRequest, response: Http2ServerResponse) => void;
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=endpoint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../../src/endpoint.ts"],"names":[],"mappings":";AAWA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AACrE,OAAO,KAAK,EACV,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,gBAAgB,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACpC;;;;QAII;IACJ,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EACtB,OAAO,EACH,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,GACvB,uBAAuB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC7B,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC3B,CAAC,CAAC;IAEL;;;;;OAKG;IACH,UAAU,CAAC,QAAQ,EAAE,aAAa,GAAG,CAAC,CAAC;IAEvC;;;;;;;;OAQG;IACH,cAAc,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC;IAErC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC;CAC9B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,eAAgB,SAAQ,mBAAmB,CAAC,eAAe,CAAC;IAC3E;;;;;;;;OAQG;IAEH,aAAa,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;IAExD;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAEvC;;OAEG;IACH,YAAY,IAAI,CACd,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,mBAAmB,KAC1B,IAAI,CAAC;CACX"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
5
|
+
* which is released under the MIT license.
|
|
6
|
+
*
|
|
7
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
8
|
+
* directory of this repository or package, or at
|
|
9
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
10
|
+
*/
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=endpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../../src/endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from "./common_api.js";
|
|
2
|
+
import { type FetchEndpoint } from "./endpoint/fetch_endpoint.js";
|
|
3
|
+
/**
|
|
4
|
+
* Create a new {@link RestateEndpoint} in request response protocol mode.
|
|
5
|
+
* Bidirectional mode (must be served over http2) can be enabled with .enableHttp2()
|
|
6
|
+
*/
|
|
7
|
+
export declare function endpoint(): FetchEndpoint;
|
|
8
|
+
//# sourceMappingURL=fetch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../../src/fetch.ts"],"names":[],"mappings":"AAWA,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,8BAA8B,CAAC;AAGtC;;;GAGG;AACH,wBAAgB,QAAQ,IAAI,aAAa,CAExC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
5
|
+
* which is released under the MIT license.
|
|
6
|
+
*
|
|
7
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
8
|
+
* directory of this repository or package, or at
|
|
9
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
10
|
+
*/
|
|
11
|
+
export * from "./common_api.js";
|
|
12
|
+
import { FetchEndpointImpl, } from "./endpoint/fetch_endpoint.js";
|
|
13
|
+
import { ProtocolMode } from "./types/discovery.js";
|
|
14
|
+
import { cloudflareWorkersBundlerPatch } from "./endpoint/handlers/vm/sdk_shared_core_wasm_bindings.js"
|
|
15
|
+
/**
|
|
16
|
+
* Create a new {@link RestateEndpoint} in request response protocol mode.
|
|
17
|
+
* Bidirectional mode (must be served over http2) can be enabled with .enableHttp2()
|
|
18
|
+
*/
|
|
19
|
+
export function endpoint() {
|
|
20
|
+
cloudflareWorkersBundlerPatch()
|
|
21
|
+
return new FetchEndpointImpl(ProtocolMode.REQUEST_RESPONSE);
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=fetch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../../src/fetch.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAEL,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD;;;GAGG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,iBAAiB,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../../../src/generated/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../../../src/generated/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lambda.d.ts","sourceRoot":"","sources":["../../../src/lambda.ts"],"names":[],"mappings":"AAWA,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,wBAAgB,QAAQ,IAAI,cAAc,CAEzC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
5
|
+
* which is released under the MIT license.
|
|
6
|
+
*
|
|
7
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
8
|
+
* directory of this repository or package, or at
|
|
9
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
10
|
+
*/
|
|
11
|
+
export * from "./common_api.js";
|
|
12
|
+
import { LambdaEndpointImpl, } from "./endpoint/lambda_endpoint.js";
|
|
13
|
+
/**
|
|
14
|
+
* Create a new {@link RestateEndpoint}.
|
|
15
|
+
*/
|
|
16
|
+
export function endpoint() {
|
|
17
|
+
return new LambdaEndpointImpl();
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=lambda.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lambda.js","sourceRoot":"","sources":["../../../src/lambda.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,iBAAiB,CAAC;AAEhC,OAAO,EACL,kBAAkB,GAEnB,MAAM,+BAA+B,CAAC;AAEvC;;GAEG;AACH,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,kBAAkB,EAAE,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
export declare enum RestateLogLevel {
|
|
3
|
+
TRACE = "trace",
|
|
4
|
+
DEBUG = "debug",
|
|
5
|
+
INFO = "info",
|
|
6
|
+
WARN = "warn",
|
|
7
|
+
ERROR = "error"
|
|
8
|
+
}
|
|
9
|
+
export declare function logLevel(level: RestateLogLevel): number;
|
|
10
|
+
export type LogParams = {
|
|
11
|
+
source: LogSource;
|
|
12
|
+
level: RestateLogLevel;
|
|
13
|
+
replaying: boolean;
|
|
14
|
+
context?: LoggerContext;
|
|
15
|
+
};
|
|
16
|
+
export type Logger = (params: LogParams, message?: any, ...optionalParams: any[]) => void;
|
|
17
|
+
export declare const DEFAULT_LOGGER_LOG_LEVEL: RestateLogLevel;
|
|
18
|
+
export declare const defaultLogger: Logger;
|
|
19
|
+
export declare class LoggerContext {
|
|
20
|
+
readonly invocationId: string;
|
|
21
|
+
readonly additionalContext?: {
|
|
22
|
+
[name: string]: string;
|
|
23
|
+
} | undefined;
|
|
24
|
+
readonly fqMethodName: string;
|
|
25
|
+
constructor(invocationId: string, packageName: string, serviceName: string, handlerName: string, additionalContext?: {
|
|
26
|
+
[name: string]: string;
|
|
27
|
+
} | undefined);
|
|
28
|
+
}
|
|
29
|
+
export declare enum LogSource {
|
|
30
|
+
SYSTEM = "SYSTEM",
|
|
31
|
+
JOURNAL = "JOURNAL",
|
|
32
|
+
USER = "USER"
|
|
33
|
+
}
|
|
34
|
+
export declare function createRestateConsole(logger: Logger, source: LogSource, context?: LoggerContext, isReplaying?: () => boolean): Console;
|
|
35
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/logger.ts"],"names":[],"mappings":";AAeA,oBAAY,eAAe;IACzB,KAAK,UAAU;IACf,KAAK,UAAU;IACf,IAAI,SAAS;IACb,IAAI,SAAS;IACb,KAAK,UAAU;CAChB;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAavD;AAuBD,MAAM,MAAM,SAAS,GAAG;IACtB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,eAAe,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG,CACnB,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE,GAAG,EACb,GAAG,cAAc,EAAE,GAAG,EAAE,KACrB,IAAI,CAAC;AAKV,eAAO,MAAM,wBAAwB,iBAAwB,CAAC;AAE9D,eAAO,MAAM,aAAa,EAAE,MA4B3B,CAAC;AAWF,qBAAa,aAAa;IAItB,QAAQ,CAAC,YAAY,EAAE,MAAM;IAI7B,QAAQ,CAAC,iBAAiB,CAAC;;;IAP7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;gBAGnB,YAAY,EAAE,MAAM,EAC7B,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACV,iBAAiB,CAAC;;iBAA4B;CAM1D;AAkCD,oBAAY,SAAS;IACnB,MAAM,WAAW;IACjB,OAAO,YAAY;IACnB,IAAI,SAAS;CACd;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,EACjB,OAAO,CAAC,EAAE,aAAa,EACvB,WAAW,GAAE,MAAM,OAAqB,GACvC,OAAO,CAwCT"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
|
|
3
|
+
*
|
|
4
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
5
|
+
* which is released under the MIT license.
|
|
6
|
+
*
|
|
7
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
8
|
+
* directory of this repository or package, or at
|
|
9
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
10
|
+
*/
|
|
11
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
12
|
+
/* eslint-disable no-console */
|
|
13
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
14
|
+
export var RestateLogLevel;
|
|
15
|
+
(function (RestateLogLevel) {
|
|
16
|
+
RestateLogLevel["TRACE"] = "trace";
|
|
17
|
+
RestateLogLevel["DEBUG"] = "debug";
|
|
18
|
+
RestateLogLevel["INFO"] = "info";
|
|
19
|
+
RestateLogLevel["WARN"] = "warn";
|
|
20
|
+
RestateLogLevel["ERROR"] = "error";
|
|
21
|
+
})(RestateLogLevel || (RestateLogLevel = {}));
|
|
22
|
+
export function logLevel(level) {
|
|
23
|
+
switch (level) {
|
|
24
|
+
case RestateLogLevel.TRACE:
|
|
25
|
+
return 1;
|
|
26
|
+
case RestateLogLevel.DEBUG:
|
|
27
|
+
return 2;
|
|
28
|
+
case RestateLogLevel.INFO:
|
|
29
|
+
return 3;
|
|
30
|
+
case RestateLogLevel.WARN:
|
|
31
|
+
return 4;
|
|
32
|
+
case RestateLogLevel.ERROR:
|
|
33
|
+
return 5;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function logLevelFromName(name) {
|
|
37
|
+
if (!name) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const n = name.toUpperCase();
|
|
41
|
+
switch (n) {
|
|
42
|
+
case "TRACE":
|
|
43
|
+
return RestateLogLevel.TRACE;
|
|
44
|
+
case "DEBUG":
|
|
45
|
+
return RestateLogLevel.DEBUG;
|
|
46
|
+
case "INFO":
|
|
47
|
+
return RestateLogLevel.INFO;
|
|
48
|
+
case "WARN":
|
|
49
|
+
return RestateLogLevel.WARN;
|
|
50
|
+
case "ERROR":
|
|
51
|
+
return RestateLogLevel.ERROR;
|
|
52
|
+
default:
|
|
53
|
+
throw new TypeError(`unknown name ${name}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// this is the log level as provided by the environment variable RESTATE_LOG_LEVEL,
|
|
57
|
+
// but it only affects the default logger - custom loggers get all log events and
|
|
58
|
+
// should use their own filtering mechanism
|
|
59
|
+
export const DEFAULT_LOGGER_LOG_LEVEL = readRestateLogLevel();
|
|
60
|
+
export const defaultLogger = (params, message, ...optionalParams) => {
|
|
61
|
+
if (params.replaying) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (logLevel(params.level) < logLevel(DEFAULT_LOGGER_LOG_LEVEL)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const p = `${formatLogPrefix(params.context)}[${new Date().toISOString()}] ${params.level.toUpperCase()}: `;
|
|
68
|
+
switch (params.level) {
|
|
69
|
+
case RestateLogLevel.TRACE:
|
|
70
|
+
return console.trace(p, message, ...optionalParams);
|
|
71
|
+
case RestateLogLevel.DEBUG:
|
|
72
|
+
return console.debug(p, message, ...optionalParams);
|
|
73
|
+
case RestateLogLevel.INFO:
|
|
74
|
+
return console.info(p, message, ...optionalParams);
|
|
75
|
+
case RestateLogLevel.WARN:
|
|
76
|
+
return console.warn(p, message, ...optionalParams);
|
|
77
|
+
case RestateLogLevel.ERROR:
|
|
78
|
+
return console.error(p, message, ...optionalParams);
|
|
79
|
+
default:
|
|
80
|
+
throw new TypeError(`unset or unknown log level ${params.level}`);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
function readRestateLogLevel() {
|
|
84
|
+
const env = globalThis.process?.env?.RESTATE_LOGGING;
|
|
85
|
+
const level = logLevelFromName(env);
|
|
86
|
+
if (level != null) {
|
|
87
|
+
return level;
|
|
88
|
+
}
|
|
89
|
+
return RestateLogLevel.INFO;
|
|
90
|
+
}
|
|
91
|
+
export class LoggerContext {
|
|
92
|
+
invocationId;
|
|
93
|
+
additionalContext;
|
|
94
|
+
fqMethodName;
|
|
95
|
+
constructor(invocationId, packageName, serviceName, handlerName, additionalContext) {
|
|
96
|
+
this.invocationId = invocationId;
|
|
97
|
+
this.additionalContext = additionalContext;
|
|
98
|
+
this.fqMethodName = packageName
|
|
99
|
+
? `${packageName}.${serviceName}/${handlerName}`
|
|
100
|
+
: `${serviceName}/${handlerName}`;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function formatLogPrefix(context) {
|
|
104
|
+
if (context === undefined) {
|
|
105
|
+
return "[restate] ";
|
|
106
|
+
}
|
|
107
|
+
let prefix = `[restate] [${context.fqMethodName}][${context.invocationId}]`;
|
|
108
|
+
if (context.additionalContext !== undefined) {
|
|
109
|
+
for (const [k, v] of Object.entries(context.additionalContext)) {
|
|
110
|
+
prefix = prefix + `[${k}: ${v}]`;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return prefix;
|
|
114
|
+
}
|
|
115
|
+
function loggerForLevel(logger, source, level, isReplaying, context) {
|
|
116
|
+
return {
|
|
117
|
+
get: () => {
|
|
118
|
+
return logger.bind(null, {
|
|
119
|
+
source,
|
|
120
|
+
level,
|
|
121
|
+
replaying: isReplaying(),
|
|
122
|
+
context,
|
|
123
|
+
});
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export var LogSource;
|
|
128
|
+
(function (LogSource) {
|
|
129
|
+
LogSource["SYSTEM"] = "SYSTEM";
|
|
130
|
+
LogSource["JOURNAL"] = "JOURNAL";
|
|
131
|
+
LogSource["USER"] = "USER";
|
|
132
|
+
})(LogSource || (LogSource = {}));
|
|
133
|
+
export function createRestateConsole(logger, source, context, isReplaying = () => false) {
|
|
134
|
+
const info = loggerForLevel(logger, source, RestateLogLevel.INFO, isReplaying, context);
|
|
135
|
+
return Object.create(console, {
|
|
136
|
+
trace: loggerForLevel(logger, source, RestateLogLevel.TRACE, isReplaying, context),
|
|
137
|
+
debug: loggerForLevel(logger, source, RestateLogLevel.DEBUG, isReplaying, context),
|
|
138
|
+
info,
|
|
139
|
+
log: info,
|
|
140
|
+
warn: loggerForLevel(logger, source, RestateLogLevel.WARN, isReplaying, context),
|
|
141
|
+
error: loggerForLevel(logger, source, RestateLogLevel.ERROR, isReplaying, context),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=logger.js.map
|