resource-manager

Orientation scope

Source-only clone at /Users/levander/coding/facekom-v2-clones/resource-manager, single commit 36a1cb2 on branch master. ~50 first-party files; small enough that nearly every source file was read line-by-line. See architecture-overview and sibling repos under repos/.

1. Purpose & role in FaceKom

The Resource Manager is a capacity-protection / admission-control service: it places incoming jobs into a FIFO queue and only “activates” them (assigns a processing slot) when capacity is available, protecting downstream FaceKom services from overload (README.md:1-3: “a service designed to protect the system’s capacity by placing incoming jobs into a queue”).

It exposes no HTTP API. Its entire public surface is a set of RabbitMQ RPC endpoints, one set per configured resource (e.g. identification). Clients ask “do you have capacity?”, “enqueue this job”, “what’s my status?”, “free my slot”, etc. (README.md:96-327, server.js:99-109).

  • package.json:2-6 — name resource_manager, "description": "Resource Manager", "author": "FaceKom", "main": "server.js".
  • The default configured resource is identification (config/dev.json:20-35), strongly implying this guards the identification flow’s concurrency in FaceKom.

"Resource" terminology

A resource = a named capacity pool (queue + slot set). Each resource has its own RabbitMQ queues, its own in-memory FIFO + slot handler, and its own DB rows. Resources are declared in config under resourceList (config/dev.json:20-35, server/service/ResourceService.js:10-13).

2. Tech stack & runtime

AspectValueSource
LanguageJavaScript (CommonJS, require)all server/**/*.js; eslint.config.mjs:18 sets sourceType: 'script'
RuntimeNode.js >=20.18.0 (engines)package.json:16-18
CI NodeNode 22, Ubuntu jammy.travis.yml:5-7
Package managerYarn 1.22.22 (classic; yarn.lock 202 KB present).travis.yml:25, test/scripts/travis.sh:6
Messaging lib@techteamer/mq ^7.2.0 (RabbitMQ RPC + ConnectionPool)package.json:39
ORM / DBSequelize ^6.37.5 + pg ^8.7.3PostgreSQLpackage.json:47-49; config/dev.json:4 postgres://...
CLI libscommander ^13.1.0, @inquirer/prompts ^7.2.0package.json:38,40
Configgetconfig ^4.5.0, dotenv, dot-object, mspackage.json:41-46
JWTjsonwebtoken ^9.0.2 (queue tickets)package.json:44
Logginglog4js ^6.6.0package.json:45
LintESLint 9 flat config, eslint-config-standard baseeslint.config.mjs, package.json:24
TestJest ^29.7.0, jest-environment-nodepackage.json:33-34

No TypeScript despite the dependency

typescript and @typescript-eslint/parser are devDependencies and the ESLint flat config uses tsParser (eslint.config.mjs:2,15), but all runtime code is plain CommonJS .js. There is no tsconfig.json and no compile step. The TS parser is purely for linting.

3. Build & run

Entrypoints

  • main / service: server.js (package.json:6). Bootstraps process settings + listeners, DB connection, RabbitMQ, services, queues, slot handlers, then emits system.start (server.js:134-148).
  • bin/ helper scripts — see §5.
  • There is no build step and no start script in package.json. The service is started directly with node server.js (see Supervisor confs below).

package.json “scripts” (verbatim — package.json:7-11)

ScriptCommandWhat it does
testjest --config ./test/jest.config.js --runInBandRuns the Jest unit suite serially (--runInBand). Config at test/jest.config.js.
linteslint . && echo 'npm run lint: OK'Lints the whole repo; prints OK on success.
lint:fixeslint . --fixLints and auto-fixes.

No start script

Do not expect npm start / yarn start. Start the service with node server.js. Supervisor is the production process manager.

Start command(s) (Supervisor)

Two near-identical supervisor configs run command=node server.js under %(ENV_DOCKER_USER)s, with exitcodes=0,2 and autorestart=true:

  • supervisor_resource_manager_dev.confenvironment=RUNTIME_ENV=dev
  • supervisor_resource_manager_docker.confenvironment=RUNTIME_ENV=docker

Both log to /var/log/resource_manager.log, stopsignal=TERM, stopwaitsecs=5 (supervisor_resource_manager_dev.conf:1-23, supervisor_resource_manager_docker.conf:1-23).

No Dockerfile in this repo

Verified by full file listing: there is no Dockerfile and no docker-compose.yml present. There is a config/docker.json and a supervisor_resource_manager_docker.conf, so containerization is expected to be provided externally (a parent/build repo), with this service slotted in. (/Users/levander/coding/facekom-v2-clones/resource-manager dir listing.)

Config selection (getconfig)

getconfig chooses config/<NODE_ENV>.json (or RUNTIME_ENV). Present env files: config/dev.json, config/docker.json. CI copies config/dev.jsonconfig/travisci.json (.travis.yml:24). config.js:56-59 special-cases NODE_ENV === 'travisci' to force amqp://localhost:5672.

4. Top-level structure

PathRoleVerified
server.jsService entrypoint / bootstrap orchestrationread server.js
config.jsgetconfig loader + helpers (get/has/getSecureConfig/TTL→ms)read config.js
config/Env JSON configs: dev.json, docker.jsonread both
bin/db/, bin/queue/First-party CLI helper scripts (see §5)read all 4
server/bootstrap/Process settings, signal listeners, DB + RabbitMQ connection setupread all 4
server/classes/Core data structures: Queue.js (FIFO), ResourceHandler.js (slots)read both
server/service/ResourceService, SyncService, TokenServiceread all 3
server/queue/rpc_server/8 RPC server handlers (the public API)read all 8
server/queue/rpc_client/QueueHandlerRpcClient (used by the CLI)read
server/constants/jobStatus.js (STATUS enum)read
server/db/Sequelize instance, models, queue model, migrationHelpers.jsread sequelize/models/model
server/service_container.jsGlobal singleton container + ServiceBus event emitterread
server/logger.jslog4js logger setupread
server/child_process_promise.jsPromisified exec/execFileread
db/migrate/, db/beforeMigrate/Sequelize migration dirs — empty (only .gitkeep)listed
test/Jest config, scripts, test/unit/** suiteread config + sampled
maintenance/, security/Dated dependency-update & yarn audit logsread 2026-05-04.md of each
.sequelizerc, .sequelizercBefore, .sequelize-config.jsSequelize CLI wiring (migrate vs beforeMigrate paths)read all 3
eslint.config.mjs, sonar-project.properties, .travis.yml, build.ignore, changelog.mdTooling/CI/build-exclusion/changelogread all

.gitignore vs build.ignore

.gitignore is 219 bytes / 21 lines and ignores .idea/*, .vscode/*, node_modules/*, /npm-debug.log*, /yarn-error.log, /logs/* (except .gitkeep), config/local.json, yarn-offline-cache, archive artifacts (*.tar, *.gz, *.7z, *.rar, *.zip), and /test/coverage/* (except .gitkeep) (.gitignore:1-21). build.ignore (not .dockerignore) lists what to strip from production runtime: config/dev.json, test/, *travis*, *eslint*, *_dev.conf, .git/ (build.ignore:1-13).

5. First-party bin/ scripts (each read)

All paths under bin/ (NOT node_modules/**/bin). Each is #!/usr/bin/env node.

bin/db/sync (bin/db/sync:1-96)

Commander CLI to synchronize the DB schema via Sequelize. Options: -f/--force (drops/recreates — prompts confirmation unless --noninteractive), -m/--migrate (runs beforeMigratesequelize.syncmigrate), -u/--manualCredentials (prompts username/password → SEQUELIZEUSER/SEQUELIZEPASS). Without --migrate it only sequelize.sync(options). Exits 0 on success, 2 on error. This script is invoked by the boot sequence (server/bootstrap/connection/db.js:21).

bin/db/truncate (bin/db/truncate:1-94)

Commander CLI to truncate all tables (cascade: true) inside a transaction, after a confirmation prompt. Supports -u/--manualCredentials. excludedModels is empty (bin/db/truncate:19), so it truncates everything. Has a MySQL SET FOREIGN_KEY_CHECKS = 0 branch (dead for the Postgres deployment).

bin/db/lint.js (bin/db/lint.js:1-14)

Not a DB tool — a no-op stub that only console.logs an ESLint workaround note (“No files matching the pattern ./bin/db”). Exists so ESLint doesn’t choke on the bin/db directory pattern.

bin/queue/queue-query.js (bin/queue/queue-query.js:1-192)

Operator CLI (“A simple CLI to query Queue and Slot”) that connects to RabbitMQ and drives QueueHandlerRpcClient against the running service’s rm-queue-handler RPC. Subcommands:

  • config [-q <queueName>] — list active queues, or print one queue’s configuration via getQueueConfiguration (:31-62).
  • slot-list <queueName> [-c <count>] — list jobs currently occupying slots (oldest first) + slot/queue stats via getSlotJobList (:64-94).
  • slot-clear <queueName> [-c <count>] — release N (or all) slot jobs after confirmation, via clearSlot (:96-123).
  • job-delete <queueName> <jobId...> — delete one or more jobs from queue+slot via deleteJob (:125-145).

<queueName> choices are restricted to resourceService.getActiveResourceNameList() (:19,68,99,128).

CLI requires a running service

queue-query.js is an RPC client, not a direct DB/in-memory tool. It calls rm-queue-handler (:158), which only exists when server.js is running (server.js:89). It will hang/timeout if the service is down.

6. Key modules / services / entities

Boot sequence (server.js:134-148)

  1. process-settings (TZ=UTC, optional self-signed TLS) → process-listeners(true) (signal/exit handlers).
  2. bootstrap/connection/db('true') — authenticate Sequelize; if db.syncOnStart, run beforeMigrate → ./bin/db/sync → migrate (server/bootstrap/connection/db.js:15-31).
  3. bootstrap/connection/rabbitmq('default') — build @techteamer/mq ConnectionPool from config.queue.
  4. setupService() — instantiate ResourceService, SyncService, TokenService into serviceContainer.service.
  5. setupJobQueue() — one Queue (FIFO) per active resource (server.js:23-35).
  6. setupResourceHandler() — one ResourceHandler per resource (server.js:37-54).
  7. setupQueue() — register all RPC servers per resource + the global rm-queue-handler; connect the pool (server.js:56-117).
  8. initManager()resourceHandler.init() per resource (load from DB, restore slots, start timers) (server.js:119-132).
  9. Emit system.start. On any failure: logger.error + process.exit(2).

server/classes/Queue.jsFifoQueue (Queue.js:1-343)

In-memory FIFO with a backing Map (queueMap id→job) and an order array (queue). Key methods: enqueue(data) (creates UUID job, status WAIT, TTL expiry), dequeue() (pops next WAIT, marks expired ones EXPIRED, activates valid → ACTIVATED), get(id, refresh) (refreshes TTL for waiting jobs, expires stale), remove(id, status) (sets status, drops from order, keeps in map), delete(id) (full removal), garbageCollector() (deletes anything not WAIT/ACTIVATED), getSnapshot() (structuredClone for DB sync), getPosition(id) (waiting-ahead count). IDs via crypto.randomUUID() (:308-311).

server/classes/ResourceHandler.js — slot manager (ResourceHandler.js:1-323)

Owns the slot (a Map<jobId, expiry>) with capacity size (default 1000; from handlerOptions.size). Core: addJob(data) (enqueue then occupySlot), occupySlot() (if free capacity, dequeue → set slot expiry → status ACTIVATED), freeSlot(id, status) (remove from slot, set final status), removeJob(id, status), hasFreeCapacity() (slot.size < size), getStatistic()/getSlotUsage(). Two timers started in run():

  • occupy/stall loop every 2000 ms (hardcoded): _removeStalledJob() (slot TTL exceeded → status STALLED) then occupySlot() (:237-243).
  • storage manager every storageManagerInterval (default 10000): if sync enabled, SyncService.syncToDb; always garbageCollector() (:231-235,248-258).

init()load() (if sync, restore ACTIVATED/WAIT jobs from DB) then re-populate slots from ACTIVATED jobs, then run() (:209-220).

Slot occupy interval is hardcoded to 2000 ms

setInterval(... , 2000) at ResourceHandler.js:243. managerInterval / storageManagerInterval only controls the sync+GC loop, not the slot-activation tick. Also note handlerOptions.managerInterval (config) vs slotOpts.storageManagerInterval (constructor key) — see gotcha §10.

server/service/ResourceService.js (ResourceService.js:1-47)

Config-reader for resources: getRegisteredResourceNameList(), getActiveResourceNameList() (filters active === true), getConfig(name), assertResource(name) (throws if not registered/active).

server/service/SyncService.js (SyncService.js:1-88)

Persists the in-memory queue to Postgres. syncToDb(queueName, snapshot) — in a transaction, bulkCreate with updateOnDuplicate: ['data','status','expiry'] in windows of 100, then destroy rows whose ids are no longer in memory (Op.notIn). loadFromDb(queueName) — first deletes rows not in (ACTIVATED,WAIT), then returns those two statuses ordered by createdAt ASC. Window size default 100 (:5).

_splitIntoWindow ignores its chunkSize arg

SyncService._splitIntoWindow(array, chunkSize) is called as this._splitIntoWindow(...) with one arg and internally uses this.window (100), not chunkSize (SyncService.js:21,79-85). Effective batch size is always 100.

server/service/TokenService.js (TokenService.js:1-73)

Signs/verifies queue tickets (JWT { jobId }) using jwt.secretKey + jwt.options. verify() returns structured { error: { title: 'EXPIRED_TOKEN' | 'INVALID_TOKEN', message } } for expired/invalid tokens rather than throwing.

server/constants/jobStatus.js (jobStatus.js:5-15)

Frozen STATUS enum: WAIT, ACTIVATED, EXPIRED, DELETED, FINISHED, FAILED, STALLED, TIMEOUT, ABANDONED.

RPC servers — the public API (server/queue/rpc_server/*, wired in server.js:99-109)

Per active resource <name>, all extend @techteamer/mq RPCServer with prefetchCount: 20:

RPC serverQueue nameBehaviourSource
ResourceCapacityRpcServerrm-has-free-capacity-<name>{ hasCapacity } via hasFreeCapacity()ResourceCapacityRpcServer.js
EnterQueueRpcServerrm-enter-queue-<name>Dedups (ALREADY_IN_QUEUE/ALREADY_IN_SLOT) then addJob; returns jobId/data/status/slotNumber; adds queueTicket JWT when jwtFormat & status WAITEnterQueueRpcServer.js
ResourceQueueStatusRpcServerrm-get-status-<name>Resolve jobId from jobId or verified queueTicket; return status + waitingAheadCount + slotNumber; NOT_FOUND if missingResourceQueueStatusRpcServer.js
LeaveQueueRpcServerrm-leave-queue-<name>jobId from ticket/id; removeJobREMOVED/FAILED/NOT_FOUNDLeaveQueueRpcServer.js
FreeSlotRpcServerrm-free-slot-<name>Requires jobId + valid status (must be in STATUS); freeSlot{ success }FreeSlotRpcServer.js
RequeueRpcServerrm-requeue-<name>Remove from queue (if WAIT) or free slot (if ACTIVATED) using reason, then re-addJob; re-issues ticketRequeueRpcServer.js
StatisticRpcServerrm-statistic-<name>Returns getStatistic() (queueCount, slotCount, slotUsage)StatisticRpcServer.js
QueueHandlerRpcServerrm-queue-handler (single, global)Actions: getQueueConfiguration, clearSlot, getSlotJobList, deleteJob — used by queue-query CLIQueueHandlerRpcServer.js

QueueHandlerRpcClient exposes those 4 actions with a 30 s default timeout (QueueHandlerRpcClient.js:1-22). Full request/response contracts are documented in README.md:96-327.

Entity / DB model — queue table (server/db/model/queue.js:3-42)

Sequelize model queue: queueName (STRING, NOT NULL), id (UUID, PK), expiry (DATE, nullable), status (STRING, NOT NULL, validated against STATUS), data (JSON, NOT NULL). Unique composite index on ['id','queueName']. Registered via server/db/models.js{ Queue }.

7. Configuration

Loader — config.js (config.js:1-203)

  • Uses getconfig; adds a custom Types.file reader (config.js:13-21) and rich SyntaxError reporting for malformed JSON (config.js:24-54, exits 2).
  • convertTTLsToMs (config.js:71-84): recursively converts any string ttl field to ms via ms(). So config "5s" / "5m" become numbers at load (matches README.md:62).
  • Appends .<RESOURCE_MANAGER_BUILD_NUMBER> to config.version from .env if present (config.js:62-69).
  • Helpers: config.get(path, default), config.has(path), config.traceConfig(), config.getSecureConfig() (masks security.sensitiveConfigFields as SECRET, supports a.*.b wildcards — config.js:164-192).
  • DB CA cert: if db.options.dialectOptions.ssl.ca is a path under /workspace/, reads the file (config.js:194-201).

Config schema (from config/dev.json + README.md)

  • version (string).
  • db: { url, syncOnStart } (or { database, username, password, options }.sequelize-config.js, server/db/sequelize.js:27-33).
  • queue.default: { url: amqps://..., options: { rejectUnauthorized, cert, key, ca }, rpcTimeoutMs, rpcQueueMaxSize }. Per-resource overrides allowed under queue.<resourceName>; queues with optional: true don’t crash the process on disconnect (rabbitmq.js:69-78).
  • resourceList.<name>: { active, jwtFormat, queueOptions: { name, ttl }, handlerOptions: { size, ttl, sync, managerInterval } } (config/dev.json:20-35, README.md:28-71).
  • jwt: { secretKey, options: { algorithm: HS512, expiresIn } } (config/dev.json:36-42).

Hardcoded secrets / TLS in committed config

config/dev.json:37 ships a real-looking jwt.secretKey UUID and rejectUnauthorized: false (config/dev.json:11). config/docker.json:22 has secretKey: "TODO" and an empty resourceList: {} (so a vanilla docker config starts with no active resources / no RPC endpoints). TLS cert paths point at /workspace/vuer_mq_cert/... — see architecture-overview for the shared MQ cert convention.

Env vars (referenced in code)

  • NODE_ENV / RUNTIME_ENV — getconfig env selection; 'travisci' triggers local AMQP override (config.js:56).
  • SEQUELIZEUSER / SEQUELIZEPASS — override DB creds (.sequelize-config.js:14-22, bin/db/sync:53-54).
  • RESOURCE_MANAGER_BUILD_NUMBER (from .env) — appended to version (config.js:64).
  • TZ forced to Etc/UTC; NODE_TLS_REJECT_UNAUTHORIZED='0' when settings.allowSelfSignedCerts (process-settings.js:4-8).
  • APP_HOME, DOCKER_USER — supervisor env (supervisor_resource_manager_*.conf).

No AJV / JSON-schema validation

Config is not validated by AJV or a JSON schema. The only structural validation is the Sequelize model status validator (server/db/model/queue.js:20-26) and runtime guards inside RPC servers. (Searched: no ajv/schema files in the tree.)

8. Tests

  • Framework: Jest 29, jest-environment-node (package.json:33-34).
  • Config: test/jest.config.jsrootDir = repo root, ignores node_modules/web/yarn-offline-cache, coverage lcovonly into test/coverage/, coverageProvider: 'v8', testTimeout: 30000 (test/jest.config.js:1-15).
  • Location: test/unit/** — service/class tests (config.test.js, Queue.test.js, ResourceHandler.test.js, ResourceService.test.js, SyncService.test.js, TokenService.test.js, service_container.test.js) and test/unit/queue/* for all 8 RPC servers. Tests mock service_container (e.g. EnterQueueRpcServer.test.js:1-20).
  • Run: yarn test (→ jest --config ./test/jest.config.js --runInBand, package.json:8).
  • CI: test/scripts/travis.shyarn install --frozen-lockfile, yarn audit (fails only on critical, exit ≥16), yarn test, git diff --exit-code (no uncommitted changes), and an executable-bit guard restricting +x files to bin/, test/scripts/, etc. (test/scripts/travis.sh:1-27). Followed by SonarCloud scan (.travis.yml:30-32, sonar-project.properties).

No integration/e2e tests in this clone

Only test/unit/** exists here. changelog.md mentions “integration test fixes”, and eslint.config.mjs references web/, client/, customization/, Puppeteer globals — none of which are present in this repo, suggesting a shared eslint config template across FaceKom repos.

9. Dependencies on other FaceKom services

Evidenced in code/config:

  • RabbitMQ (mandatory) via @techteamer/mq ConnectionPool. Default connection amqps://localhost:5671 with mutual TLS using /workspace/vuer_mq_cert/{client,ca} certs (config/dev.json:7-18, rabbitmq.js:62-84). If a non-optional connection closes, the process exits 2 (rabbitmq.js:71-78). This is the shared FaceKom MQ broker — see architecture-overview.
    • Server (this service provides): per-resource queues rm-has-free-capacity-*, rm-enter-queue-*, rm-get-status-*, rm-leave-queue-*, rm-free-slot-*, rm-requeue-*, rm-statistic-*, and global rm-queue-handler (server.js:89,100-106).
    • Client (this service consumes): only its own rm-queue-handler (from the queue-query CLI, bin/queue/queue-query.js:158). No outbound RPC calls to other services were found.
  • PostgreSQL (mandatory) via Sequelize for queue persistence (table queue). Connection from db.url / db.database (config/dev.json:4, server/db/sequelize.js:27-33). Pool max 100 (sequelize.js:18).
  • No Redis, no direct HTTP calls to other services found in the tree.

Consumers are external

The RPC contracts in README.md are meant to be called by other FaceKom services (e.g. the identification flow asking for capacity / queue tickets). Those callers live in other repos — see architecture-overview / sibling repos/ docs. Not verifiable from this repo alone.

10. Verified gotchas (callouts)

Config key name mismatch: managerInterval vs storageManagerInterval

Config supplies handlerOptions.managerInterval (config/dev.json:32, README.md:68), but ResourceHandler reads this.slotOpts.storageManagerInterval (ResourceHandler.js:37) and falls back to 10000 ms when undefined. With the shipped config, the storage-manager/sync interval is effectively the 10000 ms default regardless of the managerInterval: 10000 value (they coincidentally match in dev.json). The CLI’s parseConfig even prints it as “Storage Manager Interval” while reading managerInterval (bin/queue/queue-query.js:180). Treat these two names as a latent bug.

Slot activation latency is fixed at 2 s

Jobs are only promoted to slots by the 2000 ms occupySlot timer (ResourceHandler.js:237-243) and synchronously inside addJob (ResourceHandler.js:80-97). managerInterval does not speed this up.

db.syncOnStart runs migrations + sequelize.sync on every boot

server/bootstrap/connection/db.js:15-31 (driven by config.db.syncOnStart: true in both env files) runs beforeMigrate./bin/db/sync (which calls sequelize.sync) → migrate at startup. Migration dirs are empty here, but sequelize.sync will alter schema to match models. Be cautious pointing this at a shared/prod DB.

Non-optional RabbitMQ or DB failure kills the process

RabbitMQ connection close → process.exit(2) (rabbitmq.js:76); any boot-step throw → process.exit(2) (server.js:144-147). Supervisor (autorestart=true, exitcodes=0,2) restarts it. Expect crash-loops if MQ/DB are unreachable.

getJob's refresh param is effectively ignored

ResourceHandler.getJob(id, refresh) calls this.queue.get(id) without forwarding refresh (ResourceHandler.js:130-142), so Queue.get always uses its default refresh = true and refreshes the WAIT job’s TTL even when callers (e.g. QueueHandlerRpcServer.deleteJob passing false, QueueHandlerRpcServer.js:76) intend not to.

Empty docker resourceList

Starting with config/docker.json as-is yields resourceList: {} → zero active resources → no per-resource RPC servers registered (only rm-queue-handler). A real deployment must supply its own resource config (config/docker.json:20).

Unverified / gaps

  • server/db/migrationHelpers.js — listed but not read line-by-line (migration dirs are empty, so it is currently unused at runtime). Structurally surveyed only.
  • test/unit/** bodies — confirmed framework, layout, and mocking pattern by reading test/jest.config.js and sampling EnterQueueRpcServer.test.js:1-40; the other ~16 test files were inventoried by filename but not read in full.
  • maintenance/2026-04-07.md, security/2026-04-07.md — not read (read only the 2026-05-04.md pair as representative); these are dated dependency/audit logs, not runtime code.
  • yarn.lock (202 KB) — not read; transitive dependency internals intentionally out of scope.
  • External RPC consumers / orchestration / Dockerfile — live outside this repo; cannot be verified here. No Dockerfile exists in this clone.
  • Git-LFS binaries — none present in this repo (no model weights/pointer files found in the file listing).

Sources

Files read in full unless noted:

  • package.json, README.md, server.js, config.js, changelog.md
  • eslint.config.mjs, .travis.yml, build.ignore, sonar-project.properties, .gitignore
  • .sequelizerc, .sequelizercBefore, .sequelize-config.js
  • supervisor_resource_manager_dev.conf, supervisor_resource_manager_docker.conf
  • config/dev.json, config/docker.json
  • bin/db/sync, bin/db/truncate, bin/db/lint.js, bin/queue/queue-query.js
  • server/bootstrap/process-settings.js, server/bootstrap/process-listeners.js, server/bootstrap/connection/db.js, server/bootstrap/connection/rabbitmq.js
  • server/service_container.js, server/logger.js, server/child_process_promise.js
  • server/classes/Queue.js, server/classes/ResourceHandler.js
  • server/service/ResourceService.js, server/service/SyncService.js, server/service/TokenService.js
  • server/constants/jobStatus.js
  • server/queue/rpc_server/{EnterQueue,QueueHandler,ResourceCapacity,FreeSlot,LeaveQueue,Requeue,ResourceQueueStatus,Statistic}RpcServer.js
  • server/queue/rpc_client/QueueHandlerRpcClient.js
  • server/db/model/queue.js, server/db/models.js, server/db/sequelize.js
  • test/jest.config.js, test/scripts/travis.sh, test/unit/queue/EnterQueueRpcServer.test.js (first 40 lines)
  • maintenance/2026-05-04.md, security/2026-05-04.md
  • Directory listings of repo root, bin/, db/migrate, db/beforeMigrate, test/coverage
  • git -C ... log/branch (commit 36a1cb2, branch master)