diff --git a/data_providers/avtocod.js b/data_providers/avtocod.js index ed6b81a..3a7b69d 100644 --- a/data_providers/avtocod.js +++ b/data_providers/avtocod.js @@ -2,12 +2,23 @@ const crypto = require('crypto'); const fetch = require('node-fetch'); const Vehicle = require('../models/vehicle'); const DebugInfo = require('../models/DebugInfo'); -const Centrifuge = require('centrifuge'); +const { Centrifuge } = require('centrifuge'); const SockJS = require('sockjs-client'); +const WebSocket = require('ws'); const baseUrl = 'https://avtocod.ru/api/v3'; +const tokenRefreshUrl = 'https://avtocod.ru/api/centrifuge/refresh'; + let deviceToken = crypto.createHash('sha256').update(Date.now().toString()).digest().toString('hex'); +const myWs = function (options) { + return class wsClass extends WebSocket { + constructor(...args) { + super(...[...args, ...[options]]) + } + } +} + function fromBase64(data) { return Buffer.from(data, 'base64').toString('binary'); } @@ -37,10 +48,47 @@ function decryptReport(report, hash) { return JSON.parse(decrypted.toString()); } +function getToken(ctx) { + console.log('+++++ getToken'); + return new Promise((resolve, reject) => { + fetch(tokenRefreshUrl, { + method: 'POST', + headers: new Headers({ 'Content-Type': 'application/json' }), + body: JSON.stringify(ctx) + }) + .then(res => { + if (!res.ok) { + throw new Error(`Unexpected status code ${res.status}`); + } + return res.json(); + }) + .then(data => { + resolve(data.token); + }) + .catch(err => { + reject(err); + }); + }); +} + function waitForReport(centrifugoConfig, channel) { return new Promise((resolve, reject) => { + let report = null; - let centrifuge = new Centrifuge(centrifugoConfig.uri, { sockjs: SockJS }); + let centrifuge = new Centrifuge([{ + transport: 'websocket', + endpoint: centrifugoConfig.uri + }], { + websocket: myWs({ headers: { + 'Sec-Fetch-Site': 'same-site', + 'Sec-Fetch-Mode': 'websocket', + 'Sec-Fetch-Dest': 'websocket', + 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/109.0' + } }), + token: centrifugoConfig.token, + getToken: getToken, + debug: false + }); let timeout = setTimeout(() => { centrifuge.disconnect(); @@ -51,7 +99,9 @@ function waitForReport(centrifugoConfig, channel) { } }, 10000); - centrifuge.subscribe(channel, message => { + const sub = centrifuge.newSubscription(channel); + + sub.on('publication', function(message) { if(message.data.event == 'report-ready') { clearTimeout(timeout); centrifuge.disconnect(); @@ -61,7 +111,7 @@ function waitForReport(centrifugoConfig, channel) { } }); - centrifuge.setToken(centrifugoConfig.token); + sub.subscribe(); centrifuge.connect(); }); } @@ -73,6 +123,7 @@ class AvtocodProvider { let resp = await getJson(url); let html = await getPage(resp.report_uri); + let result = html.match(//); if(result == null) { throw Error('Error getting api version hash'); diff --git a/package-lock.json b/package-lock.json index 987ab12..4b2330b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "abort-controller": "^3.0.0", "body-parser": "^1.19.0", - "centrifuge": "^2.8.3", + "centrifuge": "^3.1.0", "compress": "^0.99.0", "compression": "^1.7.4", "cors": "^2.8.5", @@ -26,7 +26,8 @@ "response-time": "^2.3.2", "sockjs-client": "^1.5.2", "utf8": "^3.0.0", - "uuid": "^8.3.0" + "uuid": "^8.3.0", + "ws": "^8.12.0" }, "devDependencies": { "babel-eslint": "^10.1.0", @@ -1725,11 +1726,12 @@ } }, "node_modules/centrifuge": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/centrifuge/-/centrifuge-2.8.5.tgz", - "integrity": "sha512-t06HyieeB2k7uSJSbVM4e7xMF+mfY8xvDtTJLF95ho0ba/X4MSoZcisi2PBzdCLyxG2BhkYW1Wcg6RUiPYTIlQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/centrifuge/-/centrifuge-3.1.0.tgz", + "integrity": "sha512-CI0CU+ZwV7XYfFoW9oxhYg1rf/i7nhNnH9Aa+2okTces0YD+S5WCUMsrQXWkTTPxJI0jpnAbqZUVLqexxMm3ZA==", "dependencies": { - "protobufjs": "^6.11.2" + "events": "^3.3.0", + "protobufjs": "^6.11.3" } }, "node_modules/chalk": { @@ -2348,6 +2350,14 @@ "node": ">=6" } }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, "node_modules/eventsource": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", @@ -4036,6 +4046,26 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", @@ -5436,11 +5466,12 @@ "dev": true }, "centrifuge": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/centrifuge/-/centrifuge-2.8.5.tgz", - "integrity": "sha512-t06HyieeB2k7uSJSbVM4e7xMF+mfY8xvDtTJLF95ho0ba/X4MSoZcisi2PBzdCLyxG2BhkYW1Wcg6RUiPYTIlQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/centrifuge/-/centrifuge-3.1.0.tgz", + "integrity": "sha512-CI0CU+ZwV7XYfFoW9oxhYg1rf/i7nhNnH9Aa+2okTces0YD+S5WCUMsrQXWkTTPxJI0jpnAbqZUVLqexxMm3ZA==", "requires": { - "protobufjs": "^6.11.2" + "events": "^3.3.0", + "protobufjs": "^6.11.3" } }, "chalk": { @@ -5903,6 +5934,11 @@ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, "eventsource": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz", @@ -7199,6 +7235,12 @@ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "ws": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.12.0.tgz", + "integrity": "sha512-kU62emKIdKVeEIOIKVegvqpXMSTAMLJozpHZaJNDYqBjzlSYXQGviYwN1osDLJ9av68qHd4a2oSjd7yD4pacig==", + "requires": {} + }, "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", diff --git a/package.json b/package.json index 2a5f232..e21794b 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "dependencies": { "abort-controller": "^3.0.0", "body-parser": "^1.19.0", - "centrifuge": "^2.8.3", + "centrifuge": "^3.1.0", "compress": "^0.99.0", "compression": "^1.7.4", "cors": "^2.8.5", @@ -28,7 +28,8 @@ "response-time": "^2.3.2", "sockjs-client": "^1.5.2", "utf8": "^3.0.0", - "uuid": "^8.3.0" + "uuid": "^8.3.0", + "ws": "^8.12.0" }, "devDependencies": { "babel-eslint": "^10.1.0",