x-twitter-scraper 0.12.3 → 0.13.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 +73 -2
- package/README.md +66 -51
- package/client.d.mts +18 -15
- package/client.d.mts.map +1 -1
- package/client.d.ts +18 -15
- package/client.d.ts.map +1 -1
- package/client.js +3 -3
- package/client.js.map +1 -1
- package/client.mjs +4 -4
- package/client.mjs.map +1 -1
- package/core/streaming.d.mts +33 -0
- package/core/streaming.d.mts.map +1 -0
- package/core/streaming.d.ts +33 -0
- package/core/streaming.d.ts.map +1 -0
- package/core/streaming.js +270 -0
- package/core/streaming.js.map +1 -0
- package/core/streaming.mjs +265 -0
- package/core/streaming.mjs.map +1 -0
- package/internal/decoders/line.d.mts +17 -0
- package/internal/decoders/line.d.mts.map +1 -0
- package/internal/decoders/line.d.ts +17 -0
- package/internal/decoders/line.d.ts.map +1 -0
- package/internal/decoders/line.js +116 -0
- package/internal/decoders/line.js.map +1 -0
- package/internal/decoders/line.mjs +111 -0
- package/internal/decoders/line.mjs.map +1 -0
- package/internal/parse.d.mts.map +1 -1
- package/internal/parse.d.ts.map +1 -1
- package/internal/parse.js +7 -0
- package/internal/parse.js.map +1 -1
- package/internal/parse.mjs +7 -0
- package/internal/parse.mjs.map +1 -1
- package/internal/tslib.js +18 -18
- package/package.json +23 -5
- package/resources/account.d.mts +35 -12
- package/resources/account.d.mts.map +1 -1
- package/resources/account.d.ts +35 -12
- package/resources/account.d.ts.map +1 -1
- package/resources/account.js +4 -3
- package/resources/account.js.map +1 -1
- package/resources/account.mjs +4 -3
- package/resources/account.mjs.map +1 -1
- package/resources/compose.d.mts +77 -21
- package/resources/compose.d.mts.map +1 -1
- package/resources/compose.d.ts +77 -21
- package/resources/compose.d.ts.map +1 -1
- package/resources/compose.js +3 -4
- package/resources/compose.js.map +1 -1
- package/resources/compose.mjs +3 -4
- package/resources/compose.mjs.map +1 -1
- package/resources/credits.d.mts +18 -10
- package/resources/credits.d.mts.map +1 -1
- package/resources/credits.d.ts +18 -10
- package/resources/credits.d.ts.map +1 -1
- package/resources/credits.js +5 -4
- package/resources/credits.js.map +1 -1
- package/resources/credits.mjs +5 -4
- package/resources/credits.mjs.map +1 -1
- package/resources/drafts.d.mts +13 -17
- package/resources/drafts.d.mts.map +1 -1
- package/resources/drafts.d.ts +13 -17
- package/resources/drafts.d.ts.map +1 -1
- package/resources/drafts.js +4 -4
- package/resources/drafts.mjs +4 -4
- package/resources/draws.d.mts +84 -28
- package/resources/draws.d.mts.map +1 -1
- package/resources/draws.d.ts +84 -28
- package/resources/draws.d.ts.map +1 -1
- package/resources/draws.js +24 -9
- package/resources/draws.js.map +1 -1
- package/resources/draws.mjs +24 -9
- package/resources/draws.mjs.map +1 -1
- package/resources/events.d.mts +2564 -21
- package/resources/events.d.mts.map +1 -1
- package/resources/events.d.ts +2564 -21
- package/resources/events.d.ts.map +1 -1
- package/resources/events.js +34 -2
- package/resources/events.js.map +1 -1
- package/resources/events.mjs +34 -2
- package/resources/events.mjs.map +1 -1
- package/resources/extractions.d.mts +410 -128
- package/resources/extractions.d.mts.map +1 -1
- package/resources/extractions.d.ts +410 -128
- package/resources/extractions.d.ts.map +1 -1
- package/resources/extractions.js +74 -12
- package/resources/extractions.js.map +1 -1
- package/resources/extractions.mjs +74 -12
- package/resources/extractions.mjs.map +1 -1
- package/resources/guest-wallets.d.mts +6 -5
- package/resources/guest-wallets.d.mts.map +1 -1
- package/resources/guest-wallets.d.ts +6 -5
- package/resources/guest-wallets.d.ts.map +1 -1
- package/resources/guest-wallets.js +2 -1
- package/resources/guest-wallets.js.map +1 -1
- package/resources/guest-wallets.mjs +2 -1
- package/resources/guest-wallets.mjs.map +1 -1
- package/resources/index.d.mts +6 -6
- package/resources/index.d.mts.map +1 -1
- package/resources/index.d.ts +6 -6
- package/resources/index.d.ts.map +1 -1
- package/resources/index.js.map +1 -1
- package/resources/index.mjs +1 -1
- package/resources/index.mjs.map +1 -1
- package/resources/monitors/index.d.mts +2 -2
- package/resources/monitors/index.d.mts.map +1 -1
- package/resources/monitors/index.d.ts +2 -2
- package/resources/monitors/index.d.ts.map +1 -1
- package/resources/monitors/index.js.map +1 -1
- package/resources/monitors/index.mjs.map +1 -1
- package/resources/monitors/keywords.d.mts +66 -14
- package/resources/monitors/keywords.d.mts.map +1 -1
- package/resources/monitors/keywords.d.ts +66 -14
- package/resources/monitors/keywords.d.ts.map +1 -1
- package/resources/monitors/keywords.js +16 -10
- package/resources/monitors/keywords.js.map +1 -1
- package/resources/monitors/keywords.mjs +16 -10
- package/resources/monitors/keywords.mjs.map +1 -1
- package/resources/monitors/monitors.d.mts +53 -16
- package/resources/monitors/monitors.d.mts.map +1 -1
- package/resources/monitors/monitors.d.ts +53 -16
- package/resources/monitors/monitors.d.ts.map +1 -1
- package/resources/monitors/monitors.js +12 -10
- package/resources/monitors/monitors.js.map +1 -1
- package/resources/monitors/monitors.mjs +12 -10
- package/resources/monitors/monitors.mjs.map +1 -1
- package/resources/radar.d.mts +32 -36
- package/resources/radar.d.mts.map +1 -1
- package/resources/radar.d.ts +32 -36
- package/resources/radar.d.ts.map +1 -1
- package/resources/radar.js +1 -1
- package/resources/radar.mjs +1 -1
- package/resources/shared.d.mts +1726 -233
- package/resources/shared.d.mts.map +1 -1
- package/resources/shared.d.ts +1726 -233
- package/resources/shared.d.ts.map +1 -1
- package/resources/styles.d.mts +34 -23
- package/resources/styles.d.mts.map +1 -1
- package/resources/styles.d.ts +34 -23
- package/resources/styles.d.ts.map +1 -1
- package/resources/styles.js +11 -13
- package/resources/styles.js.map +1 -1
- package/resources/styles.mjs +11 -13
- package/resources/styles.mjs.map +1 -1
- package/resources/subscribe.d.mts +1 -1
- package/resources/subscribe.d.ts +1 -1
- package/resources/subscribe.js +1 -1
- package/resources/subscribe.mjs +1 -1
- package/resources/support/index.d.mts +1 -1
- package/resources/support/index.d.mts.map +1 -1
- package/resources/support/index.d.ts +1 -1
- package/resources/support/index.d.ts.map +1 -1
- package/resources/support/index.js.map +1 -1
- package/resources/support/index.mjs.map +1 -1
- package/resources/support/support.d.mts +2 -2
- package/resources/support/support.d.mts.map +1 -1
- package/resources/support/support.d.ts +2 -2
- package/resources/support/support.d.ts.map +1 -1
- package/resources/support/support.js.map +1 -1
- package/resources/support/support.mjs.map +1 -1
- package/resources/support/tickets.d.mts +30 -10
- package/resources/support/tickets.d.mts.map +1 -1
- package/resources/support/tickets.d.ts +30 -10
- package/resources/support/tickets.d.ts.map +1 -1
- package/resources/support/tickets.js +7 -7
- package/resources/support/tickets.js.map +1 -1
- package/resources/support/tickets.mjs +7 -7
- package/resources/support/tickets.mjs.map +1 -1
- package/resources/trends.d.mts +21 -5
- package/resources/trends.d.mts.map +1 -1
- package/resources/trends.d.ts +21 -5
- package/resources/trends.d.ts.map +1 -1
- package/resources/trends.js +2 -1
- package/resources/trends.js.map +1 -1
- package/resources/trends.mjs +2 -1
- package/resources/trends.mjs.map +1 -1
- package/resources/webhooks.d.mts +80 -14
- package/resources/webhooks.d.mts.map +1 -1
- package/resources/webhooks.d.ts +80 -14
- package/resources/webhooks.d.ts.map +1 -1
- package/resources/webhooks.js +30 -11
- package/resources/webhooks.js.map +1 -1
- package/resources/webhooks.mjs +30 -11
- package/resources/webhooks.mjs.map +1 -1
- package/resources/x/account-connection-attempts.d.mts +1 -1
- package/resources/x/account-connection-attempts.d.ts +1 -1
- package/resources/x/account-connection-attempts.js +1 -1
- package/resources/x/account-connection-attempts.mjs +1 -1
- package/resources/x/account-connection-challenges.d.mts +30 -11
- package/resources/x/account-connection-challenges.d.mts.map +1 -1
- package/resources/x/account-connection-challenges.d.ts +30 -11
- package/resources/x/account-connection-challenges.d.ts.map +1 -1
- package/resources/x/account-connection-challenges.js +5 -4
- package/resources/x/account-connection-challenges.js.map +1 -1
- package/resources/x/account-connection-challenges.mjs +5 -4
- package/resources/x/account-connection-challenges.mjs.map +1 -1
- package/resources/x/accounts.d.mts +38 -10
- package/resources/x/accounts.d.mts.map +1 -1
- package/resources/x/accounts.d.ts +38 -10
- package/resources/x/accounts.d.ts.map +1 -1
- package/resources/x/accounts.js +8 -7
- package/resources/x/accounts.js.map +1 -1
- package/resources/x/accounts.mjs +8 -7
- package/resources/x/accounts.mjs.map +1 -1
- package/resources/x/analysis.d.mts +3274 -0
- package/resources/x/analysis.d.mts.map +1 -0
- package/resources/x/analysis.d.ts +3274 -0
- package/resources/x/analysis.d.ts.map +1 -0
- package/resources/x/analysis.js +132 -0
- package/resources/x/analysis.js.map +1 -0
- package/resources/x/analysis.mjs +128 -0
- package/resources/x/analysis.mjs.map +1 -0
- package/resources/x/bookmarks.d.mts +84 -9
- package/resources/x/bookmarks.d.mts.map +1 -1
- package/resources/x/bookmarks.d.ts +84 -9
- package/resources/x/bookmarks.d.ts.map +1 -1
- package/resources/x/bookmarks.js +6 -4
- package/resources/x/bookmarks.js.map +1 -1
- package/resources/x/bookmarks.mjs +6 -4
- package/resources/x/bookmarks.mjs.map +1 -1
- package/resources/x/broadcasts.d.mts +176 -0
- package/resources/x/broadcasts.d.mts.map +1 -0
- package/resources/x/broadcasts.d.ts +176 -0
- package/resources/x/broadcasts.d.ts.map +1 -0
- package/resources/x/broadcasts.js +29 -0
- package/resources/x/broadcasts.js.map +1 -0
- package/resources/x/broadcasts.mjs +25 -0
- package/resources/x/broadcasts.mjs.map +1 -0
- package/resources/x/communities/communities.d.mts +612 -128
- package/resources/x/communities/communities.d.mts.map +1 -1
- package/resources/x/communities/communities.d.ts +612 -128
- package/resources/x/communities/communities.d.ts.map +1 -1
- package/resources/x/communities/communities.js +96 -17
- package/resources/x/communities/communities.js.map +1 -1
- package/resources/x/communities/communities.mjs +96 -17
- package/resources/x/communities/communities.mjs.map +1 -1
- package/resources/x/communities/index.d.mts +2 -1
- package/resources/x/communities/index.d.mts.map +1 -1
- package/resources/x/communities/index.d.ts +2 -1
- package/resources/x/communities/index.d.ts.map +1 -1
- package/resources/x/communities/index.js +3 -1
- package/resources/x/communities/index.js.map +1 -1
- package/resources/x/communities/index.mjs +1 -0
- package/resources/x/communities/index.mjs.map +1 -1
- package/resources/x/communities/join.d.mts +46 -25
- package/resources/x/communities/join.d.mts.map +1 -1
- package/resources/x/communities/join.d.ts +46 -25
- package/resources/x/communities/join.d.ts.map +1 -1
- package/resources/x/communities/join.js +10 -7
- package/resources/x/communities/join.js.map +1 -1
- package/resources/x/communities/join.mjs +10 -7
- package/resources/x/communities/join.mjs.map +1 -1
- package/resources/x/communities/media.d.mts +197 -0
- package/resources/x/communities/media.d.mts.map +1 -0
- package/resources/x/communities/media.d.ts +197 -0
- package/resources/x/communities/media.d.ts.map +1 -0
- package/resources/x/communities/media.js +29 -0
- package/resources/x/communities/media.js.map +1 -0
- package/resources/x/communities/media.mjs +25 -0
- package/resources/x/communities/media.mjs.map +1 -0
- package/resources/x/communities/tweets.d.mts +350 -20
- package/resources/x/communities/tweets.d.mts.map +1 -1
- package/resources/x/communities/tweets.d.ts +350 -20
- package/resources/x/communities/tweets.d.ts.map +1 -1
- package/resources/x/communities/tweets.js +8 -7
- package/resources/x/communities/tweets.js.map +1 -1
- package/resources/x/communities/tweets.mjs +8 -7
- package/resources/x/communities/tweets.mjs.map +1 -1
- package/resources/x/dm.d.mts +245 -13
- package/resources/x/dm.d.mts.map +1 -1
- package/resources/x/dm.d.ts +245 -13
- package/resources/x/dm.d.ts.map +1 -1
- package/resources/x/dm.js +29 -2
- package/resources/x/dm.js.map +1 -1
- package/resources/x/dm.mjs +29 -2
- package/resources/x/dm.mjs.map +1 -1
- package/resources/x/followers.d.mts +31 -3
- package/resources/x/followers.d.mts.map +1 -1
- package/resources/x/followers.d.ts +31 -3
- package/resources/x/followers.d.ts.map +1 -1
- package/resources/x/followers.js +2 -1
- package/resources/x/followers.js.map +1 -1
- package/resources/x/followers.mjs +2 -1
- package/resources/x/followers.mjs.map +1 -1
- package/resources/x/index.d.mts +12 -8
- package/resources/x/index.d.mts.map +1 -1
- package/resources/x/index.d.ts +12 -8
- package/resources/x/index.d.ts.map +1 -1
- package/resources/x/index.js +9 -1
- package/resources/x/index.js.map +1 -1
- package/resources/x/index.mjs +5 -1
- package/resources/x/index.mjs.map +1 -1
- package/resources/x/jobs.d.mts +506 -0
- package/resources/x/jobs.d.mts.map +1 -0
- package/resources/x/jobs.d.ts +506 -0
- package/resources/x/jobs.d.ts.map +1 -0
- package/resources/x/jobs.js +60 -0
- package/resources/x/jobs.js.map +1 -0
- package/resources/x/jobs.mjs +56 -0
- package/resources/x/jobs.mjs.map +1 -0
- package/resources/x/lists.d.mts +1058 -27
- package/resources/x/lists.d.mts.map +1 -1
- package/resources/x/lists.d.ts +1058 -27
- package/resources/x/lists.d.ts.map +1 -1
- package/resources/x/lists.js +39 -9
- package/resources/x/lists.js.map +1 -1
- package/resources/x/lists.mjs +39 -9
- package/resources/x/lists.mjs.map +1 -1
- package/resources/x/media.d.mts +24 -13
- package/resources/x/media.d.mts.map +1 -1
- package/resources/x/media.d.ts +24 -13
- package/resources/x/media.d.ts.map +1 -1
- package/resources/x/media.js +2 -2
- package/resources/x/media.mjs +2 -2
- package/resources/x/profile.d.mts +60 -33
- package/resources/x/profile.d.mts.map +1 -1
- package/resources/x/profile.d.ts +60 -33
- package/resources/x/profile.d.ts.map +1 -1
- package/resources/x/profile.js +3 -3
- package/resources/x/profile.mjs +3 -3
- package/resources/x/spaces.d.mts +857 -0
- package/resources/x/spaces.d.mts.map +1 -0
- package/resources/x/spaces.d.ts +857 -0
- package/resources/x/spaces.d.ts.map +1 -0
- package/resources/x/spaces.js +58 -0
- package/resources/x/spaces.js.map +1 -0
- package/resources/x/spaces.mjs +54 -0
- package/resources/x/spaces.mjs.map +1 -0
- package/resources/x/tweets/index.d.mts +1 -1
- package/resources/x/tweets/index.d.mts.map +1 -1
- package/resources/x/tweets/index.d.ts +1 -1
- package/resources/x/tweets/index.d.ts.map +1 -1
- package/resources/x/tweets/index.js.map +1 -1
- package/resources/x/tweets/index.mjs.map +1 -1
- package/resources/x/tweets/like.d.mts +38 -20
- package/resources/x/tweets/like.d.mts.map +1 -1
- package/resources/x/tweets/like.d.ts +38 -20
- package/resources/x/tweets/like.d.ts.map +1 -1
- package/resources/x/tweets/like.js +2 -2
- package/resources/x/tweets/like.mjs +2 -2
- package/resources/x/tweets/retweet.d.mts +38 -20
- package/resources/x/tweets/retweet.d.mts.map +1 -1
- package/resources/x/tweets/retweet.d.ts +38 -20
- package/resources/x/tweets/retweet.d.ts.map +1 -1
- package/resources/x/tweets/retweet.js +2 -2
- package/resources/x/tweets/retweet.mjs +2 -2
- package/resources/x/tweets/tweets.d.mts +2639 -326
- package/resources/x/tweets/tweets.d.mts.map +1 -1
- package/resources/x/tweets/tweets.d.ts +2639 -326
- package/resources/x/tweets/tweets.d.ts.map +1 -1
- package/resources/x/tweets/tweets.js +147 -21
- package/resources/x/tweets/tweets.js.map +1 -1
- package/resources/x/tweets/tweets.mjs +147 -21
- package/resources/x/tweets/tweets.mjs.map +1 -1
- package/resources/x/users/follow.d.mts +38 -20
- package/resources/x/users/follow.d.mts.map +1 -1
- package/resources/x/users/follow.d.ts +38 -20
- package/resources/x/users/follow.d.ts.map +1 -1
- package/resources/x/users/follow.js +2 -2
- package/resources/x/users/follow.mjs +2 -2
- package/resources/x/users/index.d.mts +1 -1
- package/resources/x/users/index.d.mts.map +1 -1
- package/resources/x/users/index.d.ts +1 -1
- package/resources/x/users/index.d.ts.map +1 -1
- package/resources/x/users/index.js.map +1 -1
- package/resources/x/users/index.mjs.map +1 -1
- package/resources/x/users/users.d.mts +3068 -457
- package/resources/x/users/users.d.mts.map +1 -1
- package/resources/x/users/users.d.ts +3068 -457
- package/resources/x/users/users.d.ts.map +1 -1
- package/resources/x/users/users.js +205 -22
- package/resources/x/users/users.js.map +1 -1
- package/resources/x/users/users.mjs +205 -22
- package/resources/x/users/users.mjs.map +1 -1
- package/resources/x/write-actions.d.mts +13 -6
- package/resources/x/write-actions.d.mts.map +1 -1
- package/resources/x/write-actions.d.ts +13 -6
- package/resources/x/write-actions.d.ts.map +1 -1
- package/resources/x/write-actions.js +1 -1
- package/resources/x/write-actions.mjs +1 -1
- package/resources/x/x.d.mts +864 -27
- package/resources/x/x.d.mts.map +1 -1
- package/resources/x/x.d.ts +864 -27
- package/resources/x/x.d.ts.map +1 -1
- package/resources/x/x.js +78 -5
- package/resources/x/x.js.map +1 -1
- package/resources/x/x.mjs +80 -7
- package/resources/x/x.mjs.map +1 -1
- package/skills/x-twitter-scraper/SKILL.md +97 -350
- package/skills/x-twitter-scraper/metadata.json +3 -9
- package/skills/x-twitter-scraper/references/draws.md +24 -24
- package/skills/x-twitter-scraper/references/extractions.md +71 -62
- package/skills/x-twitter-scraper/references/mcp-setup.md +36 -39
- package/skills/x-twitter-scraper/references/mcp-tools.md +105 -166
- package/skills/x-twitter-scraper/references/python-examples.md +5 -5
- package/skills/x-twitter-scraper/references/security.md +8 -8
- package/skills/x-twitter-scraper/references/types-mcp-output-schemas.md +4 -4
- package/skills/x-twitter-scraper/references/types.md +0 -1
- package/skills/x-twitter-scraper/references/usage.md +5 -5
- package/skills/x-twitter-scraper/references/webhooks.md +28 -31
- package/skills/x-twitter-scraper/references/workflows.md +70 -71
- package/skills/x-twitter-scraper/skill-card.md +13 -14
- package/skills/x-twitter-scraper/skillspector-report.md +8 -5
- package/skills/xquik-account-automation/LICENSE +21 -0
- package/skills/xquik-account-automation/SKILL.md +91 -0
- package/skills/xquik-social-research/SKILL.md +49 -56
- package/src/client.ts +47 -4
- package/src/core/streaming.ts +328 -0
- package/src/internal/decoders/line.ts +140 -0
- package/src/internal/parse.ts +9 -0
- package/src/resources/account.ts +41 -12
- package/src/resources/compose.ts +77 -21
- package/src/resources/credits.ts +19 -10
- package/src/resources/drafts.ts +13 -22
- package/src/resources/draws.ts +94 -36
- package/src/resources/events.ts +3225 -68
- package/src/resources/extractions.ts +512 -125
- package/src/resources/guest-wallets.ts +6 -5
- package/src/resources/index.ts +24 -1
- package/src/resources/monitors/index.ts +2 -0
- package/src/resources/monitors/keywords.ts +82 -14
- package/src/resources/monitors/monitors.ts +66 -14
- package/src/resources/radar.ts +32 -36
- package/src/resources/shared.ts +2227 -351
- package/src/resources/styles.ts +43 -27
- package/src/resources/subscribe.ts +1 -1
- package/src/resources/support/index.ts +1 -0
- package/src/resources/support/support.ts +2 -0
- package/src/resources/support/tickets.ts +38 -10
- package/src/resources/trends.ts +23 -5
- package/src/resources/webhooks.ts +109 -15
- package/src/resources/x/account-connection-attempts.ts +1 -1
- package/src/resources/x/account-connection-challenges.ts +39 -11
- package/src/resources/x/accounts.ts +46 -10
- package/src/resources/x/analysis.ts +3947 -0
- package/src/resources/x/bookmarks.ts +103 -9
- package/src/resources/x/broadcasts.ts +225 -0
- package/src/resources/x/communities/communities.ts +743 -141
- package/src/resources/x/communities/index.ts +9 -0
- package/src/resources/x/communities/join.ts +46 -23
- package/src/resources/x/communities/media.ts +251 -0
- package/src/resources/x/communities/tweets.ts +427 -20
- package/src/resources/x/dm.ts +334 -11
- package/src/resources/x/followers.ts +35 -3
- package/src/resources/x/index.ts +106 -1
- package/src/resources/x/jobs.ts +627 -0
- package/src/resources/x/lists.ts +1307 -28
- package/src/resources/x/media.ts +24 -12
- package/src/resources/x/profile.ts +60 -30
- package/src/resources/x/spaces.ts +1076 -0
- package/src/resources/x/tweets/index.ts +18 -0
- package/src/resources/x/tweets/like.ts +38 -18
- package/src/resources/x/tweets/retweet.ts +38 -18
- package/src/resources/x/tweets/tweets.ts +3695 -843
- package/src/resources/x/users/follow.ts +38 -18
- package/src/resources/x/users/index.ts +22 -0
- package/src/resources/x/users/users.ts +3687 -465
- package/src/resources/x/write-actions.ts +13 -5
- package/src/resources/x/x.ts +1227 -15
- package/src/streaming.ts +6 -0
- package/src/version.ts +1 -1
- package/streaming.d.mts +3 -0
- package/streaming.d.mts.map +1 -0
- package/streaming.d.ts +3 -0
- package/streaming.d.ts.map +1 -0
- package/streaming.js +9 -0
- package/streaming.js.map +1 -0
- package/streaming.mjs +6 -0
- package/streaming.mjs.map +1 -0
- package/version.d.mts +1 -1
- package/version.d.ts +1 -1
- package/version.js +1 -1
- package/version.mjs +1 -1
- package/skills/x-twitter-scraper/references/types-rest-api-vs-mcp-field-naming.md +0 -15
package/src/client.ts
CHANGED
|
@@ -59,8 +59,16 @@ import {
|
|
|
59
59
|
Draws,
|
|
60
60
|
Winner,
|
|
61
61
|
} from './resources/draws';
|
|
62
|
-
import { Event, EventDetail, EventListParams, EventListResponse, Events } from './resources/events';
|
|
63
62
|
import {
|
|
63
|
+
Event,
|
|
64
|
+
EventDetail,
|
|
65
|
+
EventListParams,
|
|
66
|
+
EventListResponse,
|
|
67
|
+
EventStreamParams,
|
|
68
|
+
Events,
|
|
69
|
+
} from './resources/events';
|
|
70
|
+
import {
|
|
71
|
+
ExtractionCancelResponse,
|
|
64
72
|
ExtractionEstimateCostParams,
|
|
65
73
|
ExtractionEstimateCostResponse,
|
|
66
74
|
ExtractionExportResultsParams,
|
|
@@ -93,6 +101,7 @@ import {
|
|
|
93
101
|
StyleCompareParams,
|
|
94
102
|
StyleCompareResponse,
|
|
95
103
|
StyleGetPerformanceResponse,
|
|
104
|
+
StyleListParams,
|
|
96
105
|
StyleListResponse,
|
|
97
106
|
StyleProfile,
|
|
98
107
|
StyleProfileSummary,
|
|
@@ -106,8 +115,12 @@ import {
|
|
|
106
115
|
Webhook,
|
|
107
116
|
WebhookCreateParams,
|
|
108
117
|
WebhookCreateResponse,
|
|
118
|
+
WebhookCreateTelegramLinkParams,
|
|
119
|
+
WebhookCreateTelegramLinkResponse,
|
|
109
120
|
WebhookDeactivateResponse,
|
|
121
|
+
WebhookListDeliveriesParams,
|
|
110
122
|
WebhookListDeliveriesResponse,
|
|
123
|
+
WebhookListParams,
|
|
111
124
|
WebhookListResponse,
|
|
112
125
|
WebhookResumeResponse,
|
|
113
126
|
WebhookTestResponse,
|
|
@@ -119,6 +132,7 @@ import {
|
|
|
119
132
|
MonitorCreateParams,
|
|
120
133
|
MonitorCreateResponse,
|
|
121
134
|
MonitorDeactivateResponse,
|
|
135
|
+
MonitorListParams,
|
|
122
136
|
MonitorListResponse,
|
|
123
137
|
MonitorUpdateParams,
|
|
124
138
|
Monitors,
|
|
@@ -126,12 +140,21 @@ import {
|
|
|
126
140
|
import { Support } from './resources/support/support';
|
|
127
141
|
import {
|
|
128
142
|
X,
|
|
143
|
+
XAutocompleteSearchParams,
|
|
144
|
+
XAutocompleteSearchResponse,
|
|
145
|
+
XGetArticleParams,
|
|
129
146
|
XGetArticleResponse,
|
|
147
|
+
XGetHashflagsParams,
|
|
148
|
+
XGetHashflagsResponse,
|
|
130
149
|
XGetHomeTimelineParams,
|
|
131
150
|
XGetNotificationsParams,
|
|
132
151
|
XGetNotificationsResponse,
|
|
152
|
+
XGetTrendLocationsParams,
|
|
153
|
+
XGetTrendLocationsResponse,
|
|
133
154
|
XGetTrendsParams,
|
|
134
155
|
XGetTrendsResponse,
|
|
156
|
+
XSearchPlacesParams,
|
|
157
|
+
XSearchPlacesResponse,
|
|
135
158
|
} from './resources/x/x';
|
|
136
159
|
import { type Fetch } from './internal/builtin-types';
|
|
137
160
|
import { HeadersLike, NullableHeaders, buildHeaders } from './internal/headers';
|
|
@@ -902,7 +925,7 @@ export class XTwitterScraper {
|
|
|
902
925
|
*/
|
|
903
926
|
account: API.Account = new API.Account(this);
|
|
904
927
|
/**
|
|
905
|
-
* Subscription, billing, and
|
|
928
|
+
* Subscription, billing, and credits
|
|
906
929
|
*/
|
|
907
930
|
subscribe: API.Subscribe = new API.Subscribe(this);
|
|
908
931
|
/**
|
|
@@ -930,7 +953,7 @@ export class XTwitterScraper {
|
|
|
930
953
|
*/
|
|
931
954
|
events: API.Events = new API.Events(this);
|
|
932
955
|
/**
|
|
933
|
-
*
|
|
956
|
+
* Saved or bulk data extraction (23 tool types)
|
|
934
957
|
*/
|
|
935
958
|
extractions: API.Extractions = new API.Extractions(this);
|
|
936
959
|
/**
|
|
@@ -948,7 +971,7 @@ export class XTwitterScraper {
|
|
|
948
971
|
trends: API.Trends = new API.Trends(this);
|
|
949
972
|
support: API.Support = new API.Support(this);
|
|
950
973
|
/**
|
|
951
|
-
* Subscription, billing, and
|
|
974
|
+
* Subscription, billing, and credits
|
|
952
975
|
*/
|
|
953
976
|
credits: API.Credits = new API.Credits(this);
|
|
954
977
|
/**
|
|
@@ -1015,6 +1038,7 @@ export declare namespace XTwitterScraper {
|
|
|
1015
1038
|
type StyleCompareResponse as StyleCompareResponse,
|
|
1016
1039
|
type StyleGetPerformanceResponse as StyleGetPerformanceResponse,
|
|
1017
1040
|
type StyleUpdateParams as StyleUpdateParams,
|
|
1041
|
+
type StyleListParams as StyleListParams,
|
|
1018
1042
|
type StyleAnalyzeParams as StyleAnalyzeParams,
|
|
1019
1043
|
type StyleCompareParams as StyleCompareParams,
|
|
1020
1044
|
};
|
|
@@ -1034,6 +1058,7 @@ export declare namespace XTwitterScraper {
|
|
|
1034
1058
|
type MonitorDeactivateResponse as MonitorDeactivateResponse,
|
|
1035
1059
|
type MonitorCreateParams as MonitorCreateParams,
|
|
1036
1060
|
type MonitorUpdateParams as MonitorUpdateParams,
|
|
1061
|
+
type MonitorListParams as MonitorListParams,
|
|
1037
1062
|
};
|
|
1038
1063
|
|
|
1039
1064
|
export {
|
|
@@ -1042,6 +1067,7 @@ export declare namespace XTwitterScraper {
|
|
|
1042
1067
|
type EventDetail as EventDetail,
|
|
1043
1068
|
type EventListResponse as EventListResponse,
|
|
1044
1069
|
type EventListParams as EventListParams,
|
|
1070
|
+
type EventStreamParams as EventStreamParams,
|
|
1045
1071
|
};
|
|
1046
1072
|
|
|
1047
1073
|
export {
|
|
@@ -1049,6 +1075,7 @@ export declare namespace XTwitterScraper {
|
|
|
1049
1075
|
type ExtractionJob as ExtractionJob,
|
|
1050
1076
|
type ExtractionRetrieveResponse as ExtractionRetrieveResponse,
|
|
1051
1077
|
type ExtractionListResponse as ExtractionListResponse,
|
|
1078
|
+
type ExtractionCancelResponse as ExtractionCancelResponse,
|
|
1052
1079
|
type ExtractionEstimateCostResponse as ExtractionEstimateCostResponse,
|
|
1053
1080
|
type ExtractionRunResponse as ExtractionRunResponse,
|
|
1054
1081
|
type ExtractionRetrieveParams as ExtractionRetrieveParams,
|
|
@@ -1077,22 +1104,35 @@ export declare namespace XTwitterScraper {
|
|
|
1077
1104
|
type Webhook as Webhook,
|
|
1078
1105
|
type WebhookCreateResponse as WebhookCreateResponse,
|
|
1079
1106
|
type WebhookListResponse as WebhookListResponse,
|
|
1107
|
+
type WebhookCreateTelegramLinkResponse as WebhookCreateTelegramLinkResponse,
|
|
1080
1108
|
type WebhookDeactivateResponse as WebhookDeactivateResponse,
|
|
1081
1109
|
type WebhookListDeliveriesResponse as WebhookListDeliveriesResponse,
|
|
1082
1110
|
type WebhookResumeResponse as WebhookResumeResponse,
|
|
1083
1111
|
type WebhookTestResponse as WebhookTestResponse,
|
|
1084
1112
|
type WebhookCreateParams as WebhookCreateParams,
|
|
1085
1113
|
type WebhookUpdateParams as WebhookUpdateParams,
|
|
1114
|
+
type WebhookListParams as WebhookListParams,
|
|
1115
|
+
type WebhookCreateTelegramLinkParams as WebhookCreateTelegramLinkParams,
|
|
1116
|
+
type WebhookListDeliveriesParams as WebhookListDeliveriesParams,
|
|
1086
1117
|
};
|
|
1087
1118
|
|
|
1088
1119
|
export {
|
|
1089
1120
|
X as X,
|
|
1121
|
+
type XAutocompleteSearchResponse as XAutocompleteSearchResponse,
|
|
1090
1122
|
type XGetArticleResponse as XGetArticleResponse,
|
|
1123
|
+
type XGetHashflagsResponse as XGetHashflagsResponse,
|
|
1091
1124
|
type XGetNotificationsResponse as XGetNotificationsResponse,
|
|
1125
|
+
type XGetTrendLocationsResponse as XGetTrendLocationsResponse,
|
|
1092
1126
|
type XGetTrendsResponse as XGetTrendsResponse,
|
|
1127
|
+
type XSearchPlacesResponse as XSearchPlacesResponse,
|
|
1128
|
+
type XAutocompleteSearchParams as XAutocompleteSearchParams,
|
|
1129
|
+
type XGetArticleParams as XGetArticleParams,
|
|
1130
|
+
type XGetHashflagsParams as XGetHashflagsParams,
|
|
1093
1131
|
type XGetHomeTimelineParams as XGetHomeTimelineParams,
|
|
1094
1132
|
type XGetNotificationsParams as XGetNotificationsParams,
|
|
1133
|
+
type XGetTrendLocationsParams as XGetTrendLocationsParams,
|
|
1095
1134
|
type XGetTrendsParams as XGetTrendsParams,
|
|
1135
|
+
type XSearchPlacesParams as XSearchPlacesParams,
|
|
1096
1136
|
};
|
|
1097
1137
|
|
|
1098
1138
|
export {
|
|
@@ -1123,6 +1163,9 @@ export declare namespace XTwitterScraper {
|
|
|
1123
1163
|
type GuestWalletTopupParams as GuestWalletTopupParams,
|
|
1124
1164
|
};
|
|
1125
1165
|
|
|
1166
|
+
export type Community = API.Community;
|
|
1167
|
+
export type CommunityPage = API.CommunityPage;
|
|
1168
|
+
export type CommunityTopic = API.CommunityTopic;
|
|
1126
1169
|
export type ContentDisclosure = API.ContentDisclosure;
|
|
1127
1170
|
export type EmbeddedTweet = API.EmbeddedTweet;
|
|
1128
1171
|
export type Error = API.Error;
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 Xquik contributors
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
6
|
+
|
|
7
|
+
import { XTwitterScraperError } from './error';
|
|
8
|
+
import { type ReadableStream } from '../internal/shim-types';
|
|
9
|
+
import { makeReadableStream } from '../internal/shims';
|
|
10
|
+
import { findDoubleNewlineIndex, LineDecoder } from '../internal/decoders/line';
|
|
11
|
+
import { ReadableStreamToAsyncIterable } from '../internal/shims';
|
|
12
|
+
import { isAbortError } from '../internal/errors';
|
|
13
|
+
import { encodeUTF8 } from '../internal/utils/bytes';
|
|
14
|
+
import { loggerFor } from '../internal/utils/log';
|
|
15
|
+
import type { XTwitterScraper } from '../client';
|
|
16
|
+
|
|
17
|
+
type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;
|
|
18
|
+
|
|
19
|
+
export type ServerSentEvent = {
|
|
20
|
+
event: string | null;
|
|
21
|
+
data: string;
|
|
22
|
+
raw: string[];
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export class Stream<Item> implements AsyncIterable<Item> {
|
|
26
|
+
controller: AbortController;
|
|
27
|
+
#client: XTwitterScraper | undefined;
|
|
28
|
+
|
|
29
|
+
constructor(
|
|
30
|
+
private iterator: () => AsyncIterator<Item>,
|
|
31
|
+
controller: AbortController,
|
|
32
|
+
client?: XTwitterScraper,
|
|
33
|
+
) {
|
|
34
|
+
this.controller = controller;
|
|
35
|
+
this.#client = client;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
static fromSSEResponse<Item>(
|
|
39
|
+
response: Response,
|
|
40
|
+
controller: AbortController,
|
|
41
|
+
client?: XTwitterScraper,
|
|
42
|
+
): Stream<Item> {
|
|
43
|
+
let consumed = false;
|
|
44
|
+
const logger = client ? loggerFor(client) : console;
|
|
45
|
+
|
|
46
|
+
async function* iterator(): AsyncIterator<Item, any, undefined> {
|
|
47
|
+
if (consumed) {
|
|
48
|
+
throw new XTwitterScraperError(
|
|
49
|
+
'Cannot iterate over a consumed stream, use `.tee()` to split the stream.',
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
consumed = true;
|
|
53
|
+
let done = false;
|
|
54
|
+
try {
|
|
55
|
+
for await (const sse of _iterSSEMessages(response, controller)) {
|
|
56
|
+
// Each event is named by its type, so every event with data is yielded.
|
|
57
|
+
if (!sse.data) continue;
|
|
58
|
+
|
|
59
|
+
try {
|
|
60
|
+
yield JSON.parse(sse.data);
|
|
61
|
+
} catch (e) {
|
|
62
|
+
logger.error(`Could not parse message into JSON:`, sse.data);
|
|
63
|
+
logger.error(`From chunk:`, sse.raw);
|
|
64
|
+
throw e;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
done = true;
|
|
68
|
+
} catch (e) {
|
|
69
|
+
// If the user calls `stream.controller.abort()`, we should exit without throwing.
|
|
70
|
+
if (isAbortError(e)) return;
|
|
71
|
+
throw e;
|
|
72
|
+
} finally {
|
|
73
|
+
// If the user `break`s, abort the ongoing request.
|
|
74
|
+
if (!done) controller.abort();
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
return new Stream(iterator, controller, client);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Generates a Stream from a newline-separated ReadableStream
|
|
83
|
+
* where each item is a JSON value.
|
|
84
|
+
*/
|
|
85
|
+
static fromReadableStream<Item>(
|
|
86
|
+
readableStream: ReadableStream,
|
|
87
|
+
controller: AbortController,
|
|
88
|
+
client?: XTwitterScraper,
|
|
89
|
+
): Stream<Item> {
|
|
90
|
+
let consumed = false;
|
|
91
|
+
|
|
92
|
+
async function* iterLines(): AsyncGenerator<string, void, unknown> {
|
|
93
|
+
const lineDecoder = new LineDecoder();
|
|
94
|
+
|
|
95
|
+
const iter = ReadableStreamToAsyncIterable<Bytes>(readableStream);
|
|
96
|
+
for await (const chunk of iter) {
|
|
97
|
+
for (const line of lineDecoder.decode(chunk)) {
|
|
98
|
+
yield line;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
for (const line of lineDecoder.flush()) {
|
|
103
|
+
yield line;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function* iterator(): AsyncIterator<Item, any, undefined> {
|
|
108
|
+
if (consumed) {
|
|
109
|
+
throw new XTwitterScraperError(
|
|
110
|
+
'Cannot iterate over a consumed stream, use `.tee()` to split the stream.',
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
consumed = true;
|
|
114
|
+
let done = false;
|
|
115
|
+
try {
|
|
116
|
+
for await (const line of iterLines()) {
|
|
117
|
+
if (done) continue;
|
|
118
|
+
if (line) yield JSON.parse(line);
|
|
119
|
+
}
|
|
120
|
+
done = true;
|
|
121
|
+
} catch (e) {
|
|
122
|
+
// If the user calls `stream.controller.abort()`, we should exit without throwing.
|
|
123
|
+
if (isAbortError(e)) return;
|
|
124
|
+
throw e;
|
|
125
|
+
} finally {
|
|
126
|
+
// If the user `break`s, abort the ongoing request.
|
|
127
|
+
if (!done) controller.abort();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return new Stream(iterator, controller, client);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
[Symbol.asyncIterator](): AsyncIterator<Item> {
|
|
135
|
+
return this.iterator();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Splits the stream into two streams which can be
|
|
140
|
+
* independently read from at different speeds.
|
|
141
|
+
*/
|
|
142
|
+
tee(): [Stream<Item>, Stream<Item>] {
|
|
143
|
+
const left: Array<Promise<IteratorResult<Item>>> = [];
|
|
144
|
+
const right: Array<Promise<IteratorResult<Item>>> = [];
|
|
145
|
+
const iterator = this.iterator();
|
|
146
|
+
|
|
147
|
+
const teeIterator = (queue: Array<Promise<IteratorResult<Item>>>): AsyncIterator<Item> => {
|
|
148
|
+
return {
|
|
149
|
+
next: () => {
|
|
150
|
+
if (queue.length === 0) {
|
|
151
|
+
const result = iterator.next();
|
|
152
|
+
left.push(result);
|
|
153
|
+
right.push(result);
|
|
154
|
+
}
|
|
155
|
+
return queue.shift()!;
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
return [
|
|
161
|
+
new Stream(() => teeIterator(left), this.controller, this.#client),
|
|
162
|
+
new Stream(() => teeIterator(right), this.controller, this.#client),
|
|
163
|
+
];
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Converts this stream to a newline-separated ReadableStream of
|
|
168
|
+
* JSON stringified values in the stream
|
|
169
|
+
* which can be turned back into a Stream with `Stream.fromReadableStream()`.
|
|
170
|
+
*/
|
|
171
|
+
toReadableStream(): ReadableStream {
|
|
172
|
+
const self = this;
|
|
173
|
+
let iter: AsyncIterator<Item>;
|
|
174
|
+
|
|
175
|
+
return makeReadableStream({
|
|
176
|
+
async start() {
|
|
177
|
+
iter = self[Symbol.asyncIterator]();
|
|
178
|
+
},
|
|
179
|
+
async pull(ctrl: any) {
|
|
180
|
+
try {
|
|
181
|
+
const { value, done } = await iter.next();
|
|
182
|
+
if (done) return ctrl.close();
|
|
183
|
+
|
|
184
|
+
const bytes = encodeUTF8(JSON.stringify(value) + '\n');
|
|
185
|
+
|
|
186
|
+
ctrl.enqueue(bytes);
|
|
187
|
+
} catch (err) {
|
|
188
|
+
ctrl.error(err);
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
async cancel() {
|
|
192
|
+
await iter.return?.();
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export async function* _iterSSEMessages(
|
|
199
|
+
response: Response,
|
|
200
|
+
controller: AbortController,
|
|
201
|
+
): AsyncGenerator<ServerSentEvent, void, unknown> {
|
|
202
|
+
if (!response.body) {
|
|
203
|
+
controller.abort();
|
|
204
|
+
if (
|
|
205
|
+
typeof (globalThis as any).navigator !== 'undefined' &&
|
|
206
|
+
(globalThis as any).navigator.product === 'ReactNative'
|
|
207
|
+
) {
|
|
208
|
+
throw new XTwitterScraperError(
|
|
209
|
+
`The default react-native fetch implementation does not support streaming. Please use expo/fetch: https://docs.expo.dev/versions/latest/sdk/expo/#expofetch-api`,
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
throw new XTwitterScraperError(`Attempted to iterate over a response with no body`);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const sseDecoder = new SSEDecoder();
|
|
216
|
+
const lineDecoder = new LineDecoder();
|
|
217
|
+
|
|
218
|
+
const iter = ReadableStreamToAsyncIterable<Bytes>(response.body);
|
|
219
|
+
for await (const sseChunk of iterSSEChunks(iter)) {
|
|
220
|
+
for (const line of lineDecoder.decode(sseChunk)) {
|
|
221
|
+
const sse = sseDecoder.decode(line);
|
|
222
|
+
if (sse) yield sse;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
for (const line of lineDecoder.flush()) {
|
|
227
|
+
const sse = sseDecoder.decode(line);
|
|
228
|
+
if (sse) yield sse;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Given an async iterable iterator, iterates over it and yields full
|
|
234
|
+
* SSE chunks, i.e. yields when a double new-line is encountered.
|
|
235
|
+
*/
|
|
236
|
+
async function* iterSSEChunks(iterator: AsyncIterableIterator<Bytes>): AsyncGenerator<Uint8Array> {
|
|
237
|
+
let data = new Uint8Array();
|
|
238
|
+
|
|
239
|
+
for await (const chunk of iterator) {
|
|
240
|
+
if (chunk == null) {
|
|
241
|
+
continue;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const binaryChunk =
|
|
245
|
+
chunk instanceof ArrayBuffer ? new Uint8Array(chunk)
|
|
246
|
+
: typeof chunk === 'string' ? encodeUTF8(chunk)
|
|
247
|
+
: chunk;
|
|
248
|
+
|
|
249
|
+
let newData = new Uint8Array(data.length + binaryChunk.length);
|
|
250
|
+
newData.set(data);
|
|
251
|
+
newData.set(binaryChunk, data.length);
|
|
252
|
+
data = newData;
|
|
253
|
+
|
|
254
|
+
let patternIndex;
|
|
255
|
+
while ((patternIndex = findDoubleNewlineIndex(data)) !== -1) {
|
|
256
|
+
yield data.slice(0, patternIndex);
|
|
257
|
+
data = data.slice(patternIndex);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
if (data.length > 0) {
|
|
262
|
+
yield data;
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
class SSEDecoder {
|
|
267
|
+
private data: string[];
|
|
268
|
+
private event: string | null;
|
|
269
|
+
private chunks: string[];
|
|
270
|
+
|
|
271
|
+
constructor() {
|
|
272
|
+
this.event = null;
|
|
273
|
+
this.data = [];
|
|
274
|
+
this.chunks = [];
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
decode(line: string) {
|
|
278
|
+
if (line.endsWith('\r')) {
|
|
279
|
+
line = line.substring(0, line.length - 1);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
if (!line) {
|
|
283
|
+
// empty line and we didn't previously encounter any messages
|
|
284
|
+
if (!this.event && !this.data.length) return null;
|
|
285
|
+
|
|
286
|
+
const sse: ServerSentEvent = {
|
|
287
|
+
event: this.event,
|
|
288
|
+
data: this.data.join('\n'),
|
|
289
|
+
raw: this.chunks,
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
this.event = null;
|
|
293
|
+
this.data = [];
|
|
294
|
+
this.chunks = [];
|
|
295
|
+
|
|
296
|
+
return sse;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
this.chunks.push(line);
|
|
300
|
+
|
|
301
|
+
if (line.startsWith(':')) {
|
|
302
|
+
return null;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
let [fieldname, _, value] = partition(line, ':');
|
|
306
|
+
|
|
307
|
+
if (value.startsWith(' ')) {
|
|
308
|
+
value = value.substring(1);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
if (fieldname === 'event') {
|
|
312
|
+
this.event = value;
|
|
313
|
+
} else if (fieldname === 'data') {
|
|
314
|
+
this.data.push(value);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
function partition(str: string, delimiter: string): [string, string, string] {
|
|
322
|
+
const index = str.indexOf(delimiter);
|
|
323
|
+
if (index !== -1) {
|
|
324
|
+
return [str.substring(0, index), delimiter, str.substring(index + delimiter.length)];
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return [str, '', ''];
|
|
328
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// SPDX-FileCopyrightText: 2026 Xquik contributors
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
|
|
5
|
+
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
6
|
+
|
|
7
|
+
import { concatBytes, decodeUTF8, encodeUTF8 } from '../utils/bytes';
|
|
8
|
+
|
|
9
|
+
export type Bytes = string | ArrayBuffer | Uint8Array | null | undefined;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A re-implementation of httpx's `LineDecoder` in Python that handles incrementally
|
|
13
|
+
* reading lines from text.
|
|
14
|
+
*
|
|
15
|
+
* https://github.com/encode/httpx/blob/920333ea98118e9cf617f246905d7b202510941c/httpx/_decoders.py#L258
|
|
16
|
+
*/
|
|
17
|
+
export class LineDecoder {
|
|
18
|
+
static NEWLINE_CHARS = new Set(['\n', '\r']);
|
|
19
|
+
static NEWLINE_REGEXP = /\r\n|[\n\r]/g;
|
|
20
|
+
|
|
21
|
+
#buffer: Uint8Array;
|
|
22
|
+
#carriageReturnIndex: number | null;
|
|
23
|
+
|
|
24
|
+
constructor() {
|
|
25
|
+
this.#buffer = new Uint8Array();
|
|
26
|
+
this.#carriageReturnIndex = null;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
decode(chunk: Bytes): string[] {
|
|
30
|
+
if (chunk == null) {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const binaryChunk =
|
|
35
|
+
chunk instanceof ArrayBuffer ? new Uint8Array(chunk)
|
|
36
|
+
: typeof chunk === 'string' ? encodeUTF8(chunk)
|
|
37
|
+
: chunk;
|
|
38
|
+
|
|
39
|
+
this.#buffer = concatBytes([this.#buffer, binaryChunk]);
|
|
40
|
+
|
|
41
|
+
const lines: string[] = [];
|
|
42
|
+
let patternIndex;
|
|
43
|
+
while ((patternIndex = findNewlineIndex(this.#buffer, this.#carriageReturnIndex)) != null) {
|
|
44
|
+
if (patternIndex.carriage && this.#carriageReturnIndex == null) {
|
|
45
|
+
// skip until we either get a corresponding `\n`, a new `\r` or nothing
|
|
46
|
+
this.#carriageReturnIndex = patternIndex.index;
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// we got double \r or \rtext\n
|
|
51
|
+
if (
|
|
52
|
+
this.#carriageReturnIndex != null &&
|
|
53
|
+
(patternIndex.index !== this.#carriageReturnIndex + 1 || patternIndex.carriage)
|
|
54
|
+
) {
|
|
55
|
+
lines.push(decodeUTF8(this.#buffer.subarray(0, this.#carriageReturnIndex - 1)));
|
|
56
|
+
this.#buffer = this.#buffer.subarray(this.#carriageReturnIndex);
|
|
57
|
+
this.#carriageReturnIndex = null;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const endIndex =
|
|
62
|
+
this.#carriageReturnIndex !== null ? patternIndex.preceding - 1 : patternIndex.preceding;
|
|
63
|
+
|
|
64
|
+
const line = decodeUTF8(this.#buffer.subarray(0, endIndex));
|
|
65
|
+
lines.push(line);
|
|
66
|
+
|
|
67
|
+
this.#buffer = this.#buffer.subarray(patternIndex.index);
|
|
68
|
+
this.#carriageReturnIndex = null;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return lines;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
flush(): string[] {
|
|
75
|
+
if (!this.#buffer.length) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
return this.decode('\n');
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* This function searches the buffer for the end patterns, (\r or \n)
|
|
84
|
+
* and returns an object with the index preceding the matched newline and the
|
|
85
|
+
* index after the newline char. `null` is returned if no new line is found.
|
|
86
|
+
*
|
|
87
|
+
* ```ts
|
|
88
|
+
* findNewLineIndex('abc\ndef') -> { preceding: 2, index: 3 }
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
function findNewlineIndex(
|
|
92
|
+
buffer: Uint8Array,
|
|
93
|
+
startIndex: number | null,
|
|
94
|
+
): { preceding: number; index: number; carriage: boolean } | null {
|
|
95
|
+
const newline = 0x0a; // \n
|
|
96
|
+
const carriage = 0x0d; // \r
|
|
97
|
+
|
|
98
|
+
for (let i = startIndex ?? 0; i < buffer.length; i++) {
|
|
99
|
+
if (buffer[i] === newline) {
|
|
100
|
+
return { preceding: i, index: i + 1, carriage: false };
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (buffer[i] === carriage) {
|
|
104
|
+
return { preceding: i, index: i + 1, carriage: true };
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export function findDoubleNewlineIndex(buffer: Uint8Array): number {
|
|
112
|
+
// This function searches the buffer for the end patterns (\r\r, \n\n, \r\n\r\n)
|
|
113
|
+
// and returns the index right after the first occurrence of any pattern,
|
|
114
|
+
// or -1 if none of the patterns are found.
|
|
115
|
+
const newline = 0x0a; // \n
|
|
116
|
+
const carriage = 0x0d; // \r
|
|
117
|
+
|
|
118
|
+
for (let i = 0; i < buffer.length - 1; i++) {
|
|
119
|
+
if (buffer[i] === newline && buffer[i + 1] === newline) {
|
|
120
|
+
// \n\n
|
|
121
|
+
return i + 2;
|
|
122
|
+
}
|
|
123
|
+
if (buffer[i] === carriage && buffer[i + 1] === carriage) {
|
|
124
|
+
// \r\r
|
|
125
|
+
return i + 2;
|
|
126
|
+
}
|
|
127
|
+
if (
|
|
128
|
+
buffer[i] === carriage &&
|
|
129
|
+
buffer[i + 1] === newline &&
|
|
130
|
+
i + 3 < buffer.length &&
|
|
131
|
+
buffer[i + 2] === carriage &&
|
|
132
|
+
buffer[i + 3] === newline
|
|
133
|
+
) {
|
|
134
|
+
// \r\n\r\n
|
|
135
|
+
return i + 4;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return -1;
|
|
140
|
+
}
|
package/src/internal/parse.ts
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.
|
|
6
6
|
|
|
7
7
|
import type { FinalRequestOptions } from './request-options';
|
|
8
|
+
import { Stream } from '../core/streaming';
|
|
8
9
|
import { type XTwitterScraper } from '../client';
|
|
9
10
|
import { formatRequestDetails, loggerFor } from './utils/log';
|
|
10
11
|
|
|
@@ -20,6 +21,14 @@ export type APIResponseProps = {
|
|
|
20
21
|
export async function defaultParseResponse<T>(client: XTwitterScraper, props: APIResponseProps): Promise<T> {
|
|
21
22
|
const { response, requestLogID, retryOfRequestLogID, startTime } = props;
|
|
22
23
|
const body = await (async () => {
|
|
24
|
+
if (props.options.stream) {
|
|
25
|
+
loggerFor(client).debug('response', response.status, response.url, response.headers, response.body);
|
|
26
|
+
|
|
27
|
+
// Note: there is an invariant here that isn't represented in the type system
|
|
28
|
+
// that if you set `stream: true` the response type must also be `Stream<T>`
|
|
29
|
+
return Stream.fromSSEResponse(response, props.controller, client) as any;
|
|
30
|
+
}
|
|
31
|
+
|
|
23
32
|
// fetch refuses to read the body when the status code is 204.
|
|
24
33
|
if (response.status === 204) {
|
|
25
34
|
return null as T;
|