@compassdigital/sdk.typescript 3.0.0-beta.9 → 3.0.0-rc.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.
Files changed (226) hide show
  1. package/README.md +121 -8
  2. package/bin/gen.js +484 -0
  3. package/bin/index.js +3 -0
  4. package/gen.ts +98 -40
  5. package/lib/base.d.ts +129 -9
  6. package/lib/base.d.ts.map +1 -1
  7. package/lib/base.js +276 -53
  8. package/lib/base.js.map +1 -1
  9. package/lib/index.d.ts +592 -337
  10. package/lib/index.d.ts.map +1 -1
  11. package/lib/index.js +317 -18
  12. package/lib/index.js.map +1 -1
  13. package/lib/interface/announcement.d.ts.map +1 -0
  14. package/lib/interface/announcement.js +4 -0
  15. package/lib/interface/announcement.js.map +1 -0
  16. package/lib/interface/brand.d.ts.map +1 -0
  17. package/lib/interface/brand.js +4 -0
  18. package/lib/interface/brand.js.map +1 -0
  19. package/lib/{calendar.d.ts → interface/calendar.d.ts} +4 -1
  20. package/lib/interface/calendar.d.ts.map +1 -0
  21. package/lib/interface/calendar.js +4 -0
  22. package/lib/interface/calendar.js.map +1 -0
  23. package/lib/interface/config.d.ts.map +1 -0
  24. package/lib/interface/config.js +4 -0
  25. package/lib/interface/config.js.map +1 -0
  26. package/lib/interface/datalake.d.ts.map +1 -0
  27. package/lib/interface/datalake.js +4 -0
  28. package/lib/interface/datalake.js.map +1 -0
  29. package/lib/interface/delivery.d.ts.map +1 -0
  30. package/lib/interface/delivery.js +4 -0
  31. package/lib/interface/delivery.js.map +1 -0
  32. package/lib/interface/dh.d.ts.map +1 -0
  33. package/lib/interface/dh.js +4 -0
  34. package/lib/interface/dh.js.map +1 -0
  35. package/lib/interface/email.d.ts +21 -0
  36. package/lib/interface/email.d.ts.map +1 -0
  37. package/lib/interface/email.js +4 -0
  38. package/lib/interface/email.js.map +1 -0
  39. package/lib/interface/file.d.ts.map +1 -0
  40. package/lib/interface/file.js +4 -0
  41. package/lib/interface/file.js.map +1 -0
  42. package/lib/{kds.d.ts → interface/kds.d.ts} +1 -0
  43. package/lib/interface/kds.d.ts.map +1 -0
  44. package/lib/interface/kds.js +4 -0
  45. package/lib/interface/kds.js.map +1 -0
  46. package/lib/{location.d.ts → interface/location.d.ts} +50 -20
  47. package/lib/interface/location.d.ts.map +1 -0
  48. package/lib/interface/location.js +4 -0
  49. package/lib/interface/location.js.map +1 -0
  50. package/lib/interface/logger.d.ts.map +1 -0
  51. package/lib/interface/logger.js +4 -0
  52. package/lib/interface/logger.js.map +1 -0
  53. package/lib/interface/loyalty.d.ts.map +1 -0
  54. package/lib/interface/loyalty.js +4 -0
  55. package/lib/interface/loyalty.js.map +1 -0
  56. package/lib/interface/mealplan.d.ts.map +1 -0
  57. package/lib/interface/mealplan.js +4 -0
  58. package/lib/interface/mealplan.js.map +1 -0
  59. package/lib/interface/menu.d.ts +448 -0
  60. package/lib/interface/menu.d.ts.map +1 -0
  61. package/lib/interface/menu.js +4 -0
  62. package/lib/interface/menu.js.map +1 -0
  63. package/lib/interface/message.d.ts.map +1 -0
  64. package/lib/interface/message.js +4 -0
  65. package/lib/interface/message.js.map +1 -0
  66. package/lib/{order.d.ts → interface/order.d.ts} +11 -4
  67. package/lib/interface/order.d.ts.map +1 -0
  68. package/lib/interface/order.js +4 -0
  69. package/lib/interface/order.js.map +1 -0
  70. package/lib/{partner.d.ts → interface/partner.d.ts} +243 -4
  71. package/lib/interface/partner.d.ts.map +1 -0
  72. package/lib/interface/partner.js +4 -0
  73. package/lib/interface/partner.js.map +1 -0
  74. package/lib/{payment.d.ts → interface/payment.d.ts} +1 -0
  75. package/lib/interface/payment.d.ts.map +1 -0
  76. package/lib/interface/payment.js +4 -0
  77. package/lib/interface/payment.js.map +1 -0
  78. package/lib/{promo.d.ts → interface/promo.d.ts} +1 -0
  79. package/lib/interface/promo.d.ts.map +1 -0
  80. package/lib/interface/promo.js +4 -0
  81. package/lib/interface/promo.js.map +1 -0
  82. package/lib/{report.d.ts → interface/report.d.ts} +2 -0
  83. package/lib/interface/report.d.ts.map +1 -0
  84. package/lib/interface/report.js +4 -0
  85. package/lib/interface/report.js.map +1 -0
  86. package/lib/interface/schedule.d.ts.map +1 -0
  87. package/lib/interface/schedule.js +4 -0
  88. package/lib/interface/schedule.js.map +1 -0
  89. package/lib/{shoppingcart.d.ts → interface/shoppingcart.d.ts} +10 -1
  90. package/lib/interface/shoppingcart.d.ts.map +1 -0
  91. package/lib/interface/shoppingcart.js +4 -0
  92. package/lib/interface/shoppingcart.js.map +1 -0
  93. package/lib/interface/task.d.ts.map +1 -0
  94. package/lib/interface/task.js +4 -0
  95. package/lib/interface/task.js.map +1 -0
  96. package/lib/{user.d.ts → interface/user.d.ts} +19 -0
  97. package/lib/interface/user.d.ts.map +1 -0
  98. package/lib/interface/user.js +4 -0
  99. package/lib/interface/user.js.map +1 -0
  100. package/lib/interface/vote.d.ts.map +1 -0
  101. package/lib/interface/vote.js +4 -0
  102. package/lib/interface/vote.js.map +1 -0
  103. package/manifest.json +4 -0
  104. package/package.json +15 -5
  105. package/src/base.ts +274 -43
  106. package/src/index.ts +1319 -764
  107. package/src/{announcement.ts → interface/announcement.ts} +2 -0
  108. package/src/{brand.ts → interface/brand.ts} +2 -0
  109. package/src/{calendar.ts → interface/calendar.ts} +7 -1
  110. package/src/{config.ts → interface/config.ts} +2 -0
  111. package/src/{datalake.ts → interface/datalake.ts} +2 -0
  112. package/src/{delivery.ts → interface/delivery.ts} +2 -0
  113. package/src/{dh.ts → interface/dh.ts} +2 -0
  114. package/src/interface/email.ts +30 -0
  115. package/src/{file.ts → interface/file.ts} +2 -0
  116. package/src/{kds.ts → interface/kds.ts} +4 -0
  117. package/src/{location.ts → interface/location.ts} +76 -35
  118. package/src/{logger.ts → interface/logger.ts} +2 -0
  119. package/src/{loyalty.ts → interface/loyalty.ts} +2 -0
  120. package/src/{mealplan.ts → interface/mealplan.ts} +2 -0
  121. package/src/interface/menu.ts +649 -0
  122. package/src/{message.ts → interface/message.ts} +2 -0
  123. package/src/{order.ts → interface/order.ts} +21 -6
  124. package/src/{partner.ts → interface/partner.ts} +291 -5
  125. package/src/{payment.ts → interface/payment.ts} +4 -0
  126. package/src/{promo.ts → interface/promo.ts} +3 -0
  127. package/src/{report.ts → interface/report.ts} +4 -0
  128. package/src/{schedule.ts → interface/schedule.ts} +2 -0
  129. package/src/{shoppingcart.ts → interface/shoppingcart.ts} +14 -1
  130. package/src/{task.ts → interface/task.ts} +2 -0
  131. package/src/{user.ts → interface/user.ts} +34 -1
  132. package/src/{vote.ts → interface/vote.ts} +2 -0
  133. package/template.ejs +3 -3
  134. package/test/client.test.ts +192 -0
  135. package/test/gen.test.ts +22 -0
  136. package/lib/announcement.d.ts.map +0 -1
  137. package/lib/announcement.js +0 -3
  138. package/lib/announcement.js.map +0 -1
  139. package/lib/brand.d.ts.map +0 -1
  140. package/lib/brand.js +0 -3
  141. package/lib/brand.js.map +0 -1
  142. package/lib/calendar.d.ts.map +0 -1
  143. package/lib/calendar.js +0 -3
  144. package/lib/calendar.js.map +0 -1
  145. package/lib/config.d.ts.map +0 -1
  146. package/lib/config.js +0 -3
  147. package/lib/config.js.map +0 -1
  148. package/lib/datalake.d.ts.map +0 -1
  149. package/lib/datalake.js +0 -3
  150. package/lib/datalake.js.map +0 -1
  151. package/lib/delivery.d.ts.map +0 -1
  152. package/lib/delivery.js +0 -3
  153. package/lib/delivery.js.map +0 -1
  154. package/lib/dh.d.ts.map +0 -1
  155. package/lib/dh.js +0 -3
  156. package/lib/dh.js.map +0 -1
  157. package/lib/email.d.ts +0 -5
  158. package/lib/email.d.ts.map +0 -1
  159. package/lib/email.js +0 -3
  160. package/lib/email.js.map +0 -1
  161. package/lib/file.d.ts.map +0 -1
  162. package/lib/file.js +0 -3
  163. package/lib/file.js.map +0 -1
  164. package/lib/kds.d.ts.map +0 -1
  165. package/lib/kds.js +0 -3
  166. package/lib/kds.js.map +0 -1
  167. package/lib/location.d.ts.map +0 -1
  168. package/lib/location.js +0 -3
  169. package/lib/location.js.map +0 -1
  170. package/lib/logger.d.ts.map +0 -1
  171. package/lib/logger.js +0 -3
  172. package/lib/logger.js.map +0 -1
  173. package/lib/loyalty.d.ts.map +0 -1
  174. package/lib/loyalty.js +0 -3
  175. package/lib/loyalty.js.map +0 -1
  176. package/lib/mealplan.d.ts.map +0 -1
  177. package/lib/mealplan.js +0 -3
  178. package/lib/mealplan.js.map +0 -1
  179. package/lib/message.d.ts.map +0 -1
  180. package/lib/message.js +0 -3
  181. package/lib/message.js.map +0 -1
  182. package/lib/order.d.ts.map +0 -1
  183. package/lib/order.js +0 -3
  184. package/lib/order.js.map +0 -1
  185. package/lib/partner.d.ts.map +0 -1
  186. package/lib/partner.js +0 -3
  187. package/lib/partner.js.map +0 -1
  188. package/lib/payment.d.ts.map +0 -1
  189. package/lib/payment.js +0 -3
  190. package/lib/payment.js.map +0 -1
  191. package/lib/promo.d.ts.map +0 -1
  192. package/lib/promo.js +0 -3
  193. package/lib/promo.js.map +0 -1
  194. package/lib/report.d.ts.map +0 -1
  195. package/lib/report.js +0 -3
  196. package/lib/report.js.map +0 -1
  197. package/lib/schedule.d.ts.map +0 -1
  198. package/lib/schedule.js +0 -3
  199. package/lib/schedule.js.map +0 -1
  200. package/lib/shoppingcart.d.ts.map +0 -1
  201. package/lib/shoppingcart.js +0 -3
  202. package/lib/shoppingcart.js.map +0 -1
  203. package/lib/task.d.ts.map +0 -1
  204. package/lib/task.js +0 -3
  205. package/lib/task.js.map +0 -1
  206. package/lib/user.d.ts.map +0 -1
  207. package/lib/user.js +0 -3
  208. package/lib/user.js.map +0 -1
  209. package/lib/vote.d.ts.map +0 -1
  210. package/lib/vote.js +0 -3
  211. package/lib/vote.js.map +0 -1
  212. package/src/email.ts +0 -4
  213. /package/lib/{announcement.d.ts → interface/announcement.d.ts} +0 -0
  214. /package/lib/{brand.d.ts → interface/brand.d.ts} +0 -0
  215. /package/lib/{config.d.ts → interface/config.d.ts} +0 -0
  216. /package/lib/{datalake.d.ts → interface/datalake.d.ts} +0 -0
  217. /package/lib/{delivery.d.ts → interface/delivery.d.ts} +0 -0
  218. /package/lib/{dh.d.ts → interface/dh.d.ts} +0 -0
  219. /package/lib/{file.d.ts → interface/file.d.ts} +0 -0
  220. /package/lib/{logger.d.ts → interface/logger.d.ts} +0 -0
  221. /package/lib/{loyalty.d.ts → interface/loyalty.d.ts} +0 -0
  222. /package/lib/{mealplan.d.ts → interface/mealplan.d.ts} +0 -0
  223. /package/lib/{message.d.ts → interface/message.d.ts} +0 -0
  224. /package/lib/{schedule.d.ts → interface/schedule.d.ts} +0 -0
  225. /package/lib/{task.d.ts → interface/task.d.ts} +0 -0
  226. /package/lib/{vote.d.ts → interface/vote.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/interface/user.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.js","sourceRoot":"","sources":["../../src/interface/user.ts"],"names":[],"mappings":";AAAA,sDAAsD"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vote.d.ts","sourceRoot":"","sources":["../../src/interface/vote.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,KAAK;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,IAAI;IAEnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;KACb,CAAC;IACF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,oBAAY,YAAY,GAAG,UAAU,CAAC;AAEtC,oBAAY,gBAAgB,GAAG,IAAI,CAAC;AAEpC,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,YAAY,CAAC;CACpB;AAID,MAAM,WAAW,eAAe;IAE9B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAE/B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,kBAAmB,SAAQ,gBAAgB,EAAE,eAAe;CAAG"}
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ // THIS FILE IS AUTOMATICALLY GENERATED, DO NOT MODIFY
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //# sourceMappingURL=vote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vote.js","sourceRoot":"","sources":["../../src/interface/vote.ts"],"names":[],"mappings":";AAAA,sDAAsD"}
package/manifest.json CHANGED
@@ -99,6 +99,10 @@
99
99
  {
100
100
  "name": "logger",
101
101
  "swagger": "https://api.compassdigital.org/dev/logger/swagger.json"
102
+ },
103
+ {
104
+ "name": "menu",
105
+ "swagger": "https://api.compassdigital.org/dev/menu/swagger.json"
102
106
  }
103
107
  ]
104
108
  }
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "@compassdigital/sdk.typescript",
3
- "version": "3.0.0-beta.9",
3
+ "version": "3.0.0-rc.1",
4
4
  "description": "Compass Digital Labs TypeScript SDK",
5
5
  "type": "commonjs",
6
+ "bin": "./bin/index.js",
6
7
  "main": "./lib/index.js",
7
8
  "types": "./lib/index.d.ts",
8
9
  "exports": {
@@ -19,10 +20,14 @@
19
20
  ]
20
21
  }
21
22
  },
23
+ "jest": {
24
+ "preset": "ts-jest",
25
+ "testEnvironment": "node"
26
+ },
22
27
  "scripts": {
23
- "test": "echo \"Error: no test specified\" && exit 1",
24
- "gen": "npx ts-node gen.ts && npx tsc",
25
- "prepare": "npx tsc"
28
+ "test": "jest",
29
+ "gen": "ts-node gen.ts --manifest ./manifest.json && tsc",
30
+ "prepare": "rimraf ./lib && tsc && tsc --esModuleInterop --outDir ./bin gen.ts"
26
31
  },
27
32
  "author": "",
28
33
  "license": "ISC",
@@ -32,10 +37,15 @@
32
37
  "devDependencies": {
33
38
  "@icholy/openapi-ts": "^2.5.1",
34
39
  "@types/ejs": "^3.1.0",
40
+ "@types/jest": "^27.0.1",
35
41
  "@types/node": "^16.7.2",
36
42
  "@types/prettier": "^2.3.2",
37
43
  "ejs": "^3.1.6",
44
+ "jest": "^27.1.0",
38
45
  "prettier": "^2.3.2",
39
- "ts-node": "^10.2.1"
46
+ "rimraf": "^3.0.2",
47
+ "ts-jest": "^27.0.5",
48
+ "ts-node": "^10.2.1",
49
+ "yargs": "^17.1.1"
40
50
  }
41
51
  }
package/src/base.ts CHANGED
@@ -15,18 +15,116 @@ export interface RequestOptions {
15
15
  // make requests against this base url
16
16
  // note: the stage property is ignored if base_url is set
17
17
  base_url?: string;
18
- // non-200 http status or error codes to allow.
19
- // when used, the returned value may be null.
20
- allow?: number[];
18
+ // intercept outgoing http requests
19
+ intercept?: InterceptFn;
21
20
  }
22
21
 
23
- export interface ServiceClientOptions extends Omit<RequestOptions, "allow"> {
24
- services?: Record<string, Omit<RequestOptions, "allow">>;
25
- methods?: Record<string, Omit<RequestOptions, "allow">>;
22
+ /**
23
+ * The request data provided to intercept
24
+ * functions.
25
+ */
26
+ export interface RequestData {
27
+ name: string;
28
+ service: string;
29
+ url: string;
30
+ method: string;
31
+ headers: Record<string, string>;
32
+ body?: string;
26
33
  }
27
34
 
28
- export type ResponseType<T, Options extends RequestOptions> = Promise<T | (Options["allow"] extends number[] ? null : never)>;
35
+ /**
36
+ * The response data expected from
37
+ * intercept functions.
38
+ */
39
+ export interface ResponseData {
40
+ ok: boolean;
41
+ status: number;
42
+ body: string;
43
+ err?: any; // network error
44
+ }
45
+
46
+ /**
47
+ * A function that performs an https request.
48
+ */
49
+ export type FetchFn = (req: RequestData) => Promise<ResponseData>;
50
+
51
+ /**
52
+ * A function that intercepts an http request and returns a response.
53
+ */
54
+ export type InterceptFn = (req: RequestData, fetch: FetchFn) => Promise<ResponseData>;
55
+
56
+ /**
57
+ * We have to re-implement the promise methods instead of just existing
58
+ * the existing Promise class due to: https://github.com/microsoft/TypeScript/issues/15202
59
+ */
60
+ export class ResponsePromise<T> implements Promise<T> {
61
+
62
+ /**
63
+ * Implements Promise interface.
64
+ */
65
+ [Symbol.toStringTag] = "[object ResponsePromise]";
66
+
67
+ constructor(private promise: Promise<T>) {}
68
+
69
+ /**
70
+ * Implements Promise interface.
71
+ */
72
+ then<TResult1 = T, TResult2 = never>(
73
+ onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
74
+ onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null
75
+ ): ResponsePromise<TResult1 | TResult2> {
76
+ return new ResponsePromise(this.promise.then(onfulfilled, onrejected));
77
+ }
78
+
79
+ /**
80
+ * Implements Promise interface.
81
+ */
82
+ catch<TResult = never>(
83
+ onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null
84
+ ): ResponsePromise<T | TResult> {
85
+ return new ResponsePromise(this.promise.catch(onrejected));
86
+ }
87
+
88
+ /**
89
+ * Implements Promise interface.
90
+ */
91
+ finally(onfinally?: (() => void) | null): ResponsePromise<T> {
92
+ return new ResponsePromise(this.promise.finally(onfinally));
93
+ }
94
+
95
+ /**
96
+ * Returns a promise that resolves to null if http status code
97
+ * or service error code matches one of the provided codes.
98
+ * If no codes are specified, all codes are ignored.
99
+ */
100
+ ignore(...codes: number[]): ResponsePromise<T | null> {
101
+ return new ResponsePromise(ServiceError.ignore(codes, this.promise));
102
+ }
29
103
 
104
+ /**
105
+ * Returns a promise that resolves to either the response body
106
+ * or a ServiceError.
107
+ */
108
+ combine(...codes: number[]): Promise<EitherResponse<T>> {
109
+ return new ResponsePromise(ServiceError.combine<T>(codes, this.promise));
110
+ }
111
+ }
112
+
113
+ /**
114
+ * Either a response body or a service error.
115
+ */
116
+ export type EitherResponse<T> = { ok: true; data: T; err: null } | { ok: false; data: null, err: ServiceError; };
117
+
118
+ /**
119
+ * This is a hack to make captureStackTrace visible.
120
+ */
121
+ interface ErrorConstructor {
122
+ captureStackTrace?(target: object, constructorOpt?: Function): void;
123
+ }
124
+
125
+ /**
126
+ * An error returned from an api service.
127
+ */
30
128
  export class ServiceError extends Error {
31
129
  constructor(
32
130
  public status: number, // http status
@@ -35,8 +133,15 @@ export class ServiceError extends Error {
35
133
  ) {
36
134
  super(message);
37
135
  this.name = `ServiceError(${code})`;
136
+
137
+ // TODO: remove this if we change compilation target > es5
138
+ Object.setPrototypeOf(this, ServiceError.prototype);
38
139
  }
39
140
 
141
+ /**
142
+ * Returns the http status code from err.
143
+ * If err isn't an instance of ServiceError, -1 is returned.
144
+ */
40
145
  static status(err: any): number {
41
146
  if (err instanceof ServiceError) {
42
147
  return err.status;
@@ -44,6 +149,10 @@ export class ServiceError extends Error {
44
149
  return -1;
45
150
  }
46
151
 
152
+ /**
153
+ * Returns the service error code from err.
154
+ * If err isn't an instance of ServiceError, -1 is returned.
155
+ */
47
156
  static code(err: any): number {
48
157
  if (err instanceof ServiceError) {
49
158
  return err.code;
@@ -51,24 +160,91 @@ export class ServiceError extends Error {
51
160
  return -1;
52
161
  }
53
162
 
54
- static from_res(res: Response, text: string): ServiceError {
55
- let message = text;
56
- let code = res.status;
163
+ /**
164
+ * Returns a promise that resolves to null if http status code
165
+ * or service error code matches one of the provided codes.
166
+ * If no codes are specified, all codes are ignored.
167
+ */
168
+ static async ignore<T>(codes: number[], response: Promise<T>): Promise<T | null> {
169
+ try {
170
+ return await response;
171
+ } catch (err) {
172
+ if (err instanceof ServiceError) {
173
+ if (codes.length === 0) {
174
+ return null;
175
+ }
176
+ for (const code of codes) {
177
+ if (err.status === code || err.code === code) {
178
+ return null;
179
+ }
180
+ }
181
+ }
182
+ throw err;
183
+ }
184
+ }
185
+
186
+ /**
187
+ * Returns a promise that resolves to either T or a ServiceError.
188
+ */
189
+ static async combine<T>(codes: number[], response: Promise<T>): Promise<EitherResponse<T>> {
57
190
  try {
58
- let data = JSON.parse(text);
59
- if (data.code && (data.message || data.error)) {
60
- code = data.code;
61
- message = data.message || data.error;
191
+ const data = await response;
192
+ return { ok: true, data, err: null };
193
+ } catch (err) {
194
+ if (err instanceof ServiceError) {
195
+ if (codes.length === 0) {
196
+ return { ok: false, data: null, err }
197
+ }
198
+ for (const code of codes) {
199
+ if (err.status === code || err.code === code) {
200
+ return { ok: false, data: null, err };
201
+ }
202
+ }
203
+ }
204
+ throw err;
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Constructs a ServiceError from the provided response data.
210
+ */
211
+ static from_res(res: ResponseData): ServiceError {
212
+ let message = res.body;
213
+ let code = res.status;
214
+ if (res.err) {
215
+ // network error
216
+ if (res.err instanceof Error) {
217
+ message = res.err.message;
218
+ } else {
219
+ message = "Network Error";
62
220
  }
63
- } catch (_) {}
64
- return new ServiceError(res.status, code, message);
221
+ code = 0;
222
+ } else {
223
+ try {
224
+ let data = JSON.parse(res.body);
225
+ if (data.code && (data.message || data.error)) {
226
+ code = data.code;
227
+ message = data.message || data.error;
228
+ }
229
+ } catch (_) {}
230
+ }
231
+ const err = new ServiceError(res.status, code, message);
232
+ // override the stack trace so that it doesn't include the from_res helper.
233
+ if (Error.captureStackTrace) {
234
+ Error.captureStackTrace(err, ServiceError.from_res);
235
+ }
236
+ return err;
65
237
  }
66
238
  }
67
239
 
240
+ /**
241
+ * BaseServiceClient contains the logic for executing http requests.
242
+ * This class is meant to be extended by the generated code.
243
+ */
68
244
  export abstract class BaseServiceClient {
69
- private options: ServiceClientOptions;
245
+ private options: RequestOptions;
70
246
 
71
- constructor(options?: ServiceClientOptions) {
247
+ constructor(options?: RequestOptions) {
72
248
  this.options = options ?? {};
73
249
  }
74
250
 
@@ -95,28 +271,92 @@ export abstract class BaseServiceClient {
95
271
  return url;
96
272
  }
97
273
 
98
- private is_4xx(res: Response): boolean {
99
- return 400 <= res.status && res.status < 500;
274
+ /**
275
+ * Perform the http request or pass it to the intercept function
276
+ * if one was configured.
277
+ */
278
+ private async fetch(req: RequestData, options?: RequestOptions): Promise<ResponseData> {
279
+ if (options?.intercept) {
280
+ return options.intercept(req, this.fetch.bind(this));
281
+ }
282
+ try {
283
+ const res = await fetch(req.url, {
284
+ method: req.method,
285
+ body: req.body,
286
+ headers: req.headers,
287
+ });
288
+ return {
289
+ ok: res.ok,
290
+ status: res.status,
291
+ body: await res.text(),
292
+ };
293
+ } catch (err) {
294
+ return {
295
+ ok: false,
296
+ status: 0,
297
+ body: "",
298
+ err: err,
299
+ }
300
+ }
100
301
  }
101
302
 
102
- private get_options(service: string, name: string, options: RequestOptions): RequestOptions {
103
- const service_options = this.options.services?.[service];
104
- const method_options = this.options.methods?.[name];
303
+ /**
304
+ * Returns true if the status code represents a transient error
305
+ * or it's a network error.
306
+ */
307
+ private should_retry(res: ResponseData): boolean {
308
+ if (res.err) {
309
+ return true;
310
+ }
311
+ switch (res.status) {
312
+ case 408: // timeout
313
+ case 413: // too large
314
+ case 429: // too many requests
315
+ case 500: // generic error response
316
+ case 502: // invalid upstream response
317
+ case 503: // service unavailable
318
+ case 504: // gateway timeout
319
+ case 522: // tcp connection timeout
320
+ return true;
321
+ default:
322
+ return false;
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Returns the merged options.
328
+ */
329
+ private get_options(options: RequestOptions): RequestOptions {
105
330
  return {
106
331
  ...this.options,
107
- ...service_options,
108
- ...method_options,
109
332
  ...options,
110
333
  headers: {
111
334
  ...this.options.headers,
112
- ...method_options?.headers,
113
- ...service_options?.headers,
114
335
  ...options.headers,
115
336
  }
116
337
  };
117
338
  }
118
339
 
119
- protected async request(
340
+ /**
341
+ * A delegate to _request that wraps the response in a ResponsePromise.
342
+ */
343
+ protected request(
344
+ service: string,
345
+ name: string,
346
+ method: string,
347
+ route: string,
348
+ body: any,
349
+ options: { query?: any } & RequestOptions = {}
350
+ ): ResponsePromise<any> {
351
+ const promise = this._request(service, name, method, route, body, options);
352
+ return new ResponsePromise(promise);
353
+ }
354
+
355
+ /**
356
+ * The main logic for fulfilling a request as perscribed by
357
+ * the request options.
358
+ */
359
+ private async _request(
120
360
  service: string,
121
361
  name: string,
122
362
  method: string,
@@ -124,7 +364,7 @@ export abstract class BaseServiceClient {
124
364
  body: any,
125
365
  options: { query?: any } & RequestOptions = {}
126
366
  ): Promise<any> {
127
- options = this.get_options(service, name, options);
367
+ options = this.get_options(options);
128
368
  const url = this.build_url(route, options, options.query ?? {});
129
369
  const headers = Object.assign({
130
370
  "User-Agent": "CDL/ServiceClient"
@@ -132,35 +372,26 @@ export abstract class BaseServiceClient {
132
372
  if (options.token) {
133
373
  headers["Authorization"] = `Bearer ${options.token}`;
134
374
  }
135
- const req: RequestInit = {
136
- method: method,
137
- headers: headers,
138
- };
375
+ const req: RequestData = { name, service, url, method, headers };
139
376
  if (body) {
140
377
  req.body = JSON.stringify(body);
141
378
  }
142
379
  if (options.debug) {
143
380
  console.log(`REQ(${method.toUpperCase()})`, url, JSON.stringify(req, null, 2));
144
381
  }
145
- const res = await fetch(url, req);
382
+ const res = await this.fetch(req, options);
146
383
  if (!res.ok) {
147
- const text = await res.text();
148
- const err = ServiceError.from_res(res, text);
384
+ const err = ServiceError.from_res(res);
149
385
  if (options.debug) {
150
386
  console.log(`ERR(${res.status})`, url, err.message);
151
387
  }
152
- for (const code of options.allow ?? []) {
153
- if (err.status === code || err.code === code) {
154
- return null;
155
- }
156
- }
157
- if (typeof options.retry === "number" && options.retry > 0 && !this.is_4xx(res)) {
388
+ if (typeof options.retry === "number" && options.retry > 0 && this.should_retry(res)) {
158
389
  options.retry--;
159
390
  return this.request(service, name, method, route, body, options);
160
391
  }
161
392
  throw err;
162
393
  }
163
- const data = await res.json();
394
+ const data = res.body ? JSON.parse(res.body) : res.body;
164
395
  if (options.debug) {
165
396
  console.log(`RES(${res.status})`, url, JSON.stringify(data, null, 2));
166
397
  }