@sdkgen/node-runtime 0.0.0-dev.20210924122820 → 1.6.1

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.
@@ -18,19 +18,19 @@ const axios_1 = __importDefault(require("axios"));
18
18
  const form_data_1 = __importDefault(require("form-data"));
19
19
  const src_1 = require("../../src");
20
20
  const ast = new parser_1.Parser(`${__dirname}/api.sdkgen`).parse();
21
- (0, fs_1.writeFileSync)(`${__dirname}/api.ts`, (0, typescript_generator_1.generateNodeServerSource)(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
21
+ fs_1.writeFileSync(`${__dirname}/api.ts`, typescript_generator_1.generateNodeServerSource(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
22
22
  const { api, TestError } = require(`${__dirname}/api.ts`);
23
- (0, fs_1.unlinkSync)(`${__dirname}/api.ts`);
24
- api.fn.add = async ({ first, second }) => {
23
+ fs_1.unlinkSync(`${__dirname}/api.ts`);
24
+ api.fn.add = async (ctx, { first, second }) => {
25
25
  return `${first}${second}`;
26
26
  };
27
- api.fn.maybe = async ({ bin }) => {
27
+ api.fn.maybe = async (ctx, { bin }) => {
28
28
  return bin === null ? null : Buffer.from(bin, "hex");
29
29
  };
30
- api.fn.hex = async ({ bin }) => {
30
+ api.fn.hex = async (ctx, { bin }) => {
31
31
  return bin.toString("hex");
32
32
  };
33
- api.fn.obj = async ({ obj }) => {
33
+ api.fn.obj = async (ctx, { obj }) => {
34
34
  if (obj.val === 0) {
35
35
  throw new Error("Value is zero ~ Fatal");
36
36
  }
@@ -39,13 +39,13 @@ api.fn.obj = async ({ obj }) => {
39
39
  }
40
40
  return obj;
41
41
  };
42
- api.fn.returnArg = async ({ arg }) => {
42
+ api.fn.returnArg = async (ctx, { arg }) => {
43
43
  return arg;
44
44
  };
45
45
  api.fn.returnNoArg = async () => {
46
46
  return "no-arg";
47
47
  };
48
- api.fn.returnArgConcat = async ({ arg, arg2 }) => {
48
+ api.fn.returnArgConcat = async (ctx, { arg, arg2 }) => {
49
49
  return `${arg}${arg2}`;
50
50
  };
51
51
  async function readAllStream(stream) {
@@ -56,8 +56,8 @@ async function readAllStream(stream) {
56
56
  stream.on("end", () => resolve(Buffer.concat(chunks)));
57
57
  });
58
58
  }
59
- api.fn.uploadFile = async () => {
60
- return Promise.all((0, src_1.useSdkgenContext)().request.files.map(async ({ name, contents }) => ({
59
+ api.fn.uploadFile = async (ctx) => {
60
+ return Promise.all(ctx.request.files.map(async ({ name, contents }) => ({
61
61
  data: await readAllStream(contents),
62
62
  name,
63
63
  })));
@@ -68,9 +68,9 @@ api.fn.getHtml = async () => {
68
68
  api.fn.getXml = async () => {
69
69
  return "<h1>Hello world!</h1>";
70
70
  };
71
- (0, fs_1.writeFileSync)(`${__dirname}/nodeClient.ts`, (0, typescript_generator_1.generateNodeClientSource)(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
71
+ fs_1.writeFileSync(`${__dirname}/nodeClient.ts`, typescript_generator_1.generateNodeClientSource(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
72
72
  const { ApiClient: NodeApiClient } = require(`${__dirname}/nodeClient.ts`);
73
- (0, fs_1.unlinkSync)(`${__dirname}/nodeClient.ts`);
73
+ fs_1.unlinkSync(`${__dirname}/nodeClient.ts`);
74
74
  const nodeClient = new NodeApiClient("http://localhost:8001");
75
75
  const server = new src_1.SdkgenHttpServer(api, {});
76
76
  describe("Rest API", () => {
@@ -13,15 +13,15 @@ const parser_1 = require("@sdkgen/parser");
13
13
  const typescript_generator_1 = require("@sdkgen/typescript-generator");
14
14
  const src_1 = require("../../src");
15
15
  const ast = new parser_1.Parser(`${__dirname}/api.sdkgen`).parse();
16
- (0, fs_1.writeFileSync)(`${__dirname}/errors-api.ts`, (0, typescript_generator_1.generateNodeServerSource)(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
16
+ fs_1.writeFileSync(`${__dirname}/errors-api.ts`, typescript_generator_1.generateNodeServerSource(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
17
17
  const { api, CustomError } = require(`${__dirname}/errors-api.ts`);
18
- (0, fs_1.unlinkSync)(`${__dirname}/errors-api.ts`);
19
- api.fn.throwCustomError = async (args) => {
18
+ fs_1.unlinkSync(`${__dirname}/errors-api.ts`);
19
+ api.fn.throwCustomError = async (ctx, args) => {
20
20
  throw new CustomError("Some message", args);
21
21
  };
22
- (0, fs_1.writeFileSync)(`${__dirname}/errors-nodeClient.ts`, (0, typescript_generator_1.generateNodeClientSource)(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
22
+ fs_1.writeFileSync(`${__dirname}/errors-nodeClient.ts`, typescript_generator_1.generateNodeClientSource(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
23
23
  const { ApiClient: NodeApiClient } = require(`${__dirname}/errors-nodeClient.ts`);
24
- (0, fs_1.unlinkSync)(`${__dirname}/errors-nodeClient.ts`);
24
+ fs_1.unlinkSync(`${__dirname}/errors-nodeClient.ts`);
25
25
  const nodeClient = new NodeApiClient("http://localhost:35437");
26
26
  const server = new src_1.SdkgenHttpServer(api, {});
27
27
  describe("Errors", () => {
@@ -13,18 +13,18 @@ const parser_1 = require("@sdkgen/parser");
13
13
  const typescript_generator_1 = require("@sdkgen/typescript-generator");
14
14
  const src_1 = require("../../src");
15
15
  const ast = new parser_1.Parser(`${__dirname}/api.sdkgen`).parse();
16
- (0, fs_1.writeFileSync)(`${__dirname}/middleware-api.ts`, (0, typescript_generator_1.generateNodeServerSource)(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
16
+ fs_1.writeFileSync(`${__dirname}/middleware-api.ts`, typescript_generator_1.generateNodeServerSource(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
17
17
  const { api } = require(`${__dirname}/middleware-api.ts`);
18
- (0, fs_1.unlinkSync)(`${__dirname}/middleware-api.ts`);
19
- api.fn.identity = async (args) => {
18
+ fs_1.unlinkSync(`${__dirname}/middleware-api.ts`);
19
+ api.fn.identity = async (_ctx, args) => {
20
20
  return args.value;
21
21
  };
22
- api.fn.sum = async (args) => {
22
+ api.fn.sum = async (_ctx, args) => {
23
23
  return args.a + args.b;
24
24
  };
25
- (0, fs_1.writeFileSync)(`${__dirname}/middleware-nodeClient.ts`, (0, typescript_generator_1.generateNodeClientSource)(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
25
+ fs_1.writeFileSync(`${__dirname}/middleware-nodeClient.ts`, typescript_generator_1.generateNodeClientSource(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
26
26
  const { ApiClient: NodeApiClient } = require(`${__dirname}/middleware-nodeClient.ts`);
27
- (0, fs_1.unlinkSync)(`${__dirname}/middleware-nodeClient.ts`);
27
+ fs_1.unlinkSync(`${__dirname}/middleware-nodeClient.ts`);
28
28
  const nodeClient = new NodeApiClient("http://localhost:32542");
29
29
  const server = new src_1.SdkgenHttpServer(api, {});
30
30
  describe("Middleware", () => {
@@ -51,6 +51,24 @@ describe("Middleware", () => {
51
51
  expect(await nodeClient.identity(null, { value: 3 })).toBe(3);
52
52
  api.middlewares.pop();
53
53
  });
54
+ test("onRequestStart still work as expected", async () => {
55
+ const previous = api.hook.onRequestStart;
56
+ expect(await nodeClient.identity(null, { value: 1 })).toBe(1);
57
+ expect(await nodeClient.identity(null, { value: 2 })).toBe(2);
58
+ expect(await nodeClient.identity(null, { value: 3 })).toBe(3);
59
+ api.hook.onRequestStart = async (ctx) => {
60
+ if (ctx.request.args.value === 2) {
61
+ return {
62
+ result: 17,
63
+ };
64
+ }
65
+ return null;
66
+ };
67
+ expect(await nodeClient.identity(null, { value: 1 })).toBe(1);
68
+ expect(await nodeClient.identity(null, { value: 2 })).toBe(17);
69
+ expect(await nodeClient.identity(null, { value: 3 })).toBe(3);
70
+ api.hook.onRequestStart = previous;
71
+ });
54
72
  test("Multiple middlewares stack", async () => {
55
73
  expect(await nodeClient.identity(null, { value: 1 })).toBe(1);
56
74
  expect(await nodeClient.identity(null, { value: 2 })).toBe(2);
@@ -99,14 +99,14 @@ class ApiClient {
99
99
  }
100
100
  catch (e) {
101
101
  console.error(e);
102
- reject({ type: "Fatal", message: `${e}` });
102
+ reject({ type: "Fatal", message: e.toString() });
103
103
  }
104
104
  }
105
105
  catch (e) {
106
106
  console.error(e);
107
107
  reject({
108
108
  type: "BadFormattedResponse",
109
- message: `Response couldn't be parsed as JSON (${data}):\n${e}`,
109
+ message: `Response couldn't be parsed as JSON (${data}):\n${e.toString()}`,
110
110
  });
111
111
  }
112
112
  });
@@ -18,19 +18,19 @@ const typescript_generator_1 = require("@sdkgen/typescript-generator");
18
18
  const axios_1 = __importDefault(require("axios"));
19
19
  const src_1 = require("../../src");
20
20
  const ast = new parser_1.Parser(`${__dirname}/api.sdkgen`).parse();
21
- (0, fs_1.writeFileSync)(`${__dirname}/api.ts`, (0, typescript_generator_1.generateNodeServerSource)(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
21
+ fs_1.writeFileSync(`${__dirname}/api.ts`, typescript_generator_1.generateNodeServerSource(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
22
22
  const { api, SomeError } = require(`${__dirname}/api.ts`);
23
- (0, fs_1.unlinkSync)(`${__dirname}/api.ts`);
23
+ fs_1.unlinkSync(`${__dirname}/api.ts`);
24
24
  let lastCallCtx = null;
25
- api.fn.getUser = async ({ id }) => {
26
- lastCallCtx = (0, src_1.useSdkgenContext)();
25
+ api.fn.getUser = async (ctx, { id }) => {
26
+ lastCallCtx = ctx;
27
27
  return {
28
28
  age: 1,
29
29
  name: id,
30
30
  };
31
31
  };
32
- api.fn.identity = async ({ types }) => {
33
- lastCallCtx = (0, src_1.useSdkgenContext)();
32
+ api.fn.identity = async (ctx, { types }) => {
33
+ lastCallCtx = ctx;
34
34
  return types;
35
35
  };
36
36
  api.fn.throwsError = async () => {
@@ -39,9 +39,9 @@ api.fn.throwsError = async () => {
39
39
  // ExecSync(`../../cubos/sdkgen/sdkgen ${__dirname + "/api.sdkgen"} -o ${__dirname + "/legacyNodeClient.ts"} -t typescript_nodeclient`);
40
40
  const { ApiClient: NodeLegacyApiClient } = require(`${__dirname}/legacyNodeClient.ts`);
41
41
  const nodeLegacyClient = new NodeLegacyApiClient("http://localhost:34367");
42
- (0, fs_1.writeFileSync)(`${__dirname}/nodeClient.ts`, (0, typescript_generator_1.generateNodeClientSource)(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
42
+ fs_1.writeFileSync(`${__dirname}/nodeClient.ts`, typescript_generator_1.generateNodeClientSource(ast).replace(/@sdkgen\/node-runtime/gu, "../../src"));
43
43
  const { ApiClient: NodeApiClient } = require(`${__dirname}/nodeClient.ts`);
44
- (0, fs_1.unlinkSync)(`${__dirname}/nodeClient.ts`);
44
+ fs_1.unlinkSync(`${__dirname}/nodeClient.ts`);
45
45
  const nodeClient = new NodeApiClient("http://localhost:34367");
46
46
  const server = new src_1.SdkgenHttpServer(api, { aaa: true });
47
47
  describe("Simple API", () => {
@@ -56,7 +56,7 @@ describe("Simple API", () => {
56
56
  await expect(axios_1.default.get("http://localhost:34367/egesg")).rejects.toThrowError();
57
57
  });
58
58
  test("Can get ast.json at runtime", async () => {
59
- expect(await axios_1.default.get("http://localhost:34367/ast.json")).toMatchObject({ data: (0, parser_1.astToJson)(ast) });
59
+ expect(await axios_1.default.get("http://localhost:34367/ast.json")).toMatchObject({ data: parser_1.astToJson(ast) });
60
60
  server.introspection = false;
61
61
  await expect(axios_1.default.get("http://localhost:34367/ast.json")).rejects.toThrowError();
62
62
  });
@@ -77,7 +77,7 @@ describe("Simple API", () => {
77
77
  arrayOfOptionals: [1, null, 3],
78
78
  base64: "SGVsbG8K",
79
79
  bool: true,
80
- bytes: (0, crypto_1.randomBytes)(23),
80
+ bytes: crypto_1.randomBytes(23),
81
81
  date: new Date(2019, 12, 3),
82
82
  datetime: new Date(),
83
83
  enum: "aa",
@@ -5,108 +5,108 @@ Object.defineProperty(exports, "__esModule", { value: true });
5
5
  const src_1 = require("../src");
6
6
  describe("Encode/Decode", () => {
7
7
  test("Process CPF", () => {
8
- expect((0, src_1.encode)({}, "", "cpf", "067.183.145-36")).toBe("06718314536");
9
- expect((0, src_1.decode)({}, "", "cpf", "06718314536")).toBe("067.183.145-36");
8
+ expect(src_1.encode({}, "", "cpf", "067.183.145-36")).toBe("06718314536");
9
+ expect(src_1.decode({}, "", "cpf", "06718314536")).toBe("067.183.145-36");
10
10
  expect(() => {
11
- (0, src_1.encode)({}, "", "cpf", "067.183.145-35");
11
+ src_1.encode({}, "", "cpf", "067.183.145-35");
12
12
  }).toThrow();
13
13
  expect(() => {
14
- (0, src_1.decode)({}, "", "cpf", "06718314535");
14
+ src_1.decode({}, "", "cpf", "06718314535");
15
15
  }).toThrow();
16
16
  });
17
17
  test("Process CNPJ", () => {
18
- expect((0, src_1.encode)({}, "", "cnpj", "18.571.767/0001-36")).toBe("18571767000136");
19
- expect((0, src_1.decode)({}, "", "cnpj", "18571767000136")).toBe("18.571.767/0001-36");
18
+ expect(src_1.encode({}, "", "cnpj", "18.571.767/0001-36")).toBe("18571767000136");
19
+ expect(src_1.decode({}, "", "cnpj", "18571767000136")).toBe("18.571.767/0001-36");
20
20
  expect(() => {
21
- (0, src_1.encode)({}, "", "cnpj", "18.571.767/0001-35");
21
+ src_1.encode({}, "", "cnpj", "18.571.767/0001-35");
22
22
  }).toThrow();
23
23
  expect(() => {
24
- (0, src_1.decode)({}, "", "cnpj", "18571767000135");
24
+ src_1.decode({}, "", "cnpj", "18571767000135");
25
25
  }).toThrow();
26
26
  });
27
27
  test("Process URL", () => {
28
- expect((0, src_1.encode)({}, "", "url", "https://cubos.io/")).toBe("https://cubos.io/");
29
- expect((0, src_1.decode)({}, "", "url", "https://cubos.io/")).toBe("https://cubos.io/");
30
- expect((0, src_1.encode)({}, "", "url", " https:cubos.io/ ")).toBe("https://cubos.io/");
31
- expect((0, src_1.encode)({}, "", "url", " https:cubos.io ")).toBe("https://cubos.io/");
28
+ expect(src_1.encode({}, "", "url", "https://cubos.io/")).toBe("https://cubos.io/");
29
+ expect(src_1.decode({}, "", "url", "https://cubos.io/")).toBe("https://cubos.io/");
30
+ expect(src_1.encode({}, "", "url", " https:cubos.io/ ")).toBe("https://cubos.io/");
31
+ expect(src_1.encode({}, "", "url", " https:cubos.io ")).toBe("https://cubos.io/");
32
32
  expect(() => {
33
- (0, src_1.encode)({}, "", "url", "dfbdfb");
33
+ src_1.encode({}, "", "url", "dfbdfb");
34
34
  }).toThrow();
35
35
  expect(() => {
36
- (0, src_1.decode)({}, "", "url", "hhh.com");
36
+ src_1.decode({}, "", "url", "hhh.com");
37
37
  }).toThrow();
38
38
  });
39
39
  test("Process Base64", () => {
40
- expect((0, src_1.encode)({}, "", "base64", "c3VyZS4=")).toBe("c3VyZS4=");
41
- expect((0, src_1.encode)({}, "", "base64", "")).toBe("");
40
+ expect(src_1.encode({}, "", "base64", "c3VyZS4=")).toBe("c3VyZS4=");
41
+ expect(src_1.encode({}, "", "base64", "")).toBe("");
42
42
  expect(() => {
43
- (0, src_1.encode)({}, "", "base64", "c3VyZS4");
43
+ src_1.encode({}, "", "base64", "c3VyZS4");
44
44
  }).toThrow();
45
45
  expect(() => {
46
- (0, src_1.encode)({}, "", "base64", " c3VyZS4=");
46
+ src_1.encode({}, "", "base64", " c3VyZS4=");
47
47
  }).toThrow();
48
- expect((0, src_1.decode)({}, "", "base64", "c3VyZS4=")).toBe("c3VyZS4=");
49
- expect((0, src_1.decode)({}, "", "base64", "")).toBe("");
48
+ expect(src_1.decode({}, "", "base64", "c3VyZS4=")).toBe("c3VyZS4=");
49
+ expect(src_1.decode({}, "", "base64", "")).toBe("");
50
50
  expect(() => {
51
- (0, src_1.decode)({}, "", "base64", "c3VyZS4");
51
+ src_1.decode({}, "", "base64", "c3VyZS4");
52
52
  }).toThrow();
53
53
  expect(() => {
54
- (0, src_1.decode)({}, "", "base64", " c3VyZS4=");
54
+ src_1.decode({}, "", "base64", " c3VyZS4=");
55
55
  }).toThrow();
56
56
  });
57
57
  test("Process Date", () => {
58
- expect((0, src_1.encode)({}, "", "date", new Date("2020-11-10T00:00:00Z"))).toBe("2020-11-10");
59
- expect((0, src_1.encode)({}, "", "date", new Date("2020-11-10T15:34:50Z"))).toBe("2020-11-10");
60
- expect((0, src_1.encode)({}, "", "date", "2020-11-10")).toBe("2020-11-10");
58
+ expect(src_1.encode({}, "", "date", new Date("2020-11-10T00:00:00Z"))).toBe("2020-11-10");
59
+ expect(src_1.encode({}, "", "date", new Date("2020-11-10T15:34:50Z"))).toBe("2020-11-10");
60
+ expect(src_1.encode({}, "", "date", "2020-11-10")).toBe("2020-11-10");
61
61
  expect(() => {
62
- (0, src_1.encode)({}, "", "date", "2020-11-10T15:34:50Z");
62
+ src_1.encode({}, "", "date", "2020-11-10T15:34:50Z");
63
63
  }).toThrow();
64
64
  expect(() => {
65
- (0, src_1.encode)({}, "", "date", "hello world");
65
+ src_1.encode({}, "", "date", "hello world");
66
66
  }).toThrow();
67
67
  expect(() => {
68
- (0, src_1.decode)({}, "", "date", "2020-02-30");
68
+ src_1.decode({}, "", "date", "2020-02-30");
69
69
  }).toThrow();
70
70
  expect(() => {
71
- (0, src_1.encode)({}, "", "date", new Date(""));
71
+ src_1.encode({}, "", "date", new Date(""));
72
72
  }).toThrow();
73
73
  });
74
74
  test("Process Datetime", () => {
75
- expect((0, src_1.encode)({}, "", "datetime", new Date("2020-11-10T15:34:50Z"))).toBe("2020-11-10T15:34:50.000");
76
- expect((0, src_1.encode)({}, "", "datetime", "2020-11-10T15:34:50Z")).toBe("2020-11-10T15:34:50.000");
77
- expect((0, src_1.encode)({}, "", "datetime", "2020-11-10T15:34:50.999")).toBe("2020-11-10T15:34:50.999");
78
- expect((0, src_1.encode)({}, "", "datetime", "2020-11-10T15:34:50+01:00")).toBe("2020-11-10T14:34:50.000");
79
- expect((0, src_1.encode)({}, "", "datetime", "2020-11-10T15:34:50.999+01:00")).toBe("2020-11-10T14:34:50.999");
75
+ expect(src_1.encode({}, "", "datetime", new Date("2020-11-10T15:34:50Z"))).toBe("2020-11-10T15:34:50.000");
76
+ expect(src_1.encode({}, "", "datetime", "2020-11-10T15:34:50Z")).toBe("2020-11-10T15:34:50.000");
77
+ expect(src_1.encode({}, "", "datetime", "2020-11-10T15:34:50.999")).toBe("2020-11-10T15:34:50.999");
78
+ expect(src_1.encode({}, "", "datetime", "2020-11-10T15:34:50+01:00")).toBe("2020-11-10T14:34:50.000");
79
+ expect(src_1.encode({}, "", "datetime", "2020-11-10T15:34:50.999+01:00")).toBe("2020-11-10T14:34:50.999");
80
80
  expect(() => {
81
- (0, src_1.encode)({}, "", "datetime", "2020-11-10");
81
+ src_1.encode({}, "", "datetime", "2020-11-10");
82
82
  }).toThrow();
83
83
  expect(() => {
84
- (0, src_1.encode)({}, "", "datetime", "hello world");
84
+ src_1.encode({}, "", "datetime", "hello world");
85
85
  }).toThrow();
86
86
  expect(() => {
87
- (0, src_1.encode)({}, "", "datetime", "2020-11-10T15:34:50.999$01:00");
87
+ src_1.encode({}, "", "datetime", "2020-11-10T15:34:50.999$01:00");
88
88
  }).toThrow();
89
89
  expect(() => {
90
- (0, src_1.decode)({}, "", "datetime", "2020-11-10T15:34:50.999$01:00");
90
+ src_1.decode({}, "", "datetime", "2020-11-10T15:34:50.999$01:00");
91
91
  }).toThrow();
92
- expect((0, src_1.decode)({}, "", "datetime", "2020-11-10T15:34:50Z").getTime()).toBe(new Date("2020-11-10T15:34:50Z").getTime());
93
- expect((0, src_1.decode)({}, "", "datetime", "2020-11-10T15:34:50.000").getTime()).toBe(new Date("2020-11-10T15:34:50Z").getTime());
92
+ expect(src_1.decode({}, "", "datetime", "2020-11-10T15:34:50Z").getTime()).toBe(new Date("2020-11-10T15:34:50Z").getTime());
93
+ expect(src_1.decode({}, "", "datetime", "2020-11-10T15:34:50.000").getTime()).toBe(new Date("2020-11-10T15:34:50Z").getTime());
94
94
  expect(() => {
95
- (0, src_1.encode)({}, "", "datetime", new Date(""));
95
+ src_1.encode({}, "", "datetime", new Date(""));
96
96
  }).toThrow();
97
97
  });
98
98
  test("Process BigInt", () => {
99
- expect((0, src_1.encode)({}, "", "bigint", BigInt(10))).toBe("10");
99
+ expect(src_1.encode({}, "", "bigint", BigInt(10))).toBe("10");
100
100
  expect(() => {
101
- (0, src_1.encode)({}, "", "bigint", 10);
101
+ src_1.encode({}, "", "bigint", 10);
102
102
  }).toThrow();
103
103
  expect(() => {
104
- (0, src_1.encode)({}, "", "bigint", "10");
104
+ src_1.encode({}, "", "bigint", "10");
105
105
  }).toThrow();
106
- expect((0, src_1.decode)({}, "", "bigint", 10)).toBe(BigInt(10));
107
- expect((0, src_1.decode)({}, "", "bigint", "10")).toBe(BigInt(10));
106
+ expect(src_1.decode({}, "", "bigint", 10)).toBe(BigInt(10));
107
+ expect(src_1.decode({}, "", "bigint", "10")).toBe(BigInt(10));
108
108
  expect(() => {
109
- (0, src_1.decode)({}, "", "bigint", "hello world");
109
+ src_1.decode({}, "", "bigint", "hello world");
110
110
  }).toThrow();
111
111
  });
112
112
  });
@@ -3,11 +3,23 @@ import type { Context, ContextReply } from "./context";
3
3
  import type { DeepReadonly } from "./utils";
4
4
  declare type Middleware<ExtraContextT> = (ctx: Context & ExtraContextT, next: () => Promise<ContextReply>) => Promise<ContextReply>;
5
5
  export declare abstract class BaseApiConfig<ExtraContextT = unknown> {
6
+ constructor();
6
7
  private _ast;
7
8
  get ast(): AstRoot;
8
9
  astJson: DeepReadonly<AstJson>;
9
10
  fn: {
10
- [name: string]: ((args: any) => Promise<any>) | undefined;
11
+ [name: string]: ((ctx: Context & ExtraContextT, args: any) => Promise<any>) | undefined;
12
+ };
13
+ err: {
14
+ [name: string]: (message?: string) => never;
15
+ };
16
+ hook: {
17
+ /** @deprecated Use server.registerHealthCheck() instead. */
18
+ onHealthCheck(): Promise<boolean>;
19
+ /** @deprecated Use middlewares with api.use() instead. */
20
+ onRequestEnd(ctx: Context & ExtraContextT, reply: ContextReply): Promise<null | ContextReply>;
21
+ /** @deprecated Use middlewares with api.use() instead. */
22
+ onRequestStart(ctx: Context & ExtraContextT): Promise<null | ContextReply>;
11
23
  };
12
24
  readonly middlewares: Array<Middleware<ExtraContextT>>;
13
25
  use(middleware: Middleware<ExtraContextT>): void;
@@ -5,11 +5,22 @@ const parser_1 = require("@sdkgen/parser");
5
5
  class BaseApiConfig {
6
6
  constructor() {
7
7
  this.fn = {};
8
+ this.err = {};
9
+ this.hook = {
10
+ onHealthCheck: async () => Promise.resolve(true),
11
+ onRequestEnd: async () => Promise.resolve(null),
12
+ onRequestStart: async () => Promise.resolve(null),
13
+ };
8
14
  this.middlewares = [];
15
+ this.use(async (ctx, next) => {
16
+ var _a, _b;
17
+ const reply = (_a = (await this.hook.onRequestStart(ctx))) !== null && _a !== void 0 ? _a : (await next());
18
+ return (_b = (await this.hook.onRequestEnd(ctx, reply))) !== null && _b !== void 0 ? _b : reply;
19
+ });
9
20
  }
10
21
  get ast() {
11
22
  var _a;
12
- return ((_a = this._ast) !== null && _a !== void 0 ? _a : (this._ast = (0, parser_1.jsonToAst)(this.astJson)));
23
+ return ((_a = this._ast) !== null && _a !== void 0 ? _a : (this._ast = parser_1.jsonToAst(this.astJson)));
13
24
  }
14
25
  use(middleware) {
15
26
  this.middlewares.push(middleware);
@@ -191,7 +191,6 @@ function encode(typeTable, path, type, value) {
191
191
  return (typeof value === "string" ? new Date(value) : value).toISOString().replace("Z", "");
192
192
  }
193
193
  else {
194
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
195
194
  const resolved = typeTable[type];
196
195
  if (resolved) {
197
196
  return encode(typeTable, path, resolved, value);
@@ -283,7 +282,6 @@ function decode(typeTable, path, type, value) {
283
282
  return new Date(`${value.endsWith("Z") ? value : value.concat("Z")}`);
284
283
  }
285
284
  else {
286
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion
287
285
  const resolved = typeTable[type];
288
286
  if (resolved) {
289
287
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.executeRequest = void 0;
4
4
  const parser_1 = require("@sdkgen/parser");
5
- const context_storage_1 = require("./context-storage");
6
5
  const encode_decode_1 = require("./encode-decode");
7
6
  const error_1 = require("./error");
8
7
  const utils_1 = require("./utils");
@@ -15,9 +14,9 @@ async function executeRequest(ctx, apiConfig) {
15
14
  if (!functionDescription || !functionImplementation) {
16
15
  throw new error_1.Fatal(`Function does not exist: ${ctx.request.name}`);
17
16
  }
18
- const args = (0, encode_decode_1.decode)(apiConfig.astJson.typeTable, `${ctx.request.name}.args`, functionDescription.args, ctx.request.args);
19
- const ret = await context_storage_1.contextStorage.run(ctx, async () => functionImplementation(args));
20
- const encodedRet = (0, encode_decode_1.encode)(apiConfig.astJson.typeTable, `${ctx.request.name}.ret`, functionDescription.ret, ret);
17
+ const args = encode_decode_1.decode(apiConfig.astJson.typeTable, `${ctx.request.name}.args`, functionDescription.args, ctx.request.args);
18
+ const ret = await functionImplementation(ctx, args);
19
+ const encodedRet = encode_decode_1.encode(apiConfig.astJson.typeTable, `${ctx.request.name}.ret`, functionDescription.ret, ret);
21
20
  return { result: encodedRet };
22
21
  }
23
22
  catch (error) {
@@ -44,7 +43,7 @@ async function executeRequest(ctx, apiConfig) {
44
43
  const allowedErrors = functionAst.annotations.filter(ann => ann instanceof parser_1.ThrowsAnnotation).map(ann => ann.error);
45
44
  if (typeof reply.error !== "object" ||
46
45
  reply.error === null ||
47
- !(0, utils_1.has)(reply.error, "type") ||
46
+ !utils_1.has(reply.error, "type") ||
48
47
  typeof reply.error.type !== "string" ||
49
48
  (allowedErrors.length > 0 && !allowedErrors.includes(reply.error.type)) ||
50
49
  !apiConfig.astJson.errors.map(error => (typeof error === "string" ? error : error[0])).includes(reply.error.type)) {
@@ -12,6 +12,6 @@ export declare class SdkgenHttpClient {
12
12
  private baseUrl;
13
13
  extra: Map<string, unknown>;
14
14
  constructor(baseUrl: string, astJson: DeepReadonly<AstJson>, errClasses: ErrClasses);
15
- makeRequest(ctxArg: PartialDeep<Context> | null, functionName: string, args: unknown): Promise<any>;
15
+ makeRequest(ctx: PartialDeep<Context> | null, functionName: string, args: unknown): Promise<any>;
16
16
  }
17
17
  export {};
@@ -1,7 +1,4 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.SdkgenHttpClient = void 0;
7
4
  /* eslint-disable prefer-promise-reject-errors */
@@ -10,8 +7,6 @@ const http_1 = require("http");
10
7
  const https_1 = require("https");
11
8
  const os_1 = require("os");
12
9
  const url_1 = require("url");
13
- const deepmerge_1 = __importDefault(require("deepmerge"));
14
- const context_storage_1 = require("./context-storage");
15
10
  const encode_decode_1 = require("./encode-decode");
16
11
  const utils_1 = require("./utils");
17
12
  class SdkgenHttpClient {
@@ -21,18 +16,9 @@ class SdkgenHttpClient {
21
16
  this.extra = new Map();
22
17
  this.baseUrl = new url_1.URL(baseUrl);
23
18
  }
24
- async makeRequest(ctxArg, functionName, args) {
25
- var _a, _b, _c, _d;
19
+ async makeRequest(ctx, functionName, args) {
20
+ var _a, _b;
26
21
  const func = this.astJson.functionTable[functionName];
27
- let ctx = {};
28
- if (ctxArg) {
29
- try {
30
- ctx = (0, deepmerge_1.default)((0, context_storage_1.useSdkgenContext)(), ctxArg);
31
- }
32
- catch (_e) {
33
- ctx = Object.assign({}, ctxArg);
34
- }
35
- }
36
22
  if (!func) {
37
23
  throw new Error(`Unknown function ${functionName}`);
38
24
  }
@@ -41,11 +27,11 @@ class SdkgenHttpClient {
41
27
  extra[key] = value;
42
28
  }
43
29
  const requestBody = JSON.stringify({
44
- args: (0, encode_decode_1.encode)(this.astJson.typeTable, `${functionName}.args`, func.args, args),
45
- deviceInfo: (_b = (_a = ctx.request) === null || _a === void 0 ? void 0 : _a.deviceInfo) !== null && _b !== void 0 ? _b : { id: (0, os_1.hostname)(), type: "node" },
46
- extra: Object.assign(Object.assign({}, extra), (_c = ctx.request) === null || _c === void 0 ? void 0 : _c.extra),
30
+ args: encode_decode_1.encode(this.astJson.typeTable, `${functionName}.args`, func.args, args),
31
+ deviceInfo: ((_a = ctx === null || ctx === void 0 ? void 0 : ctx.request) === null || _a === void 0 ? void 0 : _a.deviceInfo) ? ctx.request.deviceInfo : { id: os_1.hostname(), type: "node" },
32
+ extra: Object.assign(Object.assign({}, extra), ((ctx === null || ctx === void 0 ? void 0 : ctx.request) ? ctx.request.extra : {})),
47
33
  name: functionName,
48
- requestId: ((_d = ctx.request) === null || _d === void 0 ? void 0 : _d.id) ? ctx.request.id + (0, crypto_1.randomBytes)(6).toString("hex") : (0, crypto_1.randomBytes)(16).toString("hex"),
34
+ requestId: ((_b = ctx === null || ctx === void 0 ? void 0 : ctx.request) === null || _b === void 0 ? void 0 : _b.id) ? ctx.request.id + crypto_1.randomBytes(6).toString("hex") : crypto_1.randomBytes(16).toString("hex"),
49
35
  version: 3,
50
36
  });
51
37
  const options = {
@@ -66,11 +52,11 @@ class SdkgenHttpClient {
66
52
  res.on("end", () => {
67
53
  try {
68
54
  const response = JSON.parse(data);
69
- if ((0, utils_1.has)(response, "error") && response.error) {
55
+ if (utils_1.has(response, "error") && response.error) {
70
56
  reject(response.error);
71
57
  }
72
58
  else {
73
- resolve((0, utils_1.has)(response, "result") ? response.result : null);
59
+ resolve(utils_1.has(response, "result") ? response.result : null);
74
60
  }
75
61
  }
76
62
  catch (error) {
@@ -90,13 +76,13 @@ class SdkgenHttpClient {
90
76
  req.write(requestBody);
91
77
  req.end();
92
78
  }).catch(error => {
93
- if ((0, utils_1.has)(error, "type") && (0, utils_1.has)(error, "message") && typeof error.type === "string" && typeof error.message === "string") {
79
+ if (utils_1.has(error, "type") && utils_1.has(error, "message") && typeof error.type === "string" && typeof error.message === "string") {
94
80
  const errClass = this.errClasses[error.type];
95
81
  if (errClass) {
96
82
  const errorJson = this.astJson.errors.find(err => (Array.isArray(err) ? err[0] === error.type : err === error.type));
97
83
  if (errorJson) {
98
- if (Array.isArray(errorJson) && (0, utils_1.has)(error, "data")) {
99
- throw new errClass(error.message, (0, encode_decode_1.decode)(this.astJson.typeTable, `${errClass.name}.data`, errorJson[1], error.data));
84
+ if (Array.isArray(errorJson) && utils_1.has(error, "data")) {
85
+ throw new errClass(error.message, encode_decode_1.decode(this.astJson.typeTable, `${errClass.name}.data`, errorJson[1], error.data));
100
86
  }
101
87
  else {
102
88
  throw new errClass(error.message, undefined);
@@ -110,7 +96,7 @@ class SdkgenHttpClient {
110
96
  }
111
97
  });
112
98
  // eslint-disable-next-line @typescript-eslint/no-unsafe-return
113
- return (0, encode_decode_1.decode)(this.astJson.typeTable, `${functionName}.ret`, func.ret, encodedRet);
99
+ return encode_decode_1.decode(this.astJson.typeTable, `${functionName}.ret`, func.ret, encodedRet);
114
100
  }
115
101
  }
116
102
  exports.SdkgenHttpClient = SdkgenHttpClient;