@flitt/api 1.0.0
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/CHANGELOG.md +12 -0
- package/LICENSE +21 -0
- package/README.md +277 -0
- package/SECURITY.md +15 -0
- package/dist/cjs/client.d.ts +243 -0
- package/dist/cjs/client.d.ts.map +1 -0
- package/dist/cjs/client.js +470 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/errors.d.ts +71 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +107 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/http.d.ts +53 -0
- package/dist/cjs/http.d.ts.map +1 -0
- package/dist/cjs/http.js +322 -0
- package/dist/cjs/http.js.map +1 -0
- package/dist/cjs/index.d.ts +13 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +31 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/types.d.ts +406 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +7 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/version.d.ts +3 -0
- package/dist/cjs/version.d.ts.map +1 -0
- package/dist/cjs/version.js +6 -0
- package/dist/cjs/version.js.map +1 -0
- package/dist/cjs/webhooks.d.ts +40 -0
- package/dist/cjs/webhooks.d.ts.map +1 -0
- package/dist/cjs/webhooks.js +98 -0
- package/dist/cjs/webhooks.js.map +1 -0
- package/dist/esm/client.d.ts +243 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +465 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/errors.d.ts +71 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +90 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/http.d.ts +53 -0
- package/dist/esm/http.d.ts.map +1 -0
- package/dist/esm/http.js +310 -0
- package/dist/esm/http.js.map +1 -0
- package/dist/esm/index.d.ts +13 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/types.d.ts +406 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +6 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/version.d.ts +3 -0
- package/dist/esm/version.d.ts.map +1 -0
- package/dist/esm/version.js +3 -0
- package/dist/esm/version.js.map +1 -0
- package/dist/esm/webhooks.d.ts +40 -0
- package/dist/esm/webhooks.d.ts.map +1 -0
- package/dist/esm/webhooks.js +93 -0
- package/dist/esm/webhooks.js.map +1 -0
- package/package.json +67 -0
- package/src/client.ts +576 -0
- package/src/errors.ts +92 -0
- package/src/http.ts +353 -0
- package/src/index.ts +26 -0
- package/src/types.ts +390 -0
- package/src/version.ts +2 -0
- package/src/webhooks.ts +115 -0
|
@@ -0,0 +1,406 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Response types of the Flitt Public API v1 (`/v1/public-api`) and of the
|
|
3
|
+
* Vote API (`/v1/vote-api`). Dates are ISO 8601 strings, as sent by the API.
|
|
4
|
+
*/
|
|
5
|
+
export type Game = "GMOD" | "FIVEM" | "MC";
|
|
6
|
+
export type Plan = "FREEMIUM" | "PREMIUM" | "ENTERPRISE";
|
|
7
|
+
export type AccessRole = "OWNER" | "ADMIN" | "EDITOR" | "VIEWER";
|
|
8
|
+
export type OnlineStatus = "ONLINE" | "OFFLINE" | "UNKNOWN";
|
|
9
|
+
/** Quota state read from the X-RateLimit-* headers of the last response. */
|
|
10
|
+
export type RateLimit = {
|
|
11
|
+
/** Requests allowed in the period, `null` when unlimited. */
|
|
12
|
+
limit: number | null;
|
|
13
|
+
/** Requests left in the period, `null` when unlimited. */
|
|
14
|
+
remaining: number | null;
|
|
15
|
+
/** When the period resets, `null` if the API did not say. */
|
|
16
|
+
reset: Date | null;
|
|
17
|
+
};
|
|
18
|
+
export type Pagination = {
|
|
19
|
+
page: number;
|
|
20
|
+
limit: number;
|
|
21
|
+
/** `null` when the server is stored on an Edge SDK instance (count unknown). */
|
|
22
|
+
total: number | null;
|
|
23
|
+
pages: number | null;
|
|
24
|
+
};
|
|
25
|
+
export type PageParams = {
|
|
26
|
+
/** 1-based page number. */
|
|
27
|
+
page?: number;
|
|
28
|
+
/** Items per page. */
|
|
29
|
+
limit?: number;
|
|
30
|
+
};
|
|
31
|
+
export type Usage = {
|
|
32
|
+
enabled: boolean;
|
|
33
|
+
plan: Plan;
|
|
34
|
+
/** Monthly quota, -1 when unlimited. */
|
|
35
|
+
limitPerMonth: number;
|
|
36
|
+
usedLast30d: number;
|
|
37
|
+
/** `null` when unlimited. */
|
|
38
|
+
remaining: number | null;
|
|
39
|
+
resetAt: string;
|
|
40
|
+
};
|
|
41
|
+
export type ServerSummary = {
|
|
42
|
+
id: string;
|
|
43
|
+
game: Game;
|
|
44
|
+
name: string | null;
|
|
45
|
+
ip: string | null;
|
|
46
|
+
port: number | null;
|
|
47
|
+
domainName: string | null;
|
|
48
|
+
status: OnlineStatus;
|
|
49
|
+
playersOnline: number;
|
|
50
|
+
maxPlayers: number | null;
|
|
51
|
+
rating: number;
|
|
52
|
+
reviewsCount: number;
|
|
53
|
+
verifiedBadge: boolean;
|
|
54
|
+
createdAt: string | null;
|
|
55
|
+
};
|
|
56
|
+
export type ServerList = {
|
|
57
|
+
data: ServerSummary[];
|
|
58
|
+
pagination: Pagination;
|
|
59
|
+
};
|
|
60
|
+
export type Server = {
|
|
61
|
+
id: string;
|
|
62
|
+
game: Game;
|
|
63
|
+
name: string | null;
|
|
64
|
+
language: string;
|
|
65
|
+
/** Hidden (null) for the VIEWER role. */
|
|
66
|
+
ip: string | null;
|
|
67
|
+
port: number | null;
|
|
68
|
+
domainName: string | null;
|
|
69
|
+
createdAt: string | null;
|
|
70
|
+
/** First connection of the Flitt addon, `null` if never connected. */
|
|
71
|
+
bridgeConnectedAt: string | null;
|
|
72
|
+
bridgeLastSeenAt: string | null;
|
|
73
|
+
bridgeLastAddon: string | null;
|
|
74
|
+
bridgeLastPlayerCount: number | null;
|
|
75
|
+
bridgeLastMaxPlayers: number | null;
|
|
76
|
+
bridgeLastMapName: string | null;
|
|
77
|
+
bridgeLastGameVersion: string | null;
|
|
78
|
+
logsEnabled: boolean;
|
|
79
|
+
publicEnabled: boolean;
|
|
80
|
+
/** `false` when the server is beyond the plan's connected-server limit (votes only). */
|
|
81
|
+
planActive: boolean;
|
|
82
|
+
verifiedBadge: boolean;
|
|
83
|
+
rating: number;
|
|
84
|
+
reviewsCount: number;
|
|
85
|
+
status: OnlineStatus;
|
|
86
|
+
accessRole: AccessRole;
|
|
87
|
+
};
|
|
88
|
+
export type PlayerStatusFilter = "online" | "offline" | "all";
|
|
89
|
+
export type Player = {
|
|
90
|
+
playerId: string;
|
|
91
|
+
externalId: string;
|
|
92
|
+
name: string | null;
|
|
93
|
+
isVpn: boolean | null;
|
|
94
|
+
country: string | null;
|
|
95
|
+
countryCode: string | null;
|
|
96
|
+
isp: string | null;
|
|
97
|
+
joinCount: number;
|
|
98
|
+
firstJoinedAt: string | null;
|
|
99
|
+
lastJoinedAt: string | null;
|
|
100
|
+
lastSeenAt: string | null;
|
|
101
|
+
lastLeftAt: string | null;
|
|
102
|
+
lastSessionSeconds: number | null;
|
|
103
|
+
totalPlaySeconds: number;
|
|
104
|
+
isOnline: boolean;
|
|
105
|
+
sessionStartedAt: string | null;
|
|
106
|
+
};
|
|
107
|
+
export type PlayerList = {
|
|
108
|
+
serverId: string;
|
|
109
|
+
players: Player[];
|
|
110
|
+
pagination: Pagination;
|
|
111
|
+
};
|
|
112
|
+
export type FirewallAction = "ALLOW" | "DENY";
|
|
113
|
+
export type FirewallRuleKind = "IDENTIFIER" | "IP" | "COUNTRY";
|
|
114
|
+
export type FirewallSettings = {
|
|
115
|
+
serverId: string;
|
|
116
|
+
enabled: boolean;
|
|
117
|
+
blockVpn: boolean;
|
|
118
|
+
kickMessage: string;
|
|
119
|
+
version: number;
|
|
120
|
+
rules: {
|
|
121
|
+
total: number;
|
|
122
|
+
allow: number;
|
|
123
|
+
deny: number; /** -1 = unlimited */
|
|
124
|
+
denyMax: number;
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
export type FirewallSettingsUpdate = {
|
|
128
|
+
enabled?: boolean;
|
|
129
|
+
blockVpn?: boolean;
|
|
130
|
+
/** Up to 300 characters, "" resets to the default message. */
|
|
131
|
+
kickMessage?: string;
|
|
132
|
+
};
|
|
133
|
+
export type FirewallRule = {
|
|
134
|
+
id: string;
|
|
135
|
+
action: FirewallAction;
|
|
136
|
+
kind: FirewallRuleKind;
|
|
137
|
+
value: string;
|
|
138
|
+
note: string | null;
|
|
139
|
+
createdAt: string | null;
|
|
140
|
+
};
|
|
141
|
+
export type FirewallRuleInput = {
|
|
142
|
+
action: FirewallAction;
|
|
143
|
+
kind: FirewallRuleKind;
|
|
144
|
+
/** SteamID / license / Discord id / UUID / name, an IP, or an ISO country code. Max 128 chars. */
|
|
145
|
+
value: string;
|
|
146
|
+
/** Up to 120 characters. */
|
|
147
|
+
note?: string;
|
|
148
|
+
};
|
|
149
|
+
export type FirewallRuleQuery = PageParams & {
|
|
150
|
+
q?: string;
|
|
151
|
+
action?: FirewallAction;
|
|
152
|
+
kind?: FirewallRuleKind;
|
|
153
|
+
};
|
|
154
|
+
export type FirewallRuleList = {
|
|
155
|
+
serverId: string;
|
|
156
|
+
rules: FirewallRule[];
|
|
157
|
+
pagination: {
|
|
158
|
+
page: number;
|
|
159
|
+
limit: number;
|
|
160
|
+
total: number;
|
|
161
|
+
pages: number;
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
export type FirewallRuleCreateResult = {
|
|
165
|
+
ok: boolean;
|
|
166
|
+
created: FirewallRule[];
|
|
167
|
+
errors: Array<{
|
|
168
|
+
index: number;
|
|
169
|
+
code: string;
|
|
170
|
+
message: string;
|
|
171
|
+
}>;
|
|
172
|
+
};
|
|
173
|
+
export type FirewallRuleBulkDelete = {
|
|
174
|
+
/** Up to 500 rule ids. */
|
|
175
|
+
ids?: string[];
|
|
176
|
+
action?: FirewallAction;
|
|
177
|
+
kind?: FirewallRuleKind;
|
|
178
|
+
};
|
|
179
|
+
export type FirewallBlock = {
|
|
180
|
+
id: string;
|
|
181
|
+
externalId: string | null;
|
|
182
|
+
name: string | null;
|
|
183
|
+
ip: string | null;
|
|
184
|
+
countryCode: string | null;
|
|
185
|
+
reason: string;
|
|
186
|
+
matchedValue: string | null;
|
|
187
|
+
createdAt: string | null;
|
|
188
|
+
};
|
|
189
|
+
export type DiscordModule = {
|
|
190
|
+
serverId: string;
|
|
191
|
+
moduleEnabled: boolean;
|
|
192
|
+
active: boolean;
|
|
193
|
+
linkedGuilds: number;
|
|
194
|
+
};
|
|
195
|
+
export type LinkCode = {
|
|
196
|
+
discordId: string;
|
|
197
|
+
/** The player types `!flitt CODE` in game (GMod / FiveM) or `/flitt link CODE` (Minecraft). */
|
|
198
|
+
code: string;
|
|
199
|
+
/** Seconds before the code expires. */
|
|
200
|
+
expiresInS: number;
|
|
201
|
+
instructions: string;
|
|
202
|
+
};
|
|
203
|
+
export type AccountLink = {
|
|
204
|
+
discordId: string;
|
|
205
|
+
game: Game;
|
|
206
|
+
externalId: string;
|
|
207
|
+
name: string | null;
|
|
208
|
+
linkedAt: string;
|
|
209
|
+
};
|
|
210
|
+
export type CommandType = "chat" | "set_group" | "set_name" | "kick" | "ban" | "unban" | "notify";
|
|
211
|
+
export type CommandInput = {
|
|
212
|
+
type: CommandType;
|
|
213
|
+
payload?: Record<string, unknown>;
|
|
214
|
+
/** Wait up to this many ms (max 15000) for the addon's result. */
|
|
215
|
+
waitMs?: number;
|
|
216
|
+
};
|
|
217
|
+
export type QueuedCommand = {
|
|
218
|
+
id: string;
|
|
219
|
+
type: CommandType;
|
|
220
|
+
payload: Record<string, unknown>;
|
|
221
|
+
requestedBy: string | null;
|
|
222
|
+
createdAt: string;
|
|
223
|
+
};
|
|
224
|
+
export type CommandResult = {
|
|
225
|
+
serverId: string;
|
|
226
|
+
command: QueuedCommand;
|
|
227
|
+
/** Addon answer when `waitMs` was set and it answered in time, else `null`. */
|
|
228
|
+
result: {
|
|
229
|
+
ok: boolean;
|
|
230
|
+
output?: string | null;
|
|
231
|
+
} | null;
|
|
232
|
+
note?: string;
|
|
233
|
+
};
|
|
234
|
+
export type GroupList = {
|
|
235
|
+
serverId: string;
|
|
236
|
+
players: Array<{
|
|
237
|
+
externalId: string;
|
|
238
|
+
group: string;
|
|
239
|
+
}>;
|
|
240
|
+
};
|
|
241
|
+
export type WebhookEventType = "server_down" | "server_down_addon" | "server_down_tcp" | "server_up" | "server_up_addon" | "server_up_tcp" | "player_peak" | "player_joined" | "player_left" | "player_first_join" | "player_chat" | "review_created" | "vote_created" | "affluence_low" | "affluence_high";
|
|
242
|
+
/** Body of a generic (HTTP) webhook. */
|
|
243
|
+
export type WebhookEvent<T = Record<string, unknown> | null> = {
|
|
244
|
+
event: WebhookEventType;
|
|
245
|
+
timestamp: string;
|
|
246
|
+
server: {
|
|
247
|
+
id: string;
|
|
248
|
+
name: string | null;
|
|
249
|
+
};
|
|
250
|
+
data: T;
|
|
251
|
+
};
|
|
252
|
+
type IdentityFields = {
|
|
253
|
+
/** In-game name typed on the vote page. */
|
|
254
|
+
player: string;
|
|
255
|
+
/** SteamID64, STEAM_0:X:Y or [U:1:X]. */
|
|
256
|
+
steamId: string;
|
|
257
|
+
discordId: string;
|
|
258
|
+
/** FiveM license, with or without the "license:" prefix. */
|
|
259
|
+
license: string;
|
|
260
|
+
/** Minecraft UUID, with or without dashes. */
|
|
261
|
+
uuid: string;
|
|
262
|
+
/** Voter IP (hashed server-side, never stored in clear). */
|
|
263
|
+
ip: string;
|
|
264
|
+
voteId: string;
|
|
265
|
+
};
|
|
266
|
+
/** Exactly one way to identify the player (the others are forbidden by the type). */
|
|
267
|
+
export type VoteIdentity = {
|
|
268
|
+
[K in keyof IdentityFields]: {
|
|
269
|
+
[P in K]: IdentityFields[P];
|
|
270
|
+
} & {
|
|
271
|
+
[P in Exclude<keyof IdentityFields, K>]?: never;
|
|
272
|
+
};
|
|
273
|
+
}[keyof IdentityFields];
|
|
274
|
+
export type Vote = {
|
|
275
|
+
id: string;
|
|
276
|
+
player: string;
|
|
277
|
+
verified: boolean;
|
|
278
|
+
createdAt: string;
|
|
279
|
+
claimableUntil: string;
|
|
280
|
+
};
|
|
281
|
+
export type VoteCheck = {
|
|
282
|
+
status: "CLAIMABLE" | "CLAIMED" | "NOT_FOUND";
|
|
283
|
+
vote: Vote | null;
|
|
284
|
+
/** Minutes before this player can vote again. */
|
|
285
|
+
nextVoteInMinutes: number;
|
|
286
|
+
};
|
|
287
|
+
export type VoteClaim = {
|
|
288
|
+
status: "CLAIMED_NOW" | "ALREADY_CLAIMED" | "NOT_FOUND";
|
|
289
|
+
vote: Vote | null;
|
|
290
|
+
/** Bonus rewards won in the draw (Premium / Enterprise servers), give them yourself. */
|
|
291
|
+
rewards?: Array<{
|
|
292
|
+
id: string;
|
|
293
|
+
name: string;
|
|
294
|
+
}>;
|
|
295
|
+
};
|
|
296
|
+
export type VoteListItem = {
|
|
297
|
+
id: string;
|
|
298
|
+
player: string;
|
|
299
|
+
verified: boolean;
|
|
300
|
+
steamId: string | null;
|
|
301
|
+
discordId: string | null;
|
|
302
|
+
uuid: string | null;
|
|
303
|
+
source: "WEB" | "DISCORD";
|
|
304
|
+
claimed: boolean;
|
|
305
|
+
createdAt: string;
|
|
306
|
+
};
|
|
307
|
+
export type VoteList = {
|
|
308
|
+
votes: VoteListItem[];
|
|
309
|
+
nextCursor: string | null;
|
|
310
|
+
};
|
|
311
|
+
export type VoteListParams = {
|
|
312
|
+
/** ISO date, default: last hour, at most 30 days back. */
|
|
313
|
+
since?: string | Date;
|
|
314
|
+
/** 1 to 100, default 50. */
|
|
315
|
+
limit?: number;
|
|
316
|
+
cursor?: string;
|
|
317
|
+
};
|
|
318
|
+
export type TopVotersPeriod = "current_month" | "last_month" | "all_time" | `${number}-${number}`;
|
|
319
|
+
export type TopVoters = {
|
|
320
|
+
period: string;
|
|
321
|
+
players: Array<{
|
|
322
|
+
rank: number;
|
|
323
|
+
player: string;
|
|
324
|
+
votes: number;
|
|
325
|
+
verified: boolean;
|
|
326
|
+
lastVoteAt: string;
|
|
327
|
+
}>;
|
|
328
|
+
};
|
|
329
|
+
export type VoteStats = {
|
|
330
|
+
daily: Array<{
|
|
331
|
+
date: string;
|
|
332
|
+
votes: number;
|
|
333
|
+
views: number;
|
|
334
|
+
joinClicks: number;
|
|
335
|
+
}>;
|
|
336
|
+
weekly: Array<{
|
|
337
|
+
week: string;
|
|
338
|
+
votes: number;
|
|
339
|
+
views: number;
|
|
340
|
+
joinClicks: number;
|
|
341
|
+
}>;
|
|
342
|
+
monthly: Array<{
|
|
343
|
+
month: string;
|
|
344
|
+
votes: number;
|
|
345
|
+
views: number;
|
|
346
|
+
joinClicks: number;
|
|
347
|
+
rank: number | null;
|
|
348
|
+
}>;
|
|
349
|
+
};
|
|
350
|
+
export type VoteServer = {
|
|
351
|
+
id: string;
|
|
352
|
+
name: string | null;
|
|
353
|
+
game: Game;
|
|
354
|
+
url: string;
|
|
355
|
+
voteUrl: string;
|
|
356
|
+
verified: boolean;
|
|
357
|
+
addonConnected: boolean;
|
|
358
|
+
status: {
|
|
359
|
+
online: boolean;
|
|
360
|
+
players: number;
|
|
361
|
+
maxPlayers: number;
|
|
362
|
+
source: "ADDON" | "QUERY";
|
|
363
|
+
} | null;
|
|
364
|
+
votes: {
|
|
365
|
+
today: number;
|
|
366
|
+
month: number;
|
|
367
|
+
total: number;
|
|
368
|
+
};
|
|
369
|
+
ranking: {
|
|
370
|
+
votesRank: number | null;
|
|
371
|
+
votesRankOf: number;
|
|
372
|
+
flittScore: number;
|
|
373
|
+
badges: string[];
|
|
374
|
+
};
|
|
375
|
+
reviews: {
|
|
376
|
+
rating: number | null;
|
|
377
|
+
count: number;
|
|
378
|
+
};
|
|
379
|
+
stats?: VoteStats;
|
|
380
|
+
};
|
|
381
|
+
export type Review = {
|
|
382
|
+
id: string;
|
|
383
|
+
rating: number;
|
|
384
|
+
body: string;
|
|
385
|
+
author: string;
|
|
386
|
+
verifiedPlayer: boolean;
|
|
387
|
+
createdAt: string;
|
|
388
|
+
ownerReply: {
|
|
389
|
+
body: string;
|
|
390
|
+
createdAt: string | null;
|
|
391
|
+
} | null;
|
|
392
|
+
};
|
|
393
|
+
export type ReviewList = {
|
|
394
|
+
rating: number | null;
|
|
395
|
+
count: number;
|
|
396
|
+
reviews: Review[];
|
|
397
|
+
nextCursor: string | null;
|
|
398
|
+
};
|
|
399
|
+
export type ReviewListParams = {
|
|
400
|
+
/** 1 to 50, default 20. */
|
|
401
|
+
limit?: number;
|
|
402
|
+
cursor?: string;
|
|
403
|
+
sort?: "recent" | "rating_desc" | "rating_asc";
|
|
404
|
+
};
|
|
405
|
+
export {};
|
|
406
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Response types of the Flitt Public API v1 (`/v1/public-api`) and of the
|
|
4
|
+
* Vote API (`/v1/vote-api`). Dates are ISO 8601 strings, as sent by the API.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":";;;AAAA,mFAAmF;AACtE,QAAA,OAAO,GAAG,OAAO,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { FlittError } from "./errors.js";
|
|
2
|
+
import type { WebhookEvent } from "./types.js";
|
|
3
|
+
/** The webhook signature is missing, invalid, too old or already used. */
|
|
4
|
+
export declare class FlittWebhookError extends FlittError {
|
|
5
|
+
}
|
|
6
|
+
export type HeaderSource = Headers | Record<string, string | string[] | undefined>;
|
|
7
|
+
export type VerifyWebhookOptions = {
|
|
8
|
+
/** Raw request body, exactly as received (do not re-serialise parsed JSON). */
|
|
9
|
+
payload: string | Uint8Array | ArrayBuffer;
|
|
10
|
+
/** Request headers (Fetch `Headers`, or Node / Express `req.headers`). */
|
|
11
|
+
headers: HeaderSource;
|
|
12
|
+
/** Secret shown when you created the webhook in the dashboard. */
|
|
13
|
+
secret: string;
|
|
14
|
+
/** Maximum age of a delivery, in seconds. Default 300 (5 minutes). */
|
|
15
|
+
toleranceSec?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Replay protection: return true if this nonce was already accepted (store
|
|
18
|
+
* it for `toleranceSec`). Optional, strongly recommended.
|
|
19
|
+
*/
|
|
20
|
+
isReplay?: (nonce: string, webhookId: string | null) => boolean | Promise<boolean>;
|
|
21
|
+
/** Clock used for the age check, in ms. Default `Date.now()`. */
|
|
22
|
+
now?: number;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Checks that a webhook really comes from Flitt and returns the parsed event.
|
|
26
|
+
*
|
|
27
|
+
* Flitt signs `${timestamp}.${nonce}.${rawBody}` with HMAC-SHA256 and sends
|
|
28
|
+
* `X-Webhook-Signature: t=<ms>,v1=<hex>`, `X-Webhook-Nonce` and
|
|
29
|
+
* `X-Webhook-Timestamp`. Throws `FlittWebhookError` if anything is off.
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* app.post("/flitt", express.raw({ type: "application/json" }), async (req, res) => {
|
|
33
|
+
* const event = await verifyWebhook({ payload: req.body, headers: req.headers, secret: process.env.FLITT_WEBHOOK_SECRET! });
|
|
34
|
+
* if (event.event === "server_down") alertTeam(event.server.name);
|
|
35
|
+
* res.sendStatus(204);
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function verifyWebhook<T = Record<string, unknown> | null>(options: VerifyWebhookOptions): Promise<WebhookEvent<T>>;
|
|
40
|
+
//# sourceMappingURL=webhooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.d.ts","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,0EAA0E;AAC1E,qBAAa,iBAAkB,SAAQ,UAAU;CAAG;AAEpD,MAAM,MAAM,YAAY,GAAG,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;AAEnF,MAAM,MAAM,oBAAoB,GAAG;IACjC,+EAA+E;IAC/E,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,CAAC;IAC3C,0EAA0E;IAC1E,OAAO,EAAE,YAAY,CAAC;IACtB,kEAAkE;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnF,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AA8BF;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,aAAa,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CA6C/H"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FlittWebhookError = void 0;
|
|
4
|
+
exports.verifyWebhook = verifyWebhook;
|
|
5
|
+
const errors_js_1 = require("./errors.js");
|
|
6
|
+
/** The webhook signature is missing, invalid, too old or already used. */
|
|
7
|
+
class FlittWebhookError extends errors_js_1.FlittError {
|
|
8
|
+
}
|
|
9
|
+
exports.FlittWebhookError = FlittWebhookError;
|
|
10
|
+
function header(headers, name) {
|
|
11
|
+
if (typeof headers.get === "function")
|
|
12
|
+
return headers.get(name);
|
|
13
|
+
const record = headers;
|
|
14
|
+
const key = Object.keys(record).find((k) => k.toLowerCase() === name.toLowerCase());
|
|
15
|
+
const value = key ? record[key] : undefined;
|
|
16
|
+
return Array.isArray(value) ? value[0] ?? null : value ?? null;
|
|
17
|
+
}
|
|
18
|
+
function toBytes(payload) {
|
|
19
|
+
if (typeof payload === "string")
|
|
20
|
+
return new TextEncoder().encode(payload);
|
|
21
|
+
return payload instanceof Uint8Array ? payload : new Uint8Array(payload);
|
|
22
|
+
}
|
|
23
|
+
/** Web Crypto: global in Node.js 20+, Deno, Bun, browsers and edge runtimes. */
|
|
24
|
+
function subtle() {
|
|
25
|
+
const c = globalThis.crypto;
|
|
26
|
+
if (c?.subtle)
|
|
27
|
+
return c.subtle;
|
|
28
|
+
throw new FlittWebhookError("Web Crypto (globalThis.crypto.subtle) is not available: use Node.js 20 or newer.");
|
|
29
|
+
}
|
|
30
|
+
/** Constant-time comparison of two hex strings. */
|
|
31
|
+
function safeEqualHex(a, b) {
|
|
32
|
+
if (a.length !== b.length)
|
|
33
|
+
return false;
|
|
34
|
+
let diff = 0;
|
|
35
|
+
for (let i = 0; i < a.length; i++)
|
|
36
|
+
diff |= a.charCodeAt(i) ^ b.charCodeAt(i);
|
|
37
|
+
return diff === 0;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Checks that a webhook really comes from Flitt and returns the parsed event.
|
|
41
|
+
*
|
|
42
|
+
* Flitt signs `${timestamp}.${nonce}.${rawBody}` with HMAC-SHA256 and sends
|
|
43
|
+
* `X-Webhook-Signature: t=<ms>,v1=<hex>`, `X-Webhook-Nonce` and
|
|
44
|
+
* `X-Webhook-Timestamp`. Throws `FlittWebhookError` if anything is off.
|
|
45
|
+
*
|
|
46
|
+
* ```ts
|
|
47
|
+
* app.post("/flitt", express.raw({ type: "application/json" }), async (req, res) => {
|
|
48
|
+
* const event = await verifyWebhook({ payload: req.body, headers: req.headers, secret: process.env.FLITT_WEBHOOK_SECRET! });
|
|
49
|
+
* if (event.event === "server_down") alertTeam(event.server.name);
|
|
50
|
+
* res.sendStatus(204);
|
|
51
|
+
* });
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
async function verifyWebhook(options) {
|
|
55
|
+
const secret = String(options.secret ?? "");
|
|
56
|
+
if (!secret)
|
|
57
|
+
throw new FlittWebhookError("Missing webhook secret.");
|
|
58
|
+
const signature = header(options.headers, "x-webhook-signature");
|
|
59
|
+
const nonce = header(options.headers, "x-webhook-nonce");
|
|
60
|
+
const webhookId = header(options.headers, "x-webhook-id");
|
|
61
|
+
if (!signature)
|
|
62
|
+
throw new FlittWebhookError("Missing X-Webhook-Signature header (is a secret set on this webhook?).");
|
|
63
|
+
if (!nonce || !/^[A-Za-z0-9_-]{8,128}$/.test(nonce))
|
|
64
|
+
throw new FlittWebhookError("Missing or invalid X-Webhook-Nonce header.");
|
|
65
|
+
const parts = Object.fromEntries(signature.split(",").map((p) => {
|
|
66
|
+
const i = p.indexOf("=");
|
|
67
|
+
return [p.slice(0, i).trim(), p.slice(i + 1).trim()];
|
|
68
|
+
}));
|
|
69
|
+
const timestamp = parts.t;
|
|
70
|
+
const expected = parts.v1;
|
|
71
|
+
if (!timestamp || !/^\d{10,16}$/.test(timestamp) || !expected || !/^[0-9a-f]{64}$/i.test(expected)) {
|
|
72
|
+
throw new FlittWebhookError("Malformed X-Webhook-Signature header.");
|
|
73
|
+
}
|
|
74
|
+
const toleranceMs = Math.max(1, options.toleranceSec ?? 300) * 1000;
|
|
75
|
+
const age = Math.abs((options.now ?? Date.now()) - Number(timestamp));
|
|
76
|
+
if (age > toleranceMs)
|
|
77
|
+
throw new FlittWebhookError("Webhook timestamp outside the tolerance window (replayed or clock skew).");
|
|
78
|
+
const body = toBytes(options.payload);
|
|
79
|
+
const prefix = new TextEncoder().encode(`${timestamp}.${nonce}.`);
|
|
80
|
+
const signed = new Uint8Array(prefix.length + body.length);
|
|
81
|
+
signed.set(prefix, 0);
|
|
82
|
+
signed.set(body, prefix.length);
|
|
83
|
+
const s = subtle();
|
|
84
|
+
const key = await s.importKey("raw", new TextEncoder().encode(secret), { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
85
|
+
const mac = new Uint8Array(await s.sign("HMAC", key, signed));
|
|
86
|
+
const actual = Array.from(mac, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
87
|
+
if (!safeEqualHex(actual, expected.toLowerCase()))
|
|
88
|
+
throw new FlittWebhookError("Invalid webhook signature.");
|
|
89
|
+
if (options.isReplay && (await options.isReplay(nonce, webhookId)))
|
|
90
|
+
throw new FlittWebhookError("Webhook already processed (replayed nonce).");
|
|
91
|
+
try {
|
|
92
|
+
return JSON.parse(new TextDecoder().decode(body));
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
throw new FlittWebhookError("Webhook body is not valid JSON.");
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/webhooks.ts"],"names":[],"mappings":"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"}
|