Releases: ylabonte/procon-ip
Release list
v2.1.4
Patch Changes
-
c5a0476: Fix relay/DMX writes being silently dropped by the controller (they returned
200 "done"but never applied). Root cause: the ProCon.IP's legacy HTTP/1.0 firmware is case-sensitive on header names and reads a POST body only when the length header is spelledContent-Length.undici(and the globalfetch) lowercase the header names they generate, so every write went out withcontent-length— the firmware ignored the body and no-op'd the write. This is the same class of bug as theAuthorizationcasing fixed in 2.1.3, but on a header the HTTP client generates and won't let us re-case.The HTTP transport is now Node's built-in
http/https(newsrc/http-transport.ts), which preserves the exact casing of every header we set and adds only a capitalisedHost.undiciis removed — the package is now zero runtime dependencies. Verified end-to-end against a real ProCon.IP V.1.7.6: aDmxServicewrite followed by aGetDmxServiceread-back now echoes the written value (previously it stayed unchanged). A real-wire regression test asserts the outgoingContent-Length(andAuthorization) name reaches the wire capitalised.
v2.1.3
Patch Changes
- 5e37d9f: Fix authenticated relay/DMX writes returning 401 against the ProCon.IP controller.
AbstractService.request()built its headers through the WHATWGHeadersAPI, which lowercases every header name, so undici sentauthorization: …on the wire. The controller's legacy firmware is case-sensitive on the header name and rejects a write carryingauthorization, accepting onlyAuthorization(verified end-to-end against a real ProCon.IP V.1.7.6: lowercase → 401, capitalised → 200done). Reads were unaffected because their endpoints ignore auth. Request headers are now assembled as a plain object so their exact casing reaches the wire; a real-wire regression test asserts the outgoingAuthorizationname is capitalised.
v2.1.2
v2.1.1
Patch Changes
-
d42a13d: Fix relay switching (
UsrcfgCgiService) and DMX writes (DmxService), which were silently failing against real controllers since the 2.x rewrite. Two root causes, both now fixed:-
Browser headers from
fetch().AbstractService.request()used the globalfetch(), whose WHATWG implementation injects browser-only request headers (sec-fetch-mode,accept-language,accept,user-agent). The controller's legacy firmware accepts such a write with200 "done"but silently ignores it (reads were unaffected). Those headers are on the fetch "forbidden header" list and cannot be stripped via the API, so the HTTP layer now usesundici.request()(new runtime dependency), which sends only the headers we set. This is whataxios(pre-2.x) and other working clients did.Side effects of the HTTP-client switch:
request()no longer follows 3xx redirects (they surface asBadStatusCodeError), andstatusTextonBadStatusCodeError/ the returnedResponseis now the numeric status. No caller relies on either. -
Percent-encoded comma. The
/usrcfg.cgiPOST body was serialised withURLSearchParams, encoding the literal comma inENA=<on>,<auto>(and the DMXCH1_8/CH9_16channel lists) to%2C, which the controller cannot parse. The body is now built with literal commas.
Both were confirmed against a real
ProCon.IP V.1.7.6(relay physically toggles again). A new wire-level regression test asserts the outgoing request carries neither the browser headers nor a percent-encoded comma. -
v2.1.0
Minor Changes
-
0779ff3: Drop Node 20 support. Minimum supported runtime is now Node 22 LTS.
engines.noderaised from>=20.0.0to>=22.0.0.- CI matrix bumped from Node 20/22 to Node 22/24.
tsupcompilation target raised fromnode20tonode22.
The library's runtime API is unchanged; consumers on Node 22+ are unaffected. Consumers on Node 20 should bump their runtime to Node 22 LTS or newer.
v2.0.0
Major Changes
-
4993dbd: procon-ip 2.0.0 — toolchain modernisation, native fetch, DMX512 support.
Breaking changes:
- Drop Node ≤ 18 (
engines.node: ">=20.0.0"). - Replace
axioswith nativefetch. Errors are nowBadCredentialsError,
BadStatusCodeError,RequestTimeoutError,InvalidPayloadError(all
exported from'procon-ip').AxiosErroris no longer leaked. - Drop deep imports — only
import { X } from 'procon-ip'works. The
procon-ip/lib/...andprocon-ip/module/...paths are removed. - Build outputs move to
dist/(waslib/+module/). The package
exportsmap preserves the public import surface. mock-stateis no longer a public export.UsrcfgCgiService.setOn/setOff/setAutonow returnPromise<void>.
The opaque numeric response code returned in 1.x is dropped; failures
throw the new typed error classes instead.
New:
- DMX512 support via
GetDmxService,DmxService,GetDmxData,
DmxChannelData. Read-mutate-write idiom mirroring proconip-pypi.
Internal:
- pnpm 9 + tsup + Vitest + ESLint 9 flat + TypeDoc with strict validation.
- ≥80% coverage gate in CI; project targets 100% on parsers/interpreters/
error paths/DMX (currently 96.3% overall, 100% on parsers/interpreters/
errors/DMX). - Releases publish via npm Trusted Publishing (OIDC + provenance) inside
thereleaseGitHub environment. No long-livedNPM_TOKENin CI. - Docs are built and deployed to Pages from Actions; the previously
committeddocs/HTML is removed.
- Drop Node ≤ 18 (
All notable changes to this project are documented here.
Format: Keep a Changelog.
Versioning: Semantic Versioning.
Release v1.8.0
- Dependency updates.
- Breaking backward compatibility for Node versions <18.18.x
- Update eslint to v9.x (enforcing new config format)
What's Changed
- Bump typedoc from 0.25.9 to 0.25.10 by @dependabot in #381
- Bump the dev-dependencies group with 1 update by @dependabot in #385
- Bump the production group with 1 update by @dependabot in #390
- Bump the dev-dependencies group with 3 updates by @dependabot in #391
- Bump the dev-dependencies group with 1 update by @dependabot in #392
- Bump the dev-dependencies group with 2 updates by @dependabot in #393
- Bump the dev-dependencies group with 2 updates by @dependabot in #394
- Bump typescript from 5.4.3 to 5.4.4 in the dev-dependencies group by @dependabot in #395
- Bump eslint-plugin-n from 17.4.0 to 17.5.1 in the dev-dependencies group by @dependabot in #406
- Bump eslint-plugin-n from 17.5.1 to 17.6.0 in the dev-dependencies group by @dependabot in #407
- Bump the dev-dependencies group with 4 updates by @dependabot in #408
- Bump the dev-dependencies group with 2 updates by @dependabot in #409
- Bump axios from 1.6.8 to 1.7.1 in the production group by @dependabot in #410
- Bump the dev-dependencies group with 3 updates by @dependabot in #411
- Bump axios from 1.7.1 to 1.7.2 in the production group by @dependabot in #412
- Bump eslint-plugin-promise from 6.1.1 to 6.2.0 in the dev-dependencies group by @dependabot in #413
- Bump the dev-dependencies group with 3 updates by @dependabot in #414
- Bump the dev-dependencies group with 3 updates by @dependabot in #415
- Bump the dev-dependencies group with 3 updates by @dependabot in #416
- Bump the dev-dependencies group with 2 updates by @dependabot in #417
- Bump eslint-plugin-n from 17.8.0 to 17.8.1 in the dev-dependencies group by @dependabot in #418
- Bump the dev-dependencies group with 4 updates by @dependabot in #419
- Bump braces from 3.0.2 to 3.0.3 by @dependabot in #420
- Bump eslint-plugin-n from 17.8.1 to 17.9.0 in the dev-dependencies group by @dependabot in #421
- Bump the dev-dependencies group with 2 updates by @dependabot in #422
- Bump the dev-dependencies group with 3 updates by @dependabot in #423
- Bump typescript from 5.4.5 to 5.5.2 in the dev-dependencies group by @dependabot in #424
- Bump typedoc from 0.26.1 to 0.26.2 in the dev-dependencies group by @dependabot in #425
- Bump the dev-dependencies group with 3 updates by @dependabot in #426
- Bump typedoc from 0.26.2 to 0.26.3 in the dev-dependencies group by @dependabot in #427
- Bump the dev-dependencies group with 3 updates by @dependabot in #428
- Bump the dev-dependencies group with 4 updates by @dependabot in #429
- Bump the dev-dependencies group with 3 updates by @dependabot in #430
- Bump typedoc from 0.26.3 to 0.26.4 in the dev-dependencies group by @dependabot in #431
- Bump the dev-dependencies group with 3 updates by @dependabot in #432
- Bump the dev-dependencies group with 3 updates by @dependabot in #433
- Bump eslint-plugin-prettier from 5.1.3 to 5.2.1 in the dev-dependencies group by @dependabot in #434
- Bump the dev-dependencies group with 2 updates by @dependabot in #435
- Bump the dev-dependencies group with 4 updates by @dependabot in #436
- Bump eslint-plugin-promise from 6.6.0 to 7.0.0 in the dev-dependencies group by @dependabot in #437
- Bump eslint-plugin-n from 17.9.0 to 17.10.1 in the dev-dependencies group by @dependabot in #438
- Bump the dev-dependencies group with 2 updates by @dependabot in #439
- Bump the dev-dependencies group with 3 updates by @dependabot in #440
- Bump axios from 1.7.2 to 1.7.3 in the production group by @dependabot in #442
- Bump axios from 1.7.3 to 1.7.4 in the production group by @dependabot in #447
- Bump axios from 1.6.8 to 1.7.4 in /examples by @dependabot in #448
- Bump the dev-dependencies group across 1 directory with 7 updates by @dependabot in #446
Full Changelog: v1.7.6...v1.8.0
Release v1.7.6
Dependency updates.
Full Changelog: v1.7.5...v1.7.6