@syncbridge/common 0.4.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/LICENSE +15 -0
- package/README.md +1 -0
- package/classes/base-element.d.ts +46 -0
- package/classes/base-element.js +80 -0
- package/classes/component-base.d.ts +26 -0
- package/classes/component-base.js +12 -0
- package/classes/frame-stream.d.ts +34 -0
- package/classes/frame-stream.js +140 -0
- package/classes/processor-base.d.ts +15 -0
- package/classes/processor-base.js +8 -0
- package/classes/runnable.d.ts +86 -0
- package/classes/runnable.js +228 -0
- package/classes/sb-error.d.ts +11 -0
- package/classes/sb-error.js +54 -0
- package/classes/stack-executor.d.ts +10 -0
- package/classes/stack-executor.js +37 -0
- package/constants.d.ts +6 -0
- package/constants.js +17 -0
- package/decorators/component.decorator.d.ts +15 -0
- package/decorators/component.decorator.js +28 -0
- package/decorators/decorator-helpers.d.ts +2 -0
- package/decorators/decorator-helpers.js +13 -0
- package/decorators/define-variable.decorator.d.ts +14 -0
- package/decorators/define-variable.decorator.js +57 -0
- package/decorators/finalize-element-metadata.d.ts +4 -0
- package/decorators/finalize-element-metadata.js +30 -0
- package/decorators/processor-events.decorator.d.ts +5 -0
- package/decorators/processor-events.decorator.js +21 -0
- package/decorators/processor.decorator.d.ts +31 -0
- package/decorators/processor.decorator.js +42 -0
- package/decorators/use-component.decorator.d.ts +9 -0
- package/decorators/use-component.decorator.js +24 -0
- package/decorators/use-variables.decorator.d.ts +5 -0
- package/decorators/use-variables.decorator.js +20 -0
- package/index.d.ts +20 -0
- package/index.js +20 -0
- package/interfaces/extension-package.interface.d.ts +6 -0
- package/interfaces/extension-package.interface.js +1 -0
- package/interfaces/index.d.ts +2 -0
- package/interfaces/index.js +2 -0
- package/interfaces/logger.interface.d.ts +17 -0
- package/interfaces/logger.interface.js +1 -0
- package/models/enums/log-level.d.ts +9 -0
- package/models/enums/log-level.js +15 -0
- package/models/enums/service-status.d.ts +8 -0
- package/models/enums/service-status.js +14 -0
- package/models/enums/variable-format.enum.d.ts +9 -0
- package/models/enums/variable-format.enum.js +15 -0
- package/models/enums/variable-type.enum.d.ts +8 -0
- package/models/enums/variable-type.enum.js +14 -0
- package/models/index.d.ts +13 -0
- package/models/index.js +13 -0
- package/models/metadata/author-metadata.d.ts +8 -0
- package/models/metadata/author-metadata.js +48 -0
- package/models/metadata/component-metadata.d.ts +8 -0
- package/models/metadata/component-metadata.js +25 -0
- package/models/metadata/element-component-metadata.d.ts +19 -0
- package/models/metadata/element-component-metadata.js +70 -0
- package/models/metadata/element-metadata.d.ts +18 -0
- package/models/metadata/element-metadata.js +81 -0
- package/models/metadata/package-metadata.d.ts +7 -0
- package/models/metadata/package-metadata.js +27 -0
- package/models/metadata/processor-metadata.d.ts +5 -0
- package/models/metadata/processor-metadata.js +14 -0
- package/models/metadata/variable-metadata.d.ts +31 -0
- package/models/metadata/variable-metadata.js +138 -0
- package/models/profile/log-options.d.ts +16 -0
- package/models/profile/log-options.js +56 -0
- package/models/profile/profile-component.d.ts +23 -0
- package/models/profile/profile-component.js +77 -0
- package/models/profile/profile.d.ts +25 -0
- package/models/profile/profile.js +115 -0
- package/models-document.d.ts +3 -0
- package/models-document.js +15 -0
- package/package.json +33 -0
- package/processor-factory.d.ts +13 -0
- package/processor-factory.js +106 -0
- package/registry.d.ts +32 -0
- package/registry.js +205 -0
- package/utils/encrypt-helpers.d.ts +2 -0
- package/utils/encrypt-helpers.js +43 -0
- package/utils/make-extension-package.d.ts +3 -0
- package/utils/make-extension-package.js +13 -0
- package/utils/metadata-utils.d.ts +7 -0
- package/utils/metadata-utils.js +99 -0
- package/utils/profile-utils.d.ts +21 -0
- package/utils/profile-utils.js +222 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
Copyright (c) 2025 Panates (Panates Teknoloji Yatirim A.S.). All rights reserved.
|
|
2
|
+
|
|
3
|
+
This software and associated documentation files (the "Software") are
|
|
4
|
+
the proprietary property of Panates and are protected by copyright laws
|
|
5
|
+
and international copyright treaties.
|
|
6
|
+
|
|
7
|
+
Unauthorized copying, distribution, modification, reverse engineering,
|
|
8
|
+
or use of this software, in whole or in part, is strictly prohibited
|
|
9
|
+
without the express written permission of Panates.
|
|
10
|
+
|
|
11
|
+
This Software is provided solely for use in accordance with the terms
|
|
12
|
+
of a valid license agreement. Any unauthorized use may result in
|
|
13
|
+
civil and/or criminal penalties.
|
|
14
|
+
|
|
15
|
+
For licensing inquiries, please contact: info@panates.com
|
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# SyncBridge Common Library
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { ILogger } from '../interfaces/index.js';
|
|
2
|
+
import { ServiceStatus } from '../models/index.js';
|
|
3
|
+
import type { ComponentBase } from './component-base.js';
|
|
4
|
+
import { Runnable } from './runnable.js';
|
|
5
|
+
export declare abstract class BaseElement<TEvents extends BaseElement.Events = BaseElement.Events> extends Runnable<TEvents> {
|
|
6
|
+
static className: string;
|
|
7
|
+
static interfaces: string[];
|
|
8
|
+
protected _context: BaseElement.Context;
|
|
9
|
+
readonly name: string;
|
|
10
|
+
logger?: ILogger;
|
|
11
|
+
components: Record<string, ComponentBase>;
|
|
12
|
+
values: Record<string, any>;
|
|
13
|
+
constructor(init: BaseElement.InitArgs);
|
|
14
|
+
get status(): ServiceStatus;
|
|
15
|
+
get statusMessage(): string;
|
|
16
|
+
protected _init(): Promise<void>;
|
|
17
|
+
protected _start(abortSignal: AbortSignal): Promise<void>;
|
|
18
|
+
protected _stop(): Promise<void>;
|
|
19
|
+
protected onStatusChange(): void;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* @namespace
|
|
23
|
+
*/
|
|
24
|
+
export declare namespace BaseElement {
|
|
25
|
+
interface Events extends Runnable.Events {
|
|
26
|
+
'component-status-change': [
|
|
27
|
+
component: ComponentBase,
|
|
28
|
+
status: ServiceStatus,
|
|
29
|
+
statusMessage: string
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
interface InitArgs extends Runnable.InitArgs {
|
|
33
|
+
logger?: ILogger;
|
|
34
|
+
name: string;
|
|
35
|
+
values: Record<string, any>;
|
|
36
|
+
}
|
|
37
|
+
interface Context extends Runnable.Context {
|
|
38
|
+
calculatedStatus?: ServiceStatus;
|
|
39
|
+
calculatedStatusMessage?: string;
|
|
40
|
+
statusIndicators: Record<string, {
|
|
41
|
+
count: number;
|
|
42
|
+
components: ComponentBase[];
|
|
43
|
+
componentNames: string[];
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { ServiceStatus } from '../models/index.js';
|
|
2
|
+
import { Runnable } from './runnable.js';
|
|
3
|
+
export class BaseElement extends Runnable {
|
|
4
|
+
static className;
|
|
5
|
+
static interfaces;
|
|
6
|
+
name;
|
|
7
|
+
logger;
|
|
8
|
+
components = {};
|
|
9
|
+
values;
|
|
10
|
+
constructor(init) {
|
|
11
|
+
super(init);
|
|
12
|
+
this.logger = init.logger;
|
|
13
|
+
this.name = init.name;
|
|
14
|
+
this.values = init.values;
|
|
15
|
+
if (this.logger)
|
|
16
|
+
this.on('error', err => this.logger?.error(err));
|
|
17
|
+
}
|
|
18
|
+
get status() {
|
|
19
|
+
return this._context.calculatedStatus || this._context.status;
|
|
20
|
+
}
|
|
21
|
+
get statusMessage() {
|
|
22
|
+
return this._context.calculatedStatusMessage ?? this._context.statusMessage;
|
|
23
|
+
}
|
|
24
|
+
async _init() {
|
|
25
|
+
for (const component of Object.values(this.components)) {
|
|
26
|
+
component.on('status-change', (status, statusMessage) => {
|
|
27
|
+
/** Reset counters */
|
|
28
|
+
this._context.statusIndicators = this._context.statusIndicators || {};
|
|
29
|
+
Object.keys(ServiceStatus).forEach(key => {
|
|
30
|
+
this._context.statusIndicators[key] = {
|
|
31
|
+
count: 0,
|
|
32
|
+
components: [],
|
|
33
|
+
componentNames: [],
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
Object.values(this.components).forEach(comp => {
|
|
37
|
+
const counter = this._context.statusIndicators[comp.status];
|
|
38
|
+
counter.count++;
|
|
39
|
+
counter.components.push(comp);
|
|
40
|
+
counter.componentNames.push(comp.name);
|
|
41
|
+
});
|
|
42
|
+
this.emitSafe('component-status-change', component, status, statusMessage);
|
|
43
|
+
if (this._context.status !== this._context.calculatedStatus)
|
|
44
|
+
this.onStatusChange();
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/** Initialize components first */
|
|
48
|
+
await Promise.all(Object.values(this.components).map(component => component.init()));
|
|
49
|
+
}
|
|
50
|
+
async _start(abortSignal) {
|
|
51
|
+
await Promise.all(Object.values(this.components).map(component => component.start(abortSignal)));
|
|
52
|
+
}
|
|
53
|
+
async _stop() {
|
|
54
|
+
await Promise.all(Object.values(this.components)
|
|
55
|
+
.reverse()
|
|
56
|
+
.map(component => component.stop()));
|
|
57
|
+
}
|
|
58
|
+
onStatusChange() {
|
|
59
|
+
const oldStatus = this.status;
|
|
60
|
+
const oldStatusMessage = this.statusMessage;
|
|
61
|
+
this._context.calculatedStatus = this._context.status;
|
|
62
|
+
this._context.calculatedStatusMessage = this._context.statusMessage;
|
|
63
|
+
if (!(this.status === ServiceStatus.stopped ||
|
|
64
|
+
this.status === ServiceStatus.stopping)) {
|
|
65
|
+
/** If there are one or more unhealthy components, set calculatedStatus to unhealthy */
|
|
66
|
+
for (const _status of [ServiceStatus.unhealthy, ServiceStatus.starting]) {
|
|
67
|
+
const indicator = this._context.statusIndicators?.[_status];
|
|
68
|
+
if (indicator?.count) {
|
|
69
|
+
this._context.calculatedStatus = _status;
|
|
70
|
+
this._context.calculatedStatusMessage = `${_status} components: ${indicator.componentNames}`;
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (this.status !== oldStatus || this.statusMessage !== oldStatusMessage) {
|
|
76
|
+
this.logger?.debug(this.status);
|
|
77
|
+
super.onStatusChange();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { BaseElement } from './base-element.js';
|
|
2
|
+
import type { ProcessorBase } from './processor-base.js';
|
|
3
|
+
export declare class ComponentBase<TEvents extends ComponentBase.Events = ComponentBase.Events> extends BaseElement<TEvents> {
|
|
4
|
+
protected _context: ComponentBase.Context;
|
|
5
|
+
readonly processor: ProcessorBase;
|
|
6
|
+
readonly parent: ProcessorBase | ComponentBase;
|
|
7
|
+
readonly path: string;
|
|
8
|
+
constructor(init: ComponentBase.InitArgs);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @namespace
|
|
12
|
+
*/
|
|
13
|
+
export declare namespace ComponentBase {
|
|
14
|
+
interface Events extends BaseElement.Events {
|
|
15
|
+
}
|
|
16
|
+
interface InitArgs extends BaseElement.InitArgs {
|
|
17
|
+
processor: ProcessorBase;
|
|
18
|
+
parent: ProcessorBase | ComponentBase;
|
|
19
|
+
path: string;
|
|
20
|
+
}
|
|
21
|
+
interface Context extends BaseElement.Context {
|
|
22
|
+
parent: ProcessorBase | ComponentBase;
|
|
23
|
+
name: string;
|
|
24
|
+
path: string;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { BaseElement } from './base-element.js';
|
|
2
|
+
export class ComponentBase extends BaseElement {
|
|
3
|
+
processor;
|
|
4
|
+
parent;
|
|
5
|
+
path;
|
|
6
|
+
constructor(init) {
|
|
7
|
+
super(init);
|
|
8
|
+
this.processor = init.processor;
|
|
9
|
+
this.parent = init.parent;
|
|
10
|
+
this.path = init.path;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { Transform } from 'node:stream';
|
|
3
|
+
import { TransformCallback, TransformOptions } from 'stream';
|
|
4
|
+
import { StrictOmit } from 'ts-gems';
|
|
5
|
+
export declare class FrameStream extends Transform {
|
|
6
|
+
private _chunks;
|
|
7
|
+
private _chunkBuffer?;
|
|
8
|
+
private _flushTimeout?;
|
|
9
|
+
private readonly _frameDelayMs;
|
|
10
|
+
private readonly _frameStart?;
|
|
11
|
+
private readonly _frameEnd?;
|
|
12
|
+
private readonly _maxBufferSize?;
|
|
13
|
+
private _bufferSize;
|
|
14
|
+
private readonly _customTransform?;
|
|
15
|
+
constructor(opts?: StrictOmit<TransformOptions, 'objectMode'> & {
|
|
16
|
+
encoding?: string;
|
|
17
|
+
/**
|
|
18
|
+
* Time in milliseconds to be waited before accepting a buffer as a frame
|
|
19
|
+
*/
|
|
20
|
+
frameDelayMs?: number;
|
|
21
|
+
/**
|
|
22
|
+
* The start character(s) or byte(s) of the actual frame
|
|
23
|
+
*/
|
|
24
|
+
frameStart?: Buffer | string;
|
|
25
|
+
frameEnd?: Buffer | string;
|
|
26
|
+
maxBufferSize?: number;
|
|
27
|
+
});
|
|
28
|
+
_transform(chunk: Buffer | string, _encoding: BufferEncoding, callback: TransformCallback): void;
|
|
29
|
+
protected _pushChunk(chunk: Buffer): void;
|
|
30
|
+
protected _assertMaxBuffer(newChunkLen?: number): void;
|
|
31
|
+
_flush(callback: TransformCallback): void;
|
|
32
|
+
reset(): void;
|
|
33
|
+
private flushBuffer;
|
|
34
|
+
}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { Buffer } from 'node:buffer';
|
|
2
|
+
import { Transform } from 'node:stream';
|
|
3
|
+
export class FrameStream extends Transform {
|
|
4
|
+
_chunks = [];
|
|
5
|
+
_chunkBuffer;
|
|
6
|
+
_flushTimeout;
|
|
7
|
+
_frameDelayMs;
|
|
8
|
+
_frameStart;
|
|
9
|
+
_frameEnd;
|
|
10
|
+
_maxBufferSize;
|
|
11
|
+
_bufferSize = 0;
|
|
12
|
+
_customTransform;
|
|
13
|
+
constructor(opts) {
|
|
14
|
+
super({
|
|
15
|
+
...opts,
|
|
16
|
+
objectMode: true,
|
|
17
|
+
transform: undefined,
|
|
18
|
+
});
|
|
19
|
+
this._customTransform = opts?.transform;
|
|
20
|
+
this._frameDelayMs = opts?.frameDelayMs || (opts?.frameEnd ? 0 : 500);
|
|
21
|
+
this._maxBufferSize = opts?.maxBufferSize;
|
|
22
|
+
if (opts?.frameStart) {
|
|
23
|
+
this._frameStart = Buffer.isBuffer(opts.frameStart)
|
|
24
|
+
? opts.frameStart
|
|
25
|
+
: Buffer.from(opts.frameStart);
|
|
26
|
+
}
|
|
27
|
+
if (opts?.frameEnd) {
|
|
28
|
+
this._frameEnd = Buffer.isBuffer(opts.frameEnd)
|
|
29
|
+
? opts.frameEnd
|
|
30
|
+
: Buffer.from(opts.frameEnd);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
_transform(chunk, _encoding, callback) {
|
|
34
|
+
// Reset flush timer
|
|
35
|
+
if (this._flushTimeout) {
|
|
36
|
+
clearTimeout(this._flushTimeout);
|
|
37
|
+
}
|
|
38
|
+
try {
|
|
39
|
+
// console.log(chunk);
|
|
40
|
+
if (!Buffer.isBuffer(chunk))
|
|
41
|
+
chunk = Buffer.from(chunk);
|
|
42
|
+
if (this._chunkBuffer) {
|
|
43
|
+
this._assertMaxBuffer(chunk.length);
|
|
44
|
+
chunk = Buffer.concat([this._chunkBuffer, chunk]);
|
|
45
|
+
this._chunkBuffer = undefined;
|
|
46
|
+
}
|
|
47
|
+
const frameStart = this._frameStart;
|
|
48
|
+
const frameEnd = this._frameEnd;
|
|
49
|
+
if (frameStart || frameEnd) {
|
|
50
|
+
const stxLen = frameStart?.length || 0;
|
|
51
|
+
const etxLen = frameEnd?.length || 0;
|
|
52
|
+
let stxPos = 0;
|
|
53
|
+
let etxPos = 0;
|
|
54
|
+
while (etxPos < chunk.length) {
|
|
55
|
+
/** Find the next stx position */
|
|
56
|
+
stxPos = etxPos;
|
|
57
|
+
if (frameStart) {
|
|
58
|
+
stxPos = chunk.indexOf(frameStart, etxPos);
|
|
59
|
+
if (stxPos < 0) {
|
|
60
|
+
this._chunkBuffer = chunk.subarray(etxPos);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (stxPos < 0)
|
|
65
|
+
stxPos = 0;
|
|
66
|
+
etxPos = frameEnd
|
|
67
|
+
? /** Find the next etx position if frameEnd defined */
|
|
68
|
+
chunk.indexOf(frameEnd, stxPos + stxLen)
|
|
69
|
+
: frameStart
|
|
70
|
+
? /** Find the next stx if frameStart not defined */
|
|
71
|
+
chunk.indexOf(frameStart, stxPos + stxLen)
|
|
72
|
+
: -1;
|
|
73
|
+
if (etxPos < 0) {
|
|
74
|
+
this._chunkBuffer = chunk.subarray(stxPos);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
etxPos += etxLen;
|
|
78
|
+
this._pushChunk(chunk.subarray(stxPos, etxPos));
|
|
79
|
+
this.flushBuffer();
|
|
80
|
+
}
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
this._pushChunk(chunk);
|
|
84
|
+
}
|
|
85
|
+
finally {
|
|
86
|
+
if (this._chunks.length && this._frameDelayMs)
|
|
87
|
+
this._flushTimeout = setTimeout(() => this.flushBuffer(), this._frameDelayMs).unref();
|
|
88
|
+
callback();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
_pushChunk(chunk) {
|
|
92
|
+
this._assertMaxBuffer(chunk.length);
|
|
93
|
+
this._chunks.push(chunk);
|
|
94
|
+
this._bufferSize += chunk.length;
|
|
95
|
+
}
|
|
96
|
+
_assertMaxBuffer(newChunkLen = 0) {
|
|
97
|
+
if (this._maxBufferSize &&
|
|
98
|
+
this._bufferSize + newChunkLen + (this._chunkBuffer?.length || 0) >
|
|
99
|
+
this._maxBufferSize) {
|
|
100
|
+
this.emit('error', new Error('Max buffer size exceeded'));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
_flush(callback) {
|
|
104
|
+
if (this._flushTimeout) {
|
|
105
|
+
clearTimeout(this._flushTimeout);
|
|
106
|
+
}
|
|
107
|
+
this.flushBuffer();
|
|
108
|
+
callback();
|
|
109
|
+
}
|
|
110
|
+
reset() {
|
|
111
|
+
this._chunks = [];
|
|
112
|
+
this._chunkBuffer = undefined;
|
|
113
|
+
if (this._flushTimeout) {
|
|
114
|
+
clearTimeout(this._flushTimeout);
|
|
115
|
+
this._flushTimeout = undefined;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
flushBuffer() {
|
|
119
|
+
if (this._chunkBuffer) {
|
|
120
|
+
this._chunks.push(this._chunkBuffer);
|
|
121
|
+
this._chunkBuffer = undefined;
|
|
122
|
+
}
|
|
123
|
+
/* c8 ignore next */
|
|
124
|
+
if (this._chunks.length === 0)
|
|
125
|
+
return;
|
|
126
|
+
const combined = this._chunks.length === 1 ? this._chunks[0] : Buffer.concat(this._chunks);
|
|
127
|
+
this._chunks = [];
|
|
128
|
+
this._bufferSize = 0;
|
|
129
|
+
if (this._customTransform) {
|
|
130
|
+
this._customTransform(combined, 'buffer', (err, data) => {
|
|
131
|
+
if (err)
|
|
132
|
+
this.emit('error', err);
|
|
133
|
+
else
|
|
134
|
+
this.push(data);
|
|
135
|
+
});
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
this.push(combined);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseElement } from './base-element.js';
|
|
2
|
+
export declare abstract class ProcessorBase<TEvents extends ProcessorBase.Events = ProcessorBase.Events> extends BaseElement<TEvents> {
|
|
3
|
+
dataDirectory?: string;
|
|
4
|
+
constructor(init: ProcessorBase.InitArgs);
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* @namespace
|
|
8
|
+
*/
|
|
9
|
+
export declare namespace ProcessorBase {
|
|
10
|
+
interface Events extends BaseElement.Events {
|
|
11
|
+
}
|
|
12
|
+
interface InitArgs extends BaseElement.InitArgs {
|
|
13
|
+
dataDirectory?: string;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { AsyncEventEmitter, EventMap } from 'node-events-async';
|
|
2
|
+
import { ServiceStatus } from '../models/index.js';
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class Runnable<T extends Runnable.Events = Runnable.Events> extends AsyncEventEmitter<EventMap<T>> {
|
|
7
|
+
protected _context: Runnable.Context;
|
|
8
|
+
constructor(init?: Runnable.InitArgs);
|
|
9
|
+
get status(): ServiceStatus;
|
|
10
|
+
get statusMessage(): string;
|
|
11
|
+
get startTime(): Date | undefined;
|
|
12
|
+
/**
|
|
13
|
+
*
|
|
14
|
+
*/
|
|
15
|
+
get stopped(): boolean;
|
|
16
|
+
startNoWait(): void;
|
|
17
|
+
stopNoWait(): void;
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
*/
|
|
21
|
+
init(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
*/
|
|
25
|
+
start(abortSignal?: AbortSignal): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
*
|
|
28
|
+
*/
|
|
29
|
+
stop(): Promise<void>;
|
|
30
|
+
/**
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
protected _init(): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
*
|
|
36
|
+
*/
|
|
37
|
+
protected abstract _start(abortSignal: AbortSignal): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
*
|
|
40
|
+
*/
|
|
41
|
+
protected abstract _stop(): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
*
|
|
44
|
+
*/
|
|
45
|
+
protected _terminate(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
*
|
|
48
|
+
*/
|
|
49
|
+
protected onError(err: Error): void;
|
|
50
|
+
/**
|
|
51
|
+
*
|
|
52
|
+
*/
|
|
53
|
+
protected onInitialize(): void;
|
|
54
|
+
/**
|
|
55
|
+
*
|
|
56
|
+
*/
|
|
57
|
+
protected onStatusChange(): void;
|
|
58
|
+
/**
|
|
59
|
+
*
|
|
60
|
+
*/
|
|
61
|
+
protected setStatus(status: ServiceStatus, statusMessage?: string): void;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* @namespace
|
|
65
|
+
*/
|
|
66
|
+
export declare namespace Runnable {
|
|
67
|
+
interface Events {
|
|
68
|
+
error: [error: unknown, ...args: any[]];
|
|
69
|
+
initialize: [];
|
|
70
|
+
'status-change': [status: ServiceStatus, message: string];
|
|
71
|
+
}
|
|
72
|
+
interface InitArgs {
|
|
73
|
+
startMaxWaitMs?: number;
|
|
74
|
+
stopMaxWaitMs?: number;
|
|
75
|
+
}
|
|
76
|
+
interface Context {
|
|
77
|
+
initialized: boolean;
|
|
78
|
+
status: ServiceStatus;
|
|
79
|
+
statusMessage: string;
|
|
80
|
+
waitTimer?: Promise<void>;
|
|
81
|
+
startTime?: Date;
|
|
82
|
+
startMaxWaitMs: number;
|
|
83
|
+
stopMaxWaitMs: number;
|
|
84
|
+
stopTimer?: NodeJS.Timeout;
|
|
85
|
+
}
|
|
86
|
+
}
|