rettiwt-api 2.7.1 → 3.0.1

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 (139) hide show
  1. package/.eslintrc.js +73 -5
  2. package/.tool-versions +1 -0
  3. package/README.md +87 -20
  4. package/dist/Rettiwt.js +0 -1
  5. package/dist/Rettiwt.js.map +1 -1
  6. package/dist/cli.js +2 -4
  7. package/dist/cli.js.map +1 -1
  8. package/dist/collections/Extractors.d.ts +37 -0
  9. package/dist/collections/Extractors.js +67 -0
  10. package/dist/collections/Extractors.js.map +1 -0
  11. package/dist/collections/Groups.d.ts +19 -0
  12. package/dist/collections/Groups.js +55 -0
  13. package/dist/collections/Groups.js.map +1 -0
  14. package/dist/collections/Requests.d.ts +12 -0
  15. package/dist/collections/Requests.js +46 -0
  16. package/dist/collections/Requests.js.map +1 -0
  17. package/dist/commands/Auth.d.ts +6 -0
  18. package/dist/commands/Auth.js +26 -8
  19. package/dist/commands/Auth.js.map +1 -1
  20. package/dist/commands/Tweet.js +237 -82
  21. package/dist/commands/Tweet.js.map +1 -1
  22. package/dist/commands/User.js +197 -36
  23. package/dist/commands/User.js.map +1 -1
  24. package/dist/enums/Api.d.ts +30 -0
  25. package/dist/enums/Api.js +32 -1
  26. package/dist/enums/Api.js.map +1 -1
  27. package/dist/enums/Data.d.ts +9 -0
  28. package/dist/enums/Data.js +14 -0
  29. package/dist/enums/Data.js.map +1 -0
  30. package/dist/enums/Http.d.ts +1 -1
  31. package/dist/enums/Http.js +1 -1
  32. package/dist/enums/Logging.d.ts +6 -5
  33. package/dist/enums/Logging.js +6 -5
  34. package/dist/enums/Logging.js.map +1 -1
  35. package/dist/enums/Resource.d.ts +33 -0
  36. package/dist/enums/Resource.js +42 -0
  37. package/dist/enums/Resource.js.map +1 -0
  38. package/dist/helper/CliUtils.d.ts +1 -1
  39. package/dist/helper/CliUtils.js.map +1 -1
  40. package/dist/index.d.ts +11 -9
  41. package/dist/index.js +11 -14
  42. package/dist/index.js.map +1 -1
  43. package/dist/models/args/FetchArgs.d.ts +129 -0
  44. package/dist/models/args/FetchArgs.js +263 -0
  45. package/dist/models/args/FetchArgs.js.map +1 -0
  46. package/dist/models/args/PostArgs.d.ts +116 -0
  47. package/dist/models/args/PostArgs.js +232 -0
  48. package/dist/models/args/PostArgs.js.map +1 -0
  49. package/dist/models/data/CursoredData.d.ts +11 -11
  50. package/dist/models/data/CursoredData.js +21 -16
  51. package/dist/models/data/CursoredData.js.map +1 -1
  52. package/dist/models/data/List.d.ts +8 -10
  53. package/dist/models/data/List.js +2 -4
  54. package/dist/models/data/List.js.map +1 -1
  55. package/dist/models/data/Tweet.d.ts +44 -29
  56. package/dist/models/data/Tweet.js +74 -15
  57. package/dist/models/data/Tweet.js.map +1 -1
  58. package/dist/models/data/User.d.ts +38 -20
  59. package/dist/models/data/User.js +71 -7
  60. package/dist/models/data/User.js.map +1 -1
  61. package/dist/models/errors/ApiError.d.ts +1 -3
  62. package/dist/models/errors/ApiError.js +1 -4
  63. package/dist/models/errors/ApiError.js.map +1 -1
  64. package/dist/models/errors/DataValidationError.d.ts +30 -0
  65. package/dist/models/errors/DataValidationError.js +34 -0
  66. package/dist/models/errors/DataValidationError.js.map +1 -0
  67. package/dist/models/errors/HttpError.d.ts +1 -3
  68. package/dist/models/errors/HttpError.js +1 -4
  69. package/dist/models/errors/HttpError.js.map +1 -1
  70. package/dist/models/errors/TimeoutError.d.ts +2 -4
  71. package/dist/models/errors/TimeoutError.js +2 -5
  72. package/dist/models/errors/TimeoutError.js.map +1 -1
  73. package/dist/services/internal/ErrorService.d.ts +45 -35
  74. package/dist/services/internal/ErrorService.js +70 -68
  75. package/dist/services/internal/ErrorService.js.map +1 -1
  76. package/dist/services/internal/LogService.d.ts +7 -5
  77. package/dist/services/internal/LogService.js +28 -9
  78. package/dist/services/internal/LogService.js.map +1 -1
  79. package/dist/services/public/AuthService.d.ts +24 -20
  80. package/dist/services/public/AuthService.js +38 -36
  81. package/dist/services/public/AuthService.js.map +1 -1
  82. package/dist/services/public/FetcherService.d.ts +89 -0
  83. package/dist/services/public/FetcherService.js +240 -0
  84. package/dist/services/public/FetcherService.js.map +1 -0
  85. package/dist/services/public/TweetService.d.ts +213 -94
  86. package/dist/services/public/TweetService.js +409 -209
  87. package/dist/services/public/TweetService.js.map +1 -1
  88. package/dist/services/public/UserService.d.ts +185 -52
  89. package/dist/services/public/UserService.js +338 -103
  90. package/dist/services/public/UserService.js.map +1 -1
  91. package/dist/types/ReturnTypes.d.ts +21 -0
  92. package/dist/types/ReturnTypes.js +3 -0
  93. package/dist/types/ReturnTypes.js.map +1 -0
  94. package/package.json +4 -2
  95. package/src/Rettiwt.ts +0 -3
  96. package/src/cli.ts +2 -4
  97. package/src/collections/Extractors.ts +84 -0
  98. package/src/collections/Groups.ts +54 -0
  99. package/src/collections/Requests.ts +52 -0
  100. package/src/commands/Auth.ts +19 -7
  101. package/src/commands/Tweet.ts +179 -91
  102. package/src/commands/User.ts +118 -25
  103. package/src/enums/Api.ts +31 -0
  104. package/src/enums/Data.ts +9 -0
  105. package/src/enums/Http.ts +1 -1
  106. package/src/enums/Logging.ts +6 -5
  107. package/src/enums/Resource.ts +40 -0
  108. package/src/helper/CliUtils.ts +1 -1
  109. package/src/index.ts +41 -14
  110. package/src/models/args/FetchArgs.ts +296 -0
  111. package/src/models/args/PostArgs.ts +263 -0
  112. package/src/models/data/CursoredData.ts +23 -15
  113. package/src/models/data/List.ts +12 -15
  114. package/src/models/data/Tweet.ts +108 -39
  115. package/src/models/data/User.ts +99 -30
  116. package/src/models/errors/ApiError.ts +1 -4
  117. package/src/models/errors/DataValidationError.ts +44 -0
  118. package/src/models/errors/HttpError.ts +1 -4
  119. package/src/models/errors/TimeoutError.ts +2 -5
  120. package/src/services/internal/ErrorService.ts +76 -75
  121. package/src/services/internal/LogService.ts +20 -10
  122. package/src/services/public/AuthService.ts +39 -38
  123. package/src/services/public/FetcherService.ts +209 -0
  124. package/src/services/public/TweetService.ts +384 -179
  125. package/src/services/public/UserService.ts +319 -86
  126. package/src/types/RettiwtConfig.ts +0 -1
  127. package/src/types/ReturnTypes.ts +24 -0
  128. package/dist/models/args/TweetArgs.d.ts +0 -44
  129. package/dist/models/args/TweetArgs.js +0 -82
  130. package/dist/models/args/TweetArgs.js.map +0 -1
  131. package/dist/models/data/Media.d.ts +0 -14
  132. package/dist/models/data/Media.js +0 -19
  133. package/dist/models/data/Media.js.map +0 -1
  134. package/dist/services/internal/FetcherService.d.ts +0 -106
  135. package/dist/services/internal/FetcherService.js +0 -365
  136. package/dist/services/internal/FetcherService.js.map +0 -1
  137. package/src/models/args/TweetArgs.ts +0 -98
  138. package/src/models/data/Media.ts +0 -19
  139. package/src/services/internal/FetcherService.ts +0 -365
@@ -0,0 +1,209 @@
1
+ import https, { Agent } from 'https';
2
+
3
+ import axios from 'axios';
4
+ import { HttpsProxyAgent } from 'https-proxy-agent';
5
+ import { Auth, AuthCredential } from 'rettiwt-auth';
6
+
7
+ import { allowGuestAuthentication, fetchResources, postResources } from '../../collections/Groups';
8
+ import { requests } from '../../collections/Requests';
9
+ import { EApiErrors } from '../../enums/Api';
10
+ import { ELogActions } from '../../enums/Logging';
11
+ import { EResourceType } from '../../enums/Resource';
12
+ import { FetchArgs } from '../../models/args/FetchArgs';
13
+ import { PostArgs } from '../../models/args/PostArgs';
14
+ import { IErrorHandler } from '../../types/ErrorHandler';
15
+ import { IRettiwtConfig } from '../../types/RettiwtConfig';
16
+
17
+ import { ErrorService } from '../internal/ErrorService';
18
+ import { LogService } from '../internal/LogService';
19
+
20
+ /**
21
+ * The base service that handles all HTTP requests.
22
+ *
23
+ * @public
24
+ */
25
+ export class FetcherService {
26
+ /** The api key to use for authenticating against Twitter API as user. */
27
+ private readonly apiKey?: string;
28
+
29
+ /** The service used to handle HTTP and API errors */
30
+ private readonly errorHandler: IErrorHandler;
31
+
32
+ /** The guest key to use for authenticating against Twitter API as guest. */
33
+ private readonly guestKey?: string;
34
+
35
+ /** Whether the instance is authenticated or not. */
36
+ private readonly isAuthenticated: boolean;
37
+
38
+ /** The URL To the proxy server to use for all others. */
39
+ private readonly proxyUrl?: URL;
40
+
41
+ /** The max wait time for a response. */
42
+ private readonly timeout: number;
43
+
44
+ /** The URL to the proxy server to use only for authentication. */
45
+ protected readonly authProxyUrl?: URL;
46
+
47
+ /**
48
+ * @param config - The config object for configuring the Rettiwt instance.
49
+ */
50
+ public constructor(config?: IRettiwtConfig) {
51
+ LogService.enabled = config?.logging ?? false;
52
+ this.apiKey = config?.apiKey;
53
+ this.guestKey = config?.guestKey;
54
+ this.isAuthenticated = config?.apiKey ? true : false;
55
+ this.authProxyUrl = config?.authProxyUrl ?? config?.proxyUrl;
56
+ this.proxyUrl = config?.proxyUrl;
57
+ this.timeout = config?.timeout ?? 0;
58
+ this.errorHandler = config?.errorHandler ?? new ErrorService();
59
+ }
60
+
61
+ /**
62
+ * Checks the authorization status based on the requested resource.
63
+ *
64
+ * @param resource - The requested resource.
65
+ *
66
+ * @throws An error if not authorized to access the requested resource.
67
+ */
68
+ private checkAuthorization(resource: EResourceType): void {
69
+ // Logging
70
+ LogService.log(ELogActions.AUTHORIZATION, { authenticated: this.isAuthenticated });
71
+
72
+ // Checking authorization status
73
+ if (!allowGuestAuthentication.includes(resource) && this.isAuthenticated == false) {
74
+ throw new Error(EApiErrors.RESOURCE_NOT_ALLOWED);
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Returns the AuthCredentials based on the type of key present.
80
+ *
81
+ * @returns The generated AuthCredential
82
+ */
83
+ private async getCredential(): Promise<AuthCredential> {
84
+ if (this.apiKey) {
85
+ // Logging
86
+ LogService.log(ELogActions.GET, { target: 'USER_CREDENTIAL' });
87
+
88
+ const cookies = Buffer.from(this.apiKey, 'base64').toString('ascii').split(';');
89
+ return new AuthCredential(cookies);
90
+ } else if (this.guestKey) {
91
+ // Logging
92
+ LogService.log(ELogActions.GET, { target: 'GUEST_CREDENTIAL' });
93
+
94
+ return new AuthCredential(undefined, this.guestKey);
95
+ } else {
96
+ // Logging
97
+ LogService.log(ELogActions.GET, { target: 'NEW_GUEST_CREDENTIAL' });
98
+
99
+ return await new Auth({ proxyUrl: this.authProxyUrl }).getGuestCredential();
100
+ }
101
+ }
102
+
103
+ /**
104
+ * Gets the https agent based on whether a proxy is used or not.
105
+ *
106
+ * @param proxyUrl - Optional URL with proxy configuration to use for requests to Twitter API.
107
+ *
108
+ * @returns The https agent to use.
109
+ */
110
+ private getHttpsAgent(proxyUrl?: URL): Agent {
111
+ if (proxyUrl) {
112
+ // Logging
113
+ LogService.log(ELogActions.GET, { target: 'HTTPS_PROXY_AGENT' });
114
+
115
+ return new HttpsProxyAgent(proxyUrl);
116
+ } else {
117
+ // Logging
118
+ LogService.log(ELogActions.GET, { target: 'HTTPS_AGENT' });
119
+
120
+ return new https.Agent();
121
+ }
122
+ }
123
+
124
+ /**
125
+ * Validates the given args against the given resource.
126
+ *
127
+ * @param resource - The resource against which validation is to be done.
128
+ * @param args - The args to be validated.
129
+ *
130
+ * @returns The validated args.
131
+ */
132
+ private validateArgs(resource: EResourceType, args: FetchArgs | PostArgs): FetchArgs | PostArgs | undefined {
133
+ if (fetchResources.includes(resource)) {
134
+ // Logging
135
+ LogService.log(ELogActions.VALIDATE, { target: 'FETCH_ARGS' });
136
+
137
+ return new FetchArgs(resource, args);
138
+ } else if (postResources.includes(resource)) {
139
+ // Logging
140
+ LogService.log(ELogActions.VALIDATE, { target: 'POST_ARGS' });
141
+
142
+ return new PostArgs(resource, args);
143
+ }
144
+ }
145
+
146
+ /**
147
+ * Makes an HTTP request according to the given parameters.
148
+ *
149
+ * @param resource - The requested resource.
150
+ * @param config - The request configuration.
151
+ *
152
+ * @typeParam T - The type of the returned response data.
153
+ *
154
+ * @returns The raw data response received.
155
+ *
156
+ * @example
157
+ * Fetching the raw details of a user with username 'user1'
158
+ * ```
159
+ * import { FetcherService, EResourceType } from 'rettiwt-api';
160
+ *
161
+ * // Creating a new FetcherService instance using the given 'API_KEY'
162
+ * const fetcher = new FetcherService({ apiKey: API_KEY });
163
+ *
164
+ * // Fetching the details of the User with username 'user1'
165
+ * fetcher.request(EResourceType.USER_DETAILS_BY_USERNAME, { id: 'user1' })
166
+ * .then(res => {
167
+ * console.log(res);
168
+ * })
169
+ * .catch(err => {
170
+ * console.log(err);
171
+ * })
172
+ * ```
173
+ */
174
+ public async request<T>(resource: EResourceType, args: FetchArgs | PostArgs): Promise<T> {
175
+ // Logging
176
+ LogService.log(ELogActions.REQUEST, { resource: resource, args: args });
177
+
178
+ // Checking authorization for the requested resource
179
+ this.checkAuthorization(resource);
180
+
181
+ // Validating args
182
+ args = this.validateArgs(resource, args)!;
183
+
184
+ // Getting HTTPS agent
185
+ const httpsAgent: Agent = this.getHttpsAgent(this.proxyUrl);
186
+
187
+ // Getting credentials from key
188
+ const cred: AuthCredential = await this.getCredential();
189
+
190
+ // Getting request configuration
191
+ const config = requests[resource](args);
192
+
193
+ // Setting additional request parameters
194
+ config.headers = { ...config.headers, ...cred.toHeader() };
195
+ config.httpAgent = httpsAgent;
196
+ config.httpsAgent = httpsAgent;
197
+ config.timeout = this.timeout;
198
+
199
+ // Sending the request
200
+ try {
201
+ // Returning the reponse body
202
+ return (await axios<T>(config)).data;
203
+ } catch (error) {
204
+ // If error, delegate handling to error handler
205
+ this.errorHandler.handle(error);
206
+ throw error;
207
+ }
208
+ }
209
+ }