@nanolink/operational-model 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,60 @@
1
+ # operational-model
2
+
3
+ TypeScript package providing read-only Aerospike repository interfaces and implementations for the tracker domain (states, links, RSSI, GPS, trips, etc.).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install
9
+ ```
10
+
11
+ ## Usage (read-only)
12
+
13
+ ```ts
14
+ import {
15
+ createAerospikeClient,
16
+ createRepositories,
17
+ AerospikeRepositories,
18
+ AerospikeModels,
19
+ } from 'operational_model';
20
+
21
+ async function main() {
22
+ const client = await createAerospikeClient({
23
+ hosts: '127.0.0.1:3000',
24
+ namespace: 'test',
25
+ });
26
+
27
+ const repos = createRepositories({ client, namespace: 'test' });
28
+
29
+ // States by device id
30
+ const states: AerospikeModels.StatesWithId[] = await repos.states.getStates('device-123');
31
+
32
+ // State links by receiver
33
+ const links = await repos.stateLinks.queryByReceiver('receiver-1');
34
+
35
+ // RSSI history for receiver@transmitter
36
+ const rssi = await repos.rssi.queryByKey('receiver-1@tx-9');
37
+
38
+ // GPS with derived speeds
39
+ const gpsWithSpeed = await repos.gps.queryWithSpeed('device-123');
40
+
41
+ console.log({ states, links, rssi, gpsWithSpeed });
42
+
43
+ client.close();
44
+ }
45
+
46
+ main().catch((err) => {
47
+ console.error(err);
48
+ process.exit(1);
49
+ });
50
+ ```
51
+
52
+ ## Scripts
53
+ - Build: `npm run build`
54
+ - Test: `npm test`
55
+ - Lint: `npm run lint`
56
+ - Format: `npm run format`
57
+
58
+ ## Notes
59
+ - The package is read-only: repository implementations do not perform writes or emit events.
60
+ - Uses msgpack for decoding embedded payloads; ensure Aerospike bins match the schema in `spec.md`.
@@ -0,0 +1,14 @@
1
+ export type AerospikeClient = any;
2
+ export type AerospikeConnectionConfig = {
3
+ hosts: string | string[];
4
+ namespace: string;
5
+ user?: string;
6
+ password?: string;
7
+ maxRetries?: number;
8
+ sleepBetweenRetriesMs?: number;
9
+ socketTimeoutMs?: number;
10
+ totalTimeoutMs?: number;
11
+ rawOptions?: Record<string, unknown>;
12
+ };
13
+ export declare function createAerospikeClient(config: AerospikeConnectionConfig): Promise<AerospikeClient>;
14
+ export declare function closeAerospikeClient(client: AerospikeClient): void;
@@ -0,0 +1,22 @@
1
+ import Aerospike from 'aerospike';
2
+ export async function createAerospikeClient(config) {
3
+ const { hosts, user, password, maxRetries = 2, sleepBetweenRetriesMs = 50, socketTimeoutMs = 5000, totalTimeoutMs = 20000, rawOptions = {}, } = config;
4
+ const client = new Aerospike.Client({
5
+ hosts,
6
+ user,
7
+ password,
8
+ maxRetries,
9
+ sleepBetweenRetries: sleepBetweenRetriesMs,
10
+ socketTimeout: socketTimeoutMs,
11
+ totalTimeout: totalTimeoutMs,
12
+ ...rawOptions,
13
+ });
14
+ await client.connect();
15
+ return client;
16
+ }
17
+ export function closeAerospikeClient(client) {
18
+ if (client && typeof client.close === 'function') {
19
+ client.close();
20
+ }
21
+ }
22
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/aerospike/client.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,WAAW,CAAC;AAiBlC,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAiC;IAC3E,MAAM,EACJ,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,UAAU,GAAG,CAAC,EACd,qBAAqB,GAAG,EAAE,EAC1B,eAAe,GAAG,IAAI,EACtB,cAAc,GAAG,KAAK,EACtB,UAAU,GAAG,EAAE,GAChB,GAAG,MAAM,CAAC;IAEX,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC;QAClC,KAAK;QACL,IAAI;QACJ,QAAQ;QACR,UAAU;QACV,mBAAmB,EAAE,qBAAqB;QAC1C,aAAa,EAAE,eAAe;QAC9B,YAAY,EAAE,cAAc;QAC5B,GAAG,UAAU;KACd,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;IACvB,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAuB;IAC1D,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACjD,MAAM,CAAC,KAAK,EAAE,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { StatesWithId, StateLinkWithId, ClosedLinkWithId, RSSIWithId, DeltaRSSIWithId, GPSPositionWithId, TripWithId, StateTripWithId, ContainedWithId, TransmitterPositionWithId } from './models';
2
+ import { StatesRepository, StateLinkRepository, ClosedLinkRepository, RSSIRepository, DeltaRSSIRepository, GPSRepository, TripRepository, StateTripRepository, ContainedRepository, TransmitterPositionRepository } from './repositories';
3
+ type AerospikeClient = any;
4
+ export declare class StatesRepositoryImpl implements StatesRepository {
5
+ private client;
6
+ private namespace;
7
+ constructor(client: AerospikeClient, namespace: string);
8
+ getStates(id: string): Promise<StatesWithId[]>;
9
+ streamStates(id: string): AsyncGenerator<StatesWithId>;
10
+ }
11
+ export declare class StateLinkRepositoryImpl implements StateLinkRepository {
12
+ private client;
13
+ private namespace;
14
+ constructor(client: AerospikeClient, namespace: string);
15
+ queryByReceiver(receiverId: string): Promise<StateLinkWithId[]>;
16
+ queryByTransmitter(transmitterId: string): Promise<StateLinkWithId[]>;
17
+ uniqueTransmitters(receiverId: string): Promise<string[]>;
18
+ streamByReceiver(receiverId: string): AsyncGenerator<StateLinkWithId>;
19
+ streamByTransmitter(transmitterId: string): AsyncGenerator<StateLinkWithId>;
20
+ }
21
+ export declare class ClosedLinkRepositoryImpl implements ClosedLinkRepository {
22
+ private client;
23
+ private namespace;
24
+ constructor(client: AerospikeClient, namespace: string);
25
+ queryByKey(receiverTransmitter: string): Promise<ClosedLinkWithId[]>;
26
+ queryByReceiver(receiverId: string): Promise<ClosedLinkWithId[]>;
27
+ queryByTransmitter(transmitterId: string): Promise<ClosedLinkWithId[]>;
28
+ countByReceiver(receiverId: string): Promise<number>;
29
+ countByTransmitter(transmitterId: string): Promise<number>;
30
+ uniqueTransmitters(receiverId: string): Promise<string[]>;
31
+ streamByKey(receiverTransmitter: string): AsyncGenerator<ClosedLinkWithId>;
32
+ streamByReceiver(receiverId: string): AsyncGenerator<ClosedLinkWithId>;
33
+ streamByTransmitter(transmitterId: string): AsyncGenerator<ClosedLinkWithId>;
34
+ }
35
+ export declare class RSSIRepositoryImpl implements RSSIRepository {
36
+ private client;
37
+ private namespace;
38
+ constructor(client: AerospikeClient, namespace: string);
39
+ queryByKey(receiverTransmitter: string): Promise<RSSIWithId[]>;
40
+ queryByTransmitter(transmitterId: string): Promise<RSSIWithId[]>;
41
+ queryAll(): Promise<RSSIWithId[]>;
42
+ streamByKey(receiverTransmitter: string): AsyncGenerator<RSSIWithId>;
43
+ streamByTransmitter(transmitterId: string): AsyncGenerator<RSSIWithId>;
44
+ streamAll(): AsyncGenerator<RSSIWithId>;
45
+ }
46
+ export declare class DeltaRSSIRepositoryImpl implements DeltaRSSIRepository {
47
+ private client;
48
+ private namespace;
49
+ constructor(client: AerospikeClient, namespace: string);
50
+ queryByKey(receiverTransmitter: string): Promise<DeltaRSSIWithId[]>;
51
+ queryByLink(receiverTransmitter: string, linkStart: number): Promise<DeltaRSSIWithId[]>;
52
+ streamByKey(receiverTransmitter: string): AsyncGenerator<DeltaRSSIWithId>;
53
+ streamByLink(receiverTransmitter: string, linkStart: number): AsyncGenerator<DeltaRSSIWithId>;
54
+ }
55
+ export declare class GPSRepositoryImpl implements GPSRepository {
56
+ private client;
57
+ private namespace;
58
+ constructor(client: AerospikeClient, namespace: string);
59
+ queryById(id: string): Promise<GPSPositionWithId[]>;
60
+ queryWithSpeed(id: string): Promise<Array<{
61
+ position: GPSPositionWithId;
62
+ speed: number;
63
+ dist: number;
64
+ dt: number;
65
+ }>>;
66
+ streamById(id: string): AsyncGenerator<GPSPositionWithId>;
67
+ }
68
+ export declare class TripRepositoryImpl implements TripRepository {
69
+ private client;
70
+ private namespace;
71
+ constructor(client: AerospikeClient, namespace: string);
72
+ queryById(id: string): Promise<TripWithId[]>;
73
+ streamById(id: string): AsyncGenerator<TripWithId>;
74
+ }
75
+ export declare class StateTripRepositoryImpl implements StateTripRepository {
76
+ private client;
77
+ private namespace;
78
+ constructor(client: AerospikeClient, namespace: string);
79
+ queryById(id: string): Promise<StateTripWithId | null>;
80
+ }
81
+ export declare class ContainedRepositoryImpl implements ContainedRepository {
82
+ private client;
83
+ private namespace;
84
+ constructor(client: AerospikeClient, namespace: string);
85
+ queryByKey(receiverTransmitter: string): Promise<ContainedWithId[]>;
86
+ queryByTransmitter(transmitterId: string): Promise<ContainedWithId[]>;
87
+ queryByReceiver(receiverId: string): Promise<ContainedWithId[]>;
88
+ streamByKey(receiverTransmitter: string): AsyncGenerator<ContainedWithId>;
89
+ streamByTransmitter(transmitterId: string): AsyncGenerator<ContainedWithId>;
90
+ streamByReceiver(receiverId: string): AsyncGenerator<ContainedWithId>;
91
+ }
92
+ export declare class TransmitterPositionRepositoryImpl implements TransmitterPositionRepository {
93
+ private client;
94
+ private namespace;
95
+ constructor(client: AerospikeClient, namespace: string);
96
+ get(id: string): Promise<TransmitterPositionWithId | null>;
97
+ }
98
+ export type RepositoryFactoryOptions = {
99
+ client: AerospikeClient;
100
+ namespace: string;
101
+ };
102
+ export declare function createRepositories(opts: RepositoryFactoryOptions): {
103
+ states: StatesRepositoryImpl;
104
+ stateLinks: StateLinkRepositoryImpl;
105
+ closedLinks: ClosedLinkRepositoryImpl;
106
+ rssi: RSSIRepositoryImpl;
107
+ deltaRssi: DeltaRSSIRepositoryImpl;
108
+ gps: GPSRepositoryImpl;
109
+ trips: TripRepositoryImpl;
110
+ stateTrips: StateTripRepositoryImpl;
111
+ contained: ContainedRepositoryImpl;
112
+ transmitterPos: TransmitterPositionRepositoryImpl;
113
+ };
114
+ export {};
@@ -0,0 +1,565 @@
1
+ import * as Aerospike from 'aerospike';
2
+ import { decode as msgpackDecode } from '@msgpack/msgpack';
3
+ const toKey = (namespace, set, userKey) => new Aerospike.Key(namespace, set, userKey);
4
+ async function streamQuery(client, namespace, setName, where) {
5
+ const query = client.query(namespace, setName);
6
+ if (where) {
7
+ query.where(where);
8
+ }
9
+ return new Promise((resolve, reject) => {
10
+ const results = [];
11
+ const stream = query.foreach();
12
+ stream.on('data', (record) => results.push(record));
13
+ stream.on('error', (err) => reject(err));
14
+ stream.on('end', () => resolve(results));
15
+ });
16
+ }
17
+ async function* streamQueryGenerator(client, namespace, setName, where, map) {
18
+ const query = client.query(namespace, setName);
19
+ if (where) {
20
+ query.where(where);
21
+ }
22
+ const buffer = [];
23
+ let ended = false;
24
+ let error;
25
+ const stream = query.foreach();
26
+ stream.on('data', (record) => {
27
+ const mapped = map(record);
28
+ if (mapped !== null) {
29
+ buffer.push(mapped);
30
+ }
31
+ });
32
+ stream.on('error', (err) => {
33
+ error = err;
34
+ ended = true;
35
+ });
36
+ stream.on('end', () => {
37
+ ended = true;
38
+ });
39
+ while (!ended || buffer.length > 0) {
40
+ if (buffer.length > 0) {
41
+ yield buffer.shift();
42
+ continue;
43
+ }
44
+ if (error) {
45
+ throw error;
46
+ }
47
+ await new Promise((res) => setTimeout(res, 10));
48
+ }
49
+ if (error) {
50
+ throw error;
51
+ }
52
+ }
53
+ function decodeMsgpack(value) {
54
+ if (!value)
55
+ return null;
56
+ try {
57
+ if (value instanceof Uint8Array) {
58
+ return msgpackDecode(value);
59
+ }
60
+ if (Buffer.isBuffer(value)) {
61
+ return msgpackDecode(value);
62
+ }
63
+ return msgpackDecode(Uint8Array.from(value));
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ }
69
+ function asNumber(value) {
70
+ if (typeof value === 'number')
71
+ return value;
72
+ if (typeof value === 'string') {
73
+ const parsed = Number(value);
74
+ return Number.isNaN(parsed) ? undefined : parsed;
75
+ }
76
+ return undefined;
77
+ }
78
+ function decodeGPSPosition(raw) {
79
+ if (!raw)
80
+ return undefined;
81
+ if (Array.isArray(raw)) {
82
+ const [stamp, lon, lat, alt, speed, bearing, accuracy] = raw;
83
+ return {
84
+ stamp: asNumber(stamp) ?? 0,
85
+ longitude: asNumber(lon) ?? 0,
86
+ latitude: asNumber(lat) ?? 0,
87
+ altitude: alt == null ? undefined : asNumber(alt),
88
+ speed: speed == null ? undefined : asNumber(speed),
89
+ bearing: bearing == null ? undefined : asNumber(bearing),
90
+ accuracy: accuracy == null ? undefined : asNumber(accuracy),
91
+ };
92
+ }
93
+ return {
94
+ stamp: asNumber(raw.stamp ?? raw.Stamp) ?? 0,
95
+ longitude: asNumber(raw.longitude ?? raw.Longitude) ?? 0,
96
+ latitude: asNumber(raw.latitude ?? raw.Latitude) ?? 0,
97
+ altitude: raw.altitude ?? raw.Altitude,
98
+ speed: raw.speed ?? raw.Speed,
99
+ bearing: raw.bearing ?? raw.Bearing,
100
+ accuracy: raw.accuracy ?? raw.Accuracy,
101
+ };
102
+ }
103
+ function decodeTrip(raw) {
104
+ const start = decodeGPSPosition(raw?.startGPS ?? raw?.StartGPS);
105
+ const end = decodeGPSPosition(raw?.endGPS ?? raw?.EndGPS);
106
+ return {
107
+ startGPS: start,
108
+ endGPS: end,
109
+ distance: asNumber(raw?.distance ?? raw?.Distance) ?? 0,
110
+ completed: Boolean(raw?.completed ?? raw?.Completed),
111
+ };
112
+ }
113
+ function decodeStateTrip(raw) {
114
+ if (!raw)
115
+ return null;
116
+ const start = decodeGPSPosition(raw?.startGPS ?? raw?.StartGPS);
117
+ const end = decodeGPSPosition(raw?.endGPS ?? raw?.EndGPS);
118
+ return {
119
+ id: raw.id ?? raw.Id ?? '',
120
+ startGPS: start,
121
+ endGPS: end,
122
+ distance: asNumber(raw?.distance ?? raw?.Distance) ?? 0,
123
+ version: raw?.version ?? raw?.Version,
124
+ completed: Boolean(raw?.completed ?? raw?.Completed),
125
+ deleted: Boolean(raw?.deleted ?? raw?.Deleted),
126
+ };
127
+ }
128
+ function decodeStates(record) {
129
+ const bins = record.bins;
130
+ const stamp = asNumber(bins.stamp) ?? 0;
131
+ const idValue = bins.id;
132
+ const id = typeof idValue === 'string' ? idValue : idValue != null ? String(idValue) : '';
133
+ const boolProperties = {};
134
+ const intProperties = {};
135
+ const floatProperties = {};
136
+ const stringProperties = {};
137
+ const longProperties = {};
138
+ const enumProperties = {};
139
+ for (const [key, value] of Object.entries(bins)) {
140
+ if (key === 'id' || key === 'stamp')
141
+ continue;
142
+ if (!/^\d+$/.test(key))
143
+ continue;
144
+ const field = Number(key);
145
+ if (typeof value === 'boolean') {
146
+ boolProperties[field] = value;
147
+ continue;
148
+ }
149
+ if (typeof value === 'string') {
150
+ stringProperties[field] = value;
151
+ continue;
152
+ }
153
+ const num = asNumber(value);
154
+ if (num == null)
155
+ continue;
156
+ if (!Number.isInteger(num)) {
157
+ floatProperties[field] = num;
158
+ }
159
+ else if (Math.abs(num) > 0x7fffffff) {
160
+ longProperties[field] = num;
161
+ }
162
+ else {
163
+ intProperties[field] = num;
164
+ }
165
+ // enumProperties are left empty unless a distinct mapping is needed
166
+ }
167
+ return {
168
+ id,
169
+ stamp,
170
+ boolProperties: Object.keys(boolProperties).length ? boolProperties : undefined,
171
+ intProperties: Object.keys(intProperties).length ? intProperties : undefined,
172
+ floatProperties: Object.keys(floatProperties).length ? floatProperties : undefined,
173
+ stringProperties: Object.keys(stringProperties).length ? stringProperties : undefined,
174
+ longProperties: Object.keys(longProperties).length ? longProperties : undefined,
175
+ enumProperties: Object.keys(enumProperties).length ? enumProperties : undefined,
176
+ };
177
+ }
178
+ function decodeStateLink(record) {
179
+ const b = record.bins;
180
+ return {
181
+ receiverId: b.r,
182
+ transmitterId: b.t,
183
+ stamp: asNumber(b.stamp) ?? 0,
184
+ lastUpdated: asNumber(b.l) ?? 0,
185
+ rssi: asNumber(b.rs) ?? 0,
186
+ version: b.v ? Buffer.from(b.v).toString('hex') : undefined,
187
+ closed: Boolean(b.c),
188
+ };
189
+ }
190
+ function decodeClosedLink(record) {
191
+ const b = record.bins;
192
+ return {
193
+ receiverId: b.r,
194
+ transmitterId: b.t,
195
+ start: asNumber(b.stamp) ?? 0,
196
+ end: asNumber(b.v) ?? 0,
197
+ };
198
+ }
199
+ function decodeRSSI(record) {
200
+ const b = record.bins;
201
+ return {
202
+ receiverId: b.r,
203
+ transmitterId: b.t,
204
+ stamp: asNumber(b.stamp) ?? 0,
205
+ value: asNumber(b.v) ?? 0,
206
+ };
207
+ }
208
+ function decodeDeltaRSSI(record) {
209
+ const b = record.bins;
210
+ return {
211
+ receiverId: b.r,
212
+ transmitterId: b.t,
213
+ stamp: asNumber(b.stamp) ?? 0,
214
+ value: asNumber(b.v) ?? 0,
215
+ linkStart: asNumber(b.l) ?? 0,
216
+ };
217
+ }
218
+ function decodeContained(record) {
219
+ const b = record.bins;
220
+ return {
221
+ receiverId: b.r,
222
+ transmitterId: b.t,
223
+ start: asNumber(b.st) ?? 0,
224
+ end: asNumber(b.en) ?? 0,
225
+ };
226
+ }
227
+ function decodeGPSRecord(record) {
228
+ const b = record.bins;
229
+ const gpsRaw = decodeMsgpack(b.v) ?? b.v;
230
+ const gps = decodeGPSPosition(gpsRaw);
231
+ if (!gps)
232
+ return null;
233
+ gps.stamp = asNumber(b.stamp) ?? gps.stamp;
234
+ return {
235
+ id: b.id,
236
+ ...gps,
237
+ };
238
+ }
239
+ function decodeTripRecord(record) {
240
+ const b = record.bins;
241
+ const tripRaw = decodeMsgpack(b.v) ?? b.v;
242
+ if (!tripRaw)
243
+ return null;
244
+ const trip = decodeTrip(tripRaw);
245
+ return {
246
+ id: b.id,
247
+ ...trip,
248
+ };
249
+ }
250
+ function decodeStateTripRecord(record) {
251
+ const b = record.bins;
252
+ const tripRaw = decodeMsgpack(b.v) ?? b.v;
253
+ if (!tripRaw)
254
+ return null;
255
+ const parsed = decodeStateTrip({ ...tripRaw, id: b.id });
256
+ return parsed;
257
+ }
258
+ function decodeTransmitterPosition(record) {
259
+ const b = record.bins;
260
+ const raw = decodeMsgpack(b.v) ?? b.v;
261
+ if (!raw)
262
+ return null;
263
+ const gps = decodeGPSPosition(raw.gps ?? raw.GPSPosition ?? raw.gpsPosition);
264
+ return {
265
+ id: b.id ?? raw.id ?? raw.Id ?? '',
266
+ receiverId: raw.receiverId ?? raw.ReceiverId ?? '',
267
+ gps: gps ?? { stamp: 0, latitude: 0, longitude: 0 },
268
+ };
269
+ }
270
+ function sortByStampAscending(items) {
271
+ return [...items].sort((a, b) => (a.stamp ?? 0) - (b.stamp ?? 0));
272
+ }
273
+ function haversineMeters(a, b) {
274
+ const toRad = (deg) => (deg * Math.PI) / 180;
275
+ const R = 6371000;
276
+ const dLat = toRad((b.latitude ?? 0) - (a.latitude ?? 0));
277
+ const dLon = toRad((b.longitude ?? 0) - (a.longitude ?? 0));
278
+ const lat1 = toRad(a.latitude ?? 0);
279
+ const lat2 = toRad(b.latitude ?? 0);
280
+ const sinDLat = Math.sin(dLat / 2);
281
+ const sinDLon = Math.sin(dLon / 2);
282
+ const h = sinDLat * sinDLat + Math.cos(lat1) * Math.cos(lat2) * sinDLon * sinDLon;
283
+ const c = 2 * Math.atan2(Math.sqrt(h), Math.sqrt(1 - h));
284
+ return R * c;
285
+ }
286
+ export class StatesRepositoryImpl {
287
+ constructor(client, namespace) {
288
+ this.client = client;
289
+ this.namespace = namespace;
290
+ }
291
+ async getStates(id) {
292
+ const where = Aerospike.filter.equal('id', id);
293
+ const records = await streamQuery(this.client, this.namespace, 'rpkg_states', where);
294
+ const states = records.map(decodeStates);
295
+ return sortByStampAscending(states);
296
+ }
297
+ streamStates(id) {
298
+ const where = Aerospike.filter.equal('id', id);
299
+ return streamQueryGenerator(this.client, this.namespace, 'rpkg_states', where, (r) => decodeStates(r));
300
+ }
301
+ }
302
+ export class StateLinkRepositoryImpl {
303
+ constructor(client, namespace) {
304
+ this.client = client;
305
+ this.namespace = namespace;
306
+ }
307
+ async queryByReceiver(receiverId) {
308
+ const where = Aerospike.filter.equal('r', receiverId);
309
+ const records = await streamQuery(this.client, this.namespace, 'statelink', where);
310
+ return records.map(decodeStateLink);
311
+ }
312
+ async queryByTransmitter(transmitterId) {
313
+ const where = Aerospike.filter.equal('t', transmitterId);
314
+ const records = await streamQuery(this.client, this.namespace, 'statelink', where);
315
+ return records.map(decodeStateLink);
316
+ }
317
+ async uniqueTransmitters(receiverId) {
318
+ const items = await this.queryByReceiver(receiverId);
319
+ return Array.from(new Set(items.map((x) => x.transmitterId)));
320
+ }
321
+ streamByReceiver(receiverId) {
322
+ const where = Aerospike.filter.equal('r', receiverId);
323
+ return streamQueryGenerator(this.client, this.namespace, 'statelink', where, decodeStateLink);
324
+ }
325
+ streamByTransmitter(transmitterId) {
326
+ const where = Aerospike.filter.equal('t', transmitterId);
327
+ return streamQueryGenerator(this.client, this.namespace, 'statelink', where, decodeStateLink);
328
+ }
329
+ }
330
+ export class ClosedLinkRepositoryImpl {
331
+ constructor(client, namespace) {
332
+ this.client = client;
333
+ this.namespace = namespace;
334
+ }
335
+ async queryByKey(receiverTransmitter) {
336
+ const where = Aerospike.filter.equal('rt', receiverTransmitter);
337
+ const records = await streamQuery(this.client, this.namespace, 'lp_closed', where);
338
+ return records.map(decodeClosedLink);
339
+ }
340
+ async queryByReceiver(receiverId) {
341
+ const where = Aerospike.filter.equal('r', receiverId);
342
+ const records = await streamQuery(this.client, this.namespace, 'lp_closed', where);
343
+ return records.map(decodeClosedLink);
344
+ }
345
+ async queryByTransmitter(transmitterId) {
346
+ const where = Aerospike.filter.equal('t', transmitterId);
347
+ const records = await streamQuery(this.client, this.namespace, 'lp_closed', where);
348
+ return records.map(decodeClosedLink);
349
+ }
350
+ async countByReceiver(receiverId) {
351
+ const items = await this.queryByReceiver(receiverId);
352
+ return items.length;
353
+ }
354
+ async countByTransmitter(transmitterId) {
355
+ const items = await this.queryByTransmitter(transmitterId);
356
+ return items.length;
357
+ }
358
+ async uniqueTransmitters(receiverId) {
359
+ const items = await this.queryByReceiver(receiverId);
360
+ return Array.from(new Set(items.map((x) => x.transmitterId)));
361
+ }
362
+ streamByKey(receiverTransmitter) {
363
+ const where = Aerospike.filter.equal('rt', receiverTransmitter);
364
+ return streamQueryGenerator(this.client, this.namespace, 'lp_closed', where, decodeClosedLink);
365
+ }
366
+ streamByReceiver(receiverId) {
367
+ const where = Aerospike.filter.equal('r', receiverId);
368
+ return streamQueryGenerator(this.client, this.namespace, 'lp_closed', where, decodeClosedLink);
369
+ }
370
+ streamByTransmitter(transmitterId) {
371
+ const where = Aerospike.filter.equal('t', transmitterId);
372
+ return streamQueryGenerator(this.client, this.namespace, 'lp_closed', where, decodeClosedLink);
373
+ }
374
+ }
375
+ export class RSSIRepositoryImpl {
376
+ constructor(client, namespace) {
377
+ this.client = client;
378
+ this.namespace = namespace;
379
+ }
380
+ async queryByKey(receiverTransmitter) {
381
+ const where = Aerospike.filter.equal('rt', receiverTransmitter);
382
+ const records = await streamQuery(this.client, this.namespace, 'rpkg_rssi', where);
383
+ return sortByStampAscending(records.map(decodeRSSI));
384
+ }
385
+ async queryByTransmitter(transmitterId) {
386
+ const where = Aerospike.filter.equal('t', transmitterId);
387
+ const records = await streamQuery(this.client, this.namespace, 'rpkg_rssi', where);
388
+ return sortByStampAscending(records.map(decodeRSSI));
389
+ }
390
+ async queryAll() {
391
+ const records = await streamQuery(this.client, this.namespace, 'rpkg_rssi');
392
+ return sortByStampAscending(records.map(decodeRSSI));
393
+ }
394
+ streamByKey(receiverTransmitter) {
395
+ const where = Aerospike.filter.equal('rt', receiverTransmitter);
396
+ return streamQueryGenerator(this.client, this.namespace, 'rpkg_rssi', where, decodeRSSI);
397
+ }
398
+ streamByTransmitter(transmitterId) {
399
+ const where = Aerospike.filter.equal('t', transmitterId);
400
+ return streamQueryGenerator(this.client, this.namespace, 'rpkg_rssi', where, decodeRSSI);
401
+ }
402
+ streamAll() {
403
+ return streamQueryGenerator(this.client, this.namespace, 'rpkg_rssi', undefined, decodeRSSI);
404
+ }
405
+ }
406
+ export class DeltaRSSIRepositoryImpl {
407
+ constructor(client, namespace) {
408
+ this.client = client;
409
+ this.namespace = namespace;
410
+ }
411
+ async queryByKey(receiverTransmitter) {
412
+ const where = Aerospike.filter.equal('rt', receiverTransmitter);
413
+ const records = await streamQuery(this.client, this.namespace, 'delta_rssi', where);
414
+ return sortByStampAscending(records.map(decodeDeltaRSSI));
415
+ }
416
+ async queryByLink(receiverTransmitter, linkStart) {
417
+ const lrt = `${receiverTransmitter}@${linkStart}`;
418
+ const where = Aerospike.filter.equal('lrt', lrt);
419
+ const records = await streamQuery(this.client, this.namespace, 'delta_rssi', where);
420
+ return sortByStampAscending(records.map(decodeDeltaRSSI));
421
+ }
422
+ streamByKey(receiverTransmitter) {
423
+ const where = Aerospike.filter.equal('rt', receiverTransmitter);
424
+ return streamQueryGenerator(this.client, this.namespace, 'delta_rssi', where, decodeDeltaRSSI);
425
+ }
426
+ streamByLink(receiverTransmitter, linkStart) {
427
+ const lrt = `${receiverTransmitter}@${linkStart}`;
428
+ const where = Aerospike.filter.equal('lrt', lrt);
429
+ return streamQueryGenerator(this.client, this.namespace, 'delta_rssi', where, decodeDeltaRSSI);
430
+ }
431
+ }
432
+ export class GPSRepositoryImpl {
433
+ constructor(client, namespace) {
434
+ this.client = client;
435
+ this.namespace = namespace;
436
+ }
437
+ async queryById(id) {
438
+ const where = Aerospike.filter.equal('id', id);
439
+ const records = await streamQuery(this.client, this.namespace, 'rpkg_gps', where);
440
+ const decoded = records
441
+ .map(decodeGPSRecord)
442
+ .filter((x) => x !== null);
443
+ return sortByStampAscending(decoded);
444
+ }
445
+ async queryWithSpeed(id) {
446
+ const positions = await this.queryById(id);
447
+ const result = [];
448
+ for (let i = 0; i < positions.length - 1; i++) {
449
+ const a = positions[i];
450
+ const b = positions[i + 1];
451
+ const dist = haversineMeters(a, b);
452
+ const dt = Math.max(1, (b.stamp ?? 0) - (a.stamp ?? 0));
453
+ const speed = dist / dt;
454
+ result.push({ position: a, speed, dist, dt });
455
+ }
456
+ return result;
457
+ }
458
+ streamById(id) {
459
+ const where = Aerospike.filter.equal('id', id);
460
+ return streamQueryGenerator(this.client, this.namespace, 'rpkg_gps', where, (rec) => decodeGPSRecord(rec));
461
+ }
462
+ }
463
+ export class TripRepositoryImpl {
464
+ constructor(client, namespace) {
465
+ this.client = client;
466
+ this.namespace = namespace;
467
+ }
468
+ async queryById(id) {
469
+ const where = Aerospike.filter.equal('id', id);
470
+ const records = await streamQuery(this.client, this.namespace, 'trips', where);
471
+ const trips = records
472
+ .map(decodeTripRecord)
473
+ .filter((x) => x !== null);
474
+ return trips.sort((a, b) => (a.startGPS?.stamp ?? 0) - (b.startGPS?.stamp ?? 0));
475
+ }
476
+ streamById(id) {
477
+ const where = Aerospike.filter.equal('id', id);
478
+ return streamQueryGenerator(this.client, this.namespace, 'trips', where, (rec) => decodeTripRecord(rec));
479
+ }
480
+ }
481
+ export class StateTripRepositoryImpl {
482
+ constructor(client, namespace) {
483
+ this.client = client;
484
+ this.namespace = namespace;
485
+ }
486
+ async queryById(id) {
487
+ try {
488
+ const key = toKey(this.namespace, 'statetrip', id);
489
+ const record = await this.client.get(key);
490
+ return decodeStateTripRecord(record) ?? null;
491
+ }
492
+ catch (err) {
493
+ if (err && err.code === Aerospike.status.ERR_RECORD_NOT_FOUND)
494
+ return null;
495
+ throw err;
496
+ }
497
+ }
498
+ }
499
+ export class ContainedRepositoryImpl {
500
+ constructor(client, namespace) {
501
+ this.client = client;
502
+ this.namespace = namespace;
503
+ }
504
+ async queryByKey(receiverTransmitter) {
505
+ const where = Aerospike.filter.equal('rt', receiverTransmitter);
506
+ const records = await streamQuery(this.client, this.namespace, 'contained', where);
507
+ return records.map(decodeContained);
508
+ }
509
+ async queryByTransmitter(transmitterId) {
510
+ const where = Aerospike.filter.equal('t', transmitterId);
511
+ const records = await streamQuery(this.client, this.namespace, 'contained', where);
512
+ return records.map(decodeContained);
513
+ }
514
+ async queryByReceiver(receiverId) {
515
+ const where = Aerospike.filter.equal('r', receiverId);
516
+ const records = await streamQuery(this.client, this.namespace, 'contained', where);
517
+ return records.map(decodeContained);
518
+ }
519
+ streamByKey(receiverTransmitter) {
520
+ const where = Aerospike.filter.equal('rt', receiverTransmitter);
521
+ return streamQueryGenerator(this.client, this.namespace, 'contained', where, decodeContained);
522
+ }
523
+ streamByTransmitter(transmitterId) {
524
+ const where = Aerospike.filter.equal('t', transmitterId);
525
+ return streamQueryGenerator(this.client, this.namespace, 'contained', where, decodeContained);
526
+ }
527
+ streamByReceiver(receiverId) {
528
+ const where = Aerospike.filter.equal('r', receiverId);
529
+ return streamQueryGenerator(this.client, this.namespace, 'contained', where, decodeContained);
530
+ }
531
+ }
532
+ export class TransmitterPositionRepositoryImpl {
533
+ constructor(client, namespace) {
534
+ this.client = client;
535
+ this.namespace = namespace;
536
+ }
537
+ async get(id) {
538
+ try {
539
+ const key = toKey(this.namespace, 'transmitterpos', id);
540
+ const record = await this.client.get(key);
541
+ return decodeTransmitterPosition(record);
542
+ }
543
+ catch (err) {
544
+ if (err && err.code === Aerospike.status.ERR_RECORD_NOT_FOUND)
545
+ return null;
546
+ throw err;
547
+ }
548
+ }
549
+ }
550
+ export function createRepositories(opts) {
551
+ const { client, namespace } = opts;
552
+ return {
553
+ states: new StatesRepositoryImpl(client, namespace),
554
+ stateLinks: new StateLinkRepositoryImpl(client, namespace),
555
+ closedLinks: new ClosedLinkRepositoryImpl(client, namespace),
556
+ rssi: new RSSIRepositoryImpl(client, namespace),
557
+ deltaRssi: new DeltaRSSIRepositoryImpl(client, namespace),
558
+ gps: new GPSRepositoryImpl(client, namespace),
559
+ trips: new TripRepositoryImpl(client, namespace),
560
+ stateTrips: new StateTripRepositoryImpl(client, namespace),
561
+ contained: new ContainedRepositoryImpl(client, namespace),
562
+ transmitterPos: new TransmitterPositionRepositoryImpl(client, namespace),
563
+ };
564
+ }
565
+ //# sourceMappingURL=impl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"impl.js","sourceRoot":"","sources":["../../src/aerospike/impl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ export type States = {
2
+ stamp: number;
3
+ boolProperties?: Record<number, boolean>;
4
+ intProperties?: Record<number, number>;
5
+ floatProperties?: Record<number, number>;
6
+ stringProperties?: Record<number, string>;
7
+ longProperties?: Record<number, number>;
8
+ enumProperties?: Record<number, number>;
9
+ };
10
+ export type StatesWithId = States & {
11
+ id: string;
12
+ };
13
+ export type StateLink = {
14
+ stamp: number;
15
+ lastUpdated: number;
16
+ rssi: number;
17
+ version?: string;
18
+ closed: boolean;
19
+ };
20
+ export type StateLinkWithId = StateLink & {
21
+ receiverId: string;
22
+ transmitterId: string;
23
+ };
24
+ export type ClosedLink = {
25
+ start: number;
26
+ end: number;
27
+ };
28
+ export type ClosedLinkWithId = ClosedLink & {
29
+ receiverId: string;
30
+ transmitterId: string;
31
+ };
32
+ export type RSSI = {
33
+ stamp: number;
34
+ value: number;
35
+ };
36
+ export type RSSIWithId = RSSI & {
37
+ receiverId: string;
38
+ transmitterId: string;
39
+ };
40
+ export type DeltaRSSI = {
41
+ stamp: number;
42
+ value: number;
43
+ linkStart: number;
44
+ };
45
+ export type DeltaRSSIWithId = DeltaRSSI & {
46
+ receiverId: string;
47
+ transmitterId: string;
48
+ };
49
+ export type GPSPosition = {
50
+ stamp: number;
51
+ longitude: number;
52
+ latitude: number;
53
+ altitude?: number | null;
54
+ speed?: number | null;
55
+ bearing?: number | null;
56
+ accuracy?: number | null;
57
+ };
58
+ export type GPSPositionWithId = GPSPosition & {
59
+ id: string;
60
+ };
61
+ export type Trip = {
62
+ startGPS?: GPSPosition;
63
+ endGPS?: GPSPosition;
64
+ distance: number;
65
+ completed: boolean;
66
+ };
67
+ export type TripWithId = Trip & {
68
+ id: string;
69
+ };
70
+ export type StateTrip = {
71
+ startGPS?: GPSPosition;
72
+ endGPS?: GPSPosition;
73
+ distance: number;
74
+ version?: string;
75
+ completed: boolean;
76
+ deleted: boolean;
77
+ };
78
+ export type StateTripWithId = StateTrip & {
79
+ id: string;
80
+ };
81
+ export type Contained = {
82
+ start: number;
83
+ end: number;
84
+ };
85
+ export type ContainedWithId = Contained & {
86
+ receiverId: string;
87
+ transmitterId: string;
88
+ };
89
+ export type TransmitterPosition = {
90
+ receiverId: string;
91
+ gps: GPSPosition;
92
+ };
93
+ export type TransmitterPositionWithId = TransmitterPosition & {
94
+ id: string;
95
+ };
96
+ export type TimeRange = {
97
+ start: number;
98
+ end: number;
99
+ };
@@ -0,0 +1,3 @@
1
+ // Domain models mirrored from the contract (read-only views)
2
+ export {};
3
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/aerospike/models.ts"],"names":[],"mappings":"AAAA,6DAA6D"}
@@ -0,0 +1,77 @@
1
+ import { StatesWithId, StateLinkWithId, ClosedLinkWithId, RSSIWithId, DeltaRSSIWithId, GPSPositionWithId, TripWithId, StateTripWithId, ContainedWithId, TransmitterPositionWithId } from './models';
2
+ export interface StatesRepository {
3
+ getStates(id: string): Promise<StatesWithId[]>;
4
+ streamStates(id: string): AsyncGenerator<StatesWithId>;
5
+ }
6
+ export interface StateLinkRepository {
7
+ queryByReceiver(receiverId: string): Promise<StateLinkWithId[]>;
8
+ queryByTransmitter(transmitterId: string): Promise<StateLinkWithId[]>;
9
+ uniqueTransmitters(receiverId: string): Promise<string[]>;
10
+ streamByReceiver(receiverId: string): AsyncGenerator<StateLinkWithId>;
11
+ streamByTransmitter(transmitterId: string): AsyncGenerator<StateLinkWithId>;
12
+ }
13
+ export interface ClosedLinkRepository {
14
+ queryByKey(receiverTransmitter: string): Promise<ClosedLinkWithId[]>;
15
+ queryByReceiver(receiverId: string): Promise<ClosedLinkWithId[]>;
16
+ queryByTransmitter(transmitterId: string): Promise<ClosedLinkWithId[]>;
17
+ countByReceiver(receiverId: string): Promise<number>;
18
+ countByTransmitter(transmitterId: string): Promise<number>;
19
+ uniqueTransmitters(receiverId: string): Promise<string[]>;
20
+ streamByKey(receiverTransmitter: string): AsyncGenerator<ClosedLinkWithId>;
21
+ streamByReceiver(receiverId: string): AsyncGenerator<ClosedLinkWithId>;
22
+ streamByTransmitter(transmitterId: string): AsyncGenerator<ClosedLinkWithId>;
23
+ }
24
+ export interface RSSIRepository {
25
+ queryByKey(receiverTransmitter: string): Promise<RSSIWithId[]>;
26
+ queryByTransmitter(transmitterId: string): Promise<RSSIWithId[]>;
27
+ queryAll(): Promise<RSSIWithId[]>;
28
+ streamByKey(receiverTransmitter: string): AsyncGenerator<RSSIWithId>;
29
+ streamByTransmitter(transmitterId: string): AsyncGenerator<RSSIWithId>;
30
+ streamAll(): AsyncGenerator<RSSIWithId>;
31
+ }
32
+ export interface DeltaRSSIRepository {
33
+ queryByKey(receiverTransmitter: string): Promise<DeltaRSSIWithId[]>;
34
+ queryByLink(receiverTransmitter: string, linkStart: number): Promise<DeltaRSSIWithId[]>;
35
+ streamByKey(receiverTransmitter: string): AsyncGenerator<DeltaRSSIWithId>;
36
+ streamByLink(receiverTransmitter: string, linkStart: number): AsyncGenerator<DeltaRSSIWithId>;
37
+ }
38
+ export interface GPSRepository {
39
+ queryById(id: string): Promise<GPSPositionWithId[]>;
40
+ queryWithSpeed(id: string): Promise<Array<{
41
+ position: GPSPositionWithId;
42
+ speed: number;
43
+ dist: number;
44
+ dt: number;
45
+ }>>;
46
+ streamById(id: string): AsyncGenerator<GPSPositionWithId>;
47
+ }
48
+ export interface TripRepository {
49
+ queryById(id: string): Promise<TripWithId[]>;
50
+ streamById(id: string): AsyncGenerator<TripWithId>;
51
+ }
52
+ export interface StateTripRepository {
53
+ queryById(id: string): Promise<StateTripWithId | null>;
54
+ }
55
+ export interface ContainedRepository {
56
+ queryByKey(receiverTransmitter: string): Promise<ContainedWithId[]>;
57
+ queryByTransmitter(transmitterId: string): Promise<ContainedWithId[]>;
58
+ queryByReceiver(receiverId: string): Promise<ContainedWithId[]>;
59
+ streamByKey(receiverTransmitter: string): AsyncGenerator<ContainedWithId>;
60
+ streamByTransmitter(transmitterId: string): AsyncGenerator<ContainedWithId>;
61
+ streamByReceiver(receiverId: string): AsyncGenerator<ContainedWithId>;
62
+ }
63
+ export interface TransmitterPositionRepository {
64
+ get(id: string): Promise<TransmitterPositionWithId | null>;
65
+ }
66
+ export type RepositoryBundle = {
67
+ states: StatesRepository;
68
+ stateLinks: StateLinkRepository;
69
+ closedLinks: ClosedLinkRepository;
70
+ rssi: RSSIRepository;
71
+ deltaRssi: DeltaRSSIRepository;
72
+ gps: GPSRepository;
73
+ trips: TripRepository;
74
+ stateTrips: StateTripRepository;
75
+ contained: ContainedRepository;
76
+ transmitterPos: TransmitterPositionRepository;
77
+ };
@@ -0,0 +1,4 @@
1
+ // Read-only repository contracts modeled after the existing Go repos.
2
+ // Implementations should use the Aerospike Node.js client and respect the set/bin contract in spec.md.
3
+ export {};
4
+ //# sourceMappingURL=repositories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repositories.js","sourceRoot":"","sources":["../../src/aerospike/repositories.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,uGAAuG"}
@@ -0,0 +1,4 @@
1
+ export * as AerospikeModels from './aerospike/models';
2
+ export * as AerospikeRepositories from './aerospike/repositories';
3
+ export * from './aerospike/client';
4
+ export * from './aerospike/impl';
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * as AerospikeModels from './aerospike/models';
2
+ export * as AerospikeRepositories from './aerospike/repositories';
3
+ export * from './aerospike/client';
4
+ export * from './aerospike/impl';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,eAAe,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,qBAAqB,MAAM,0BAA0B,CAAC;AAClE,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@nanolink/operational-model",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript utility package.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc -p tsconfig.json",
14
+ "clean": "rimraf dist",
15
+ "lint": "eslint . --ext .ts",
16
+ "format": "prettier --write .",
17
+ "prepare": "npm run build"
18
+ },
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "keywords": [],
23
+ "author": "",
24
+ "license": "MIT",
25
+ "dependencies": {
26
+ "@msgpack/msgpack": "^2.8.0",
27
+ "aerospike": "^6.5.0"
28
+ },
29
+ "devDependencies": {
30
+ "@types/node": "^22.7.4",
31
+ "@typescript-eslint/eslint-plugin": "^8.10.0",
32
+ "@typescript-eslint/parser": "^8.10.0",
33
+ "eslint": "^9.12.0",
34
+ "eslint-config-prettier": "^9.1.0",
35
+ "prettier": "^3.3.3",
36
+ "rimraf": "^6.0.1",
37
+ "typescript": "^5.6.3"
38
+ }
39
+ }