@@ -111,6 +111,22 @@ export default class Twitter {
111111 * @returns {Stream }
112112 */
113113 public stream ( resource : string , parameters : object ) : Stream ;
114+
115+ /**
116+ * Creates an instance of the original {@instance Twitter} with labs API capabilities
117+ * @return {TwitterLabs } - a twitter labs instance
118+ */
119+ public withLabs ( ) : TwitterLabs ;
120+
121+ /**
122+ * Add rule for the filter stream API
123+ *
124+ * @param {LabsFilterStreamRule[] } rules a list of rules for the filter stream API
125+ * @param {boolean } [dryRun] optional parameter to mark the request as a dry run
126+ * @returns {Promise<object> } Promise response from Twitter API
127+ * @see {@link https://developer.twitter.com/en/docs/labs/filtered-stream/api-reference/post-tweets-stream-filter-rules Twitter API }
128+ */
129+ public static labsFilterStreamRule ( value : string , tag ?: string ) : FilterStreamRule ;
114130}
115131
116132/* In reality snowflakes are BigInts. Once BigInt is supported by browsers and Node per default, we could adjust this type.
@@ -157,10 +173,10 @@ interface BearerResponse {
157173
158174type TokenResponse =
159175 | {
160- oauth_token : OauthToken ;
161- oauth_token_secret : OauthTokenSecret ;
162- oauth_callback_confirmed : 'true' ;
163- }
176+ oauth_token : OauthToken ;
177+ oauth_token_secret : OauthTokenSecret ;
178+ oauth_callback_confirmed : 'true' ;
179+ }
164180 | { oauth_callback_confirmed : 'false' } ;
165181
166182interface AccessTokenResponse {
@@ -176,3 +192,82 @@ declare class Stream extends EventEmitter {
176192 parse ( buffer : Buffer ) : void ;
177193 destroy ( ) : void ;
178194}
195+
196+ export class TwitterLabs extends Twitter {
197+ /**
198+ * Construct the data and headers for an authenticated HTTP request to the Twitter Labs API
199+ * @param {'GET | 'POST' | 'PUT' } method
200+ * @param {'1' | '2' } version
201+ * @param {string } resource - the API endpoint
202+ * @param {object } queryParams - query params object
203+ */
204+ private _makeLabsRequest ( method : 'GET' | 'POST' | 'PUT' , version : '1' | '2' ,
205+ resource : string , queryParams : object ) : {
206+ requestData : { url : string ; method : string } ;
207+ headers : { Authorization : string } | OAuth . Header ;
208+ } ;
209+
210+ /**
211+ * Add rule for the filter stream API
212+ *
213+ * @param {FilterStreamRule[] } rules a list of rules for the filter stream API
214+ * @param {boolean } [dryRun] optional parameter to mark the request as a dry run
215+ * @returns {Promise<object> } Promise response from Twitter API
216+ * @see {@link https://developer.twitter.com/en/docs/labs/filtered-stream/api-reference/post-tweets-stream-filter-rules Twitter API }
217+ */
218+ public addRules ( rules : FilterStreamRule [ ] , dryRun ?: boolean ) : Promise < object >
219+
220+ /**
221+ * Get registered rules
222+ *
223+ * @returns {Promise<object> } Promise response from Twitter API
224+ * @see {@link https://developer.twitter.com/en/docs/labs/filtered-stream/api-reference/get-tweets-stream-filter-rules Twitter API }
225+ */
226+ public getRules ( ...ids : string [ ] ) : Promise < object >
227+
228+ /**
229+ * Delete registered rules
230+ *
231+ * @param {string[] } Rule IDs that has been registered
232+ * @param {boolean } [dryRun] optional parameter to mark request as a dry run
233+ * @returns {Promise<object> } Promise response from Twitter API
234+ * @see {@link https://developer.twitter.com/en/docs/labs/filtered-stream/api-reference/get-tweets-stream-filter-rules Twitter API }
235+ */
236+ public deleteRules ( ids : string [ ] , dryRun ?: boolean ) : Promise < object >
237+
238+
239+ /**
240+ * Start filter stream using saved rules
241+ *
242+ * @param {{expansions: Expansions[], format: Format, 'place.format': Format,
243+ * 'tweet.format': Format, 'user.format': Format}} [queryParams]
244+ * @returns {Stream } stream object for the filter stream
245+ * @see {@link https://developer.twitter.com/en/docs/labs/filtered-stream/api-reference/get-tweets-stream-filter Twitter API }
246+ */
247+ filterStream ( queryParams ?: FilterStreamParams ) : Promise < object >
248+ }
249+
250+ /**
251+ * Rule structure when adding twitter labs filter stream rules
252+ */
253+ type FilterStreamRule = { value : string , meta ?: string } ;
254+
255+ /**
256+ * Twitter labs response format
257+ * @see {@link https://developer.twitter.com/en/docs/labs/overview/whats-new/formats About format }
258+ */
259+ type LabsFormat = 'compact' | 'detailed' | 'default' ;
260+
261+ /**
262+ * Twitter labs expansions
263+ * @see {@link https://developer.twitter.com/en/docs/labs/overview/whats-new/expansions About expansions }
264+ */
265+ type LabsExpansion = 'attachment.poll_ids' | 'attachments.media_keys' | 'author_id' | 'entities.mentions.username' | 'geo.place_id'
266+ | 'in_reply_to_user_id' | 'referenced_tweets.id' | 'referenced_tweets.id.author_id' ;
267+ type FilterStreamParams = {
268+ expansions ?: LabsExpansion [ ] ,
269+ format ?: LabsFormat ,
270+ 'place.format' ?: LabsFormat ,
271+ 'tweet.format' ?: LabsFormat ,
272+ 'user.format' ?: LabsFormat
273+ } ;
0 commit comments