@empa-electronics/tiremo-sdk-client-node 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # Node.js client for the TIREMO SDK.
2
+
3
+ Published as `@empa-electronics/tiremo-sdk-client-node` on [npm](https://www.npmjs.com/package/@empa-electronics/tiremo-sdk-client-node).
4
+
5
+ Requires Node.js 18+ (native `fetch`; WebSocket on Node 22+).
6
+
7
+ ```bash
8
+ npm install @empa-electronics/tiremo-sdk-client-node
9
+ ```
10
+
11
+ ```typescript
12
+ import { TiremoClient } from "@empa-electronics/tiremo-sdk-client-node";
13
+ ```
14
+
15
+ See the [repository README](../../README.md) for usage details.
@@ -0,0 +1,34 @@
1
+ import type { LiveEventMap, LiveSubscribeAlarmOptions, LiveSubscribePresenceOptions, LiveSubscribeTelemetryOptions, LiveTokenResponse, TelemetryLatestOptions, TelemetryLatestResponse, TiremoClientOptions } from "./types.js";
2
+ type EventHandler<T> = (event: T) => void;
3
+ export declare class TiremoLiveClient {
4
+ private readonly baseUrl;
5
+ private readonly auth;
6
+ private socket;
7
+ private readonly handlers;
8
+ constructor(baseUrl: string, auth: {
9
+ apiKey?: string;
10
+ token?: string;
11
+ });
12
+ connect(): void;
13
+ disconnect(): void;
14
+ on<T extends keyof LiveEventMap>(event: T, handler: EventHandler<LiveEventMap[T]>): () => void;
15
+ subscribeTelemetry(options: LiveSubscribeTelemetryOptions): void;
16
+ subscribePresence(options: LiveSubscribePresenceOptions): void;
17
+ subscribeAlarm(options: LiveSubscribeAlarmOptions): void;
18
+ unsubscribe(subscriptionId: string): void;
19
+ private send;
20
+ }
21
+ export declare class TiremoClient {
22
+ private readonly options;
23
+ readonly devices: {
24
+ getTelemetryLatest: (deviceIdentifier: string, options?: TelemetryLatestOptions) => Promise<TelemetryLatestResponse>;
25
+ };
26
+ readonly live: {
27
+ createToken: () => Promise<LiveTokenResponse>;
28
+ connectWithToken: (token: string) => TiremoLiveClient;
29
+ connectWithSecretKey: () => TiremoLiveClient;
30
+ };
31
+ constructor(options: TiremoClientOptions);
32
+ }
33
+ export type { LiveAlarmEvent, LiveErrorEvent, LiveEvent, LiveEventMap, LivePresenceEvent, LiveSubscribeAlarmOptions, LiveSubscribePresenceOptions, LiveSubscribeTelemetryOptions, LiveTelemetryEvent, LiveTokenResponse, TelemetryLatestOptions, TelemetryLatestResponse, TiremoClientOptions, } from "./types.js";
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EACZ,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,EAC7B,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAEpB,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAE1C,qBAAa,gBAAgB;IAmBzB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAnBvB,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAcvB;gBAGiB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAG5D,OAAO,IAAI,IAAI;IA4Cf,UAAU,IAAI,IAAI;IAKlB,EAAE,CAAC,CAAC,SAAS,MAAM,YAAY,EAC7B,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,GACrC,MAAM,IAAI;IAMb,kBAAkB,CAAC,OAAO,EAAE,6BAA6B,GAAG,IAAI;IAUhE,iBAAiB,CAAC,OAAO,EAAE,4BAA4B,GAAG,IAAI;IAS9D,cAAc,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI;IASxD,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI;IAIzC,OAAO,CAAC,IAAI;CAMb;AAED,qBAAa,YAAY;IAcX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAbpC,QAAQ,CAAC,OAAO,EAAE;QAChB,kBAAkB,EAAE,CAClB,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,sBAAsB,KAC7B,OAAO,CAAC,uBAAuB,CAAC,CAAC;KACvC,CAAC;IAEF,QAAQ,CAAC,IAAI,EAAE;QACb,WAAW,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;QAC9C,gBAAgB,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,gBAAgB,CAAC;QACtD,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;KAC9C,CAAC;gBAE2B,OAAO,EAAE,mBAAmB;CA2D1D;AAED,YAAY,EACV,cAAc,EACd,cAAc,EACd,SAAS,EACT,YAAY,EACZ,iBAAiB,EACjB,yBAAyB,EACzB,4BAA4B,EAC5B,6BAA6B,EAC7B,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,155 @@
1
+ export class TiremoLiveClient {
2
+ baseUrl;
3
+ auth;
4
+ socket = null;
5
+ handlers = {
6
+ connected: new Set(),
7
+ telemetry: new Set(),
8
+ presence: new Set(),
9
+ alarm: new Set(),
10
+ error: new Set(),
11
+ message: new Set(),
12
+ };
13
+ constructor(baseUrl, auth) {
14
+ this.baseUrl = baseUrl;
15
+ this.auth = auth;
16
+ }
17
+ connect() {
18
+ if (this.socket) {
19
+ return;
20
+ }
21
+ const wsBase = this.baseUrl.replace(/^http/, "ws").replace(/\/$/, "");
22
+ let url = `${wsBase}/v1/live`;
23
+ if (this.auth.token) {
24
+ url += `?token=${encodeURIComponent(this.auth.token)}`;
25
+ }
26
+ else if (this.auth.apiKey) {
27
+ url += `?apiKey=${encodeURIComponent(this.auth.apiKey)}`;
28
+ }
29
+ else {
30
+ throw new Error("Live connection requires either a short-lived token or a secret API key.");
31
+ }
32
+ this.socket = new WebSocket(url);
33
+ this.socket.addEventListener("message", (event) => {
34
+ let parsed;
35
+ try {
36
+ parsed = JSON.parse(String(event.data));
37
+ }
38
+ catch {
39
+ return;
40
+ }
41
+ this.handlers.message.forEach((handler) => handler(parsed));
42
+ if (parsed.type === "connected") {
43
+ this.handlers.connected.forEach((handler) => handler(parsed));
44
+ }
45
+ else if (parsed.type === "telemetry") {
46
+ this.handlers.telemetry.forEach((handler) => handler(parsed));
47
+ }
48
+ else if (parsed.type === "presence") {
49
+ this.handlers.presence.forEach((handler) => handler(parsed));
50
+ }
51
+ else if (parsed.type === "alarm") {
52
+ this.handlers.alarm.forEach((handler) => handler(parsed));
53
+ }
54
+ else if (parsed.type === "error") {
55
+ this.handlers.error.forEach((handler) => handler(parsed));
56
+ }
57
+ else if (parsed.type === "ping") {
58
+ this.send({ type: "pong" });
59
+ }
60
+ });
61
+ }
62
+ disconnect() {
63
+ this.socket?.close();
64
+ this.socket = null;
65
+ }
66
+ on(event, handler) {
67
+ const set = this.handlers[event];
68
+ set.add(handler);
69
+ return () => set.delete(handler);
70
+ }
71
+ subscribeTelemetry(options) {
72
+ this.send({
73
+ type: "subscribe",
74
+ id: options.id,
75
+ channel: "telemetry",
76
+ deviceIdentifier: options.deviceIdentifier,
77
+ keys: options.keys,
78
+ });
79
+ }
80
+ subscribePresence(options) {
81
+ this.send({
82
+ type: "subscribe",
83
+ id: options.id,
84
+ channel: "presence",
85
+ deviceIdentifier: options.deviceIdentifier,
86
+ });
87
+ }
88
+ subscribeAlarm(options) {
89
+ this.send({
90
+ type: "subscribe",
91
+ id: options.id,
92
+ channel: "alarm",
93
+ deviceIdentifier: options.deviceIdentifier,
94
+ });
95
+ }
96
+ unsubscribe(subscriptionId) {
97
+ this.send({ type: "unsubscribe", id: subscriptionId });
98
+ }
99
+ send(payload) {
100
+ if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
101
+ throw new Error("Live socket is not connected");
102
+ }
103
+ this.socket.send(JSON.stringify(payload));
104
+ }
105
+ }
106
+ export class TiremoClient {
107
+ options;
108
+ devices;
109
+ live;
110
+ constructor(options) {
111
+ this.options = options;
112
+ const baseUrl = options.baseUrl.replace(/\/$/, "");
113
+ this.devices = {
114
+ getTelemetryLatest: async (deviceIdentifier, queryOptions) => {
115
+ const params = new URLSearchParams();
116
+ if (queryOptions?.keys?.length) {
117
+ for (const key of queryOptions.keys) {
118
+ params.append("keys", key);
119
+ }
120
+ }
121
+ const suffix = params.size > 0 ? `?${params.toString()}` : "";
122
+ const response = await fetch(`${baseUrl}/v1/devices/${encodeURIComponent(deviceIdentifier)}/telemetry/latest/${suffix}`, {
123
+ headers: {
124
+ "X-API-Key": options.apiKey,
125
+ Accept: "application/json",
126
+ },
127
+ });
128
+ if (!response.ok) {
129
+ const body = (await response.json().catch(() => ({})));
130
+ throw new Error(body.message ?? `Request failed (${response.status})`);
131
+ }
132
+ return (await response.json());
133
+ },
134
+ };
135
+ this.live = {
136
+ createToken: async () => {
137
+ const response = await fetch(`${baseUrl}/v1/live/token/`, {
138
+ method: "POST",
139
+ headers: {
140
+ "X-API-Key": options.apiKey,
141
+ Accept: "application/json",
142
+ },
143
+ });
144
+ if (!response.ok) {
145
+ const body = (await response.json().catch(() => ({})));
146
+ throw new Error(body.message ?? `Token request failed (${response.status})`);
147
+ }
148
+ return (await response.json());
149
+ },
150
+ connectWithToken: (token) => new TiremoLiveClient(baseUrl, { token }),
151
+ connectWithSecretKey: () => new TiremoLiveClient(baseUrl, { apiKey: options.apiKey }),
152
+ };
153
+ }
154
+ }
155
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,gBAAgB;IAmBR;IACA;IAnBX,MAAM,GAAqB,IAAI,CAAC;IACvB,QAAQ,GAOrB;QACF,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,SAAS,EAAE,IAAI,GAAG,EAAE;QACpB,QAAQ,EAAE,IAAI,GAAG,EAAE;QACnB,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,KAAK,EAAE,IAAI,GAAG,EAAE;QAChB,OAAO,EAAE,IAAI,GAAG,EAAE;KACnB,CAAC;IAEF,YACmB,OAAe,EACf,IAAyC;QADzC,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAqC;IACzD,CAAC;IAEJ,OAAO;QACL,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACtE,IAAI,GAAG,GAAG,GAAG,MAAM,UAAU,CAAC;QAE9B,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,GAAG,IAAI,UAAU,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACzD,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YAC5B,GAAG,IAAI,WAAW,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,KAAK,CAAC,0EAA0E,CAAC,CAAC;QAC9F,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC;QAEjC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;YAChD,IAAI,MAAiB,CAAC;YACtB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAc,CAAC;YACvD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO;YACT,CAAC;YAED,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAE5D,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAChC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBACvC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBACtC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/D,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,UAAU;QACR,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,EAAE,CACA,KAAQ,EACR,OAAsC;QAEtC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAuC,CAAC;QACvE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACjB,OAAO,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,kBAAkB,CAAC,OAAsC;QACvD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,WAAW;YACpB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,OAAqC;QACrD,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,UAAU;YACnB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,OAAkC;QAC/C,IAAI,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,WAAW;YACjB,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,OAAO;YAChB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC,CAAC;IACL,CAAC;IAED,WAAW,CAAC,cAAsB;QAChC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC;IACzD,CAAC;IAEO,IAAI,CAAC,OAAgC;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI,EAAE,CAAC;YAC9D,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,MAAM,OAAO,YAAY;IAcM;IAbpB,OAAO,CAKd;IAEO,IAAI,CAIX;IAEF,YAA6B,OAA4B;QAA5B,YAAO,GAAP,OAAO,CAAqB;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAEnD,IAAI,CAAC,OAAO,GAAG;YACb,kBAAkB,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE;gBAC3D,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;gBACrC,IAAI,YAAY,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBAC/B,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;wBACpC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBAC7B,CAAC;gBACH,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC9D,MAAM,QAAQ,GAAG,MAAM,KAAK,CAC1B,GAAG,OAAO,eAAe,kBAAkB,CAAC,gBAAgB,CAAC,qBAAqB,MAAM,EAAE,EAC1F;oBACE,OAAO,EAAE;wBACP,WAAW,EAAE,OAAO,CAAC,MAAM;wBAC3B,MAAM,EAAE,kBAAkB;qBAC3B;iBACF,CACF,CAAC;gBAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAEpD,CAAC;oBACF,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,mBAAmB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBACzE,CAAC;gBAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;YAC5D,CAAC;SACF,CAAC;QAEF,IAAI,CAAC,IAAI,GAAG;YACV,WAAW,EAAE,KAAK,IAAI,EAAE;gBACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,OAAO,iBAAiB,EAAE;oBACxD,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,WAAW,EAAE,OAAO,CAAC,MAAM;wBAC3B,MAAM,EAAE,kBAAkB;qBAC3B;iBACF,CAAC,CAAC;gBAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;oBACjB,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAEpD,CAAC;oBACF,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,yBAAyB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/E,CAAC;gBAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAsB,CAAC;YACtD,CAAC;YACD,gBAAgB,EAAE,CAAC,KAAa,EAAE,EAAE,CAClC,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC;YAC1C,oBAAoB,EAAE,GAAG,EAAE,CACzB,IAAI,gBAAgB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;SAC5D,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,78 @@
1
+ export interface LiveTokenResponse {
2
+ token: string;
3
+ expiresAt: string;
4
+ }
5
+ export interface TiremoClientOptions {
6
+ apiKey: string;
7
+ baseUrl: string;
8
+ }
9
+ export interface TelemetryLatestOptions {
10
+ keys?: string[];
11
+ }
12
+ export interface TelemetryLatestResponse {
13
+ deviceIdentifier: string;
14
+ timestamp: string;
15
+ data: Record<string, unknown>;
16
+ }
17
+ export interface LiveSubscribeTelemetryOptions {
18
+ id: string;
19
+ deviceIdentifier: string;
20
+ keys?: string[];
21
+ }
22
+ export interface LiveSubscribePresenceOptions {
23
+ id: string;
24
+ deviceIdentifier: string;
25
+ }
26
+ export interface LiveSubscribeAlarmOptions {
27
+ id: string;
28
+ deviceIdentifier: string;
29
+ }
30
+ export interface LiveTelemetryEvent {
31
+ type: "telemetry";
32
+ subscriptionId: string;
33
+ deviceIdentifier: string;
34
+ timestamp: string;
35
+ data: Record<string, unknown>;
36
+ }
37
+ export interface LivePresenceEvent {
38
+ type: "presence";
39
+ subscriptionId: string;
40
+ deviceIdentifier: string;
41
+ isOnline: boolean;
42
+ lastSeenAt: string | null;
43
+ }
44
+ export interface LiveAlarmEvent {
45
+ type: "alarm";
46
+ subscriptionId: string;
47
+ deviceIdentifier: string;
48
+ timestamp: string;
49
+ alarmType: string;
50
+ code: string;
51
+ exception: string;
52
+ severity: "CRITICAL" | "MAJOR" | "MINOR" | "WARNING" | "INFO";
53
+ }
54
+ export interface LiveErrorEvent {
55
+ type: "error";
56
+ code: string;
57
+ message: string;
58
+ }
59
+ export type LiveEvent = LiveTelemetryEvent | LivePresenceEvent | LiveAlarmEvent | LiveErrorEvent | {
60
+ type: "connected";
61
+ productIdentifier: string;
62
+ protocolVersion: 1;
63
+ } | {
64
+ type: "ping";
65
+ } | {
66
+ type: "pong";
67
+ };
68
+ export type LiveEventMap = {
69
+ connected: Extract<LiveEvent, {
70
+ type: "connected";
71
+ }>;
72
+ telemetry: LiveTelemetryEvent;
73
+ presence: LivePresenceEvent;
74
+ alarm: LiveAlarmEvent;
75
+ error: LiveErrorEvent;
76
+ message: LiveEvent;
77
+ };
78
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,yBAAyB;IACxC,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,WAAW,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,UAAU,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;CAC/D;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,GACjB,kBAAkB,GAClB,iBAAiB,GACjB,cAAc,GACd,cAAc,GACd;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,CAAC,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,MAAM,MAAM,YAAY,GAAG;IACzB,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,CAAC,CAAC;IACrD,SAAS,EAAE,kBAAkB,CAAC;IAC9B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,KAAK,EAAE,cAAc,CAAC;IACtB,KAAK,EAAE,cAAc,CAAC;IACtB,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@empa-electronics/tiremo-sdk-client-node",
3
+ "version": "0.1.0",
4
+ "description": "Node.js client for the TIREMO SDK REST and live WebSocket APIs",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.js",
11
+ "types": "./dist/index.d.ts"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist"
16
+ ],
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/Empa-Electronics/TIREMO-SDK-CLIENT.git",
20
+ "directory": "packages/client-node"
21
+ },
22
+ "publishConfig": {
23
+ "access": "public",
24
+ "registry": "https://registry.npmjs.org"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc -p tsconfig.json",
28
+ "clean": "rm -rf dist",
29
+ "check:build": "tsc -p tsconfig.json --noEmit",
30
+ "lint": "eslint ./src",
31
+ "lint:fix": "eslint --fix ./src",
32
+ "new-version": "npm version patch && git push && git push --tags"
33
+ },
34
+ "license": "ISC",
35
+ "devDependencies": {
36
+ "@eslint/js": "^9.35.0",
37
+ "@types/node": "^22.15.21",
38
+ "eslint": "^9.35.0",
39
+ "typescript": "^5.9.2",
40
+ "typescript-eslint": "^8.42.0"
41
+ }
42
+ }