feat(device-plane): add universal adapter acceptance boundary

This commit is contained in:
Codex
2026-08-11 19:11:48 +03:00
parent 227c7c26c1
commit 393741f1bd
26 changed files with 1887 additions and 127 deletions
@@ -1,3 +1,10 @@
import { createHash } from "node:crypto";
import {
DEVICE_ADAPTER_CONTRACT_VERSION,
defineDeviceAdapter,
} from "../../device-adapter-runtime/src/index.mjs";
export const ARUSNAVI_INTERNAL_SPECIFICATION_REF =
"arusnavi.internal.protocol-sheet.gid-12.v1";
@@ -53,6 +60,26 @@ export const ARUSNAVI_B2_MODEL_PROFILE = deepFreeze({
},
});
export const ARUSNAVI_B2_ADAPTER = defineDeviceAdapter({
contractVersion: DEVICE_ADAPTER_CONTRACT_VERSION,
adapterRef: "arusnavi-b2",
runtimePackageRef: "@nodedc/arusnavi-b2-adapter",
profiles: [ARUSNAVI_B2_MODEL_PROFILE],
createSession({ profileRef } = {}) {
if (profileRef !== ARUSNAVI_B2_MODEL_PROFILE.profileRef) {
throw new TypeError("b2_adapter_profile_unsupported");
}
return {
parseHeader: tryParseB2Header2,
buildHeaderAcknowledgement: buildB2HeaderAcknowledgement,
parseMessage: tryParseB2Package,
buildMessageAcknowledgement(message) {
return buildB2PackageAcknowledgement(message.packageNumber);
},
};
},
});
export function tryParseB2Header2(input) {
assertBuffer(input, "b2_header_buffer_required");
if (input.length < HEADER2_LENGTH) {
@@ -148,6 +175,16 @@ export function tryParseB2Package(input) {
bytesConsumed: offset + 1,
packageNumber,
packetCount,
messageType: "telemetry.package",
payloadSchemaRef: "arusnavi.internal.package-metadata.v1",
payload: Object.freeze({
packageNumber,
packetCount,
byteLength: offset + 1,
packageDigest: `sha256:${createHash("sha256")
.update(input.subarray(0, offset + 1))
.digest("hex")}`,
}),
});
}
if (input.length - offset < 3) {
@@ -66,11 +66,22 @@ test("parses and acknowledges the official package example", () => {
tryParseB2Package(specificationPackage.subarray(0, -1)).status,
"incomplete",
);
assert.deepEqual(tryParseB2Package(specificationPackage), {
status: "complete",
bytesConsumed: specificationPackage.length,
const parsed = tryParseB2Package(specificationPackage);
assert.equal(parsed.status, "complete");
assert.equal(parsed.bytesConsumed, specificationPackage.length);
assert.equal(parsed.packageNumber, 1);
assert.equal(parsed.packetCount, 1);
assert.equal(parsed.messageType, "telemetry.package");
assert.equal(
parsed.payloadSchemaRef,
"arusnavi.internal.package-metadata.v1",
);
assert.deepEqual(parsed.payload, {
packageNumber: 1,
packetCount: 1,
byteLength: specificationPackage.length,
packageDigest:
"sha256:bba7205d2f613ac3dfdb7bccdee292b3837e1c8d3d1254ee68bba2dda3853e11",
});
assert.equal(
buildB2PackageAcknowledgement(1).toString("hex").toUpperCase(),
@@ -93,12 +104,14 @@ test("uses packet lengths and checksum instead of scanning for 0x5D", () => {
checksum,
0x5d,
]);
assert.deepEqual(tryParseB2Package(packageBytes), {
status: "complete",
bytesConsumed: packageBytes.length,
packageNumber: 2,
packetCount: 1,
});
const parsed = tryParseB2Package(packageBytes);
assert.equal(parsed.status, "complete");
assert.equal(parsed.bytesConsumed, packageBytes.length);
assert.equal(parsed.packageNumber, 2);
assert.equal(parsed.packetCount, 1);
assert.equal(parsed.messageType, "telemetry.package");
assert.equal(parsed.payload.byteLength, packageBytes.length);
assert.match(parsed.payload.packageDigest, /^sha256:[a-f0-9]{64}$/);
});
test("fails closed on unsupported headers and malformed packages", () => {