From b7956dea30886637756f79d56693709b18344ba3 Mon Sep 17 00:00:00 2001 From: Mathias Buus Date: Sun, 29 Dec 2024 13:45:27 +0100 Subject: [PATCH 1/2] use allocation free approach --- lib/codegen.js | 28 +++++++++++++++++++--------- package.json | 6 +++--- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/codegen.js b/lib/codegen.js index 02999de..d8bb0dd 100644 --- a/lib/codegen.js +++ b/lib/codegen.js @@ -6,7 +6,9 @@ module.exports = function generateCode (hyperdispatch) { str += '/* eslint-disable camelcase */\n' str += '\n' str += 'const { c, b4a, assert } = require(\'hyperdispatch/runtime\')\n' - str += 'const { version, resolveStruct } = require(\'./messages.js\')\n' + str += 'const { version, getEncoding, setVersion } = require(\'./messages.js\')\n' + str += '\n' + str += 'const defaultVersion = version\n' str += '\n' str += 'class Router {\n' @@ -45,10 +47,12 @@ module.exports = function generateCode (hyperdispatch) { str += ' const state = { buffer: encoded, start: 0, end: encoded.byteLength }\n' str += ' const id = c.uint.decode(state)\n' str += '\n' + str += ' setVersion(defaultVersion)\n' + str += '\n' str += ' switch (id) {\n' for (const handler of hyperdispatch.handlers) { str += ` case ${handler.id}:\n` - str += ` return this._handler${handler.id}(resolveStruct(${s(handler.requestType)}).decode(state), context)\n` + str += ` return this._handler${handler.id}(getEncoding(${s(handler.requestType)}).decode(state), context)\n` } str += ' default:\n' str += ' throw new Error(\'Handler not found for ID:\' + id)\n' @@ -58,10 +62,11 @@ module.exports = function generateCode (hyperdispatch) { str += '\n' - str += 'function dispatch (name, message, opts) {\n' - str += ' const state = c.state()\n' + str += 'function dispatch (name, message, { version = defaultVersion } = {}) {\n' + str += ' const state = { buffer: null, start: 0, end: 0 }\n' str += '\n' str += ' const o = getEncoderAndId(name)\n' + str += ' setVersion(version)\n' str += '\n' str += ' c.uint.preencode(state, o.id)\n' str += ' o.enc.preencode(state, message)\n' @@ -74,14 +79,19 @@ module.exports = function generateCode (hyperdispatch) { str += '}\n' str += '\n' - str += 'function getEncoderAndId (name, opts) {\n' + for (const handler of hyperdispatch.handlers) { + str += 'const dispatch' + handler.id + ' = {\n' + str += ` id: ${handler.id},\n` + str += ` enc: getEncoding(${s(handler.requestType)})\n` + str += '}\n' + str += '\n' + } + + str += 'function getEncoderAndId (name) {\n' str += ' switch (name) {\n' for (const handler of hyperdispatch.handlers) { str += ` case ${s(handler.name)}:\n` - str += ' return {\n' - str += ` id: ${handler.id},\n` - str += ` enc: resolveStruct(${s(handler.requestType)}, opts && opts.version)\n` - str += ' }\n' + str += ` return dispatch${handler.id}\n` } str += ' default:\n' str += ' throw new Error(\'Handler not found for name: \' + name)\n' diff --git a/package.json b/package.json index 83403aa..1e61fa3 100644 --- a/package.json +++ b/package.json @@ -27,10 +27,10 @@ "test-tmp": "^1.3.0" }, "dependencies": { - "b4a": "^1.6.6", - "compact-encoding": "^2.15.0", + "b4a": "^1.6.7", + "compact-encoding": "^2.16.0", "generate-string": "^1.0.1", - "hyperschema": "^1.0.0", + "hyperschema": "^1.3.2", "nanoassert": "^2.0.0" } } From dc2d9722f820246ec7efa78d9ac3cb1dad072cb2 Mon Sep 17 00:00:00 2001 From: Mathias Buus Date: Sun, 29 Dec 2024 13:49:22 +0100 Subject: [PATCH 2/2] no need for string lookup on recv --- lib/codegen.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/codegen.js b/lib/codegen.js index d8bb0dd..9bc7cff 100644 --- a/lib/codegen.js +++ b/lib/codegen.js @@ -52,7 +52,7 @@ module.exports = function generateCode (hyperdispatch) { str += ' switch (id) {\n' for (const handler of hyperdispatch.handlers) { str += ` case ${handler.id}:\n` - str += ` return this._handler${handler.id}(getEncoding(${s(handler.requestType)}).decode(state), context)\n` + str += ` return this._handler${handler.id}(route${handler.id}.enc.decode(state), context)\n` } str += ' default:\n' str += ' throw new Error(\'Handler not found for ID:\' + id)\n' @@ -80,7 +80,7 @@ module.exports = function generateCode (hyperdispatch) { str += '\n' for (const handler of hyperdispatch.handlers) { - str += 'const dispatch' + handler.id + ' = {\n' + str += 'const route' + handler.id + ' = {\n' str += ` id: ${handler.id},\n` str += ` enc: getEncoding(${s(handler.requestType)})\n` str += '}\n' @@ -91,7 +91,7 @@ module.exports = function generateCode (hyperdispatch) { str += ' switch (name) {\n' for (const handler of hyperdispatch.handlers) { str += ` case ${s(handler.name)}:\n` - str += ` return dispatch${handler.id}\n` + str += ` return route${handler.id}\n` } str += ' default:\n' str += ' throw new Error(\'Handler not found for name: \' + name)\n'