mq (@techteamer/mq)
A standalone, MIT-licensed RabbitMQ wrapper library for Node.js, published to npm as @techteamer/mq. It is NOT a FaceKom service in itself — it is a reusable messaging client/server toolkit authored by TechTeamer and consumed by FaceKom/vuer backend services to talk to RabbitMQ. The repo builds a dual CommonJS + ESM npm package from TypeScript source; there is no long-running process, no HTTP server, no Dockerfile here.
Role in FaceKom
This is an upstream dependency, published openly on npm (
publishConfig.access: public,package.json:69-71) and GitHub (TechTeamer/mq). FaceKom backends import it to get RPC / Pub-Sub / Gathering / work-queue patterns over AMQP. The only direct FaceKom coupling visible in-tree is the test config, which points TLS certs at avuer_dockerpath (see vuer_docker and Configuration below). “vuer” is FaceKom’s product codename.
1. Purpose & role
package.json:1-7— name@techteamer/mq, version 7.2.0, description “A RabbitMQ wrapper for node”,main: dist/cjs/index.js,module: dist/mjs/index.js, dualexportsmap forimport/require.README.md:1-34— title “TechTeamer MQ”, install viayarn add @techteamer/mq, build viayarn run build, tests require renaming a sample test config. npm / Travis / Coveralls badges.index.js:1-32— the package entry: imports 13 classes from./src/*.jsand re-exports them:QueueClient, QueueConfig, QueueConnection, ConnectionPool, QueueMessage, QueueServer, QueueManager, RPCClient, RPCError, RPCServer, Publisher, Subscriber, GatheringClient, GatheringServer. (Note:src/QueueResponse.tsis the 15th.tsfile insrc/but is not re-exported here.)
It implements four messaging patterns on top of amqplib:
| Pattern | Client class | Server class | AMQP mechanism |
|---|---|---|---|
| RPC (request/response) | RPCClient | RPCServer | sendToQueue + per-call reply queue, correlationId matching (RPCClient.ts:128-159, RPCServer.ts:193-254) |
| Pub/Sub (fan-out broadcast) | Publisher | Subscriber | fanout exchange, exclusive auto-delete queue per subscriber (Publisher.ts:54-58, Subscriber.ts:86-102) |
| Work queue (point-to-point, durable) | QueueClient | QueueServer | named durable queue, prefetch, retry counter (QueueClient.ts:32-36, QueueServer.ts:36-50) |
| Gathering (scatter→gather from N servers) | GatheringClient | GatheringServer | fanout exchange + status queue, counts responses vs serverCount (GatheringClient.ts:120-174, GatheringServer.ts:122-201) |
2. Tech stack & runtime
- Language: TypeScript (15
.tsfiles insrc/), compiled withtsc.index.jsis plain ESM JS. - Runtime: Node.js.
package.json:23-25engines:"node": "^22.13.0 || >=24"."type": "module"(package.json:33). - Package manager: Yarn (classic;
yarn.lockpresent, 270 KB; README and CI useyarn). Resolutions block atpackage.json:72-77. - Runtime dependency (only one):
amqplib ^0.10.9(package.json:34-37). Also a stray runtime dep@typescript-eslint/parseris listed underdependencies(package.json:35) — unusual; everything else is dev. - Peer dependency:
protobufjs ^7.2.3(package.json:66-68) — optional, only relevant if a caller passes a non-JSONContentSchema/MessageModel. - Build tooling:
typescript ^5.4.5, dual-targettsc. Test runner: vitest^4.1.4(package.json:64); coverage viac8 ^9.1.0. Lint:eslint ^9.19.0flat config. Release:semantic-release ^24(package.json:61).
Vitest, not Jest — despite the name
The repo depends on and configures Jest ESLint plugins (
eslint-plugin-jest,eslint-plugin-jest-formatting) andeslint.config.mjswiresjestglobals, but the actual test runner is vitest (package.jsonscriptstest: vitest run; everytest/*.test.tsimports{ describe, it, assert, beforeAll, afterAll } from 'vitest', e.g.test/RPC.test.ts:2). The Jest references are legacy lint config. The CI workflow even uploads coverage to atest/coverage/jest/lcov.infopath (.github/workflows/pull-request.yaml:135), but the test script writes lcov to./test/coverage/(package.json:31) — these paths are inconsistent.
3. Build & run
This is a library, not an app — “run” means build the npm artifact and run tests against a live RabbitMQ. There is no bin/, no CLI entrypoint, no Dockerfile, no start command in this repo.
package.json “scripts” (verbatim, every entry)
| Script | Command (verbatim) | What it does |
|---|---|---|
build | rm -fr dist/* && tsc -p tsconfig.json && tsc -p tsconfig-cjs.json && ./fixup.sh | Cleans dist/, compiles ESM build (→ dist/mjs) and CJS build (→ dist/cjs), then runs fixup.sh. |
lint | eslint . --max-warnings 0 --ignore-pattern "test/*" && echo 'npm run eslint --max-warnings 0' | Lints everything except test/* with zero-warning tolerance, then echoes a (cosmetic) confirmation line. |
lint:fix | eslint . --fix && eslint --max-warnings 0 . | Auto-fixes, then re-lints with zero-warning tolerance (lint must be clean after fix). |
test | vitest run | Runs the vitest suite once (non-watch). Requires a reachable RabbitMQ + a test/config/TestConfig.ts. |
test:ci | c8 --temp-directory=./test/coverage/tmp vitest run && c8 report --reporter=text-lcov --report-dir=./test/coverage/ --reporter=lcovonly | Runs vitest under c8 coverage, then emits an lcov-only report into test/coverage/. Used by CI. |
Publish requires a fresh build
README.md:31-34: “Before publish always run the build process!” — the published package needsdist/, which is.gitignored (/.gitignore:4). Actual publishing is automated bysemantic-release(release.config.mjs), not a manualnpm publish.
Build helper scripts (top-level .sh)
fixup.sh(fixup.sh:1-11) — aftertscproduces both builds, writesdist/cjs/package.jsoncontaining{"type":"commonjs"}anddist/mjs/package.jsoncontaining{"type":"module"}. This is the standard dual-package trick so Node resolves each subtree with the correct module system.jstsconvert.sh(jstsconvert.sh:1-36) — a one-off migration helper (NOT used by build/CI). Takes a folder path argument and renames every*.jsin that folder to*.ts(mv). Leftover from the JS→TS migration; safe to ignore for normal dev.
Entrypoints
- Package consumers:
dist/cjs/index.js(require) /dist/mjs/index.js(import), declared inexports(package.json:7-12). - Source entry:
index.js(re-export barrel) +src/*.ts.
4. Top-level structure
Verified by find (excluding .git, node_modules). No vendored dirs are tracked (node_modules/ and dist/ are git-ignored).
| Path | What it is |
|---|---|
index.js | ESM barrel re-exporting all 13 public classes (index.js:17-32). |
src/ | All TypeScript source — 15 .ts files, the entire library (see §6). |
test/ | Vitest suites (14 *.test.ts) + test/config/ + consoleInspector.ts test helper. |
test/config/ | LoadConfig.ts, TestConfig.ts (TLS local), TestConfig-ci.ts (plain guest) — see §7. |
.github/workflows/ | pull-request.yaml — the only CI workflow (lint/audit/test/sonar/build). |
maintenance/ | Dependency-update audit notes (2026-04-07.md, 2026-05-04.md) listing deferred dep upgrades + yarn audit/yarn outdated logs. Documentation only. |
security/ | Security audit notes (2026-04-07.md 685 KB, 2026-05-04.md) — yarn audit “before/after” logs for vulnerable transitive deps (e.g. request, uuid, postcss). Documentation only. |
package.json | Manifest (deps, scripts, engines, exports). |
tsconfig*.json | TS compiler configs (base + esm + cjs). |
eslint.config.mjs | Flat ESLint config (shared across TechTeamer repos — see gotcha). |
release.config.mjs | semantic-release config. |
sonar-project.properties | SonarCloud project config. |
fixup.sh, jstsconvert.sh | Build helper + migration helper (§3). |
CHANGELOG.md | Auto-generated by semantic-release (angular preset). |
.editorconfig, .gitignore, .npmignore | Editor/VCS/publish ignore rules. |
maintenance/andsecurity/are bookkeeping, not codeBoth folders hold dated Markdown reports of pending dependency upgrades and
yarn auditoutput (maintenance/2026-05-04.md:1-25,security/2026-05-04.md:1-25). Thesecurity/2026-04-07.mdfile is ~685 KB of captured audit logs. They have no effect on the build.
5. First-party bin/ helper scripts
There is no first-party
bin/directory in this repoConfirmed by full
findof the tree.eslint.config.mjs:111-121defines lint overrides forbin/*/bin/**/*, but those globs match nothing here — that config is a shared template copied across TechTeamer/FaceKom repos and references many directories that do not exist inmq(server/,engines/,client/,customization/ui/,db/,bin/;eslint.config.mjs:72-139). The only executable scripts are the two top-level build helpers documented in §3:fixup.shandjstsconvert.sh.
6. Key modules (src/)
Read in full. Listed roughly foundational → high-level.
Connection & config layer
QueueConfig.ts(173 lines) — config value object. Defaults:url: 'amqps://localhost:5672',rpcTimeoutMs: 10000,rpcQueueMaxSize: 100,logger: console,shuffleUrls: false(QueueConfig.ts:77-108). Holds per-component assert-queue/assert-exchange option bags (e.g.rpcServerAssertQueueOptions,subscriberAssertExchangeOptions, …). NestedRabbitMqOptionsclass for TLS (rejectUnauthorized,cert,key,ca[], optionaltimeout) (QueueConfig.ts:11-33). Statics:isValidConfig(checksurlown-prop),urlStringToObject(parses an amqp URL into{protocol,hostname,port,username,password,vhost}vianode:url),urlObjectToLogString(QueueConfig.ts:142-170).QueueConnection.ts(222 lines) —extends EventEmitter. Wraps a single amqplib connection + one sharedConfirmChannel. Uses the promise channel APIconnectfromamqplib/channel_api(QueueConnection.ts:3).connect()memoizes via_connectionPromise; readscert/key/cafiles from disk withreadFileSync(QueueConnection.ts:56-65). Supports multiple hosts / URL arrays with optionalshuffleUrlsrandom ordering and sequential failover (_connectWithMultipleUrls,QueueConnection.ts:108-155). Re-emitserror/close/blocked/unblockedconnection events anderror/close/return/drainchannel events; guardserroremit onlistenerCount('error') > 0to avoid uncaught exceptions (QueueConnection.ts:81-106,198-219).getChannel()lazily creates acreateConfirmChannel(QueueConnection.ts:176-196).ConnectionPool.ts(107 lines) — manages multiple namedQueueManagerconnections.setupQueueManagers()accepts either a single config (backwards-compatible) or aRecord<name, config>map with a designated default (defaultConnectionName, default'default') (ConnectionPool.ts:22-58).connect()connects all in parallel;reconnect()sequentially (ConnectionPool.ts:94-104). ImportsConsoleInspectorfrom../test/...for its logger type (ConnectionPool.ts:3) — a test-dir import leaking into src.
Message model
QueueMessage.ts(96 lines) — the wire format. Fieldsstatus,data,timeOut,attachments: Map<string,Buffer>,ContentSchema(defaultJSON). Custom binary framing inserialize(): a 1-byte'+'marker + 4-byte big-endian JSON length + JSON body + concatenated attachment buffers (QueueMessage.ts:28-50).unserialize()understands both the'+'framed format (with attachments) and a bare'{'legacy JSON message; throws on unknown format (QueueMessage.ts:52-73).fromJSONtolerant parse returns anerror-status message on failure.QueueResponse.ts(96 lines) — server-side response builder with status constantsOK/NOT_FOUND/ERRORand helpersok()/notFound()/error(), plus an attachments map. Used byRPCServerandGatheringServerhandlers.RPCError.ts(5 lines) — emptyclass RPCError extends Error {}. Exported but not thrown internally (consumer-facing marker type).
Messaging primitives
Publisher.ts(116 lines) — base publisher.assertExchangedefaults true → asserts afanoutexchange (Publisher.ts:54-58).send()builds aMessageModel(defaultQueueMessage), serializes,channel.publish(...)with confirm callback anddrainback-pressure handling (Publisher.ts:69-112).sendAction(action, data, …)wraps{action, data}. PluggableMessageModel/ContentSchema.Subscriber.ts(232 lines) — base consumer for fan-out. Assertsfanoutexchange, an exclusive auto-delete anonymous queue, binds it, consumes (Subscriber.ts:86-102). Action registry viaregisterAction(action, handler)(Subscriber.ts:73-81)._processMessageenforces a per-message timeout (request.timeOut ?? _timeoutMs), ack/nack with double-ack guards, and a redelivery retry counter keyed byconsumerTagcapped atmaxRetry(Subscriber.ts:154-221).RPCClient.ts(235 lines) — request side. Lazily asserts an exclusive auto-delete reply queue (or named, optionally bound to adirectexchange viabindDirectExchangeName) and consumes itnoAck(RPCClient.ts:171-198).call()enforcesrpcQueueMaxSize, registers acrypto.randomUUID()correlationId with a per-call timeout,sendToQueue(name, …, {correlationId, replyTo})(RPCClient.ts:128-159)._onReplymatches by correlationId, resolvesdata(or full message ifresolveWithFullResponse), rejects on non-okstatus (RPCClient.ts:205-232).callAction(action, data, …)convenience.RPCServer.ts(265 lines) — response side. Asserts a durable named queue, optionaldirectexchange,prefetch, consumes (RPCServer.ts:94-113)._processMessageruns the registered action handler under a response timeout, builds a reply viaQueueResponse, replies tomsg.properties.replyTo(viasendToQueueorpublishto the bound direct exchange), and acks (RPCServer.ts:193-254). Distinct error paths: request-decode error, response timeout, response error — each sends a typederrorreply (RPCServer.ts:129-181).QueueClient.ts(39 lines) —extends Publisher. A point-to-point durable work-queue producer: asserts a named durable queue (instead of an exchange) and publishes with the queue name as routing key (QueueClient.ts:11-37).QueueServer.ts(53 lines) —extends Subscriber. Consumes the named durable queue directly (asserts durable queue,prefetch,consume) rather than binding to a fan-out exchange (QueueServer.ts:36-50). Inherits Subscriber’s retry/timeout/ack machinery.GatheringClient.ts(283 lines) — scatter side. Publishes to afanoutexchange, then collects replies on a reply queue, distinguishingtype:'status'vstype:'reply'messages and counting responses against the liveconsumerCountof a shared status queue (GatheringClient.ts:120-174,225-280). SupportsacceptNotFound,resolveWithFullResponse,serverCount, and per-request timeout withresponseCount/serverCountreporting.GatheringServer.ts(298 lines) — gather side. Binds an exclusive queue to the fan-out exchange, also owns a non-exclusive shared status queue (GatheringServer.ts:49-78). For each announcement: runs the action handler under a timeout, then replies (type:'reply') onOK, or sends astatusmessage +nack(requeue=false)onNOT_FOUND/timeout/error (GatheringServer.ts:122-201). Implicit status:undefinedanswer →NOT_FOUND, elseOK(GatheringServer.ts:160-167).
Orchestrator
QueueManager.ts(341 lines) — the main façade. Owns oneQueueConnection+ aQueueConfig, and eightMaps of named entities (rpcClients, rpcServers, publishers, subscribers, queueClients, queueServers, gatheringClients, gatheringServers) (QueueManager.ts:39-53).connect()opens the connection theninitialize()s every registered entity in order (QueueManager.ts:55-95);reconnect()closes + reconnects. Factory gettersgetRPCClient/getRPCServer/getPublisher/getSubscriber/getGatheringClient/getGatheringServer/getQueueClient/getQueueServereach: return the cached instance if present, accept an optionalOverrideClasssubclass (validated via_isSubClass, else throw) plus an options bag, and merge per-type defaults from config (e.g. RPC serverprefetchCount:1, subscribermaxRetry:5) (QueueManager.ts:112-338). This is the class FaceKom consumers instantiate.
7. Configuration
Library config — QueueConfig (consumer-supplied)
Callers pass an IQueueConfig object (interface at QueueConfig.ts:35-55). There is no getconfig / AJV / dotenv in this repo — config is plain constructor objects, validated only by QueueConfig.isValidConfig (presence of url). Notable knobs (defaults in QueueConfig.ts:78-108):
url— amqp(s) URL or an array of URLs or an object with ahostnamearray (multi-host failover,QueueConnection.ts:108-150). Defaultamqps://localhost:5672.options— TLS:rejectUnauthorized(default false),cert,key,ca[](file paths, read at connect time), optionaltimeout.rpcTimeoutMs(10000),rpcQueueMaxSize(100),logger(defaultconsole),shuffleUrls(false).- Per-component option bags:
rpcClientExchangeOptions,rpcServerAssertQueueOptions,publisherAssertExchangeOptions,subscriberAssertQueueOptions,gatheringServerAssertExchangeOptions,queueClientAssertQueueOptions, etc.
Test config (the only env-driven config)
test/config/LoadConfig.ts(:1-13) — selects config by env: ifprocess.env.NODE_ENV === 'ci'→TestConfig-ci, else dynamic-importsTestConfig(and logs an error if that file is missing).test/config/TestConfig.ts(:1-17) — local TLS config:url: 'amqps://localhost:5671', with cert/key/ca read from/workspace/vuer_docker/workspace/cert/vuer_mq_cert/...(TestConfig.ts:4). This is the one direct FaceKom/vuer coupling in the codebase — it expects the vuer_docker dev environment’s generated MQ certificates..gitignore:3ignorestest/config/TestConfig.js(the legacy JS form).test/config/TestConfig-ci.ts(:1-12) — plain config for CI:url: 'amqp://guest:guest@localhost:5672',rejectUnauthorized: false. Matches the RabbitMQ service container in CI.- Both wrap a
ConsoleInspector(test logger,test/consoleInspector.ts) cast asConsole.
Tests need a real RabbitMQ + a hand-created config
README.md:22-29: to run tests you must rename a sample config toTestConfig.jsand provide valid values. In this clone the config files are already.tsand present, butTestConfig.tshard-codes an absolute/workspace/vuer_docker/...cert path that only exists inside the FaceKom docker dev env. For a generic local run, useNODE_ENV=ciagainst a guest RabbitMQ onlocalhost:5672, or editTestConfig.ts.
Build config
tsconfig-base.json(:1-25) — shared:baseUrl: src,rootDir: .,declaration: true,lib: [esnext],types: [node],moduleResolution: node,strict: false,allowJs: true,noFallthroughCasesInSwitch: true; includessrc+index.js, excludesnode_modules/dist.tsconfig.json(:1-8) — ESM build:module: esnext,target: esnext,outDir: dist/mjs.tsconfig-cjs.json(:1-8) — CJS build:module: commonjs,target: es2022,outDir: dist/cjs.
Other tool configs
release.config.mjs(:1-22) — semantic-release: branchesmaster+beta(prerelease);tagFormat: '${version}'; plugins commit-analyzer, release-notes-generator, changelog, npm, github, git; angular preset. → drives versioning + npm/GitHub publish.sonar-project.properties(:1-9) — SonarCloudTechTeamer_mq/ orgtechteamer; sources., coverage excludestest/**+index.js; lcov pathtest/coverage/lcov.info.eslint.config.mjs— flat config extendingstandard,plugin:n/recommended,plugin:jest-formatting/strict;no-console: errorglobally (relaxed for the non-existentengines/,db/,bin/,client/dirs). Ignoresdist/.
8. Tests
- Framework: vitest (
package.json:30-31, alltest/*.test.tsimport from'vitest'). Coverage viac8. - Location:
test/— 14 spec files:RPC.test.ts,RPCAction.test.ts,Pubsub.test.ts,PubSubAction.test.ts,Queue.test.ts,QuorumQueues.test.ts,Gathering.test.ts,Gathering-multi-server.test.ts,GatheringAction.test.ts,ConnectionPool.test.ts,QueueConnection.test.ts,QueueManager.test.ts,QueueConfig.test.ts,QueueMessage.test.ts. Helper:test/consoleInspector.ts(records logger calls instead of printing;test/consoleInspector.ts:1-37). - Nature: Integration tests against a live broker — they
new QueueManager(config)andconnect()to RabbitMQ (e.g.test/RPC.test.ts:1-20,test/QuorumQueues.test.ts:10-29). Queue/exchange names are namespacedtechteamer-mq-js-test-*.QuorumQueues.test.tsexercisesx-queue-type: quorumvia the manager’s assert-option overrides. - How to run locally:
yarn test(needstest/config/TestConfig.ts+ a reachable broker, default TLSamqps://localhost:5671). Easiest path:NODE_ENV=ci yarn testagainst a plain RabbitMQ onlocalhost:5672(amqp://guest:guest@localhost:5672). - CI:
.github/workflows/pull-request.yamlruns on every PR — jobs lint, audit (yarn audit+improved-yarn-audit --min-severity critical), test (yarn test:ciwith arabbitmq:4.1.4service container on ports 5672/5671,NODE_ENV: ci), sonar (SonarCloud scan, needstest), build (yarn build, needs lint+audit+test+sonar). Node version pinned to 24 (pull-request.yaml:11).
9. Dependencies on other FaceKom services
No runtime coupling to FaceKom services
As a generic library,
mqdoes not itself call any FaceKom HTTP endpoint, DB, Redis, or named RabbitMQ queue. Its only external runtime is RabbitMQ (AMQP 0.9.1 viaamqplib) — the broker URL is entirely supplied by the consumer.
Evidenced FaceKom touch-points (all build/test-time, not runtime):
test/config/TestConfig.ts:4references/workspace/vuer_docker/workspace/cert/vuer_mq_cert— the MQ TLS certs generated by the FaceKom/vuer docker dev environment (vuer_docker). This is how FaceKom services (e.g. vuer_cv and other vuer backends) and this library’s tests are expected to authenticate to the shared broker overamqps://...:5671.CHANGELOG.mdlines reference internal Jira ticketsFKITDEV-3756,FKITDEV-6045— confirming this repo is maintained inside the FaceKom (FKITDEV) program even though published publicly.
For how a FaceKom backend uses this library, instantiate QueueManager with the broker config, register RPC/queue/subscriber/gathering actions, and connect() — see §6 QueueManager.
10. Verified gotchas
rejectUnauthorizeddefaults to falseBoth
QueueConfig’sRabbitMqOptionsdefault (QueueConfig.ts:21) and both test configs disable TLS cert verification. Production callers usingamqps://should overrideoptions.rejectUnauthorized: trueand supply a properca, or they get unverified TLS.
One shared confirm channel per connection
QueueConnection.getChannel()memoizes a singleConfirmChanneland hands it to every entity (QueueConnection.ts:176-196). All publishers/consumers on oneQueueManagershare that channel; a channel-level error closes it for everyone. Use multiple connections viaConnectionPoolto isolate.
Custom wire format — not interoperable with plain JSON producers unless framed
QueueMessage.serialize()emits a proprietary'+'-prefixed length-framed binary envelope (QueueMessage.ts:28-50).unserializecan still read a bare'{...}'JSON body, but anything else throws “unrecognized format”. Non-mqproducers/consumers must match this framing (or send bare JSON with a top-levelstatus).
Subscriber/Queue retry is keyed by
consumerTag, capped atmaxRetryOn redelivery,
Subscriberincrements a per-consumerTagcounter and, once it exceedsmaxRetry(default 5 fromQueueManager), acks and drops the message (Subscriber.ts:154-175). Failures are not dead-lettered by the library.
eslint.config.mjsis a shared multi-repo templateIt configures globals/rules for
server/,engines/,client/,customization/ui/,db/,bin/— none of which exist inmq(eslint.config.mjs:72-139). Do not infer repo structure from it. The real source lives only insrc/andtest/.
ConnectionPoolimports from the test directory
src/ConnectionPool.ts:3importsConsoleInspectorfrom../test/consoleInspectorpurely for a logger type annotation. This couples asrc/file totest/; it compiles becausetsconfigincludesindex.js+srcbutskipLibCheck/loose settings tolerate it. Worth noting if the test dir is ever stripped from a build context.
Shallow clone — limited git history
This source-only clone shows a single reachable commit on
master(4926e0a ci [fkitdev-8416] improve github actions (#88), 2026-05-19). UseCHANGELOG.mdfor release history rather thangit log.
Unverified / gaps
maintenance/2026-04-07.md,security/2026-04-07.md— read only the headers/structure of the dated audit notes (thesecurity/2026-04-07.mdfile is ~685 KB of capturedyarn auditlogs). Their contents are dependency-vulnerability dumps with no bearing on architecture; not read line-by-line.- Test specs — confirmed the framework (vitest), import patterns, and broker-integration nature by reading
RPC.test.ts(head),QuorumQueues.test.ts(full), andconsoleInspector.ts(full); the remaining ~11*.test.tsfiles were surveyed structurally (names + grep for sharedtechteamer-mq-js-test-*naming), not read in full. CHANGELOG.md— read the top ~30 lines + ticket refs; full release history not transcribed.- No Git-LFS pointer files were found in this repo (no model weights/binaries) — this is a pure-source library; nothing was withheld for being a binary blob.
- Downstream consumers — that FaceKom backends import
@techteamer/mqis inferred from thevuer_dockercert path and FKITDEV changelog tickets; the actualimportsites live in other repos (e.g. vuer_cv) and were not inspected here.
Sources
Files read in full unless noted:
package.json,README.md,index.jstsconfig-base.json,tsconfig.json,tsconfig-cjs.jsonfixup.sh,jstsconvert.sheslint.config.mjs,release.config.mjs,sonar-project.properties,.npmignore,.gitignoresrc/QueueConfig.ts,src/QueueConnection.ts,src/ConnectionPool.ts,src/QueueMessage.ts,src/QueueResponse.ts,src/RPCError.ts,src/Publisher.ts,src/Subscriber.ts,src/RPCClient.ts,src/RPCServer.ts,src/QueueClient.ts,src/QueueServer.ts,src/GatheringClient.ts,src/GatheringServer.ts,src/QueueManager.ts.github/workflows/pull-request.yamltest/config/LoadConfig.ts,test/config/TestConfig.ts,test/config/TestConfig-ci.ts,test/consoleInspector.ts,test/QuorumQueues.test.ts(full),test/RPC.test.ts(head)CHANGELOG.md(head + grep),maintenance/2026-05-04.md(head),security/2026-05-04.md(head)- Directory listing via
find(whole tree);git -C log/branchfor HEAD + branches