@sirena-lwm2m/core
v0.2.0
Published
The shared foundation of Sirena LwM2M: codecs, object model, and types.
Readme
@sirena-lwm2m/core
The shared foundation of Sirena LwM2M: codecs, object model, and types.
@sirena-lwm2m/core is the shared foundation of the Sirena LwM2M toolkit. It holds the encoders, decoders, OMA object definitions, and error types that Sirena's server, client, and transport layers all build on top of. LwM2M (Lightweight M2M) is the OMA-specified protocol for managing constrained IoT devices; this package gives you its wire format and schemas in pure TypeScript. If you need to send a packet, run a server, or talk to a device, you're in the wrong package — @sirena-lwm2m/core ends at the wire format and the schemas.
What's included
- Codecs for every LwM2M wire format: TLV, CBOR, SenML JSON/CBOR, Opaque, Plain Text — plus dispatch and content-format negotiation
- Object model for OMA LwM2M objects 0–10 (LwM2M Server, ACL, Device, etc.) with full resource definitions
- Types for paths, values, content formats, observations, registration, and stores
- Errors as a typed hierarchy mapped to CoAP response codes
Installation
Requires Node.js 24+.
npm install @sirena-lwm2m/coreUsage
import { encodeTlv, decodeTlv, ResourceType } from "@sirena-lwm2m/core";
const schema = { resourceId: 3, type: ResourceType.String };
const wire = encodeTlv({ type: "string", value: "hello" }, schema);
const back = decodeTlv(wire, schema);The Story
Once the server and the CoAP stack were taking shape, a problem became obvious: both needed to encode a TLV resource, both needed to model an LwM2M path, both needed to know what a 3/0/0 meant. The choice was either to duplicate or to distil. They chose to distil. @sirena-lwm2m/core is what remains when you strip away the transport, the server logic, and the client behaviour — the pure grammar of LwM2M. Codecs, object definitions, resource types, error hierarchy. The part of the signal that every component in the system has to agree on before any of them can be understood.
License
MIT © 2026 Dejan Dimic. See LICENSE for the full text.
