nodecommons-esm-process 0.0.2

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 (40) hide show
  1. package/dist/classes/commons-forever.d.mts +22 -0
  2. package/dist/classes/commons-forever.mjs +129 -0
  3. package/dist/classes/commons-forever.mjs.map +1 -0
  4. package/dist/classes/commons-graceful-abort.d.mts +3 -0
  5. package/dist/classes/commons-graceful-abort.mjs +56 -0
  6. package/dist/classes/commons-graceful-abort.mjs.map +1 -0
  7. package/dist/classes/commons-ipc-unix-socket-auto-reconnect-client.d.mts +20 -0
  8. package/dist/classes/commons-ipc-unix-socket-auto-reconnect-client.mjs +106 -0
  9. package/dist/classes/commons-ipc-unix-socket-auto-reconnect-client.mjs.map +1 -0
  10. package/dist/classes/commons-ipc-unix-socket-auto-reconnect-host.d.mts +7 -0
  11. package/dist/classes/commons-ipc-unix-socket-auto-reconnect-host.mjs +16 -0
  12. package/dist/classes/commons-ipc-unix-socket-auto-reconnect-host.mjs.map +1 -0
  13. package/dist/classes/commons-ipc-unix-socket-client.d.mts +10 -0
  14. package/dist/classes/commons-ipc-unix-socket-client.mjs +62 -0
  15. package/dist/classes/commons-ipc-unix-socket-client.mjs.map +1 -0
  16. package/dist/classes/commons-ipc-unix-socket-host.d.mts +13 -0
  17. package/dist/classes/commons-ipc-unix-socket-host.mjs +131 -0
  18. package/dist/classes/commons-ipc-unix-socket-host.mjs.map +1 -0
  19. package/dist/classes/commons-ipc-unix-socket.d.mts +7 -0
  20. package/dist/classes/commons-ipc-unix-socket.mjs +17 -0
  21. package/dist/classes/commons-ipc-unix-socket.mjs.map +1 -0
  22. package/dist/classes/commons-resource-queue.d.mts +26 -0
  23. package/dist/classes/commons-resource-queue.mjs +108 -0
  24. package/dist/classes/commons-resource-queue.mjs.map +1 -0
  25. package/dist/classes/commons-shm.d.mts +28 -0
  26. package/dist/classes/commons-shm.mjs +120 -0
  27. package/dist/classes/commons-shm.mjs.map +1 -0
  28. package/dist/enums/ecommons-exit-code.d.mts +10 -0
  29. package/dist/enums/ecommons-exit-code.mjs +12 -0
  30. package/dist/enums/ecommons-exit-code.mjs.map +1 -0
  31. package/dist/helpers/commons-exec.d.mts +10 -0
  32. package/dist/helpers/commons-exec.mjs +81 -0
  33. package/dist/helpers/commons-exec.mjs.map +1 -0
  34. package/dist/helpers/commons-systemd.d.mts +4 -0
  35. package/dist/helpers/commons-systemd.mjs +96 -0
  36. package/dist/helpers/commons-systemd.mjs.map +1 -0
  37. package/dist/index.d.mts +13 -0
  38. package/dist/index.mjs +14 -0
  39. package/dist/index.mjs.map +1 -0
  40. package/package.json +37 -0
@@ -0,0 +1,22 @@
1
+ export declare abstract class CommonsForever {
2
+ private script;
3
+ private permittedExitCodes;
4
+ private minUptime;
5
+ private tsConfigPaths;
6
+ static ready(): void;
7
+ private child;
8
+ private firstStarted;
9
+ private startTime;
10
+ private command;
11
+ private args;
12
+ private options;
13
+ constructor(script: string, permittedExitCodes?: number[], minUptime?: number, tsConfigPaths?: boolean, args?: string[]);
14
+ start(): void;
15
+ isChildActive(): boolean;
16
+ abstract handleReady(first: boolean): void;
17
+ abstract handleMessage(message: string): void;
18
+ fork(): void;
19
+ send(message: string): Promise<void>;
20
+ terminateChild(): void;
21
+ shutdown(code: number): Promise<void>;
22
+ }
@@ -0,0 +1,129 @@
1
+ import * as child_process from 'child_process';
2
+ import { commonsOutputInfo, commonsOutputDebug, commonsOutputError } from 'nodecommons-esm-cli';
3
+ import { commonsFileDistRelativePath } from 'nodecommons-esm-file';
4
+ import { ECommonsExitCode } from '../enums/ecommons-exit-code.mjs';
5
+ export class CommonsForever {
6
+ script;
7
+ permittedExitCodes;
8
+ minUptime;
9
+ tsConfigPaths;
10
+ // helper method for child processes
11
+ static ready() {
12
+ if (process.send !== undefined)
13
+ process.send({ message: 'ready' });
14
+ }
15
+ child;
16
+ firstStarted = true;
17
+ startTime = 0;
18
+ command;
19
+ args;
20
+ options;
21
+ constructor(script, permittedExitCodes = [
22
+ ECommonsExitCode.SUCCESS,
23
+ ECommonsExitCode.MISUSE
24
+ ], minUptime = 2000, tsConfigPaths = false, args) {
25
+ this.script = script;
26
+ this.permittedExitCodes = permittedExitCodes;
27
+ this.minUptime = minUptime;
28
+ this.tsConfigPaths = tsConfigPaths;
29
+ if (this.permittedExitCodes.includes(ECommonsExitCode.FOREVERSTOP))
30
+ throw Error('CommonsForever cannot use FOREVERSTOP as a permitted exit code');
31
+ if (this.permittedExitCodes.includes(ECommonsExitCode.FOREVERRESTART))
32
+ throw Error('CommonsForever cannot use FOREVERRESTART as a permitted exit code');
33
+ this.command = commonsFileDistRelativePath(this.script);
34
+ this.args = args === undefined ? process.argv.slice(2) : args;
35
+ this.options = {
36
+ cwd: process.cwd(),
37
+ stdio: ['pipe', 'pipe', 'pipe', 'ipc']
38
+ };
39
+ if (process.platform === 'win32')
40
+ this.options.detached = true;
41
+ if (this.tsConfigPaths)
42
+ this.options.execArgv = '-r ./tsconfig-paths-bootstrap.js'.split(' ');
43
+ }
44
+ start() {
45
+ commonsOutputInfo('CommonsForever process running');
46
+ this.firstStarted = true;
47
+ this.fork();
48
+ }
49
+ isChildActive() {
50
+ return this.child !== undefined;
51
+ }
52
+ fork() {
53
+ if (this.child !== undefined)
54
+ throw new Error('Child process already exists');
55
+ commonsOutputInfo('Forking child process');
56
+ this.startTime = new Date().getTime();
57
+ this.child = child_process.fork(this.command, this.args, this.options);
58
+ this.child.on('error', (_) => {
59
+ if (this.child === undefined)
60
+ return;
61
+ if (!this.child.connected)
62
+ return;
63
+ this.child = undefined;
64
+ });
65
+ this.child.on('message', (message) => {
66
+ if (message.message === 'ready')
67
+ this.handleReady(this.firstStarted);
68
+ this.firstStarted = false;
69
+ this.handleMessage(message.message);
70
+ });
71
+ this.child.on('exit', (code, signal) => {
72
+ this.child = undefined;
73
+ commonsOutputDebug(`Child process exited with exit code ${code || 'null'} and signal ${signal || 'null'}`);
74
+ if (code !== null && this.permittedExitCodes.includes(code)) {
75
+ void this.shutdown(code);
76
+ return;
77
+ }
78
+ if (signal === 'SIGINT') {
79
+ void this.shutdown(ECommonsExitCode.INTERRUPT);
80
+ return;
81
+ }
82
+ const endTime = new Date().getTime();
83
+ const delta = endTime - this.startTime;
84
+ if (delta < this.minUptime) {
85
+ commonsOutputError('Minimum uptime not reached. Aborting');
86
+ void this.shutdown(ECommonsExitCode.ERROR);
87
+ return;
88
+ }
89
+ commonsOutputInfo('Non-permitted exit code. Restarting');
90
+ process.nextTick(() => {
91
+ this.fork();
92
+ });
93
+ });
94
+ if (this.child.stdout !== null) {
95
+ this.child.stdout.on('data', (data) => {
96
+ process.stdout.write(data);
97
+ });
98
+ }
99
+ if (this.child.stderr !== null) {
100
+ this.child.stderr.on('data', (data) => {
101
+ process.stderr.write(data);
102
+ });
103
+ }
104
+ }
105
+ send(message) {
106
+ return new Promise((resolve, reject) => {
107
+ if (this.child === undefined) {
108
+ reject(new Error('No client is available'));
109
+ return;
110
+ }
111
+ this.child.send({ message: message }, (outcome) => {
112
+ if (outcome === null)
113
+ resolve();
114
+ else
115
+ reject(outcome);
116
+ });
117
+ });
118
+ }
119
+ terminateChild() {
120
+ if (this.child !== undefined)
121
+ this.child.kill('SIGTERM');
122
+ }
123
+ async shutdown(code) {
124
+ process.exitCode = code;
125
+ commonsOutputInfo('Stopping CommonsForever process');
126
+ this.terminateChild();
127
+ }
128
+ }
129
+ //# sourceMappingURL=commons-forever.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-forever.mjs","sourceRoot":"","sources":["../../src/classes/commons-forever.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function commonsGracefulAbortAddCallback(callback: () => void): string;
2
+ export declare function commonsGracefulAbortRemoveCallback(id: string): void;
3
+ export declare function commonsGracefulAbortIsAborted(): boolean;
@@ -0,0 +1,56 @@
1
+ import { commonsBase62GenerateRandomId } from 'tscommons-esm-core';
2
+ import { replaceCommonsKeyPressSigIntHandler } from 'nodecommons-esm-cli';
3
+ class InternalCommonsGracefulAbort {
4
+ callbacks;
5
+ abort = false;
6
+ constructor() {
7
+ this.callbacks = new Map();
8
+ this.init();
9
+ }
10
+ sigIntHandler() {
11
+ if (this.abort) {
12
+ console.log('Second SIGINT detected. Forcing hard abort.');
13
+ process.exit(128 + 2); // 128 + SIGINT=2
14
+ }
15
+ console.log('SIGINT detected. Attempting clean shutdown.');
16
+ this.abort = true;
17
+ const keys = Array.from(this.callbacks.keys());
18
+ for (const key of keys) {
19
+ const callback = this.callbacks.get(key);
20
+ this.callbacks.delete(key);
21
+ if (callback !== undefined)
22
+ callback();
23
+ }
24
+ }
25
+ init() {
26
+ process.on('SIGINT', () => {
27
+ this.sigIntHandler();
28
+ });
29
+ // CommonsKeyPress suppresses SIGINT, so we have to set a handler inside it manually
30
+ replaceCommonsKeyPressSigIntHandler(() => {
31
+ this.sigIntHandler();
32
+ });
33
+ }
34
+ addCallback(callback) {
35
+ const id = commonsBase62GenerateRandomId();
36
+ this.callbacks.set(id, callback);
37
+ return id;
38
+ }
39
+ removeCallback(id) {
40
+ this.callbacks.delete(id);
41
+ }
42
+ isAborted() {
43
+ return this.abort;
44
+ }
45
+ }
46
+ const internal = new InternalCommonsGracefulAbort();
47
+ export function commonsGracefulAbortAddCallback(callback) {
48
+ return internal.addCallback(callback);
49
+ }
50
+ export function commonsGracefulAbortRemoveCallback(id) {
51
+ internal.removeCallback(id);
52
+ }
53
+ export function commonsGracefulAbortIsAborted() {
54
+ return internal.isAborted();
55
+ }
56
+ //# sourceMappingURL=commons-graceful-abort.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-graceful-abort.mjs","sourceRoot":"","sources":["../../src/classes/commons-graceful-abort.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,oBAAoB,CAAC;AAEnE,OAAO,EAAE,mCAAmC,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,4BAA4B;IACzB,SAAS,CAA0B;IACnC,KAAK,GAAY,KAAK,CAAC;IAE/B;QACC,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAsB,CAAC;QAE/C,IAAI,CAAC,IAAI,EAAE,CAAC;IACb,CAAC;IAEO,aAAa;QACpB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB;QACzC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAElB,MAAM,IAAI,GAAa,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;QACzD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACxB,MAAM,QAAQ,GAA2B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACjE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAE3B,IAAI,QAAQ,KAAK,SAAS;gBAAE,QAAQ,EAAE,CAAC;QACxC,CAAC;IACF,CAAC;IAEO,IAAI;QACX,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAS,EAAE;YAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;QAEH,oFAAoF;QACpF,mCAAmC,CAAC,GAAS,EAAE;YAC9C,IAAI,CAAC,aAAa,EAAE,CAAC;QACtB,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,WAAW,CAAC,QAAoB;QACtC,MAAM,EAAE,GAAW,6BAA6B,EAAE,CAAC;QACnD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;QAEjC,OAAO,EAAE,CAAC;IACX,CAAC;IAEM,cAAc,CAAC,EAAU;QAC/B,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3B,CAAC;IAEM,SAAS;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;CACD;AAED,MAAM,QAAQ,GAAiC,IAAI,4BAA4B,EAAE,CAAC;AAElF,MAAM,UAAU,+BAA+B,CAAC,QAAoB;IACnE,OAAO,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,kCAAkC,CAAC,EAAU;IAC5D,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;AAC7B,CAAC;AACD,MAAM,UAAU,6BAA6B;IAC5C,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { CommonsIpcUnixSocketClient } from './commons-ipc-unix-socket-client.mjs';
2
+ export declare class CommonsIpcUnixSocketAutoReconnectClient extends CommonsIpcUnixSocketClient {
3
+ private maxTtl;
4
+ private reconnectDelay;
5
+ private noopInterval;
6
+ private noopCommand;
7
+ private failureCallback?;
8
+ private connectedCallback?;
9
+ private requireInitialConnection;
10
+ private connected;
11
+ private intervalName;
12
+ constructor(name: string, maxTtl: number, reconnectDelay?: number, noopInterval?: number, noopCommand?: string, failureCallback?: (() => void) | undefined, connectedCallback?: ((state: boolean) => void) | undefined, requireInitialConnection?: boolean);
13
+ isConnected(): boolean;
14
+ private setConnected;
15
+ private reconnect;
16
+ listen(callback: (data: string) => void): Promise<void>;
17
+ send(data: string): Promise<void>;
18
+ close(): void;
19
+ destroy(): void;
20
+ }
@@ -0,0 +1,106 @@
1
+ import { commonsAsyncTimeout, commonsAsyncInterval, commonsAsyncAbortInterval, ECommonsInvocation } from 'tscommons-esm-async';
2
+ import { commonsOutputDebug } from 'nodecommons-esm-cli';
3
+ import { CommonsIpcUnixSocketClient } from './commons-ipc-unix-socket-client.mjs';
4
+ export class CommonsIpcUnixSocketAutoReconnectClient extends CommonsIpcUnixSocketClient {
5
+ maxTtl;
6
+ reconnectDelay;
7
+ noopInterval;
8
+ noopCommand;
9
+ failureCallback;
10
+ connectedCallback;
11
+ requireInitialConnection;
12
+ connected = false;
13
+ intervalName;
14
+ constructor(name, maxTtl, reconnectDelay = 1000, noopInterval = 1000, noopCommand = '_noop', failureCallback, connectedCallback, requireInitialConnection = true) {
15
+ super(name);
16
+ this.maxTtl = maxTtl;
17
+ this.reconnectDelay = reconnectDelay;
18
+ this.noopInterval = noopInterval;
19
+ this.noopCommand = noopCommand;
20
+ this.failureCallback = failureCallback;
21
+ this.connectedCallback = connectedCallback;
22
+ this.requireInitialConnection = requireInitialConnection;
23
+ this.intervalName = `commons_ipc_unix_socket_auto_reconnect_client_${name}`;
24
+ }
25
+ isConnected() {
26
+ return this.connected;
27
+ }
28
+ setConnected(state) {
29
+ const existing = this.connected;
30
+ this.connected = state;
31
+ if (this.connectedCallback && state !== existing)
32
+ this.connectedCallback(state);
33
+ }
34
+ async reconnect(callback, ttl = -1) {
35
+ if (ttl === 0) { // allows -1 to start an infinite reconnect
36
+ commonsOutputDebug('TTL on reconnection expired');
37
+ return false;
38
+ }
39
+ commonsOutputDebug(`Attempting reconnection to unix domain socket. TTL is ${ttl}`);
40
+ try {
41
+ await super.listen(callback);
42
+ this.setConnected(true);
43
+ commonsOutputDebug('Connected successfully');
44
+ return true;
45
+ }
46
+ catch (_e) {
47
+ if (ttl > 1)
48
+ await commonsAsyncTimeout(this.reconnectDelay);
49
+ return await this.reconnect(callback, ttl - 1);
50
+ }
51
+ }
52
+ async listen(callback) {
53
+ if (this.requireInitialConnection) {
54
+ if (!(await this.reconnect(callback, 1)))
55
+ throw new Error('Unable to connect');
56
+ }
57
+ commonsAsyncInterval(this.noopInterval, ECommonsInvocation.IF, async () => {
58
+ if (!this.connected) {
59
+ commonsOutputDebug('Attempting reconnection to unix domain socket');
60
+ if (!(await this.reconnect(callback, this.maxTtl))) {
61
+ commonsOutputDebug('Timed out attempting to connect');
62
+ commonsAsyncAbortInterval(this.intervalName);
63
+ if (this.failureCallback)
64
+ this.failureCallback();
65
+ }
66
+ }
67
+ else {
68
+ try {
69
+ await super.send(this.noopCommand);
70
+ this.setConnected(true);
71
+ }
72
+ catch (_e) {
73
+ this.setConnected(false);
74
+ commonsOutputDebug('Lost connection to unix domain socket during noop');
75
+ try {
76
+ super.destroy();
77
+ }
78
+ catch (_e2) {
79
+ // do nothing
80
+ }
81
+ }
82
+ }
83
+ }, this.intervalName);
84
+ }
85
+ async send(data) {
86
+ if (!this.connected)
87
+ throw new Error('Not connected');
88
+ try {
89
+ await super.send(data);
90
+ }
91
+ catch (e) {
92
+ this.setConnected(false);
93
+ commonsOutputDebug('Lost connection to unix domain socket during send');
94
+ throw e;
95
+ }
96
+ }
97
+ close() {
98
+ commonsAsyncAbortInterval(this.intervalName);
99
+ super.close();
100
+ }
101
+ destroy() {
102
+ commonsAsyncAbortInterval(this.intervalName);
103
+ super.destroy();
104
+ }
105
+ }
106
+ //# sourceMappingURL=commons-ipc-unix-socket-auto-reconnect-client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-ipc-unix-socket-auto-reconnect-client.mjs","sourceRoot":"","sources":["../../src/classes/commons-ipc-unix-socket-auto-reconnect-client.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { Socket } from 'net';
2
+ import { CommonsIpcUnixSocketHost } from './commons-ipc-unix-socket-host.mjs';
3
+ export declare class CommonsIpcUnixSocketAutoReconnectHost extends CommonsIpcUnixSocketHost {
4
+ private noopCommand;
5
+ constructor(name: string, chmodPermissions?: string, noopCommand?: string);
6
+ listen(callback: (data: string, socket: Socket) => void): Promise<void>;
7
+ }
@@ -0,0 +1,16 @@
1
+ import { CommonsIpcUnixSocketHost } from './commons-ipc-unix-socket-host.mjs';
2
+ export class CommonsIpcUnixSocketAutoReconnectHost extends CommonsIpcUnixSocketHost {
3
+ noopCommand;
4
+ constructor(name, chmodPermissions, noopCommand = '_noop') {
5
+ super(name, chmodPermissions);
6
+ this.noopCommand = noopCommand;
7
+ }
8
+ async listen(callback) {
9
+ await super.listen((data, socket) => {
10
+ if (data === this.noopCommand)
11
+ return;
12
+ callback(data, socket);
13
+ });
14
+ }
15
+ }
16
+ //# sourceMappingURL=commons-ipc-unix-socket-auto-reconnect-host.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-ipc-unix-socket-auto-reconnect-host.mjs","sourceRoot":"","sources":["../../src/classes/commons-ipc-unix-socket-auto-reconnect-host.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAE9E,MAAM,OAAO,qCAAsC,SAAQ,wBAAwB;IAIxE;IAHV,YACE,IAAY,EACZ,gBAAyB,EACjB,cAAsB,OAAO;QAEtC,KAAK,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC;QAFrB,gBAAW,GAAX,WAAW,CAAkB;IAGvC,CAAC;IAEe,KAAK,CAAC,MAAM,CAC1B,QAAgD;QAEjD,MAAM,KAAK,CAAC,MAAM,CAChB,CAAC,IAAY,EAAE,MAAc,EAAQ,EAAE;YACtC,IAAI,IAAI,KAAK,IAAI,CAAC,WAAW;gBAAE,OAAO;YACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACxB,CAAC,CACF,CAAC;IACH,CAAC;CACD"}
@@ -0,0 +1,10 @@
1
+ import { CommonsIpcUnixSocket } from './commons-ipc-unix-socket.mjs';
2
+ export declare class CommonsIpcUnixSocketClient extends CommonsIpcUnixSocket {
3
+ private socket;
4
+ private remoteClosedCallback;
5
+ constructor(name: string);
6
+ listen(callback: (data: string) => void): Promise<void>;
7
+ send(data: string): Promise<void>;
8
+ close(): void;
9
+ destroy(): void;
10
+ }
@@ -0,0 +1,62 @@
1
+ import * as net from 'net';
2
+ import { commonsOutputDebug } from 'nodecommons-esm-cli';
3
+ import { CommonsIpcUnixSocket } from './commons-ipc-unix-socket.mjs';
4
+ export class CommonsIpcUnixSocketClient extends CommonsIpcUnixSocket {
5
+ socket = undefined;
6
+ remoteClosedCallback;
7
+ constructor(name) {
8
+ super(name);
9
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
10
+ this.remoteClosedCallback = () => { };
11
+ }
12
+ async listen(callback) {
13
+ return new Promise((resolve, reject) => {
14
+ this.socket = net.createConnection(this.getPath(), () => {
15
+ resolve();
16
+ });
17
+ this.socket.setEncoding('utf8');
18
+ this.socket.on('error', (error) => {
19
+ if (error.code === 'EPIPE') {
20
+ this.remoteClosedCallback();
21
+ return;
22
+ }
23
+ reject(error);
24
+ });
25
+ this.socket.on('data', (data) => {
26
+ callback(data);
27
+ });
28
+ });
29
+ }
30
+ send(data) {
31
+ commonsOutputDebug(`Sending data: ${data}`);
32
+ return new Promise((resolve, reject) => {
33
+ if (this.socket === undefined) {
34
+ reject(new Error('Unix IPC socket is not open yet'));
35
+ return;
36
+ }
37
+ try {
38
+ this.remoteClosedCallback = () => {
39
+ reject(new Error('Unix IPC socket no longer available'));
40
+ };
41
+ this.socket.write(data, () => {
42
+ resolve();
43
+ });
44
+ }
45
+ catch (e) {
46
+ reject(e);
47
+ }
48
+ });
49
+ }
50
+ close() {
51
+ if (this.socket === undefined)
52
+ return;
53
+ this.socket.end();
54
+ }
55
+ destroy() {
56
+ if (this.socket === undefined)
57
+ return;
58
+ this.socket.destroy();
59
+ this.socket.unref();
60
+ }
61
+ }
62
+ //# sourceMappingURL=commons-ipc-unix-socket-client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-ipc-unix-socket-client.mjs","sourceRoot":"","sources":["../../src/classes/commons-ipc-unix-socket-client.mts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAG3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAIrE,MAAM,OAAO,0BAA2B,SAAQ,oBAAoB;IAC3D,MAAM,GAAqB,SAAS,CAAC;IACrC,oBAAoB,CAAwB;IAEpD,YACE,IAAY;QAEb,KAAK,CAAC,IAAI,CAAC,CAAC;QAEZ,gEAAgE;QAChE,IAAI,CAAC,oBAAoB,GAAG,GAAS,EAAE,GAAE,CAAC,CAAC;IAC5C,CAAC;IAEM,KAAK,CAAC,MAAM,CACjB,QAAgC;QAEjC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAmB,EAAE,MAA8B,EAAQ,EAAE;YAChF,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAChC,IAAI,CAAC,OAAO,EAAE,EACd,GAAS,EAAE;gBACV,OAAO,EAAE,CAAC;YACX,CAAC,CACF,CAAC;YACF,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAEhC,IAAI,CAAC,MAAM,CAAC,EAAE,CACZ,OAAO,EACP,CAAC,KAA4B,EAAQ,EAAE;gBACtC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC5B,IAAI,CAAC,oBAAoB,EAAE,CAAC;oBAC5B,OAAO;gBACR,CAAC;gBAED,MAAM,CAAC,KAAK,CAAC,CAAC;YACf,CAAC,CACF,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,EAAE,CACZ,MAAM,EACN,CAAC,IAAY,EAAQ,EAAE;gBACtB,QAAQ,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CACF,CAAC;QACH,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,IAAI,CAAC,IAAY;QACvB,kBAAkB,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAmB,EAAE,MAA8B,EAAQ,EAAE;YAChF,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACR,CAAC;YAED,IAAI,CAAC;gBACJ,IAAI,CAAC,oBAAoB,GAAG,GAAS,EAAE;oBACtC,MAAM,CAAC,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;gBAC1D,CAAC,CAAC;gBAEF,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,IAAI,EACJ,GAAS,EAAE;oBACV,OAAO,EAAE,CAAC;gBACX,CAAC,CACF,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,MAAM,CAAC,CAAU,CAAC,CAAC;YACpB,CAAC;QACF,CAAC,CAAC,CAAC;IACJ,CAAC;IAEM,KAAK;QACX,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IACnB,CAAC;IAEM,OAAO;QACb,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;YAAE,OAAO;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACD"}
@@ -0,0 +1,13 @@
1
+ import { Socket } from 'net';
2
+ import { CommonsIpcUnixSocket } from './commons-ipc-unix-socket.mjs';
3
+ export declare class CommonsIpcUnixSocketHost extends CommonsIpcUnixSocket {
4
+ private chmodPermissions?;
5
+ private server;
6
+ private sockets;
7
+ constructor(name: string, chmodPermissions?: string | undefined);
8
+ private disposeSocket;
9
+ closeServer(): Promise<void>;
10
+ listen(callback: (data: string, socket: Socket) => void): Promise<void>;
11
+ send(data: string): Promise<boolean>;
12
+ shutdown(wait?: boolean): Promise<void>;
13
+ }
@@ -0,0 +1,131 @@
1
+ import * as fs from 'fs';
2
+ import * as net from 'net';
3
+ import { commonsOutputDebug } from 'nodecommons-esm-cli';
4
+ import { CommonsIpcUnixSocket } from './commons-ipc-unix-socket.mjs';
5
+ import { CommonsIpcUnixSocketClient } from './commons-ipc-unix-socket-client.mjs';
6
+ export class CommonsIpcUnixSocketHost extends CommonsIpcUnixSocket {
7
+ chmodPermissions;
8
+ server;
9
+ sockets = [];
10
+ constructor(name, chmodPermissions) {
11
+ super(name);
12
+ this.chmodPermissions = chmodPermissions;
13
+ this.server = net.createServer();
14
+ }
15
+ disposeSocket(socket) {
16
+ const index = this.sockets.indexOf(socket);
17
+ if (index > -1)
18
+ this.sockets.splice(index, 1);
19
+ socket.unref();
20
+ }
21
+ async closeServer() {
22
+ return new Promise((resolve, _) => {
23
+ if (!this.server || !this.server.listening) {
24
+ resolve();
25
+ return;
26
+ }
27
+ this.server.close(() => {
28
+ resolve();
29
+ this.server.unref();
30
+ });
31
+ });
32
+ }
33
+ async listen(callback) {
34
+ commonsOutputDebug('Setting up listen for IPC server');
35
+ return new Promise((resolve, reject) => {
36
+ this.server.listen(this.getPath(), () => {
37
+ if (this.chmodPermissions)
38
+ fs.chmodSync(this.getPath(), this.chmodPermissions);
39
+ resolve();
40
+ });
41
+ this.server.on('error', (error) => {
42
+ if (error.code === 'EADDRINUSE') {
43
+ commonsOutputDebug('Unix socket is already in use!');
44
+ commonsOutputDebug('Attempting removal and recreation');
45
+ const test = new CommonsIpcUnixSocketClient(this.getName());
46
+ void (async () => {
47
+ try {
48
+ // eslint-disable-next-line @typescript-eslint/no-empty-function
49
+ await test.listen((_) => { });
50
+ test.destroy();
51
+ reject(new Error('Existing Unix socket on that path being used'));
52
+ return;
53
+ }
54
+ catch (e) {
55
+ test.destroy();
56
+ if (e.code === 'ECONNREFUSED') { // eslint-disable-line @typescript-eslint/no-unsafe-member-access
57
+ commonsOutputDebug(`Unlinking existing IPC socket path at ${this.getPath()}`);
58
+ fs.unlinkSync(this.getPath());
59
+ try {
60
+ commonsOutputDebug('Reattempting to listen');
61
+ this.server.listen(this.getPath(), () => {
62
+ commonsOutputDebug('Recreation succeeded');
63
+ resolve();
64
+ });
65
+ return;
66
+ }
67
+ catch (e2) {
68
+ reject(e2);
69
+ return;
70
+ }
71
+ }
72
+ reject(e);
73
+ }
74
+ })();
75
+ }
76
+ reject(error);
77
+ });
78
+ this.server.on('connection', (socket) => {
79
+ socket.setEncoding('utf8');
80
+ this.sockets.push(socket);
81
+ socket.on('close', (_) => {
82
+ this.disposeSocket(socket);
83
+ });
84
+ socket.on('end', () => {
85
+ this.disposeSocket(socket);
86
+ });
87
+ socket.on('data', (data) => {
88
+ callback(data, socket);
89
+ });
90
+ });
91
+ });
92
+ }
93
+ async send(data) {
94
+ return new Promise((resolve, _) => {
95
+ let success = 0;
96
+ let failure = 0;
97
+ for (const socket of this.sockets) {
98
+ try {
99
+ socket.write(data, () => {
100
+ success++;
101
+ if ((success + failure) === this.sockets.length)
102
+ resolve(failure === 0);
103
+ });
104
+ }
105
+ catch (_e) {
106
+ failure++;
107
+ if ((success + failure) === this.sockets.length)
108
+ resolve(failure === 0);
109
+ }
110
+ }
111
+ });
112
+ }
113
+ async shutdown(wait = false) {
114
+ return new Promise((resolve, _) => {
115
+ for (const socket of this.sockets)
116
+ socket.end();
117
+ if (!wait) {
118
+ resolve();
119
+ return;
120
+ }
121
+ const interval = setInterval(() => {
122
+ if (this.sockets.length === 0) {
123
+ clearInterval(interval);
124
+ resolve();
125
+ return;
126
+ }
127
+ }, 100);
128
+ });
129
+ }
130
+ }
131
+ //# sourceMappingURL=commons-ipc-unix-socket-host.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commons-ipc-unix-socket-host.mjs","sourceRoot":"","sources":["../../src/classes/commons-ipc-unix-socket-host.mts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare abstract class CommonsIpcUnixSocket {
2
+ private name;
3
+ private path;
4
+ constructor(name: string);
5
+ getPath(): string;
6
+ getName(): string;
7
+ }
@@ -0,0 +1,17 @@
1
+ import * as os from 'os';
2
+ import * as path from 'path';
3
+ export class CommonsIpcUnixSocket {
4
+ name;
5
+ path;
6
+ constructor(name) {
7
+ this.name = name;
8
+ this.path = path.join(os.tmpdir(), `${name}.sock`);
9
+ }
10
+ getPath() {
11
+ return this.path;
12
+ }
13
+ getName() {
14
+ return this.name;
15
+ }
16
+ }
17
+ //# sourceMappingURL=commons-ipc-unix-socket.mjs.map