@camera.ui/common 0.0.14 → 0.0.16

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 (49) hide show
  1. package/dist/cameraUtils/ffmpeg-process.d.ts +2 -2
  2. package/dist/cameraUtils/ffmpeg-process.js +2 -1
  3. package/dist/cameraUtils/ffmpeg-process.js.map +1 -1
  4. package/dist/cameraUtils/index.d.ts +0 -4
  5. package/dist/cameraUtils/index.js +0 -4
  6. package/dist/cameraUtils/index.js.map +1 -1
  7. package/dist/cameraUtils/mp4.js +1 -1
  8. package/dist/cameraUtils/mp4.js.map +1 -1
  9. package/dist/cameraUtils/rtp-splitter.d.ts +1 -1
  10. package/dist/cameraUtils/rtp-splitter.js +11 -2
  11. package/dist/cameraUtils/rtp-splitter.js.map +1 -1
  12. package/dist/index.d.ts +0 -8
  13. package/dist/index.js +0 -8
  14. package/dist/index.js.map +1 -1
  15. package/dist/logger/index.d.ts +2 -2
  16. package/dist/npm/index.d.ts +1 -1
  17. package/dist/npm/index.js +18 -28
  18. package/dist/npm/index.js.map +1 -1
  19. package/dist/utils/subscribed.d.ts +9 -0
  20. package/dist/utils/subscribed.js +16 -0
  21. package/dist/utils/subscribed.js.map +1 -1
  22. package/dist/utils/utils.d.ts +7 -2
  23. package/dist/utils/utils.js +72 -30
  24. package/dist/utils/utils.js.map +1 -1
  25. package/package.json +7 -33
  26. package/dist/cameraUtils/processor.d.ts +0 -49
  27. package/dist/cameraUtils/processor.js +0 -154
  28. package/dist/cameraUtils/processor.js.map +0 -1
  29. package/dist/cameraUtils/return-audio-transcoder.d.ts +0 -40
  30. package/dist/cameraUtils/return-audio-transcoder.js +0 -84
  31. package/dist/cameraUtils/return-audio-transcoder.js.map +0 -1
  32. package/dist/cameraUtils/srtp.d.ts +0 -8
  33. package/dist/cameraUtils/srtp.js +0 -22
  34. package/dist/cameraUtils/srtp.js.map +0 -1
  35. package/dist/cameraUtils/utils.d.ts +0 -1
  36. package/dist/cameraUtils/utils.js +0 -15
  37. package/dist/cameraUtils/utils.js.map +0 -1
  38. package/dist/messaging/index.d.ts +0 -48
  39. package/dist/messaging/index.js +0 -141
  40. package/dist/messaging/index.js.map +0 -1
  41. package/dist/nats/index.d.ts +0 -30
  42. package/dist/nats/index.js +0 -85
  43. package/dist/nats/index.js.map +0 -1
  44. package/dist/packer/index.d.ts +0 -2
  45. package/dist/packer/index.js +0 -17
  46. package/dist/packer/index.js.map +0 -1
  47. package/dist/python/index.d.ts +0 -48
  48. package/dist/python/index.js +0 -478
  49. package/dist/python/index.js.map +0 -1
@@ -1,49 +0,0 @@
1
- import { RtpPacket } from 'werift';
2
- import type { Logger } from '../logger/index.js';
3
- import type { RtpSplitter } from './rtp-splitter.js';
4
- import type { SrtpOptions } from './srtp.js';
5
- export declare function getSessionConfig(srtpOptions: SrtpOptions): {
6
- keys: {
7
- localMasterKey: Buffer;
8
- localMasterSalt: Buffer;
9
- remoteMasterKey: Buffer;
10
- remoteMasterSalt: Buffer;
11
- };
12
- profile: number;
13
- };
14
- export declare function getDurationSeconds(start: number): number;
15
- export declare class AudioProcessor {
16
- private audioSsrc;
17
- private audioSrtp;
18
- private audioSplitter;
19
- private targetAddress;
20
- private targetPort;
21
- private payloadType;
22
- private isOpus;
23
- private packetTime;
24
- private logger;
25
- private audioSrtpSession;
26
- private sequenceNumber;
27
- private timestamp;
28
- private buffer;
29
- constructor(audioSsrc: number, audioSrtp: SrtpOptions, audioSplitter: RtpSplitter, targetAddress: string, targetPort: number, payloadType: number, isOpus: boolean, packetTime: number, logger: Logger);
30
- processPacket(data: Buffer): void;
31
- private process20ms;
32
- private process60ms;
33
- private sendPacket;
34
- }
35
- export declare class VideoProcessor {
36
- private videoSsrc;
37
- private videoSrtp;
38
- private videoSplitter;
39
- private targetAddress;
40
- private targetPort;
41
- private mtu;
42
- private payloadType;
43
- private logger;
44
- private videoSrtpSession;
45
- private sequenceNumber;
46
- constructor(videoSsrc: number, videoSrtp: SrtpOptions, videoSplitter: RtpSplitter, targetAddress: string, targetPort: number, mtu: number, payloadType: number, logger: Logger);
47
- processPacket(rtp: RtpPacket): void;
48
- private fragmentPacket;
49
- }
@@ -1,154 +0,0 @@
1
- import { RtpHeader, RtpPacket, SrtpSession } from 'werift';
2
- export function getSessionConfig(srtpOptions) {
3
- return {
4
- keys: {
5
- localMasterKey: srtpOptions.srtpKey,
6
- localMasterSalt: srtpOptions.srtpSalt,
7
- remoteMasterKey: srtpOptions.srtpKey,
8
- remoteMasterSalt: srtpOptions.srtpSalt,
9
- },
10
- profile: 1,
11
- };
12
- }
13
- export function getDurationSeconds(start) {
14
- return (Date.now() - start) / 1000;
15
- }
16
- export class AudioProcessor {
17
- audioSsrc;
18
- audioSrtp;
19
- audioSplitter;
20
- targetAddress;
21
- targetPort;
22
- payloadType;
23
- isOpus;
24
- packetTime;
25
- logger;
26
- audioSrtpSession;
27
- sequenceNumber = Math.floor(Math.random() * 65536);
28
- timestamp = 0;
29
- buffer = [];
30
- constructor(audioSsrc, audioSrtp, audioSplitter, targetAddress, targetPort, payloadType, isOpus, packetTime, logger) {
31
- this.audioSsrc = audioSsrc;
32
- this.audioSrtp = audioSrtp;
33
- this.audioSplitter = audioSplitter;
34
- this.targetAddress = targetAddress;
35
- this.targetPort = targetPort;
36
- this.payloadType = payloadType;
37
- this.isOpus = isOpus;
38
- this.packetTime = packetTime;
39
- this.logger = logger;
40
- this.audioSrtpSession = new SrtpSession(getSessionConfig(this.audioSrtp));
41
- if (this.isOpus) {
42
- this.logger.log(`AudioProcessor created with OPUS codec, audio will be split into ${this.packetTime}ms frames`);
43
- }
44
- else {
45
- this.logger.log('AudioProcessor created with AAC codec, audio will be sent as is');
46
- }
47
- }
48
- processPacket(data) {
49
- const rtp = RtpPacket.deSerialize(data);
50
- if (this.isOpus) {
51
- if (this.packetTime === 20) {
52
- this.process20ms(rtp);
53
- }
54
- else {
55
- this.process60ms(rtp);
56
- }
57
- }
58
- else {
59
- this.sendPacket(rtp);
60
- }
61
- }
62
- process20ms(rtp) {
63
- rtp.header.sequenceNumber = this.sequenceNumber++;
64
- rtp.header.timestamp = this.timestamp;
65
- rtp.header.ssrc = this.audioSsrc;
66
- rtp.header.payloadType = this.payloadType;
67
- this.sendPacket(rtp);
68
- this.timestamp += 16000 * 0.02; // 16kHz * 20ms
69
- }
70
- process60ms(rtp) {
71
- this.buffer.push(rtp.payload.subarray(1)); // Remove TOC byte
72
- if (this.buffer.length === 3) {
73
- const toc = rtp.payload[0] & 0xfc; // Keep config bits
74
- const frameCountByte = 0x83; // VBR flag set, 3 frames
75
- const header = Buffer.from([toc | 0x03, frameCountByte]);
76
- const payload = Buffer.concat([header, ...this.buffer]);
77
- rtp.header.sequenceNumber = this.sequenceNumber++;
78
- rtp.header.timestamp = this.timestamp;
79
- rtp.header.ssrc = this.audioSsrc;
80
- rtp.payload = payload;
81
- this.sendPacket(rtp);
82
- this.timestamp += 16000 * 0.06; // 16kHz * 60ms
83
- this.buffer = [];
84
- }
85
- }
86
- sendPacket(rtp) {
87
- const encryptedPacket = this.audioSrtpSession.encrypt(rtp.payload, rtp.header);
88
- this.audioSplitter.send(encryptedPacket, {
89
- port: this.targetPort,
90
- address: this.targetAddress,
91
- });
92
- }
93
- }
94
- export class VideoProcessor {
95
- videoSsrc;
96
- videoSrtp;
97
- videoSplitter;
98
- targetAddress;
99
- targetPort;
100
- mtu;
101
- payloadType;
102
- logger;
103
- videoSrtpSession;
104
- sequenceNumber = Math.floor(Math.random() * 65536);
105
- constructor(videoSsrc, videoSrtp, videoSplitter, targetAddress, targetPort, mtu, payloadType, logger) {
106
- this.videoSsrc = videoSsrc;
107
- this.videoSrtp = videoSrtp;
108
- this.videoSplitter = videoSplitter;
109
- this.targetAddress = targetAddress;
110
- this.targetPort = targetPort;
111
- this.mtu = mtu;
112
- this.payloadType = payloadType;
113
- this.logger = logger;
114
- this.videoSrtpSession = new SrtpSession(getSessionConfig(this.videoSrtp));
115
- }
116
- processPacket(rtp) {
117
- if (!rtp || !rtp.payload) {
118
- this.logger.warn('Received invalid RTP packet, ignore...');
119
- return;
120
- }
121
- const fragments = this.fragmentPacket(rtp.payload, this.mtu - 12); // Subtract RTP header size
122
- for (let i = 0; i < fragments.length; i++) {
123
- const newRtp = new RtpPacket(new RtpHeader({
124
- version: 2,
125
- padding: false,
126
- extension: false,
127
- marker: i === fragments.length - 1 && rtp.header.marker,
128
- payloadType: this.payloadType,
129
- sequenceNumber: this.sequenceNumber++,
130
- timestamp: rtp.header.timestamp,
131
- ssrc: this.videoSsrc,
132
- }), fragments[i]);
133
- const encryptedPacket = this.videoSrtpSession.encrypt(newRtp.payload, newRtp.header);
134
- this.videoSplitter.send(encryptedPacket, {
135
- port: this.targetPort,
136
- address: this.targetAddress,
137
- });
138
- }
139
- }
140
- fragmentPacket(payload, maxFragmentSize) {
141
- if (payload.length <= maxFragmentSize) {
142
- return [payload];
143
- }
144
- const fragments = [];
145
- let startIndex = 0;
146
- while (startIndex < payload.length) {
147
- const endIndex = Math.min(startIndex + maxFragmentSize, payload.length);
148
- fragments.push(payload.subarray(startIndex, endIndex));
149
- startIndex = endIndex;
150
- }
151
- return fragments;
152
- }
153
- }
154
- //# sourceMappingURL=processor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"processor.js","sourceRoot":"","sources":["../../src/cameraUtils/processor.ts"],"names":[],"mappings":"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"}
@@ -1,40 +0,0 @@
1
- import { FfmpegProcess } from './ffmpeg-process.js';
2
- import type { FfmpegProcessOptions } from './ffmpeg-process.js';
3
- import type { RtpSplitter } from './rtp-splitter.js';
4
- interface Source {
5
- srtp_key: Buffer;
6
- srtp_salt: Buffer;
7
- }
8
- interface PrepareStreamRequest {
9
- targetAddress: string;
10
- addressVersion: 'ipv4' | 'ipv6';
11
- audio: Source;
12
- }
13
- interface StartStreamRequest {
14
- audio: {
15
- codec: 'OPUS' | 'AAC_eld' | string;
16
- channel: number;
17
- sample_rate: number;
18
- pt: number;
19
- };
20
- }
21
- export declare class ReturnAudioTranscoder {
22
- private options;
23
- readonly returnRtpSplitter: RtpSplitter;
24
- private startStreamRequest;
25
- readonly ffmpegProcess: FfmpegProcess;
26
- readonly reservedPortsPromise: Promise<number[]>;
27
- constructor(options: {
28
- outputArgs: (string | number)[];
29
- prepareStreamRequest: PrepareStreamRequest;
30
- incomingAudioOptions: {
31
- ssrc: number;
32
- rtcpPort: number;
33
- };
34
- returnAudioSplitter: RtpSplitter;
35
- startStreamRequest?: StartStreamRequest;
36
- } & Omit<FfmpegProcessOptions, 'ffmpegArgs'>);
37
- start(): Promise<void>;
38
- stop(): void;
39
- }
40
- export {};
@@ -1,84 +0,0 @@
1
- import { FfmpegProcess } from './ffmpeg-process.js';
2
- import { reservePorts } from './ports.js';
3
- import { getSsrc } from './rtp.js';
4
- import { createCryptoLine } from './srtp.js';
5
- const defaultStartStreamReqeuest = {
6
- audio: {
7
- codec: 'AAC_eld',
8
- channel: 1,
9
- sample_rate: 16,
10
- pt: 110,
11
- },
12
- };
13
- export class ReturnAudioTranscoder {
14
- options;
15
- returnRtpSplitter;
16
- startStreamRequest;
17
- ffmpegProcess;
18
- reservedPortsPromise = reservePorts({ count: 2 });
19
- constructor(options) {
20
- this.options = options;
21
- this.startStreamRequest = this.options.startStreamRequest || defaultStartStreamReqeuest;
22
- this.ffmpegProcess = new FfmpegProcess({
23
- ffmpegArgs: [
24
- '-hide_banner',
25
- '-protocol_whitelist',
26
- 'pipe,udp,rtp,file,crypto',
27
- '-f',
28
- 'sdp',
29
- '-acodec',
30
- this.startStreamRequest.audio.codec === 'OPUS' ? 'libopus' : 'libfdk_aac',
31
- '-i',
32
- 'pipe:',
33
- '-map',
34
- '0:0',
35
- ...this.options.outputArgs,
36
- ],
37
- ...this.options,
38
- });
39
- // allow return audio splitter to be passed in if you want to create one in the prepare stream phase, and create the transcoder in the stream request phase
40
- this.returnRtpSplitter = options.returnAudioSplitter;
41
- }
42
- async start() {
43
- const [rtpPort, rtcpPort] = await this.reservedPortsPromise, { targetAddress, addressVersion, audio: { srtp_key: srtpKey, srtp_salt: srtpSalt }, } = this.options.prepareStreamRequest, { ssrc: incomingAudioSsrc, rtcpPort: incomingAudioRtcpPort } = this.options.incomingAudioOptions, { codec, sample_rate, channel, pt: packetType } = this.startStreamRequest.audio;
44
- this.ffmpegProcess.writeStdin(
45
- // This SDP was generated using ffmpeg, and describes the type of packets we expect to receive from HomeKit.
46
- [
47
- 'v=0',
48
- 'o=- 0 0 IN IP4 127.0.0.1',
49
- 's=Talk',
50
- `c=IN ${addressVersion.replace('v', '').toUpperCase()} ${targetAddress}`,
51
- 't=0 0',
52
- 'a=tool:libavformat 58.38.100',
53
- `m=audio ${rtpPort} RTP/AVP ${packetType}`,
54
- 'b=AS:24',
55
- ...(codec === 'OPUS'
56
- ? [`a=rtpmap:${packetType} opus/${sample_rate}000/${channel}`, `a=fmtp:${packetType} minptime=10;useinbandfec=1`]
57
- : [
58
- `a=rtpmap:${packetType} MPEG4-GENERIC/${sample_rate}000/${channel}`,
59
- `a=fmtp:${packetType} profile-level-id=1;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3; config=F8F0212C00BC00`,
60
- ]),
61
- createCryptoLine({
62
- srtpKey,
63
- srtpSalt,
64
- }),
65
- ].join('\n'));
66
- this.returnRtpSplitter.addMessageHandler(({ isRtpMessage, message }) => {
67
- // This splitter will receive all audio-related packets from HomeKit.
68
- // This includes RTP + RTCP for return audio, as well as RTCP for incoming audio
69
- if (!isRtpMessage && getSsrc(message) === incomingAudioSsrc) {
70
- return {
71
- port: incomingAudioRtcpPort,
72
- };
73
- }
74
- return {
75
- port: isRtpMessage ? rtpPort : rtcpPort,
76
- };
77
- });
78
- }
79
- stop() {
80
- this.ffmpegProcess.stop();
81
- this.returnRtpSplitter.close();
82
- }
83
- }
84
- //# sourceMappingURL=return-audio-transcoder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"return-audio-transcoder.js","sourceRoot":"","sources":["../../src/cameraUtils/return-audio-transcoder.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- export interface SrtpOptions {
2
- srtpKey: Buffer;
3
- srtpSalt: Buffer;
4
- }
5
- export declare function encodeSrtpOptions({ srtpKey, srtpSalt }: SrtpOptions): string;
6
- export declare function decodeSrtpOptions(encodedOptions: string): SrtpOptions;
7
- export declare function createCryptoLine(srtpOptions: SrtpOptions): string;
8
- export declare function generateSrtpOptions(): SrtpOptions;
@@ -1,22 +0,0 @@
1
- import { randomBytes } from 'node:crypto';
2
- export function encodeSrtpOptions({ srtpKey, srtpSalt }) {
3
- return Buffer.concat([srtpKey, srtpSalt]).toString('base64');
4
- }
5
- export function decodeSrtpOptions(encodedOptions) {
6
- const crypto = Buffer.from(encodedOptions, 'base64');
7
- return {
8
- srtpKey: crypto.subarray(0, 16),
9
- srtpSalt: crypto.subarray(16, 30),
10
- };
11
- }
12
- export function createCryptoLine(srtpOptions) {
13
- const encodedOptions = encodeSrtpOptions(srtpOptions);
14
- return `a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:${encodedOptions}`;
15
- }
16
- export function generateSrtpOptions() {
17
- return {
18
- srtpKey: randomBytes(16),
19
- srtpSalt: randomBytes(14),
20
- };
21
- }
22
- //# sourceMappingURL=srtp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../src/cameraUtils/srtp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO1C,MAAM,UAAU,iBAAiB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAe;IAClE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,cAAsB;IACtD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAErD,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;QAC/B,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,WAAwB;IACvD,MAAM,cAAc,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAEtD,OAAO,6CAA6C,cAAc,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;QACL,OAAO,EAAE,WAAW,CAAC,EAAE,CAAC;QACxB,QAAQ,EAAE,WAAW,CAAC,EAAE,CAAC;KAC1B,CAAC;AACJ,CAAC"}
@@ -1 +0,0 @@
1
- export declare function timeoutPromise<T>(timeout: number, promise: Promise<T>): Promise<T>;
@@ -1,15 +0,0 @@
1
- export function timeoutPromise(timeout, promise) {
2
- return new Promise((resolve, reject) => {
3
- const t = setTimeout(() => reject(new Error('Operation timed out')), timeout);
4
- promise
5
- .then((v) => {
6
- clearTimeout(t);
7
- resolve(v);
8
- })
9
- .catch((e) => {
10
- clearTimeout(t);
11
- reject(e);
12
- });
13
- });
14
- }
15
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/cameraUtils/utils.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,cAAc,CAAI,OAAe,EAAE,OAAmB;IACpE,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAE9E,OAAO;aACJ,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE;YACV,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO,CAAC,CAAC,CAAC,CAAC;QACb,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;YACX,YAAY,CAAC,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,48 +0,0 @@
1
- import type { CameraDelegates, PluginLogger } from '@camera.ui/types';
2
- import type { ProxyConnection, ProxySubscription } from '../nats/index.js';
3
- export declare const NATS_SERVER_SUBJECT = "camera.ui-server";
4
- export interface DeserializedError {
5
- name: string;
6
- message: string;
7
- stack: string;
8
- }
9
- export declare class RemoteError extends Error {
10
- constructor(error: DeserializedError, cause: Omit<ProxyMessageStructure, 'error'>);
11
- }
12
- export interface QueueItem {
13
- message: ProxyMessageStructure;
14
- resolve: (response: any) => void;
15
- reject: (error: RemoteError) => void;
16
- }
17
- export interface ProxyMessageStructure {
18
- requestId: string;
19
- cameraId?: string;
20
- targetId: string;
21
- targetName?: string;
22
- pluginId: string;
23
- type: 'request' | 'reply';
24
- proxy: 'device' | 'camera' | 'plugin' | 'core';
25
- client: 'cameraFn' | 'pluginFn' | 'deviceFn' | 'storageFn' | 'coreFn' | keyof CameraDelegates;
26
- fn: string;
27
- args: any[];
28
- timeout: number;
29
- timestamp: number;
30
- response?: any;
31
- error?: DeserializedError;
32
- }
33
- export declare class MessageQueue {
34
- private logger;
35
- private type;
36
- private publisher;
37
- private subscriber;
38
- private requestHandler;
39
- private aborted;
40
- private isProcessing;
41
- private queue;
42
- private pendingResponses;
43
- constructor(type: 'server' | 'client', publisher: ProxyConnection, subscriber: ProxySubscription, logger: PluginLogger, requestHandler: (message: ProxyMessageStructure) => void);
44
- abortQueue(): void;
45
- enqueue(message: ProxyMessageStructure): Promise<any>;
46
- private processQueue;
47
- private onMessage;
48
- }
@@ -1,141 +0,0 @@
1
- import { unpack } from '../packer/index.js';
2
- export const NATS_SERVER_SUBJECT = 'camera.ui-server';
3
- export class RemoteError extends Error {
4
- constructor(error, cause) {
5
- super(error.message);
6
- this.name = error.name;
7
- this.cause = cause;
8
- if (error.stack && error.stack !== '') {
9
- this.stack = error.stack;
10
- }
11
- }
12
- }
13
- export class MessageQueue {
14
- logger;
15
- type;
16
- publisher;
17
- subscriber;
18
- requestHandler;
19
- aborted = false;
20
- isProcessing = false;
21
- queue = [];
22
- pendingResponses = new Map();
23
- constructor(type, publisher, subscriber, logger, requestHandler) {
24
- this.type = type;
25
- this.logger = logger;
26
- this.publisher = publisher;
27
- this.subscriber = subscriber;
28
- this.requestHandler = requestHandler;
29
- this.subscriber.on('message', this.onMessage.bind(this));
30
- }
31
- abortQueue() {
32
- this.aborted = true;
33
- this.isProcessing = false;
34
- while (this.queue.length > 0) {
35
- const item = this.queue.shift();
36
- const remoteError = new RemoteError({
37
- name: 'AbortError',
38
- message: 'Message processing aborted',
39
- stack: '',
40
- }, item.message);
41
- item.reject(remoteError);
42
- }
43
- for (const [requestId, { reject, message }] of this.pendingResponses) {
44
- const remoteError = new RemoteError({
45
- name: 'AbortError',
46
- message: 'Request aborted due to queue abort',
47
- stack: '',
48
- }, message);
49
- reject(remoteError);
50
- this.pendingResponses.delete(requestId);
51
- }
52
- }
53
- async enqueue(message) {
54
- if (message.type === 'request' && message.timeout > 0) {
55
- // console.log(`${this.type.toUpperCase()} => Enqueueing message:`, message);
56
- const promise = new Promise((_resolve, _reject) => {
57
- const queueItem = {
58
- message,
59
- resolve: _resolve,
60
- reject: _reject,
61
- };
62
- this.queue.push(queueItem);
63
- });
64
- if (!this.isProcessing) {
65
- this.processQueue();
66
- }
67
- return promise;
68
- }
69
- else {
70
- const targetId = this.type === 'server' ? message.targetId : NATS_SERVER_SUBJECT;
71
- this.publisher.publish(targetId, message);
72
- }
73
- }
74
- processQueue() {
75
- if (this.isProcessing || this.queue.length === 0 || this.aborted) {
76
- return;
77
- }
78
- this.isProcessing = true;
79
- while (this.queue.length && !this.aborted) {
80
- const currentItem = this.queue.shift();
81
- // console.log(`${this.type.toUpperCase()} => Sending request to ${this.type === 'server' ? 'CLIENT' : 'SERVER'}:`, currentItem.message);
82
- const cleanup = () => {
83
- clearTimeout(timeout);
84
- this.pendingResponses.delete(currentItem.message.requestId);
85
- };
86
- const timeout = setTimeout(() => {
87
- const remoteError = new RemoteError({
88
- name: 'TimeoutError',
89
- message: `Request timed out after ${currentItem.message.timeout}ms`,
90
- stack: '',
91
- }, currentItem.message);
92
- currentItem.reject(remoteError);
93
- cleanup();
94
- }, currentItem.message.timeout);
95
- this.pendingResponses.set(currentItem.message.requestId, {
96
- message: currentItem.message,
97
- resolve: (response) => {
98
- currentItem.resolve(response);
99
- cleanup();
100
- },
101
- reject: (error) => {
102
- currentItem.reject(error);
103
- cleanup();
104
- },
105
- });
106
- const targetId = this.type === 'server' ? currentItem.message.targetId : NATS_SERVER_SUBJECT;
107
- this.publisher.publish(targetId, currentItem.message);
108
- }
109
- this.isProcessing = false;
110
- }
111
- async onMessage(msg) {
112
- if (this.aborted) {
113
- return;
114
- }
115
- const message = unpack(msg.data);
116
- if (message.type === 'reply') {
117
- // console.log(`${this.type.toUpperCase()} => Received reply from ${this.type === 'server' ? 'CLIENT' : 'SERVER'}:`, message);
118
- const currentItem = this.pendingResponses.get(message.requestId);
119
- if (!currentItem) {
120
- // this.logger.error(`Unknown reply from ${this.type === 'server' ? 'client' : 'server'}:`, message);
121
- return;
122
- }
123
- if (message.error) {
124
- const { error, ...cause } = message;
125
- const remoteError = new RemoteError(error, cause);
126
- currentItem.reject(remoteError);
127
- }
128
- else {
129
- currentItem.resolve(message.response);
130
- }
131
- }
132
- else if (message.type === 'request') {
133
- // console.log(`${this.type.toUpperCase()} => Received request from ${this.type === 'server' ? 'CLIENT' : 'SERVER'}:`, message);
134
- this.requestHandler(message);
135
- }
136
- else {
137
- this.logger.error('Invalid message type received:', message);
138
- }
139
- }
140
- }
141
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/messaging/index.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- import { EventEmitter } from 'events';
2
- import type { Msg, NatsConnection, Subscription as NatsSubscription, RequestOptions } from 'nats';
3
- export interface AuthConfig {
4
- user: string;
5
- password: string;
6
- }
7
- export declare interface ProxySubscription {
8
- on(event: 'message', listener: (message: Msg) => void): this;
9
- emit(event: 'message', message: Msg): boolean;
10
- }
11
- export declare class ProxySubscription extends EventEmitter implements ProxySubscription {
12
- readonly subscriber: NatsSubscription;
13
- constructor(subscriber: NatsSubscription);
14
- listen(): Promise<void>;
15
- close(): void;
16
- }
17
- export declare class ProxyConnection {
18
- private name;
19
- private servers;
20
- private auth;
21
- private publisher?;
22
- private subscribers;
23
- private closed;
24
- constructor(name: string, servers: string[], auth: AuthConfig);
25
- connect(): Promise<NatsConnection>;
26
- subscribe(subject: string, skipListening?: boolean): ProxySubscription;
27
- publish(subject: string, message: any): void;
28
- request(subject: string, message: any, opts?: RequestOptions): Promise<any>;
29
- close(): Promise<void>;
30
- }