@similie/hyphen-rtsp-tunnel 1.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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +497 -0
  3. package/dist/index.d.ts +4 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +83 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/services/day.d.ts +3 -0
  8. package/dist/services/day.d.ts.map +1 -0
  9. package/dist/services/day.js +26 -0
  10. package/dist/services/day.js.map +1 -0
  11. package/dist/services/device-auth.d.ts +26 -0
  12. package/dist/services/device-auth.d.ts.map +1 -0
  13. package/dist/services/device-auth.js +95 -0
  14. package/dist/services/device-auth.js.map +1 -0
  15. package/dist/services/events.d.ts +29 -0
  16. package/dist/services/events.d.ts.map +1 -0
  17. package/dist/services/events.js +14 -0
  18. package/dist/services/events.js.map +1 -0
  19. package/dist/services/index.d.ts +9 -0
  20. package/dist/services/index.d.ts.map +1 -0
  21. package/dist/services/index.js +9 -0
  22. package/dist/services/index.js.map +1 -0
  23. package/dist/services/notifier.d.ts +20 -0
  24. package/dist/services/notifier.d.ts.map +1 -0
  25. package/dist/services/notifier.js +12 -0
  26. package/dist/services/notifier.js.map +1 -0
  27. package/dist/services/rtsp-tunnel-gateway.d.ts +58 -0
  28. package/dist/services/rtsp-tunnel-gateway.d.ts.map +1 -0
  29. package/dist/services/rtsp-tunnel-gateway.js +532 -0
  30. package/dist/services/rtsp-tunnel-gateway.js.map +1 -0
  31. package/dist/services/sqs-notifier.d.ts +23 -0
  32. package/dist/services/sqs-notifier.d.ts.map +1 -0
  33. package/dist/services/sqs-notifier.js +109 -0
  34. package/dist/services/sqs-notifier.js.map +1 -0
  35. package/dist/services/storage-s3.d.ts +12 -0
  36. package/dist/services/storage-s3.d.ts.map +1 -0
  37. package/dist/services/storage-s3.js +49 -0
  38. package/dist/services/storage-s3.js.map +1 -0
  39. package/dist/services/storage-worker.d.ts +22 -0
  40. package/dist/services/storage-worker.d.ts.map +1 -0
  41. package/dist/services/storage-worker.js +100 -0
  42. package/dist/services/storage-worker.js.map +1 -0
  43. package/dist/services/storage.d.ts +28 -0
  44. package/dist/services/storage.d.ts.map +1 -0
  45. package/dist/services/storage.js +41 -0
  46. package/dist/services/storage.js.map +1 -0
  47. package/package.json +48 -0
@@ -0,0 +1,95 @@
1
+ import crypto from "node:crypto";
2
+ export class DeviceAuth {
3
+ ctx;
4
+ constructor(ctx) {
5
+ this.ctx = ctx;
6
+ }
7
+ async deviceSensors(identity) {
8
+ const query = `SELECT "s".* FROM "device" "d" JOIN "device_sensor" "ds" ON ("d"."id" = "ds"."device") JOIN "sensor" "s" ON ("s"."id" = "ds".sensor) WHERE "d"."identity" = $1;`;
9
+ const results = await this.ds().query(query, [identity]);
10
+ const values = {};
11
+ for (const row of results) {
12
+ values[row.key] = row;
13
+ }
14
+ return { results, values };
15
+ }
16
+ async device(identity) {
17
+ const repo = this.ds().getRepository("device");
18
+ const results = await repo.findOne({ where: { identity } });
19
+ return results;
20
+ }
21
+ ds() {
22
+ const ds = this.ctx?.ellipsies?.pgManager?.datasource;
23
+ if (!ds) {
24
+ throw new Error("ctx.ellipsies.pgManager.datasource is missing");
25
+ }
26
+ return ds;
27
+ }
28
+ /**
29
+ * Parse "AUTH <deviceId> <sigB64>"
30
+ * Returns null if invalid.
31
+ */
32
+ parseAuthLine(line) {
33
+ const parts = line.trim().split(/\s+/);
34
+ if (parts.length < 3)
35
+ return null;
36
+ if ((parts[0] ?? "").toUpperCase() !== "AUTH")
37
+ return null;
38
+ const deviceId = (parts[1] ?? "").trim();
39
+ const sigB64 = (parts[2] ?? "").trim();
40
+ if (!deviceId || !sigB64)
41
+ return null;
42
+ return { deviceId, sigB64 };
43
+ }
44
+ /**
45
+ * Lookup device certificate by identity and verify signature
46
+ * over `${deviceId}.${nonceB64}` using RSA-SHA256.
47
+ */
48
+ async verify(deviceId, nonceB64, sigB64) {
49
+ this.ctx.log("[rtsp-tunnel][auth] verify", { deviceId, nonceB64, sigB64 });
50
+ // 1) Load certificate row by identity
51
+ const repo = this.ds().getRepository("certificate");
52
+ // identity in your schema is unique
53
+ const row = await repo.findOne({ where: { identity: deviceId } });
54
+ if (!row?.cert) {
55
+ this.ctx.log("[rtsp-tunnel][auth] no cert for deviceId", {
56
+ identity: deviceId,
57
+ });
58
+ return false;
59
+ }
60
+ // 2) Build canonical message
61
+ const message = `${deviceId}.${nonceB64}`;
62
+ this.ctx.log("[rtsp-tunnel][auth] message", { message });
63
+ // 3) Verify signature
64
+ let sig;
65
+ try {
66
+ sig = Buffer.from(sigB64, "base64");
67
+ }
68
+ catch {
69
+ this.ctx.log("[rtsp-tunnel][auth] bad base64 sig", {
70
+ identity: deviceId,
71
+ });
72
+ return false;
73
+ }
74
+ try {
75
+ // Node can accept X.509 cert PEM directly as the public key
76
+ const ok = crypto.verify("RSA-SHA256", Buffer.from(message, "utf8"), {
77
+ key: row.cert,
78
+ }, sig);
79
+ if (!ok) {
80
+ this.ctx.log("[rtsp-tunnel][auth] verify failed", {
81
+ identity: deviceId,
82
+ });
83
+ }
84
+ return ok;
85
+ }
86
+ catch (e) {
87
+ this.ctx.log("[rtsp-tunnel][auth] verify error", {
88
+ identity: deviceId,
89
+ message: e?.message ?? e,
90
+ });
91
+ return false;
92
+ }
93
+ }
94
+ }
95
+ //# sourceMappingURL=device-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device-auth.js","sourceRoot":"","sources":["../../src/services/device-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { EventEmitter } from "node:events";
2
+ export type SnapshotCapturedEvent = {
3
+ sessionId: string;
4
+ deviceId: string;
5
+ payloadId: string | null;
6
+ remote: string;
7
+ localPath: string;
8
+ capturedAt: string;
9
+ tzOffsetHours?: number | null;
10
+ };
11
+ export type SnapshotStoredEvent = SnapshotCapturedEvent & {
12
+ storage: string;
13
+ storedUri: string;
14
+ day?: string;
15
+ };
16
+ export type SnapshotFailedEvent = {
17
+ sessionId: string;
18
+ deviceId: string;
19
+ payloadId: string | null;
20
+ remote: string;
21
+ stage: "hello" | "auth" | "capture" | "proxy" | "unknown" | "store";
22
+ error: string;
23
+ };
24
+ export declare class RtspTunnelEvents extends EventEmitter {
25
+ emitCaptured(e: SnapshotCapturedEvent): void;
26
+ emitStored(e: SnapshotStoredEvent): void;
27
+ emitFailed(e: SnapshotFailedEvent): void;
28
+ }
29
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/services/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,GAAG;IACxD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IACpE,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,YAAY,CAAC,CAAC,EAAE,qBAAqB;IAGrC,UAAU,CAAC,CAAC,EAAE,mBAAmB;IAGjC,UAAU,CAAC,CAAC,EAAE,mBAAmB;CAGlC"}
@@ -0,0 +1,14 @@
1
+ // events.ts
2
+ import { EventEmitter } from "node:events";
3
+ export class RtspTunnelEvents extends EventEmitter {
4
+ emitCaptured(e) {
5
+ this.emit("snapshot:captured", e);
6
+ }
7
+ emitStored(e) {
8
+ this.emit("snapshot:stored", e);
9
+ }
10
+ emitFailed(e) {
11
+ this.emit("snapshot:failed", e);
12
+ }
13
+ }
14
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/services/events.ts"],"names":[],"mappings":"AAAA,YAAY;AACZ,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AA2B3C,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IAChD,YAAY,CAAC,CAAwB;QACnC,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,UAAU,CAAC,CAAsB;QAC/B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,UAAU,CAAC,CAAsB;QAC/B,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,9 @@
1
+ export * from "./events.js";
2
+ export * from "./rtsp-tunnel-gateway.js";
3
+ export * from "./storage-s3.js";
4
+ export * from "./storage.js";
5
+ export * from "./storage-worker.js";
6
+ export * from "./sqs-notifier.js";
7
+ export * from "./notifier.js";
8
+ export * from "./device-auth.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from "./events.js";
2
+ export * from "./rtsp-tunnel-gateway.js";
3
+ export * from "./storage-s3.js";
4
+ export * from "./storage.js";
5
+ export * from "./storage-worker.js";
6
+ export * from "./sqs-notifier.js";
7
+ export * from "./notifier.js";
8
+ export * from "./device-auth.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/services/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,0BAA0B,CAAC;AACzC,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { SnapshotStoredEvent, SnapshotFailedEvent } from "./events.js";
2
+ import type { ModuleContext } from "@similie/hyphen-command-server-types";
3
+ export type NotifierEventMap = {
4
+ "snapshot:stored": SnapshotStoredEvent;
5
+ "snapshot:failed": SnapshotFailedEvent;
6
+ };
7
+ export interface Notifier {
8
+ /** If false, callers may skip work (optional optimization). */
9
+ readonly enabled: boolean;
10
+ init(ctx: ModuleContext): Promise<void> | void;
11
+ /** Generic send hook. Implementations can switch on eventName. */
12
+ send<K extends keyof NotifierEventMap>(eventName: K, payload: NotifierEventMap[K]): Promise<void>;
13
+ }
14
+ export declare class NoopNotifier implements Notifier {
15
+ readonly enabled = false;
16
+ private ctx;
17
+ init(ctx: ModuleContext): void;
18
+ send<K extends keyof NotifierEventMap>(_eventName: K, _payload: NotifierEventMap[K]): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=notifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.d.ts","sourceRoot":"","sources":["../../src/services/notifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AAC1E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,iBAAiB,EAAE,mBAAmB,CAAC;IACvC,iBAAiB,EAAE,mBAAmB,CAAC;CACxC,CAAC;AAEF,MAAM,WAAW,QAAQ;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C,kEAAkE;IAClE,IAAI,CAAC,CAAC,SAAS,MAAM,gBAAgB,EACnC,SAAS,EAAE,CAAC,EACZ,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,qBAAa,YAAa,YAAW,QAAQ;IAC3C,QAAQ,CAAC,OAAO,SAAS;IACzB,OAAO,CAAC,GAAG,CAA8B;IACzC,IAAI,CAAC,GAAG,EAAE,aAAa;IAGjB,IAAI,CAAC,CAAC,SAAS,MAAM,gBAAgB,EACzC,UAAU,EAAE,CAAC,EACb,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,IAAI,CAAC;CAIjB"}
@@ -0,0 +1,12 @@
1
+ export class NoopNotifier {
2
+ enabled = false;
3
+ ctx = null;
4
+ init(ctx) {
5
+ this.ctx = ctx;
6
+ }
7
+ async send(_eventName, _payload) {
8
+ // intentionally no-op
9
+ this.ctx?.log(_eventName, _payload);
10
+ }
11
+ }
12
+ //# sourceMappingURL=notifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifier.js","sourceRoot":"","sources":["../../src/services/notifier.ts"],"names":[],"mappings":"AAkBA,MAAM,OAAO,YAAY;IACd,OAAO,GAAG,KAAK,CAAC;IACjB,GAAG,GAAyB,IAAI,CAAC;IACzC,IAAI,CAAC,GAAkB;QACrB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IACD,KAAK,CAAC,IAAI,CACR,UAAa,EACb,QAA6B;QAE7B,sBAAsB;QACtB,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,58 @@
1
+ import { RtspTunnelEvents } from "./events.js";
2
+ import { type ModuleContext } from "@similie/hyphen-command-server-types";
3
+ export type RtspTunnelTunnelParams = {
4
+ camUser: string;
5
+ camPass: string;
6
+ rtspPath: string;
7
+ };
8
+ export declare class RtspTunnelGateway {
9
+ private readonly ctx;
10
+ readonly events: RtspTunnelEvents;
11
+ private readonly wsPort;
12
+ private readonly proxyPort;
13
+ private readonly wsTls;
14
+ private readonly tlsCert;
15
+ private readonly tlsKey;
16
+ private readonly camUser;
17
+ private readonly camPass;
18
+ private readonly rtspPath;
19
+ private readonly outDir;
20
+ private readonly autoCapture;
21
+ private readonly requireAuth;
22
+ private readonly helloWaitMs;
23
+ private readonly captureTimeoutMs;
24
+ private server;
25
+ private wss;
26
+ private proxyServer;
27
+ private auth;
28
+ private sessions;
29
+ private globalCaptureInFlight;
30
+ private globalCaptureSessionId;
31
+ private started;
32
+ constructor(ctx: ModuleContext);
33
+ private deviceSensorsKey;
34
+ private deviceIdKey;
35
+ private pullDevice;
36
+ pullDeviceTimezoneOffsetHours(identity: string): Promise<number | null>;
37
+ pullDeviceSensorMeta(identity: string): Promise<any>;
38
+ start(): Promise<void>;
39
+ stop(): Promise<void>;
40
+ private makeHttpsServer;
41
+ private newSessionId;
42
+ private safeDeviceId;
43
+ private mkOutFile;
44
+ private isWsOpen;
45
+ private sendOpen;
46
+ private sendClose;
47
+ private sendText;
48
+ private makeNonceB64;
49
+ private verifyAuth;
50
+ private pullCameraProfile;
51
+ private buildTunnelParams;
52
+ private captureOnce;
53
+ private maybeAutoCapture;
54
+ private parseHello;
55
+ private onConnection;
56
+ private onProxyConnection;
57
+ }
58
+ //# sourceMappingURL=rtsp-tunnel-gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtsp-tunnel-gateway.d.ts","sourceRoot":"","sources":["../../src/services/rtsp-tunnel-gateway.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EACL,KAAK,aAAa,EAEnB,MAAM,sCAAsC,CAAC;AAwB9C,MAAM,MAAM,sBAAsB,GAAG;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,SAAgB,MAAM,mBAA0B;IAEhD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAyC;IAChE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA4C;IAEtE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuC;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6B;IAEpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmC;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAuC;IAEhE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAEqC;IAE5D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;IACzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6C;IAEzE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA+C;IAC3E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAE/B;IAGF,OAAO,CAAC,MAAM,CAA2C;IACzD,OAAO,CAAC,GAAG,CAAgC;IAC3C,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,IAAI,CAAa;IACzB,OAAO,CAAC,QAAQ,CAA8B;IAE9C,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,sBAAsB,CAAuB;IAErD,OAAO,CAAC,OAAO,CAAS;gBAEZ,GAAG,EAAE,aAAa;IAK9B,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,WAAW;YAIL,UAAU;IAWlB,6BAA6B,CACjC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAMnB,oBAAoB,CAAC,QAAQ,EAAE,MAAM;IAYrC,KAAK;IAkCL,IAAI;IAsCV,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,QAAQ;IAOhB,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,YAAY;YAMN,UAAU;YAQV,iBAAiB;YAwBjB,iBAAiB;YAajB,WAAW;IAuFzB,OAAO,CAAC,gBAAgB;IAqDxB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,YAAY;IAkLpB,OAAO,CAAC,iBAAiB;CAwC1B"}