-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathhooks.ts
112 lines (90 loc) · 2.52 KB
/
hooks.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
*/
import { RequestInput } from "../lib/http.js";
import {
AfterErrorContext,
AfterErrorHook,
AfterSuccessContext,
AfterSuccessHook,
BeforeCreateRequestContext,
BeforeCreateRequestHook,
BeforeRequestContext,
BeforeRequestHook,
Hooks,
SDKInitHook,
SDKInitOptions,
} from "./types.js";
import { initHooks } from "./registration.js";
export class SDKHooks implements Hooks {
sdkInitHooks: SDKInitHook[] = [];
beforeCreateRequestHooks: BeforeCreateRequestHook[] = [];
beforeRequestHooks: BeforeRequestHook[] = [];
afterSuccessHooks: AfterSuccessHook[] = [];
afterErrorHooks: AfterErrorHook[] = [];
constructor() {
initHooks(this);
}
registerSDKInitHook(hook: SDKInitHook) {
this.sdkInitHooks.push(hook);
}
registerBeforeCreateRequestHook(hook: BeforeCreateRequestHook) {
this.beforeCreateRequestHooks.push(hook);
}
registerBeforeRequestHook(hook: BeforeRequestHook) {
this.beforeRequestHooks.push(hook);
}
registerAfterSuccessHook(hook: AfterSuccessHook) {
this.afterSuccessHooks.push(hook);
}
registerAfterErrorHook(hook: AfterErrorHook) {
this.afterErrorHooks.push(hook);
}
sdkInit(opts: SDKInitOptions): SDKInitOptions {
return this.sdkInitHooks.reduce((opts, hook) => hook.sdkInit(opts), opts);
}
beforeCreateRequest(
hookCtx: BeforeCreateRequestContext,
input: RequestInput,
): RequestInput {
let inp = input;
for (const hook of this.beforeCreateRequestHooks) {
inp = hook.beforeCreateRequest(hookCtx, inp);
}
return inp;
}
async beforeRequest(
hookCtx: BeforeRequestContext,
request: Request,
): Promise<Request> {
let req = request;
for (const hook of this.beforeRequestHooks) {
req = await hook.beforeRequest(hookCtx, req);
}
return req;
}
async afterSuccess(
hookCtx: AfterSuccessContext,
response: Response,
): Promise<Response> {
let res = response;
for (const hook of this.afterSuccessHooks) {
res = await hook.afterSuccess(hookCtx, res);
}
return res;
}
async afterError(
hookCtx: AfterErrorContext,
response: Response | null,
error: unknown,
): Promise<{ response: Response | null; error: unknown }> {
let res = response;
let err = error;
for (const hook of this.afterErrorHooks) {
const result = await hook.afterError(hookCtx, res, err);
res = result.response;
err = result.error;
}
return { response: res, error: err };
}
}