-
Notifications
You must be signed in to change notification settings - Fork 6
/
HttpPostPushChannel.ts
72 lines (69 loc) · 1.86 KB
/
HttpPostPushChannel.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
import * as axios from "axios";
import { CommittableHttpStatus } from "../cluster";
import { PushChannel } from "../interfaces";
import { PushEvent, PushResponse } from "../types";
import { toAxiosRequestHeaders } from "../utils";
const TIMEOUT = 10000;
const push = async (
url: string,
event: PushEvent,
headers?: axios.AxiosRequestHeaders
): Promise<PushResponse> => {
try {
const { status, statusText } = await axios.default.post(url, event, {
timeout: TIMEOUT,
headers
});
return { statusCode: status, statusText };
} catch (error: unknown) {
if (axios.isAxiosError(error)) {
if (error.response) {
const { status, statusText, data } = error.response;
return {
statusCode: status,
statusText,
details: data
? `${data.message} ${
data.details ? JSON.stringify(data.details) : ""
}`
: undefined
};
}
return {
statusCode: 503,
statusText: error.code
};
}
return {
statusCode: 503,
statusText: "Internal Server Error",
details: error instanceof Error ? error.message : JSON.stringify(error)
};
}
};
export const HttpPostPushChannel = (
endpoint: URL,
headers?: Record<string, unknown>
): PushChannel => {
const axiosRequestHeaders = headers && toAxiosRequestHeaders(headers);
return {
label: "",
init: () => Promise.resolve(),
push: async (events) => {
let lastCode = 200;
while (events.length) {
const event = events.shift();
if (event) {
event.response = await push(
endpoint.href,
event,
axiosRequestHeaders
);
lastCode = event.response.statusCode;
if (!CommittableHttpStatus.includes(lastCode)) break;
}
}
return lastCode;
}
};
};