twspace-crawler
Version:
Script to monitor & download Twitter Spaces 24/7
60 lines • 2.63 kB
JavaScript
;
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