UNPKG

twspace-crawler

Version:
60 lines 2.63 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.TwitterTransaction = void 0; const bottleneck_1 = __importDefault(require("bottleneck")); const x_client_transaction_id_1 = require("x-client-transaction-id"); const logger_1 = require("../logger"); /** * @see https://github.com/Lqm1/x-client-transaction-id * @since 2025-11-08 */ class TwitterTransaction { constructor() { this.logger = logger_1.logger.child({ label: '[TwitterTransaction]' }); this.ttl = 1000; this.transactionCollections = {}; this.clientLimiter = new bottleneck_1.default({ maxConcurrent: 1 }); this.transactionLimiter = new bottleneck_1.default.Group({ maxConcurrent: 1, minTime: this.ttl, }); } async generateTransactionId(method, path) { // eslint-disable-next-line no-param-reassign method = method.toUpperCase(); const res = await this.transactionLimiter.key(path).schedule(async () => { let transactionItem = this.transactionCollections[path]?.[method]; if (transactionItem && Date.now() - transactionItem.at < this.ttl) { return transactionItem.value; } const transaction = await this.initClient(); const transactionId = await transaction.generateTransactionId(method, path); transactionItem = { at: Date.now(), value: transactionId, }; this.logger.debug(`generateTransactionId | ${JSON.stringify({ method, path, data: transactionItem })}`); this.transactionCollections[path] = { [method]: transactionItem }; return transactionItem.value; }); return res; } async initClient() { const res = await this.clientLimiter.schedule(async () => { if (!this.transaction) { this.logger.info('initClient: create'); const document = await (0, x_client_transaction_id_1.handleXMigration)(); const transaction = await x_client_transaction_id_1.ClientTransaction.create(document); this.transaction = transaction; this.logger.info('initClient: ok'); } return this.transaction; }); return res; } } exports.TwitterTransaction = TwitterTransaction; //# sourceMappingURL=twitter-transaction.js.map