@compassdigital/sdk.typescript 3.0.0-beta.11 → 3.0.0-beta.13
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/README.md +108 -8
- package/lib/base.d.ts +22 -0
- package/lib/base.d.ts.map +1 -1
- package/lib/base.js +50 -1
- package/lib/base.js.map +1 -1
- package/package.json +1 -1
- package/src/base.ts +48 -1
- package/test/client.test.ts +45 -0
package/README.md
CHANGED
|
@@ -8,31 +8,131 @@ Compass Digital Labs TypeScript SDK
|
|
|
8
8
|
$ npm install --save @compassdigital/sdk.typescript@latest
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
+
## Example Server Usage
|
|
12
|
+
|
|
13
|
+
``` typescript
|
|
14
|
+
import Provider from "@compassdigital/provider";
|
|
15
|
+
import { GetTaskRequest, GetTaskResponse } from "@compassdigital/sdk.typescript/task";
|
|
16
|
+
|
|
17
|
+
const provider = new Provider({ type: "payment" });
|
|
18
|
+
|
|
19
|
+
provider.on<GetTaskRequest, GetTaskResponse>("get_task", function (req, next): void {
|
|
20
|
+
// ...
|
|
21
|
+
})
|
|
22
|
+
```
|
|
23
|
+
|
|
11
24
|
## Example Client Usage
|
|
12
25
|
|
|
26
|
+
**Instanciate Client:**
|
|
27
|
+
|
|
13
28
|
``` typescript
|
|
14
29
|
import { ServiceClient } from "@compassdigital/sdk.typescript";
|
|
15
30
|
|
|
16
31
|
const api = new ServiceClient({ stage: "dev" });
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Basic Request:**
|
|
35
|
+
|
|
36
|
+
``` typescript
|
|
37
|
+
const task = await api.get_task(id);
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Request Options:**
|
|
41
|
+
|
|
42
|
+
* These options may be passed to any request.
|
|
17
43
|
|
|
18
|
-
|
|
19
|
-
|
|
44
|
+
``` typescript
|
|
45
|
+
interface RequestOptions {
|
|
46
|
+
// environment to make requests to
|
|
47
|
+
stage?: string;
|
|
48
|
+
// authentication token
|
|
49
|
+
token?: string;
|
|
50
|
+
// additional headers
|
|
51
|
+
headers?: Record<string, string>;
|
|
52
|
+
// log all requests and responses
|
|
53
|
+
debug?: boolean;
|
|
54
|
+
// the number of times to retry a request
|
|
55
|
+
retry?: number;
|
|
56
|
+
// make requests against this base url
|
|
57
|
+
// note: the stage property is ignored if base_url is set
|
|
58
|
+
base_url?: string;
|
|
59
|
+
// intercept outgoing http requests
|
|
60
|
+
intercept?: InterceptFn;
|
|
20
61
|
}
|
|
21
62
|
```
|
|
22
63
|
|
|
23
|
-
|
|
64
|
+
* The `RequestOptions` can be provided to the `ServiceClient` constructor or at the request call site.
|
|
65
|
+
* The options provided at the call site will overide options passed to the constructor.
|
|
24
66
|
|
|
25
67
|
``` typescript
|
|
26
|
-
import Provider from "@compassdigital/provider";
|
|
27
|
-
import { GetTaskRequest, GetTaskResponse } from "@compassdigital/sdk.typescript/task";
|
|
28
68
|
|
|
29
|
-
const
|
|
69
|
+
const api = new ServiceClient({
|
|
70
|
+
token: "<token>",
|
|
71
|
+
retry: 2,
|
|
72
|
+
})
|
|
30
73
|
|
|
31
|
-
|
|
32
|
-
|
|
74
|
+
const location = await api.get_location(id, {
|
|
75
|
+
token: "<token>",
|
|
76
|
+
retry: 2,
|
|
33
77
|
})
|
|
34
78
|
```
|
|
35
79
|
|
|
80
|
+
**Error Handling:**
|
|
81
|
+
|
|
82
|
+
* non-200 responses are rejected with a `ServiceError`.
|
|
83
|
+
|
|
84
|
+
``` typescript
|
|
85
|
+
try {
|
|
86
|
+
const shoppingcart = await api.get_shoppingcart(id);
|
|
87
|
+
} catch (err) {
|
|
88
|
+
// Since the error type is `unknown` we must type assert before
|
|
89
|
+
// accessing the properties.
|
|
90
|
+
if (err instanceof ServiceError) {
|
|
91
|
+
console.log(err.status, err.code, err.message);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// There are helpers for accessing the status and code
|
|
95
|
+
if (ServiceError.code(err) === 400.31) {
|
|
96
|
+
console.log("Failed to get menu");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
* There is a `ignore` convinience method for ignoring specific status & error codes.
|
|
102
|
+
|
|
103
|
+
``` typescript
|
|
104
|
+
const issue: OrderIssue = { items: [] };
|
|
105
|
+
await api.post_order_issue(id, issue).ignore(400.18, 400.21);
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
* There is a `combine` convinience method for returning an object which contains the response or error.
|
|
109
|
+
|
|
110
|
+
``` typescript
|
|
111
|
+
const res = await api.get_task(id).combine();
|
|
112
|
+
|
|
113
|
+
if (res.ok) {
|
|
114
|
+
console.log("task", res.data);
|
|
115
|
+
} else {
|
|
116
|
+
console.log("error", res.err);
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
**Testing:**
|
|
121
|
+
|
|
122
|
+
* You can register an `intercept` function which will recieve all request.
|
|
123
|
+
|
|
124
|
+
``` typescript
|
|
125
|
+
|
|
126
|
+
import { ServiceClient, RequestData, ResponseData, FetchFn } from "@compassdigital/sdk.typescript";
|
|
127
|
+
|
|
128
|
+
async function intercept(req: RequestData, fetch: FetchFn): Promise<ResponseData> {
|
|
129
|
+
expect(req.name).toBe("get_shoppingcart");
|
|
130
|
+
return { ok: true, status: 200, body: JSON.stringify({}) }
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const api = new ServiceClient({ intercept });
|
|
134
|
+
```
|
|
135
|
+
|
|
36
136
|
## Code Gen
|
|
37
137
|
|
|
38
138
|
1. Add new services to `manifest.json`.
|
package/lib/base.d.ts
CHANGED
|
@@ -65,7 +65,24 @@ export declare class ResponsePromise<T> implements Promise<T> {
|
|
|
65
65
|
* If no codes are specified, all codes are ignored.
|
|
66
66
|
*/
|
|
67
67
|
ignore(...codes: number[]): ResponsePromise<T | null>;
|
|
68
|
+
/**
|
|
69
|
+
* Returns a promise that resolves to either the response body
|
|
70
|
+
* or a ServiceError.
|
|
71
|
+
*/
|
|
72
|
+
combine(...codes: number[]): Promise<EitherResponse<T>>;
|
|
68
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Either a response body or a service error.
|
|
76
|
+
*/
|
|
77
|
+
declare type EitherResponse<T> = {
|
|
78
|
+
ok: true;
|
|
79
|
+
data: T;
|
|
80
|
+
err: null;
|
|
81
|
+
} | {
|
|
82
|
+
ok: false;
|
|
83
|
+
data: null;
|
|
84
|
+
err: ServiceError;
|
|
85
|
+
};
|
|
69
86
|
/**
|
|
70
87
|
* An error returned from an api service.
|
|
71
88
|
*/
|
|
@@ -91,6 +108,10 @@ export declare class ServiceError extends Error {
|
|
|
91
108
|
* If no codes are specified, all codes are ignored.
|
|
92
109
|
*/
|
|
93
110
|
static ignore<T>(codes: number[], response: Promise<T>): Promise<T | null>;
|
|
111
|
+
/**
|
|
112
|
+
* Returns a promise that resolves to either T or a ServiceError.
|
|
113
|
+
*/
|
|
114
|
+
static combine<T>(codes: number[], response: Promise<T>): Promise<EitherResponse<T>>;
|
|
94
115
|
/**
|
|
95
116
|
* Constructs a ServiceError from the provided response data.
|
|
96
117
|
*/
|
|
@@ -132,4 +153,5 @@ export declare abstract class BaseServiceClient {
|
|
|
132
153
|
*/
|
|
133
154
|
private _request;
|
|
134
155
|
}
|
|
156
|
+
export {};
|
|
135
157
|
//# sourceMappingURL=base.d.ts.map
|
package/lib/base.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,cAAc;IAE7B,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB,KAAK,CAAC,EAAE,MAAM,CAAC;IAGf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,SAAS,CAAC,EAAE,WAAW,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,oBAAY,OAAO,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAElE;;GAEG;AACH,oBAAY,WAAW,GAAG,CAAC,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;AAEtF;;;GAGG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,YAAW,OAAO,CAAC,CAAC,CAAC;IAOvC,OAAO,CAAC,OAAO;IAL3B;;OAEG;IACH,CAAC,MAAM,CAAC,WAAW,CAAC,SAA8B;gBAE9B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvC;;OAEG;IACH,IAAI,CAAC,QAAQ,GAAG,CAAC,EAAE,QAAQ,GAAG,KAAK,EACjC,WAAW,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,EACrE,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,GACtE,eAAe,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAIvC;;OAEG;IACH,KAAK,CAAC,OAAO,GAAG,KAAK,EACnB,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,GAAG,IAAI,GACpE,eAAe,CAAC,CAAC,GAAG,OAAO,CAAC;IAI/B;;OAEG;IACH,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC;IAI5D;;;;OAIG;IACH,MAAM,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,CAAC,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":"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"}
|
package/lib/base.js
CHANGED
|
@@ -110,6 +110,17 @@ var ResponsePromise = /** @class */ (function () {
|
|
|
110
110
|
}
|
|
111
111
|
return new ResponsePromise(ServiceError.ignore(codes, this.promise));
|
|
112
112
|
};
|
|
113
|
+
/**
|
|
114
|
+
* Returns a promise that resolves to either the response body
|
|
115
|
+
* or a ServiceError.
|
|
116
|
+
*/
|
|
117
|
+
ResponsePromise.prototype.combine = function () {
|
|
118
|
+
var codes = [];
|
|
119
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
120
|
+
codes[_i] = arguments[_i];
|
|
121
|
+
}
|
|
122
|
+
return new ResponsePromise(ServiceError.combine(codes, this.promise));
|
|
123
|
+
};
|
|
113
124
|
return ResponsePromise;
|
|
114
125
|
}());
|
|
115
126
|
exports.ResponsePromise = ResponsePromise;
|
|
@@ -184,6 +195,39 @@ var ServiceError = /** @class */ (function (_super) {
|
|
|
184
195
|
});
|
|
185
196
|
});
|
|
186
197
|
};
|
|
198
|
+
/**
|
|
199
|
+
* Returns a promise that resolves to either T or a ServiceError.
|
|
200
|
+
*/
|
|
201
|
+
ServiceError.combine = function (codes, response) {
|
|
202
|
+
return __awaiter(this, void 0, void 0, function () {
|
|
203
|
+
var data, err_2, _i, codes_2, code;
|
|
204
|
+
return __generator(this, function (_b) {
|
|
205
|
+
switch (_b.label) {
|
|
206
|
+
case 0:
|
|
207
|
+
_b.trys.push([0, 2, , 3]);
|
|
208
|
+
return [4 /*yield*/, response];
|
|
209
|
+
case 1:
|
|
210
|
+
data = _b.sent();
|
|
211
|
+
return [2 /*return*/, { ok: true, data: data, err: null }];
|
|
212
|
+
case 2:
|
|
213
|
+
err_2 = _b.sent();
|
|
214
|
+
if (err_2 instanceof ServiceError) {
|
|
215
|
+
if (codes.length === 0) {
|
|
216
|
+
return [2 /*return*/, { ok: false, data: null, err: err_2 }];
|
|
217
|
+
}
|
|
218
|
+
for (_i = 0, codes_2 = codes; _i < codes_2.length; _i++) {
|
|
219
|
+
code = codes_2[_i];
|
|
220
|
+
if (err_2.status === code || err_2.code === code) {
|
|
221
|
+
return [2 /*return*/, { ok: false, data: null, err: err_2 }];
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
throw err_2;
|
|
226
|
+
case 3: return [2 /*return*/];
|
|
227
|
+
}
|
|
228
|
+
});
|
|
229
|
+
});
|
|
230
|
+
};
|
|
187
231
|
/**
|
|
188
232
|
* Constructs a ServiceError from the provided response data.
|
|
189
233
|
*/
|
|
@@ -198,7 +242,12 @@ var ServiceError = /** @class */ (function (_super) {
|
|
|
198
242
|
}
|
|
199
243
|
}
|
|
200
244
|
catch (_) { }
|
|
201
|
-
|
|
245
|
+
var err = new ServiceError(res.status, code, message);
|
|
246
|
+
// override the stack trace so that it doesn't include the from_res helper.
|
|
247
|
+
if (Error.captureStackTrace) {
|
|
248
|
+
Error.captureStackTrace(err, ServiceError.from_res);
|
|
249
|
+
}
|
|
250
|
+
return err;
|
|
202
251
|
};
|
|
203
252
|
return ServiceError;
|
|
204
253
|
}(Error));
|
package/lib/base.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4DAAgC;AAqDhC;;;GAGG;AACH;IAOE,yBAAoB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;QALvC;;WAEG;QACH,QAAoB,GAAG,0BAA0B,CAAC;IAER,CAAC;IAE3C;;OAEG;IACH,8BAAI,GAAJ,UACE,WAAqE,EACrE,UAAuE;QAEvE,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,+BAAK,GAAL,UACE,UAAqE;QAErE,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,iCAAO,GAAP,UAAQ,SAA+B;QACrC,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACH,gCAAM,GAAN;QAAO,eAAkB;aAAlB,UAAkB,EAAlB,qBAAkB,EAAlB,IAAkB;YAAlB,0BAAkB;;QACvB,OAAO,IAAI,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IACH,sBAAC;AAAD,CAAC,
|
|
1
|
+
{"version":3,"file":"base.js","sourceRoot":"","sources":["../src/base.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,4DAAgC;AAqDhC;;;GAGG;AACH;IAOE,yBAAoB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;QALvC;;WAEG;QACH,QAAoB,GAAG,0BAA0B,CAAC;IAER,CAAC;IAE3C;;OAEG;IACH,8BAAI,GAAJ,UACE,WAAqE,EACrE,UAAuE;QAEvE,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;IACzE,CAAC;IAED;;OAEG;IACH,+BAAK,GAAL,UACE,UAAqE;QAErE,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,iCAAO,GAAP,UAAQ,SAA+B;QACrC,OAAO,IAAI,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED;;;;OAIG;IACH,gCAAM,GAAN;QAAO,eAAkB;aAAlB,UAAkB,EAAlB,qBAAkB,EAAlB,IAAkB;YAAlB,0BAAkB;;QACvB,OAAO,IAAI,eAAe,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACvE,CAAC;IAED;;;OAGG;IACH,iCAAO,GAAP;QAAQ,eAAkB;aAAlB,UAAkB,EAAlB,qBAAkB,EAAlB,IAAkB;YAAlB,0BAAkB;;QACxB,OAAO,IAAI,eAAe,CAAC,YAAY,CAAC,OAAO,CAAI,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IACH,sBAAC;AAAD,CAAC,AAnDD,IAmDC;AAnDY,0CAAe;KAKzB,MAAM,CAAC,WAAW;AA4DrB;;GAEG;AACH;IAAkC,gCAAK;IACrC,sBACS,MAAc,EAAE,cAAc;IAC9B,IAAY,EAAI,qBAAqB;IAC5C,OAAe,CAAQ,wBAAwB;;QAHjD,YAKE,kBAAM,OAAO,CAAC,SAKf;QATQ,YAAM,GAAN,MAAM,CAAQ;QACd,UAAI,GAAJ,IAAI,CAAQ;QAInB,KAAI,CAAC,IAAI,GAAG,kBAAgB,IAAI,MAAG,CAAC;QAEpC,0DAA0D;QAC1D,MAAM,CAAC,cAAc,CAAC,KAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;;IACtD,CAAC;IAED;;;OAGG;IACI,mBAAM,GAAb,UAAc,GAAQ;QACpB,IAAI,GAAG,YAAY,YAAY,EAAE;YAC/B,OAAO,GAAG,CAAC,MAAM,CAAC;SACnB;QACD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAED;;;OAGG;IACI,iBAAI,GAAX,UAAY,GAAQ;QAClB,IAAI,GAAG,YAAY,YAAY,EAAE;YAC/B,OAAO,GAAG,CAAC,IAAI,CAAC;SACjB;QACD,OAAO,CAAC,CAAC,CAAC;IACZ,CAAC;IAED;;;;OAIG;IACU,mBAAM,GAAnB,UAAuB,KAAe,EAAE,QAAoB;;;;;;;wBAEjD,qBAAM,QAAQ,EAAA;4BAArB,sBAAO,SAAc,EAAC;;;wBAEtB,IAAI,KAAG,YAAY,YAAY,EAAE;4BAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;gCACtB,sBAAO,IAAI,EAAC;6BACb;4BACD,WAAwB,EAAL,eAAK,EAAL,mBAAK,EAAL,IAAK,EAAE;gCAAf,IAAI;gCACb,IAAI,KAAG,CAAC,MAAM,KAAK,IAAI,IAAI,KAAG,CAAC,IAAI,KAAK,IAAI,EAAE;oCAC5C,sBAAO,IAAI,EAAC;iCACb;6BACF;yBACF;wBACD,MAAM,KAAG,CAAC;;;;;KAEb;IAED;;OAEG;IACU,oBAAO,GAApB,UAAwB,KAAe,EAAE,QAAoB;;;;;;;wBAE5C,qBAAM,QAAQ,EAAA;;wBAArB,IAAI,GAAG,SAAc;wBAC3B,sBAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,MAAA,EAAE,GAAG,EAAE,IAAI,EAAE,EAAC;;;wBAErC,IAAI,KAAG,YAAY,YAAY,EAAE;4BAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE;gCACtB,sBAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAA,EAAE,EAAA;6BACtC;4BACD,WAAwB,EAAL,eAAK,EAAL,mBAAK,EAAL,IAAK,EAAE;gCAAf,IAAI;gCACb,IAAI,KAAG,CAAC,MAAM,KAAK,IAAI,IAAI,KAAG,CAAC,IAAI,KAAK,IAAI,EAAE;oCAC5C,sBAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,OAAA,EAAE,EAAC;iCACvC;6BACF;yBACF;wBACD,MAAM,KAAG,CAAC;;;;;KAEb;IAED;;OAEG;IACI,qBAAQ,GAAf,UAAgB,GAAiB;QAC/B,IAAI,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC;QACvB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;QACtB,IAAI;YACF,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE;gBAC7C,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACjB,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC;aACtC;SACF;QAAC,OAAO,CAAC,EAAE,GAAE;QACd,IAAM,GAAG,GAAG,IAAI,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACxD,2EAA2E;QAC3E,IAAI,KAAK,CAAC,iBAAiB,EAAE;YAC3B,KAAK,CAAC,iBAAiB,CAAC,GAAG,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;SACrD;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACH,mBAAC;AAAD,CAAC,AApGD,CAAkC,KAAK,GAoGtC;AApGY,oCAAY;AAsGzB;;;GAGG;AACH;IAGE,2BAAY,OAAwB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,qCAAS,GAAjB,UAAkB,KAAa,EAAE,EAA2C,EAAE,MAAW;YAAtD,QAAQ,cAAA,EAAE,aAAa,EAAb,KAAK,mBAAG,KAAK,KAAA;QACxD,IAAI,GAAG,GAAG,oCAAkC,KAAK,GAAG,KAAO,CAAC;QAC5D,wCAAwC;QACxC,IAAI,QAAQ,EAAE;YACZ,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAC1B,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAClC;YACD,GAAG,GAAG,KAAG,QAAQ,GAAG,KAAO,CAAC;SAC7B;QACD,wBAAwB;QACxB,IAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,KAA4B,UAAsB,EAAtB,KAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAtB,cAAsB,EAAtB,IAAsB,EAAE;YAAzC,IAAA,WAAa,EAAZ,MAAI,QAAA,EAAE,KAAK,QAAA;YACrB,KAAK,CAAC,IAAI,CAAI,kBAAkB,CAAC,MAAI,CAAC,SAAI,kBAAkB,CAAC,KAAY,CAAG,CAAC,CAAC;SAC/E;QACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,GAAG,IAAI,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC9B;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;OAGG;IACW,iCAAK,GAAnB,UAAoB,GAAgB,EAAE,OAAwB;;;;;;;wBAC5D,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,EAAE;4BACtB,sBAAO,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAC;yBACtD;wBACW,qBAAM,IAAA,qBAAK,EAAC,GAAG,CAAC,GAAG,EAAE;gCAC/B,MAAM,EAAE,GAAG,CAAC,MAAM;gCAClB,IAAI,EAAE,GAAG,CAAC,IAAI;gCACd,OAAO,EAAE,GAAG,CAAC,OAAO;6BACrB,CAAC,EAAA;;wBAJI,GAAG,GAAG,SAIV;;4BAEA,EAAE,EAAE,GAAG,CAAC,EAAE;4BACV,MAAM,EAAE,GAAG,CAAC,MAAM;;wBACZ,qBAAM,GAAG,CAAC,IAAI,EAAE,EAAA;4BAHxB,uBAGE,OAAI,GAAE,SAAgB;iCACtB;;;;KACH;IAED;;OAEG;IACK,kCAAM,GAAd,UAAe,GAAiB;QAC9B,OAAO,GAAG,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC;IAC/C,CAAC;IAED;;OAEG;IACK,uCAAW,GAAnB,UAAoB,OAAuB;QACzC,sCACK,IAAI,CAAC,OAAO,GACZ,OAAO,KACV,OAAO,wBACF,IAAI,CAAC,OAAO,CAAC,OAAO,GACpB,OAAO,CAAC,OAAO,KAEpB;IACJ,CAAC;IAED;;OAEG;IACO,mCAAO,GAAjB,UACE,OAAe,EACf,IAAY,EACZ,MAAc,EACd,KAAa,EACb,IAAS,EACT,OAA8C;QAA9C,wBAAA,EAAA,YAA8C;QAE9C,IAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3E,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;;OAGG;IACW,oCAAQ,GAAtB,UACE,OAAe,EACf,IAAY,EACZ,MAAc,EACd,KAAa,EACb,IAAS,EACT,OAA8C;;QAA9C,wBAAA,EAAA,YAA8C;;;;;;wBAE9C,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;wBAC9B,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,mCAAI,EAAE,CAAC,CAAC;wBAC1D,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;4BAC5B,YAAY,EAAE,mBAAmB;yBAClC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;wBACpB,IAAI,OAAO,CAAC,KAAK,EAAE;4BACjB,OAAO,CAAC,eAAe,CAAC,GAAG,YAAU,OAAO,CAAC,KAAO,CAAC;yBACtD;wBACK,GAAG,GAAgB,EAAE,IAAI,MAAA,EAAE,OAAO,SAAA,EAAE,GAAG,KAAA,EAAE,MAAM,QAAA,EAAE,OAAO,SAAA,EAAE,CAAC;wBACjE,IAAI,IAAI,EAAE;4BACR,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;yBACjC;wBACD,IAAI,OAAO,CAAC,KAAK,EAAE;4BACjB,OAAO,CAAC,GAAG,CAAC,SAAO,MAAM,CAAC,WAAW,EAAE,MAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;yBAChF;wBACW,qBAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,OAAO,CAAC,EAAA;;wBAApC,GAAG,GAAG,SAA8B;wBAC1C,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE;4BACL,GAAG,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;4BACvC,IAAI,OAAO,CAAC,KAAK,EAAE;gCACjB,OAAO,CAAC,GAAG,CAAC,SAAO,GAAG,CAAC,MAAM,MAAG,EAAE,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;6BACrD;4BACD,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;gCAC/E,OAAO,CAAC,KAAK,EAAE,CAAC;gCAChB,sBAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,EAAC;6BAClE;4BACD,MAAM,GAAG,CAAC;yBACX;wBACK,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;wBACxD,IAAI,OAAO,CAAC,KAAK,EAAE;4BACjB,OAAO,CAAC,GAAG,CAAC,SAAO,GAAG,CAAC,MAAM,MAAG,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;yBACvE;wBACD,sBAAO,IAAI,EAAC;;;;KACb;IACH,wBAAC;AAAD,CAAC,AAnID,IAmIC;AAnIqB,8CAAiB"}
|
package/package.json
CHANGED
package/src/base.ts
CHANGED
|
@@ -99,6 +99,26 @@ export class ResponsePromise<T> implements Promise<T> {
|
|
|
99
99
|
ignore(...codes: number[]): ResponsePromise<T | null> {
|
|
100
100
|
return new ResponsePromise(ServiceError.ignore(codes, this.promise));
|
|
101
101
|
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Returns a promise that resolves to either the response body
|
|
105
|
+
* or a ServiceError.
|
|
106
|
+
*/
|
|
107
|
+
combine(...codes: number[]): Promise<EitherResponse<T>> {
|
|
108
|
+
return new ResponsePromise(ServiceError.combine<T>(codes, this.promise));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Either a response body or a service error.
|
|
114
|
+
*/
|
|
115
|
+
type EitherResponse<T> = { ok: true; data: T; err: null } | { ok: false; data: null, err: ServiceError; };
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* This is a hack to make captureStackTrace visible.
|
|
119
|
+
*/
|
|
120
|
+
interface ErrorConstructor {
|
|
121
|
+
captureStackTrace?(target: object, constructorOpt?: Function): void;
|
|
102
122
|
}
|
|
103
123
|
|
|
104
124
|
/**
|
|
@@ -162,6 +182,28 @@ export class ServiceError extends Error {
|
|
|
162
182
|
}
|
|
163
183
|
}
|
|
164
184
|
|
|
185
|
+
/**
|
|
186
|
+
* Returns a promise that resolves to either T or a ServiceError.
|
|
187
|
+
*/
|
|
188
|
+
static async combine<T>(codes: number[], response: Promise<T>): Promise<EitherResponse<T>> {
|
|
189
|
+
try {
|
|
190
|
+
const data = await response;
|
|
191
|
+
return { ok: true, data, err: null };
|
|
192
|
+
} catch (err) {
|
|
193
|
+
if (err instanceof ServiceError) {
|
|
194
|
+
if (codes.length === 0) {
|
|
195
|
+
return { ok: false, data: null, err }
|
|
196
|
+
}
|
|
197
|
+
for (const code of codes) {
|
|
198
|
+
if (err.status === code || err.code === code) {
|
|
199
|
+
return { ok: false, data: null, err };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
throw err;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
165
207
|
/**
|
|
166
208
|
* Constructs a ServiceError from the provided response data.
|
|
167
209
|
*/
|
|
@@ -175,7 +217,12 @@ export class ServiceError extends Error {
|
|
|
175
217
|
message = data.message || data.error;
|
|
176
218
|
}
|
|
177
219
|
} catch (_) {}
|
|
178
|
-
|
|
220
|
+
const err = new ServiceError(res.status, code, message);
|
|
221
|
+
// override the stack trace so that it doesn't include the from_res helper.
|
|
222
|
+
if (Error.captureStackTrace) {
|
|
223
|
+
Error.captureStackTrace(err, ServiceError.from_res);
|
|
224
|
+
}
|
|
225
|
+
return err;
|
|
179
226
|
}
|
|
180
227
|
}
|
|
181
228
|
|
package/test/client.test.ts
CHANGED
|
@@ -131,5 +131,50 @@ describe("ServiceClient", () => {
|
|
|
131
131
|
expect(ServiceError.code(err)).toBe(500.4);
|
|
132
132
|
}
|
|
133
133
|
});
|
|
134
|
+
|
|
135
|
+
test("either should be true with 200 response", async () => {
|
|
136
|
+
const api = new ServiceClient({
|
|
137
|
+
intercept: async (req) => {
|
|
138
|
+
return { ok: true, status: 200, body: "{}" };
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
const res = await api.get_task("{}").combine();
|
|
142
|
+
expect(res.ok).toBe(true);
|
|
143
|
+
expect(res.data).toBeTruthy();
|
|
144
|
+
expect(res.err).toBeNull();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
test("either should be false with non-200 response", async () => {
|
|
148
|
+
const api = new ServiceClient({
|
|
149
|
+
intercept: async (req) => {
|
|
150
|
+
return { ok: false, status: 400, body: "{}" };
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
const res = await api.get_task("{}").combine();
|
|
154
|
+
expect(res.ok).toBe(false);
|
|
155
|
+
expect(res.data).toBeNull();
|
|
156
|
+
expect(res.err).toBeInstanceOf(ServiceError);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("either should be false with matching code", async () => {
|
|
160
|
+
const api = new ServiceClient({
|
|
161
|
+
intercept: async (req) => {
|
|
162
|
+
return { ok: false, status: 400, body: "{}" };
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
const res = await api.get_task("{}").combine(400);
|
|
166
|
+
expect(res.ok).toBe(false);
|
|
167
|
+
expect(res.err).toBeInstanceOf(ServiceError);
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test("method should throw if code is not specified", async () => {
|
|
171
|
+
const api = new ServiceClient({
|
|
172
|
+
intercept: async (req) => {
|
|
173
|
+
return { ok: false, status: 400, body: "{}" };
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
const promise = api.get_task("").combine(500);
|
|
177
|
+
expect(promise).rejects.toThrow();
|
|
178
|
+
});
|
|
134
179
|
});
|
|
135
180
|
});
|