From 4b1c92c38faf2d95409e1eb05eda86999e89f675 Mon Sep 17 00:00:00 2001 From: Sadzurami Date: Mon, 11 Mar 2024 16:25:47 +0300 Subject: [PATCH 1/3] update stdlib version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 810b9bd..92ae661 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,7 @@ "url": "https://github.com/DoctorMcKay/node-tf2.git" }, "dependencies": { - "@doctormckay/stdlib": "^2.7.1", + "@doctormckay/stdlib": "^2.9.1", "bytebuffer": "^5.0.1", "kvparser": "^1.0.2", "protobufjs": "^7.2.5", From 6088edc6d39b10dcaaa9796cb570537e02c99d09 Mon Sep 17 00:00:00 2001 From: Sadzurami Date: Mon, 11 Mar 2024 16:27:21 +0300 Subject: [PATCH 2/3] add items schema caching --- handlers.js | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/handlers.js b/handlers.js index 1d57bbf..a3dc462 100644 --- a/handlers.js +++ b/handlers.js @@ -1,5 +1,6 @@ const ByteBuffer = require('bytebuffer'); const {HttpClient} = require('@doctormckay/stdlib/http'); +const {Semaphore} = require('@doctormckay/stdlib/concurrency.js'); const SteamID = require('steamid'); const VDF = require('kvparser'); @@ -45,26 +46,46 @@ handlers[Language.ServerGoodbye] = function(body) { }; // Item schema +let g_ItemSchema = null; +let g_ItemSchemaVersion = null; +let g_ItemSchemaRetrievalSemaphore = new Semaphore(); + handlers[Language.UpdateItemSchema] = async function(body) { + let release = await g_ItemSchemaRetrievalSemaphore.waitAsync(); + try { let proto = decodeProto(Schema.CMsgUpdateItemSchema, body); - this.emit('itemSchema', proto.item_schema_version.toString(16).toUpperCase(), proto.items_game_url); - let client = new HttpClient(); - let result = await client.request({ - method: 'get', - url: proto.items_game_url - }); + let schemaVersion = proto.item_schema_version.toString(16).toUpperCase(); + let schemaUrl = proto.items_game_url; + + this.emit('itemSchema', schemaVersion, schemaUrl); + + if (schemaVersion !== g_ItemSchemaVersion) { + let client = new HttpClient(); - if (result.statusCode != 200) { - throw new Error(`HTTP error ${result.statusCode}`); + let result = await client.request({ + method: 'get', + url: schemaUrl + }); + + if (result.statusCode != 200) { + throw new Error(`HTTP error ${result.statusCode}`); + } + + g_ItemSchema = VDF.parse(result.textBody).items_game; + g_ItemSchemaVersion = schemaVersion; } - this.itemSchema = VDF.parse(result.textBody).items_game; + this.itemSchema = g_ItemSchema; + this.itemSchemaVersion = g_ItemSchemaVersion; + this.emit('itemSchemaLoaded'); } catch (err) { this.emit('debug', `Unable to download items_game.txt: ${err.message}`); this.emit('itemSchemaError', err); + } finally { + release(); } }; From 59a2a72405f31d21ad025dc1d1fa49fa9b0b8d7f Mon Sep 17 00:00:00 2001 From: Sadzurami Date: Wed, 23 Oct 2024 16:12:00 +0300 Subject: [PATCH 3/3] feat: update http client --- handlers.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/handlers.js b/handlers.js index a3dc462..3be3f23 100644 --- a/handlers.js +++ b/handlers.js @@ -1,4 +1,6 @@ const ByteBuffer = require('bytebuffer'); +const {Agent:HttpAgent} = require('http'); +const {Agent:HttpsAgent} = require('https'); const {HttpClient} = require('@doctormckay/stdlib/http'); const {Semaphore} = require('@doctormckay/stdlib/concurrency.js'); const SteamID = require('steamid'); @@ -8,6 +10,11 @@ const TeamFortress2 = require('./index.js'); const Language = require('./language.js'); const Schema = require('./protobufs/generated/_load.js'); +const httpClient = new HttpClient({ + httpAgent: new HttpAgent({ keepAlive: true, timeout: 10000 }), + httpsAgent: new HttpsAgent({ keepAlive: true, timeout: 10000 }) +}); + const handlers = TeamFortress2.prototype._handlers; // ClientWelcome, ServerWelcome, ClientGoodbye, and ServerGoodbye @@ -62,9 +69,7 @@ handlers[Language.UpdateItemSchema] = async function(body) { this.emit('itemSchema', schemaVersion, schemaUrl); if (schemaVersion !== g_ItemSchemaVersion) { - let client = new HttpClient(); - - let result = await client.request({ + let result = await httpClient.request({ method: 'get', url: schemaUrl });