@phxgg/kick.js 0.1.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.
Files changed (181) hide show
  1. package/dist/BaseResponse.d.ts +10 -0
  2. package/dist/BaseResponse.d.ts.map +1 -0
  3. package/dist/BaseResponse.js +2 -0
  4. package/dist/BaseResponse.js.map +1 -0
  5. package/dist/Errors.d.ts +25 -0
  6. package/dist/Errors.d.ts.map +1 -0
  7. package/dist/Errors.js +49 -0
  8. package/dist/Errors.js.map +1 -0
  9. package/dist/EventManager.d.ts +15 -0
  10. package/dist/EventManager.d.ts.map +1 -0
  11. package/dist/EventManager.js +35 -0
  12. package/dist/EventManager.js.map +1 -0
  13. package/dist/KickClient.d.ts +46 -0
  14. package/dist/KickClient.d.ts.map +1 -0
  15. package/dist/KickClient.js +88 -0
  16. package/dist/KickClient.js.map +1 -0
  17. package/dist/OAuth.d.ts +77 -0
  18. package/dist/OAuth.d.ts.map +1 -0
  19. package/dist/OAuth.js +162 -0
  20. package/dist/OAuth.js.map +1 -0
  21. package/dist/Scope.d.ts +14 -0
  22. package/dist/Scope.d.ts.map +1 -0
  23. package/dist/Scope.js +15 -0
  24. package/dist/Scope.js.map +1 -0
  25. package/dist/Serializable.d.ts +15 -0
  26. package/dist/Serializable.d.ts.map +1 -0
  27. package/dist/Serializable.js +111 -0
  28. package/dist/Serializable.js.map +1 -0
  29. package/dist/Version.d.ts +5 -0
  30. package/dist/Version.d.ts.map +1 -0
  31. package/dist/Version.js +6 -0
  32. package/dist/Version.js.map +1 -0
  33. package/dist/index.d.ts +49 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +41 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/resources/Category.d.ts +20 -0
  38. package/dist/resources/Category.d.ts.map +1 -0
  39. package/dist/resources/Category.js +26 -0
  40. package/dist/resources/Category.js.map +1 -0
  41. package/dist/resources/Channel.d.ts +48 -0
  42. package/dist/resources/Channel.d.ts.map +1 -0
  43. package/dist/resources/Channel.js +51 -0
  44. package/dist/resources/Channel.js.map +1 -0
  45. package/dist/resources/ChannelReward.d.ts +28 -0
  46. package/dist/resources/ChannelReward.d.ts.map +1 -0
  47. package/dist/resources/ChannelReward.js +38 -0
  48. package/dist/resources/ChannelReward.js.map +1 -0
  49. package/dist/resources/ChannelRewardRedemption.d.ts +59 -0
  50. package/dist/resources/ChannelRewardRedemption.d.ts.map +1 -0
  51. package/dist/resources/ChannelRewardRedemption.js +38 -0
  52. package/dist/resources/ChannelRewardRedemption.js.map +1 -0
  53. package/dist/resources/EventSubscription.d.ts +26 -0
  54. package/dist/resources/EventSubscription.d.ts.map +1 -0
  55. package/dist/resources/EventSubscription.js +35 -0
  56. package/dist/resources/EventSubscription.js.map +1 -0
  57. package/dist/resources/Leaderboard.d.ts +22 -0
  58. package/dist/resources/Leaderboard.d.ts.map +1 -0
  59. package/dist/resources/Leaderboard.js +20 -0
  60. package/dist/resources/Leaderboard.js.map +1 -0
  61. package/dist/resources/Livestream.d.ts +38 -0
  62. package/dist/resources/Livestream.d.ts.map +1 -0
  63. package/dist/resources/Livestream.js +48 -0
  64. package/dist/resources/Livestream.js.map +1 -0
  65. package/dist/resources/Message.d.ts +14 -0
  66. package/dist/resources/Message.d.ts.map +1 -0
  67. package/dist/resources/Message.js +17 -0
  68. package/dist/resources/Message.js.map +1 -0
  69. package/dist/resources/User.d.ts +18 -0
  70. package/dist/resources/User.d.ts.map +1 -0
  71. package/dist/resources/User.js +23 -0
  72. package/dist/resources/User.js.map +1 -0
  73. package/dist/services/CategoriesService.d.ts +39 -0
  74. package/dist/services/CategoriesService.d.ts.map +1 -0
  75. package/dist/services/CategoriesService.js +73 -0
  76. package/dist/services/CategoriesService.js.map +1 -0
  77. package/dist/services/CategoriesServiceV2.d.ts +39 -0
  78. package/dist/services/CategoriesServiceV2.d.ts.map +1 -0
  79. package/dist/services/CategoriesServiceV2.js +89 -0
  80. package/dist/services/CategoriesServiceV2.js.map +1 -0
  81. package/dist/services/ChannelRewardsService.d.ts +128 -0
  82. package/dist/services/ChannelRewardsService.d.ts.map +1 -0
  83. package/dist/services/ChannelRewardsService.js +296 -0
  84. package/dist/services/ChannelRewardsService.js.map +1 -0
  85. package/dist/services/ChannelsService.d.ts +64 -0
  86. package/dist/services/ChannelsService.d.ts.map +1 -0
  87. package/dist/services/ChannelsService.js +126 -0
  88. package/dist/services/ChannelsService.js.map +1 -0
  89. package/dist/services/ChatService.d.ts +49 -0
  90. package/dist/services/ChatService.d.ts.map +1 -0
  91. package/dist/services/ChatService.js +90 -0
  92. package/dist/services/ChatService.js.map +1 -0
  93. package/dist/services/EventsService.d.ts +96 -0
  94. package/dist/services/EventsService.d.ts.map +1 -0
  95. package/dist/services/EventsService.js +145 -0
  96. package/dist/services/EventsService.js.map +1 -0
  97. package/dist/services/KICKsService.d.ts +26 -0
  98. package/dist/services/KICKsService.d.ts.map +1 -0
  99. package/dist/services/KICKsService.js +49 -0
  100. package/dist/services/KICKsService.js.map +1 -0
  101. package/dist/services/LivestreamsService.d.ts +39 -0
  102. package/dist/services/LivestreamsService.d.ts.map +1 -0
  103. package/dist/services/LivestreamsService.js +92 -0
  104. package/dist/services/LivestreamsService.js.map +1 -0
  105. package/dist/services/ModerationService.d.ts +65 -0
  106. package/dist/services/ModerationService.d.ts.map +1 -0
  107. package/dist/services/ModerationService.js +132 -0
  108. package/dist/services/ModerationService.js.map +1 -0
  109. package/dist/services/PublicKeyService.d.ts +22 -0
  110. package/dist/services/PublicKeyService.d.ts.map +1 -0
  111. package/dist/services/PublicKeyService.js +58 -0
  112. package/dist/services/PublicKeyService.js.map +1 -0
  113. package/dist/services/UsersService.d.ts +23 -0
  114. package/dist/services/UsersService.d.ts.map +1 -0
  115. package/dist/services/UsersService.js +44 -0
  116. package/dist/services/UsersService.js.map +1 -0
  117. package/dist/utils.d.ts +21 -0
  118. package/dist/utils.d.ts.map +1 -0
  119. package/dist/utils.js +66 -0
  120. package/dist/utils.js.map +1 -0
  121. package/dist/webhooks/WebhookEvents.d.ts +27 -0
  122. package/dist/webhooks/WebhookEvents.d.ts.map +1 -0
  123. package/dist/webhooks/WebhookEvents.js +14 -0
  124. package/dist/webhooks/WebhookEvents.js.map +1 -0
  125. package/dist/webhooks/dispatch.d.ts +10 -0
  126. package/dist/webhooks/dispatch.d.ts.map +1 -0
  127. package/dist/webhooks/dispatch.js +16 -0
  128. package/dist/webhooks/dispatch.js.map +1 -0
  129. package/dist/webhooks/v1/Properties.d.ts +50 -0
  130. package/dist/webhooks/v1/Properties.d.ts.map +1 -0
  131. package/dist/webhooks/v1/Properties.js +2 -0
  132. package/dist/webhooks/v1/Properties.js.map +1 -0
  133. package/dist/webhooks/v1/payloads/ChannelFollowed.d.ts +6 -0
  134. package/dist/webhooks/v1/payloads/ChannelFollowed.d.ts.map +1 -0
  135. package/dist/webhooks/v1/payloads/ChannelFollowed.js +2 -0
  136. package/dist/webhooks/v1/payloads/ChannelFollowed.js.map +1 -0
  137. package/dist/webhooks/v1/payloads/ChannelRewardRedemptionUpdated.d.ts +17 -0
  138. package/dist/webhooks/v1/payloads/ChannelRewardRedemptionUpdated.d.ts.map +1 -0
  139. package/dist/webhooks/v1/payloads/ChannelRewardRedemptionUpdated.js +2 -0
  140. package/dist/webhooks/v1/payloads/ChannelRewardRedemptionUpdated.js.map +1 -0
  141. package/dist/webhooks/v1/payloads/ChannelSubscriptionGifts.d.ts +9 -0
  142. package/dist/webhooks/v1/payloads/ChannelSubscriptionGifts.d.ts.map +1 -0
  143. package/dist/webhooks/v1/payloads/ChannelSubscriptionGifts.js +2 -0
  144. package/dist/webhooks/v1/payloads/ChannelSubscriptionGifts.js.map +1 -0
  145. package/dist/webhooks/v1/payloads/ChannelSubscriptionNew.d.ts +9 -0
  146. package/dist/webhooks/v1/payloads/ChannelSubscriptionNew.d.ts.map +1 -0
  147. package/dist/webhooks/v1/payloads/ChannelSubscriptionNew.js +2 -0
  148. package/dist/webhooks/v1/payloads/ChannelSubscriptionNew.js.map +1 -0
  149. package/dist/webhooks/v1/payloads/ChannelSubscriptionRenewal.d.ts +9 -0
  150. package/dist/webhooks/v1/payloads/ChannelSubscriptionRenewal.d.ts.map +1 -0
  151. package/dist/webhooks/v1/payloads/ChannelSubscriptionRenewal.js +2 -0
  152. package/dist/webhooks/v1/payloads/ChannelSubscriptionRenewal.js.map +1 -0
  153. package/dist/webhooks/v1/payloads/ChatMessageSent.d.ts +15 -0
  154. package/dist/webhooks/v1/payloads/ChatMessageSent.d.ts.map +1 -0
  155. package/dist/webhooks/v1/payloads/ChatMessageSent.js +2 -0
  156. package/dist/webhooks/v1/payloads/ChatMessageSent.js.map +1 -0
  157. package/dist/webhooks/v1/payloads/KicksGifted.d.ts +8 -0
  158. package/dist/webhooks/v1/payloads/KicksGifted.d.ts.map +1 -0
  159. package/dist/webhooks/v1/payloads/KicksGifted.js +2 -0
  160. package/dist/webhooks/v1/payloads/KicksGifted.js.map +1 -0
  161. package/dist/webhooks/v1/payloads/LivestreamMetadataUpdated.d.ts +6 -0
  162. package/dist/webhooks/v1/payloads/LivestreamMetadataUpdated.d.ts.map +1 -0
  163. package/dist/webhooks/v1/payloads/LivestreamMetadataUpdated.js +2 -0
  164. package/dist/webhooks/v1/payloads/LivestreamMetadataUpdated.js.map +1 -0
  165. package/dist/webhooks/v1/payloads/LivestreamStatusUpdated.d.ts +9 -0
  166. package/dist/webhooks/v1/payloads/LivestreamStatusUpdated.d.ts.map +1 -0
  167. package/dist/webhooks/v1/payloads/LivestreamStatusUpdated.js +2 -0
  168. package/dist/webhooks/v1/payloads/LivestreamStatusUpdated.js.map +1 -0
  169. package/dist/webhooks/v1/payloads/ModerationBanned.d.ts +12 -0
  170. package/dist/webhooks/v1/payloads/ModerationBanned.d.ts.map +1 -0
  171. package/dist/webhooks/v1/payloads/ModerationBanned.js +2 -0
  172. package/dist/webhooks/v1/payloads/ModerationBanned.js.map +1 -0
  173. package/dist/webhooks/v1/payloads/index.d.ts +12 -0
  174. package/dist/webhooks/v1/payloads/index.d.ts.map +1 -0
  175. package/dist/webhooks/v1/payloads/index.js +2 -0
  176. package/dist/webhooks/v1/payloads/index.js.map +1 -0
  177. package/dist/webhooks/verify.d.ts +21 -0
  178. package/dist/webhooks/verify.d.ts.map +1 -0
  179. package/dist/webhooks/verify.js +15 -0
  180. package/dist/webhooks/verify.js.map +1 -0
  181. package/package.json +36 -0
@@ -0,0 +1,65 @@
1
+ import z from 'zod';
2
+ import type { KickClient } from '../KickClient.js';
3
+ export declare const banUserSchema: z.ZodObject<{
4
+ broadcasterUserId: z.ZodNumber;
5
+ userId: z.ZodNumber;
6
+ reason: z.ZodOptional<z.ZodString>;
7
+ }, z.z.core.$strip>;
8
+ export type BanUserParams = z.infer<typeof banUserSchema>;
9
+ export declare const timeoutUserSchema: z.ZodObject<{
10
+ broadcasterUserId: z.ZodNumber;
11
+ userId: z.ZodNumber;
12
+ reason: z.ZodOptional<z.ZodString>;
13
+ duration: z.ZodNumber;
14
+ }, z.z.core.$strip>;
15
+ export type TimeoutUserParams = z.infer<typeof timeoutUserSchema>;
16
+ export declare const removeBanSchema: z.ZodObject<{
17
+ broadcasterUserId: z.ZodNumber;
18
+ userId: z.ZodNumber;
19
+ }, z.z.core.$strip>;
20
+ export type RemoveBanParams = z.infer<typeof removeBanSchema>;
21
+ export declare class ModerationService {
22
+ private readonly MODERATION_URL;
23
+ protected readonly client: KickClient;
24
+ constructor(client: KickClient);
25
+ /**
26
+ * Ban a user from a channel.
27
+ *
28
+ * Required scopes:
29
+ * `moderation:ban`
30
+ *
31
+ * @param params The parameters for banning a user
32
+ * @param params.broadcasterUserId The ID of the broadcaster from whose channel the user is being banned
33
+ * @param params.userId The ID of the user to be banned
34
+ * @param params.reason (Optional) The reason for the ban
35
+ * @returns void
36
+ */
37
+ banUser(params: BanUserParams): Promise<void>;
38
+ /**
39
+ * Timeout a user in a channel.
40
+ *
41
+ * Required scopes:
42
+ * `moderation:ban`
43
+ *
44
+ * @param params The parameters for timing out a user
45
+ * @param params.broadcasterUserId The ID of the broadcaster from whose channel the user is being timed out
46
+ * @param params.userId The ID of the user to be timed out
47
+ * @param params.reason (Optional) The reason for the timeout
48
+ * @param params.duration The duration of the timeout in seconds (max 7 days)
49
+ * @returns void
50
+ */
51
+ timeoutUser(params: TimeoutUserParams): Promise<void>;
52
+ /**
53
+ * Remove a ban or timeout from a user in a channel.
54
+ *
55
+ * Required scopes:
56
+ * `moderation:ban`
57
+ *
58
+ * @param options The options for removing a ban or timeout
59
+ * @param options.broadcasterUserId The ID of the broadcaster from whose channel the ban/timeout is being removed
60
+ * @param options.userId The ID of the user whose ban/timeout is being removed
61
+ * @returns void
62
+ */
63
+ removeBan(params: RemoveBanParams): Promise<void>;
64
+ }
65
+ //# sourceMappingURL=ModerationService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModerationService.d.ts","sourceRoot":"","sources":["../../src/services/ModerationService.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,eAAO,MAAM,aAAa;;;;mBAIxB,CAAC;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAE1D,eAAO,MAAM,iBAAiB;;;;;mBAE5B,CAAC;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE,eAAO,MAAM,eAAe;;;mBAG1B,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAE9D,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA+C;IAC9E,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAE1B,MAAM,EAAE,UAAU;IAI9B;;;;;;;;;;;OAWG;IACG,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA8BnD;;;;;;;;;;;;OAYG;IACG,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IA+B3D;;;;;;;;;;OAUG;IACG,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CA4BxD"}
@@ -0,0 +1,132 @@
1
+ import z from 'zod';
2
+ import { Scope } from '../Scope.js';
3
+ import { constructEndpoint, handleError } from '../utils.js';
4
+ import { Version } from '../Version.js';
5
+ export const banUserSchema = z.object({
6
+ broadcasterUserId: z.number().int().positive(),
7
+ userId: z.number().int().positive(),
8
+ reason: z.string().max(100).optional(),
9
+ });
10
+ export const timeoutUserSchema = banUserSchema.extend({
11
+ duration: z.number().int().min(1).max(10080), // max 7 days
12
+ });
13
+ export const removeBanSchema = z.object({
14
+ broadcasterUserId: z.number().int().positive(),
15
+ userId: z.number().int().positive(),
16
+ });
17
+ export class ModerationService {
18
+ MODERATION_URL = constructEndpoint(Version.V1, 'moderation');
19
+ client;
20
+ constructor(client) {
21
+ this.client = client;
22
+ }
23
+ /**
24
+ * Ban a user from a channel.
25
+ *
26
+ * Required scopes:
27
+ * `moderation:ban`
28
+ *
29
+ * @param params The parameters for banning a user
30
+ * @param params.broadcasterUserId The ID of the broadcaster from whose channel the user is being banned
31
+ * @param params.userId The ID of the user to be banned
32
+ * @param params.reason (Optional) The reason for the ban
33
+ * @returns void
34
+ */
35
+ async banUser(params) {
36
+ this.client.requiresScope(Scope.MODERATION_BAN);
37
+ const schema = banUserSchema.safeParse(params);
38
+ if (!schema.success) {
39
+ throw new Error(`Invalid parameters: ${schema.error.message}`);
40
+ }
41
+ const { broadcasterUserId, userId, reason } = schema.data;
42
+ const endpoint = new URL(this.MODERATION_URL + '/bans');
43
+ const response = await fetch(endpoint, {
44
+ method: 'POST',
45
+ headers: {
46
+ Authorization: `Bearer ${this.client.token?.access_token}`,
47
+ 'Content-Type': 'application/json',
48
+ },
49
+ body: JSON.stringify({
50
+ broadcaster_user_id: broadcasterUserId,
51
+ user_id: userId,
52
+ reason: reason,
53
+ }),
54
+ });
55
+ if (!response.ok) {
56
+ handleError(response);
57
+ }
58
+ }
59
+ /**
60
+ * Timeout a user in a channel.
61
+ *
62
+ * Required scopes:
63
+ * `moderation:ban`
64
+ *
65
+ * @param params The parameters for timing out a user
66
+ * @param params.broadcasterUserId The ID of the broadcaster from whose channel the user is being timed out
67
+ * @param params.userId The ID of the user to be timed out
68
+ * @param params.reason (Optional) The reason for the timeout
69
+ * @param params.duration The duration of the timeout in seconds (max 7 days)
70
+ * @returns void
71
+ */
72
+ async timeoutUser(params) {
73
+ this.client.requiresScope(Scope.MODERATION_BAN);
74
+ const schema = timeoutUserSchema.safeParse(params);
75
+ if (!schema.success) {
76
+ throw new Error(`Invalid parameters: ${schema.error.message}`);
77
+ }
78
+ const { broadcasterUserId, userId, reason, duration } = schema.data;
79
+ const endpoint = new URL(this.MODERATION_URL + '/bans');
80
+ const response = await fetch(endpoint, {
81
+ method: 'POST',
82
+ headers: {
83
+ Authorization: `Bearer ${this.client.token?.access_token}`,
84
+ 'Content-Type': 'application/json',
85
+ },
86
+ body: JSON.stringify({
87
+ broadcaster_user_id: broadcasterUserId,
88
+ user_id: userId,
89
+ reason: reason,
90
+ duration: duration,
91
+ }),
92
+ });
93
+ if (!response.ok) {
94
+ handleError(response);
95
+ }
96
+ }
97
+ /**
98
+ * Remove a ban or timeout from a user in a channel.
99
+ *
100
+ * Required scopes:
101
+ * `moderation:ban`
102
+ *
103
+ * @param options The options for removing a ban or timeout
104
+ * @param options.broadcasterUserId The ID of the broadcaster from whose channel the ban/timeout is being removed
105
+ * @param options.userId The ID of the user whose ban/timeout is being removed
106
+ * @returns void
107
+ */
108
+ async removeBan(params) {
109
+ this.client.requiresScope(Scope.MODERATION_BAN);
110
+ const schema = removeBanSchema.safeParse(params);
111
+ if (!schema.success) {
112
+ throw new Error(`Invalid parameters: ${schema.error.message}`);
113
+ }
114
+ const { broadcasterUserId, userId } = schema.data;
115
+ const endpoint = new URL(this.MODERATION_URL + '/bans');
116
+ const response = await fetch(endpoint, {
117
+ method: 'DELETE',
118
+ headers: {
119
+ Authorization: `Bearer ${this.client.token?.access_token}`,
120
+ 'Content-Type': 'application/json',
121
+ },
122
+ body: JSON.stringify({
123
+ broadcaster_user_id: broadcasterUserId,
124
+ user_id: userId,
125
+ }),
126
+ });
127
+ if (!response.ok) {
128
+ handleError(response);
129
+ }
130
+ }
131
+ }
132
+ //# sourceMappingURL=ModerationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModerationService.js","sourceRoot":"","sources":["../../src/services/ModerationService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { BaseResponse } from '../BaseResponse.js';
2
+ export type PublicKeyDto = {
3
+ public_key: string;
4
+ };
5
+ export type PublicKeyResponse = BaseResponse<PublicKeyDto>;
6
+ export declare class PublicKeyService {
7
+ private readonly KICK_PUBLIC_KEY_URL;
8
+ private static instance;
9
+ private cache;
10
+ private inFlight?;
11
+ private readonly ttlMs;
12
+ private constructor();
13
+ static getInstance(): PublicKeyService;
14
+ /**
15
+ * Returns the (possibly cached) public key; refreshes when TTL expired.
16
+ * Ensures only one network fetch runs concurrently.
17
+ */
18
+ getPublicKey(): Promise<string>;
19
+ refresh(): Promise<string>;
20
+ }
21
+ export declare function getKickPublicKey(): Promise<string>;
22
+ //# sourceMappingURL=PublicKeyService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublicKeyService.d.ts","sourceRoot":"","sources":["../../src/services/PublicKeyService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIlD,MAAM,MAAM,YAAY,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAClD,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;AAO3D,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA+C;IAEnF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAC,CAAkB;IAEnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,OAAO;IAIP,MAAM,CAAC,WAAW,IAAI,gBAAgB;IAOtC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IA+B/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;CAIjC;AAGD,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,CAExD"}
@@ -0,0 +1,58 @@
1
+ import { constructEndpoint, handleError, parseJSON } from '../utils.js';
2
+ import { Version } from '../Version.js';
3
+ export class PublicKeyService {
4
+ KICK_PUBLIC_KEY_URL = constructEndpoint(Version.V1, 'public-key');
5
+ static instance;
6
+ cache = null;
7
+ inFlight;
8
+ // Optional TTL (ms). Set to Infinity if Kick public key never rotates.
9
+ ttlMs;
10
+ constructor(ttlMs = 60 * 60 * 1000) {
11
+ this.ttlMs = ttlMs;
12
+ }
13
+ static getInstance() {
14
+ if (!this.instance) {
15
+ this.instance = new PublicKeyService();
16
+ }
17
+ return this.instance;
18
+ }
19
+ /**
20
+ * Returns the (possibly cached) public key; refreshes when TTL expired.
21
+ * Ensures only one network fetch runs concurrently.
22
+ */
23
+ async getPublicKey() {
24
+ const now = Date.now();
25
+ if (this.cache && now - this.cache.fetchedAt < this.ttlMs) {
26
+ return this.cache.key;
27
+ }
28
+ if (this.inFlight) {
29
+ return this.inFlight;
30
+ }
31
+ this.inFlight = (async () => {
32
+ const endpoint = new URL(this.KICK_PUBLIC_KEY_URL);
33
+ const response = await fetch(endpoint);
34
+ if (!response.ok) {
35
+ handleError(response);
36
+ }
37
+ const json = await parseJSON(response);
38
+ const key = json.data.public_key;
39
+ this.cache = { key, fetchedAt: Date.now() };
40
+ this.inFlight = undefined;
41
+ return key;
42
+ })().catch((err) => {
43
+ this.inFlight = undefined;
44
+ throw err;
45
+ });
46
+ return this.inFlight;
47
+ }
48
+ // Force refresh (ignore cache)
49
+ async refresh() {
50
+ this.cache = null;
51
+ return this.getPublicKey();
52
+ }
53
+ }
54
+ // Convenience exported function if callers prefer a simple API
55
+ export async function getKickPublicKey() {
56
+ return PublicKeyService.getInstance().getPublicKey();
57
+ }
58
+ //# sourceMappingURL=PublicKeyService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PublicKeyService.js","sourceRoot":"","sources":["../../src/services/PublicKeyService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAUxC,MAAM,OAAO,gBAAgB;IACV,mBAAmB,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAE3E,MAAM,CAAC,QAAQ,CAAmB;IAClC,KAAK,GAAsB,IAAI,CAAC;IAChC,QAAQ,CAAmB;IACnC,uEAAuE;IACtD,KAAK,CAAS;IAE/B,YAAoB,KAAK,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;QACxC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,EAAE,CAAC;QACzC,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC1D,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACnD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,WAAW,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAoB,QAAQ,CAAC,CAAC;YAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;YAEjC,IAAI,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC5C,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAE1B,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACjB,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC1B,MAAM,GAAG,CAAC;QACZ,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,+BAA+B;IAC/B,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;CACF;AAED,+DAA+D;AAC/D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,gBAAgB,CAAC,WAAW,EAAE,CAAC,YAAY,EAAE,CAAC;AACvD,CAAC"}
@@ -0,0 +1,23 @@
1
+ import { BaseResponse } from '../BaseResponse.js';
2
+ import type { KickClient } from '../KickClient.js';
3
+ import { User, type UserDto } from '../resources/User.js';
4
+ export type FetchUserResponse = BaseResponse<UserDto[]>;
5
+ export declare class UsersService {
6
+ private readonly USERS_URL;
7
+ protected readonly client: KickClient;
8
+ constructor(client: KickClient);
9
+ /**
10
+ * Retrieve user information based on provided user IDs.
11
+ * If no user IDs are specified, the information
12
+ * for the currently authorised user will be returned by default.
13
+ *
14
+ * Required scopes:
15
+ * `user:read`
16
+ *
17
+ * @param ids (Optional) Array of user IDs
18
+ * @returns An array of `User` instances.
19
+ */
20
+ fetch(ids?: number[]): Promise<User[]>;
21
+ me(): Promise<User>;
22
+ }
23
+ //# sourceMappingURL=UsersService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsersService.d.ts","sourceRoot":"","sources":["../../src/services/UsersService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAK1D,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;AAExD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;gBAE1B,MAAM,EAAE,UAAU;IAI9B;;;;;;;;;;OAUG;IACG,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAwBtC,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;CAG1B"}
@@ -0,0 +1,44 @@
1
+ import { User } from '../resources/User.js';
2
+ import { Scope } from '../Scope.js';
3
+ import { constructEndpoint, handleError, parseJSON } from '../utils.js';
4
+ import { Version } from '../Version.js';
5
+ export class UsersService {
6
+ USERS_URL = constructEndpoint(Version.V1, 'users');
7
+ client;
8
+ constructor(client) {
9
+ this.client = client;
10
+ }
11
+ /**
12
+ * Retrieve user information based on provided user IDs.
13
+ * If no user IDs are specified, the information
14
+ * for the currently authorised user will be returned by default.
15
+ *
16
+ * Required scopes:
17
+ * `user:read`
18
+ *
19
+ * @param ids (Optional) Array of user IDs
20
+ * @returns An array of `User` instances.
21
+ */
22
+ async fetch(ids) {
23
+ this.client.requiresScope(Scope.USER_READ);
24
+ const endpoint = new URL(this.USERS_URL);
25
+ if (ids) {
26
+ ids.forEach((id) => endpoint.searchParams.append('id', String(id)));
27
+ }
28
+ const response = await fetch(endpoint, {
29
+ headers: {
30
+ Authorization: `Bearer ${this.client.token?.access_token}`,
31
+ },
32
+ });
33
+ if (!response.ok) {
34
+ handleError(response);
35
+ }
36
+ const json = await parseJSON(response);
37
+ const data = json.data.map((user) => new User(this.client, user));
38
+ return data;
39
+ }
40
+ async me() {
41
+ return (await this.fetch())[0];
42
+ }
43
+ }
44
+ //# sourceMappingURL=UsersService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsersService.js","sourceRoot":"","sources":["../../src/services/UsersService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAgB,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAIxC,MAAM,OAAO,YAAY;IACN,SAAS,GAAG,iBAAiB,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACjD,MAAM,CAAa;IAEtC,YAAY,MAAkB;QAC5B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;;;;;;;OAUG;IACH,KAAK,CAAC,KAAK,CAAC,GAAc;QACxB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEzC,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;YACrC,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE;aAC3D;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,WAAW,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAAoB,QAAQ,CAAC,CAAC;QAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,EAAE;QACN,OAAO,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,21 @@
1
+ import { Version } from './Version.js';
2
+ import { WebhookEventNames } from './webhooks/WebhookEvents.js';
3
+ export declare function handleError(response: Response): void;
4
+ export declare function parseJSON<T>(response: Response): Promise<T>;
5
+ export declare function generateCodeVerifier(length?: number): string;
6
+ export declare function generateCodeChallenge(codeVerifier: string): string;
7
+ /**
8
+ * Helper function to extract the event unique identifier from different event types
9
+ * @param eventType The type of the webhook event
10
+ * @param payload The payload of the webhook event
11
+ * @returns The unique identifier as a string, or null if not found
12
+ */
13
+ export declare function extractUniqueId(eventType: WebhookEventNames, payload: any): string | null;
14
+ /**
15
+ * Construct the full API endpoint URL
16
+ * @param version API version
17
+ * @param path Endpoint path
18
+ * @returns Full URL as a string
19
+ */
20
+ export declare function constructEndpoint(version: Version, path: string): string;
21
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,wBAAgB,WAAW,CAAC,QAAQ,EAAE,QAAQ,QAe7C;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAOjE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,SAAK,UAG/C;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,UAGzD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,GAAG,GAAG,MAAM,GAAG,IAAI,CAMzF;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMxE"}
package/dist/utils.js ADDED
@@ -0,0 +1,66 @@
1
+ import crypto from 'crypto';
2
+ import { BadRequestError, ForbiddenError, InternalServerError, NotFoundError, RateLimitError, UnauthorizedError, } from './Errors.js';
3
+ import { KICK_BASE_URL } from './KickClient.js';
4
+ export function handleError(response) {
5
+ switch (response.status) {
6
+ case 400:
7
+ throw new BadRequestError();
8
+ case 401:
9
+ throw new UnauthorizedError();
10
+ case 403:
11
+ throw new ForbiddenError();
12
+ case 404:
13
+ throw new NotFoundError();
14
+ case 429:
15
+ throw new RateLimitError();
16
+ case 500:
17
+ throw new InternalServerError();
18
+ }
19
+ }
20
+ export async function parseJSON(response) {
21
+ try {
22
+ const data = await response.json();
23
+ return data;
24
+ }
25
+ catch (error) {
26
+ throw new Error('Failed to parse response body as JSON.');
27
+ }
28
+ }
29
+ export function generateCodeVerifier(length = 64) {
30
+ const rnd = crypto.randomBytes(length);
31
+ return rnd.toString('base64url');
32
+ }
33
+ export function generateCodeChallenge(codeVerifier) {
34
+ const hash = crypto.createHash('sha256').update(codeVerifier).digest();
35
+ return hash.toString('base64url');
36
+ }
37
+ /**
38
+ * Helper function to extract the event unique identifier from different event types
39
+ * @param eventType The type of the webhook event
40
+ * @param payload The payload of the webhook event
41
+ * @returns The unique identifier as a string, or null if not found
42
+ */
43
+ export function extractUniqueId(eventType, payload) {
44
+ // Try user_id, then username, then channel_slug
45
+ if (payload.broadcaster?.user_id)
46
+ return payload.broadcaster.user_id.toString();
47
+ if (payload.broadcaster?.username)
48
+ return payload.broadcaster.username.toString();
49
+ if (payload.broadcaster?.channel_slug)
50
+ return payload.broadcaster.channel_slug.toString();
51
+ return null;
52
+ }
53
+ /**
54
+ * Construct the full API endpoint URL
55
+ * @param version API version
56
+ * @param path Endpoint path
57
+ * @returns Full URL as a string
58
+ */
59
+ export function constructEndpoint(version, path) {
60
+ // if path starts with '/', remove it
61
+ if (path.startsWith('/')) {
62
+ path = path.slice(1);
63
+ }
64
+ return `${KICK_BASE_URL}/${version}/${path}`;
65
+ }
66
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B,OAAO,EACL,eAAe,EACf,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAIhD,MAAM,UAAU,WAAW,CAAC,QAAkB;IAC5C,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,GAAG;YACN,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,KAAK,GAAG;YACN,MAAM,IAAI,iBAAiB,EAAE,CAAC;QAChC,KAAK,GAAG;YACN,MAAM,IAAI,cAAc,EAAE,CAAC;QAC7B,KAAK,GAAG;YACN,MAAM,IAAI,aAAa,EAAE,CAAC;QAC5B,KAAK,GAAG;YACN,MAAM,IAAI,cAAc,EAAE,CAAC;QAC7B,KAAK,GAAG;YACN,MAAM,IAAI,mBAAmB,EAAE,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAAI,QAAkB;IACnD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,OAAO,IAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAM,GAAG,EAAE;IAC9C,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB;IACxD,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC;IACvE,OAAO,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,SAA4B,EAAE,OAAY;IACxE,gDAAgD;IAChD,IAAI,OAAO,CAAC,WAAW,EAAE,OAAO;QAAE,OAAO,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAChF,IAAI,OAAO,CAAC,WAAW,EAAE,QAAQ;QAAE,OAAO,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;IAClF,IAAI,OAAO,CAAC,WAAW,EAAE,YAAY;QAAE,OAAO,OAAO,CAAC,WAAW,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;IAC1F,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAgB,EAAE,IAAY;IAC9D,qCAAqC;IACrC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,OAAO,GAAG,aAAa,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { ChannelFollowedEventPayload, ChannelRewardRedemptionUpdatedEventPayload, ChannelSubscriptionGiftsEventPayload, ChannelSubscriptionNewEventPayload, ChannelSubscriptionRenewalEventPayload, ChatMessageSentEventPayload, KicksGiftedEventPayload, LivestreamMetadataUpdatedEventPayload, LivestreamStatusUpdatedEventPayload, ModerationBannedEventPayload } from './v1/payloads/index.js';
2
+ export declare enum WebhookEvents {
3
+ CHAT_MESSAGE_SENT = "chat.message.sent",
4
+ CHANNEL_FOLLOWED = "channel.followed",
5
+ CHANNEL_SUBSCRIPTION_RENEWAL = "channel.subscription.renewal",
6
+ CHANNEL_SUBSCRIPTION_GIFTS = "channel.subscription.gifts",
7
+ CHANNEL_SUBSCRIPTION_NEW = "channel.subscription.new",
8
+ CHANNEL_REWARD_REDEMPTION_UPDATED = "channel.reward.redemption.updated",
9
+ LIVESTREAM_STATUS_UPDATED = "livestream.status.updated",
10
+ LIVESTREAM_METADATA_UPDATED = "livestream.metadata.updated",
11
+ MODERATION_BANNED = "moderation.banned",
12
+ KICKS_GIFTED = "kicks.gifted"
13
+ }
14
+ export type WebhookEventNames = (typeof WebhookEvents)[keyof typeof WebhookEvents];
15
+ export interface WebhookEventPayloadMap {
16
+ [WebhookEvents.CHAT_MESSAGE_SENT]: ChatMessageSentEventPayload;
17
+ [WebhookEvents.CHANNEL_FOLLOWED]: ChannelFollowedEventPayload;
18
+ [WebhookEvents.CHANNEL_SUBSCRIPTION_RENEWAL]: ChannelSubscriptionRenewalEventPayload;
19
+ [WebhookEvents.CHANNEL_SUBSCRIPTION_GIFTS]: ChannelSubscriptionGiftsEventPayload;
20
+ [WebhookEvents.CHANNEL_SUBSCRIPTION_NEW]: ChannelSubscriptionNewEventPayload;
21
+ [WebhookEvents.CHANNEL_REWARD_REDEMPTION_UPDATED]: ChannelRewardRedemptionUpdatedEventPayload;
22
+ [WebhookEvents.LIVESTREAM_STATUS_UPDATED]: LivestreamStatusUpdatedEventPayload;
23
+ [WebhookEvents.LIVESTREAM_METADATA_UPDATED]: LivestreamMetadataUpdatedEventPayload;
24
+ [WebhookEvents.MODERATION_BANNED]: ModerationBannedEventPayload;
25
+ [WebhookEvents.KICKS_GIFTED]: KicksGiftedEventPayload;
26
+ }
27
+ //# sourceMappingURL=WebhookEvents.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookEvents.d.ts","sourceRoot":"","sources":["../../src/webhooks/WebhookEvents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,2BAA2B,EAC3B,0CAA0C,EAC1C,oCAAoC,EACpC,kCAAkC,EAClC,sCAAsC,EACtC,2BAA2B,EAC3B,uBAAuB,EACvB,qCAAqC,EACrC,mCAAmC,EACnC,4BAA4B,EAC7B,MAAM,wBAAwB,CAAC;AAEhC,oBAAY,aAAa;IACvB,iBAAiB,sBAAsB;IACvC,gBAAgB,qBAAqB;IACrC,4BAA4B,iCAAiC;IAC7D,0BAA0B,+BAA+B;IACzD,wBAAwB,6BAA6B;IACrD,iCAAiC,sCAAsC;IACvE,yBAAyB,8BAA8B;IACvD,2BAA2B,gCAAgC;IAC3D,iBAAiB,sBAAsB;IACvC,YAAY,iBAAiB;CAC9B;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAEnF,MAAM,WAAW,sBAAsB;IACrC,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,2BAA2B,CAAC;IAC/D,CAAC,aAAa,CAAC,gBAAgB,CAAC,EAAE,2BAA2B,CAAC;IAC9D,CAAC,aAAa,CAAC,4BAA4B,CAAC,EAAE,sCAAsC,CAAC;IACrF,CAAC,aAAa,CAAC,0BAA0B,CAAC,EAAE,oCAAoC,CAAC;IACjF,CAAC,aAAa,CAAC,wBAAwB,CAAC,EAAE,kCAAkC,CAAC;IAC7E,CAAC,aAAa,CAAC,iCAAiC,CAAC,EAAE,0CAA0C,CAAC;IAC9F,CAAC,aAAa,CAAC,yBAAyB,CAAC,EAAE,mCAAmC,CAAC;IAC/E,CAAC,aAAa,CAAC,2BAA2B,CAAC,EAAE,qCAAqC,CAAC;IACnF,CAAC,aAAa,CAAC,iBAAiB,CAAC,EAAE,4BAA4B,CAAC;IAChE,CAAC,aAAa,CAAC,YAAY,CAAC,EAAE,uBAAuB,CAAC;CACvD"}
@@ -0,0 +1,14 @@
1
+ export var WebhookEvents;
2
+ (function (WebhookEvents) {
3
+ WebhookEvents["CHAT_MESSAGE_SENT"] = "chat.message.sent";
4
+ WebhookEvents["CHANNEL_FOLLOWED"] = "channel.followed";
5
+ WebhookEvents["CHANNEL_SUBSCRIPTION_RENEWAL"] = "channel.subscription.renewal";
6
+ WebhookEvents["CHANNEL_SUBSCRIPTION_GIFTS"] = "channel.subscription.gifts";
7
+ WebhookEvents["CHANNEL_SUBSCRIPTION_NEW"] = "channel.subscription.new";
8
+ WebhookEvents["CHANNEL_REWARD_REDEMPTION_UPDATED"] = "channel.reward.redemption.updated";
9
+ WebhookEvents["LIVESTREAM_STATUS_UPDATED"] = "livestream.status.updated";
10
+ WebhookEvents["LIVESTREAM_METADATA_UPDATED"] = "livestream.metadata.updated";
11
+ WebhookEvents["MODERATION_BANNED"] = "moderation.banned";
12
+ WebhookEvents["KICKS_GIFTED"] = "kicks.gifted";
13
+ })(WebhookEvents || (WebhookEvents = {}));
14
+ //# sourceMappingURL=WebhookEvents.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebhookEvents.js","sourceRoot":"","sources":["../../src/webhooks/WebhookEvents.ts"],"names":[],"mappings":"AAaA,MAAM,CAAN,IAAY,aAWX;AAXD,WAAY,aAAa;IACvB,wDAAuC,CAAA;IACvC,sDAAqC,CAAA;IACrC,8EAA6D,CAAA;IAC7D,0EAAyD,CAAA;IACzD,sEAAqD,CAAA;IACrD,wFAAuE,CAAA;IACvE,wEAAuD,CAAA;IACvD,4EAA2D,CAAA;IAC3D,wDAAuC,CAAA;IACvC,8CAA6B,CAAA;AAC/B,CAAC,EAXW,aAAa,KAAb,aAAa,QAWxB"}
@@ -0,0 +1,10 @@
1
+ import type { WebhookEventNames, WebhookEventPayloadMap } from './WebhookEvents.js';
2
+ /**
3
+ * Routes a verified webhook payload to any `KickClient` subscribed for the
4
+ * targeted broadcaster via `client.on(eventName, listener)`. The lookup uses
5
+ * `broadcaster.user_id`/`username`/`channel_slug` from the payload, in that order.
6
+ *
7
+ * No-op if no client is registered for the resolved unique id.
8
+ */
9
+ export declare function dispatchWebhookEvent<E extends WebhookEventNames>(eventType: E, payload: WebhookEventPayloadMap[E]): void;
10
+ //# sourceMappingURL=dispatch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/webhooks/dispatch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAEpF;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,iBAAiB,EAC9D,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,GACjC,IAAI,CAKN"}
@@ -0,0 +1,16 @@
1
+ import { eventManager } from '../EventManager.js';
2
+ import { extractUniqueId } from '../utils.js';
3
+ /**
4
+ * Routes a verified webhook payload to any `KickClient` subscribed for the
5
+ * targeted broadcaster via `client.on(eventName, listener)`. The lookup uses
6
+ * `broadcaster.user_id`/`username`/`channel_slug` from the payload, in that order.
7
+ *
8
+ * No-op if no client is registered for the resolved unique id.
9
+ */
10
+ export function dispatchWebhookEvent(eventType, payload) {
11
+ const uniqueId = extractUniqueId(eventType, payload);
12
+ if (uniqueId) {
13
+ eventManager.emit(uniqueId, eventType, payload);
14
+ }
15
+ }
16
+ //# sourceMappingURL=dispatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/webhooks/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG9C;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,SAAY,EACZ,OAAkC;IAElC,MAAM,QAAQ,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,QAAQ,EAAE,CAAC;QACb,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAClD,CAAC;AACH,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { CategoryDto } from '../../resources/Category.js';
2
+ export type UserIdentityEventProperty = {
3
+ username_color: string;
4
+ badges: {
5
+ text: string;
6
+ type: string;
7
+ count?: number;
8
+ }[];
9
+ };
10
+ export type UserEventProperty = {
11
+ is_anonymous: boolean;
12
+ user_id: number;
13
+ username: string;
14
+ is_verified: boolean;
15
+ profile_picture: string;
16
+ channel_slug: string;
17
+ identity: UserIdentityEventProperty | null;
18
+ };
19
+ export type WithIdentityNull<T extends {
20
+ identity?: any;
21
+ }> = Omit<T, 'identity'> & {
22
+ identity: null;
23
+ };
24
+ export type WithIdentity<T extends {
25
+ identity?: any;
26
+ }> = Omit<T, 'identity'> & {
27
+ identity: UserIdentityEventProperty;
28
+ };
29
+ export type EmoteEventProperty = {
30
+ emote_id: string;
31
+ positions: {
32
+ s: number;
33
+ e: number;
34
+ }[];
35
+ };
36
+ export type LivestreamMetadataEventProperty = {
37
+ title: string;
38
+ language: string;
39
+ has_mature_content: boolean;
40
+ category: CategoryDto;
41
+ };
42
+ export type GiftEventProperty = {
43
+ amount: number;
44
+ name: string;
45
+ type: string;
46
+ tier: string;
47
+ message: string;
48
+ pinned_time_seconds: number;
49
+ };
50
+ //# sourceMappingURL=Properties.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Properties.d.ts","sourceRoot":"","sources":["../../../src/webhooks/v1/Properties.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,MAAM,MAAM,yBAAyB,GAAG;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,yBAAyB,GAAG,IAAI,CAAC;CAC5C,CAAC;AAGF,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,IAAI,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,CAAC;AACtG,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,IAAI,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG;IAAE,QAAQ,EAAE,yBAAyB,CAAA;CAAE,CAAC;AAEvH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE;QACT,CAAC,EAAE,MAAM,CAAC;QACV,CAAC,EAAE,MAAM,CAAC;KACX,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,QAAQ,EAAE,WAAW,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,mBAAmB,EAAE,MAAM,CAAC;CAC7B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=Properties.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Properties.js","sourceRoot":"","sources":["../../../src/webhooks/v1/Properties.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import type { UserEventProperty, WithIdentityNull } from '../Properties.js';
2
+ export type ChannelFollowedEventPayload = {
3
+ broadcaster: WithIdentityNull<UserEventProperty>;
4
+ follower: WithIdentityNull<UserEventProperty>;
5
+ };
6
+ //# sourceMappingURL=ChannelFollowed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChannelFollowed.d.ts","sourceRoot":"","sources":["../../../../src/webhooks/v1/payloads/ChannelFollowed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,MAAM,2BAA2B,GAAG;IACxC,WAAW,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACjD,QAAQ,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;CAC/C,CAAC"}