@syncbridge/common 2.0.0 → 2.0.1
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 +192 -1
- package/app-factory.js +0 -1
- package/classes/app-base.js +0 -1
- package/classes/base-element.js +0 -1
- package/classes/component-base.js +0 -1
- package/classes/console-logger.js +0 -1
- package/classes/frame-stream.js +0 -1
- package/classes/log-channel-writer.js +0 -1
- package/classes/runnable.js +0 -1
- package/classes/sb-error.js +0 -1
- package/classes/stack-executor.js +0 -1
- package/constants.d.ts +1 -1
- package/constants.js +1 -2
- package/decorators/app-events.decorator.js +0 -1
- package/decorators/app.decorator.js +0 -1
- package/decorators/component.decorator.js +0 -1
- package/decorators/decorator-helpers.js +0 -1
- package/decorators/define-variable.decorator.js +0 -1
- package/decorators/log-channel.decorator.js +0 -1
- package/decorators/use-component.decorator.js +0 -1
- package/decorators/use-variables.decorator.js +0 -1
- package/host-link/host-identity.js +0 -1
- package/host-link/host-link.js +0 -1
- package/host-link/host-packages.js +0 -1
- package/host-link/host-workers.js +0 -1
- package/host-link/multiplexer.js +0 -1
- package/host-link/sealed-box.js +0 -1
- package/index.js +0 -1
- package/interfaces/index.js +0 -1
- package/interfaces/logger.interface.js +0 -1
- package/models/enums/enum-source.enum.js +0 -1
- package/models/enums/log-channel-kind.js +0 -1
- package/models/enums/log-level.js +0 -1
- package/models/enums/service-status.js +0 -1
- package/models/enums/variable-format.enum.js +0 -1
- package/models/enums/variable-type.enum.js +0 -1
- package/models/enums/worker-permission.enum.js +0 -1
- package/models/index.js +0 -1
- package/models/metadata/app-metadata.js +0 -1
- package/models/metadata/component-metadata.js +0 -1
- package/models/metadata/element-component-metadata.js +0 -1
- package/models/metadata/element-metadata.js +0 -1
- package/models/metadata/log-channel-metadata.js +0 -1
- package/models/metadata/package-metadata.js +0 -1
- package/models/metadata/plugin-metadata.js +0 -1
- package/models/metadata/variable-metadata.js +0 -1
- package/models/profile/log-options.js +0 -1
- package/models/profile/profile-component.js +0 -1
- package/models/profile/profile.js +0 -1
- package/models-document.js +0 -1
- package/package.json +6 -2
- package/registry/docs-sidebar.js +0 -1
- package/registry/extension-package.js +0 -1
- package/registry/extension-registry.js +0 -1
- package/registry/module-catalog.js +0 -1
- package/registry/package-docs.js +0 -1
- package/registry/package-manifest.js +0 -1
- package/utils/decode-profile.js +0 -1
- package/utils/encrypt-helpers.js +0 -1
- package/utils/locate-package-json.js +0 -1
- package/utils/materialize-metadata.js +0 -1
- package/utils/normalize-metadata.js +0 -1
- package/utils/registry-names.js +0 -1
- package/utils/resolve-promises.js +0 -1
- package/utils/type-guards.js +0 -1
- package/utils/uri-to-id.js +0 -1
- package/utils/worker-permissions.js +0 -1
- package/app-factory.js.map +0 -1
- package/classes/app-base.js.map +0 -1
- package/classes/base-element.js.map +0 -1
- package/classes/component-base.js.map +0 -1
- package/classes/console-logger.js.map +0 -1
- package/classes/frame-stream.js.map +0 -1
- package/classes/log-channel-writer.js.map +0 -1
- package/classes/runnable.js.map +0 -1
- package/classes/sb-error.js.map +0 -1
- package/classes/stack-executor.js.map +0 -1
- package/constants.js.map +0 -1
- package/decorators/app-events.decorator.js.map +0 -1
- package/decorators/app.decorator.js.map +0 -1
- package/decorators/component.decorator.js.map +0 -1
- package/decorators/decorator-helpers.js.map +0 -1
- package/decorators/define-variable.decorator.js.map +0 -1
- package/decorators/log-channel.decorator.js.map +0 -1
- package/decorators/use-component.decorator.js.map +0 -1
- package/decorators/use-variables.decorator.js.map +0 -1
- package/host-link/host-identity.js.map +0 -1
- package/host-link/host-link.js.map +0 -1
- package/host-link/host-packages.js.map +0 -1
- package/host-link/host-workers.js.map +0 -1
- package/host-link/multiplexer.js.map +0 -1
- package/host-link/sealed-box.js.map +0 -1
- package/index.js.map +0 -1
- package/interfaces/index.js.map +0 -1
- package/interfaces/logger.interface.js.map +0 -1
- package/models/enums/enum-source.enum.js.map +0 -1
- package/models/enums/log-channel-kind.js.map +0 -1
- package/models/enums/log-level.js.map +0 -1
- package/models/enums/service-status.js.map +0 -1
- package/models/enums/variable-format.enum.js.map +0 -1
- package/models/enums/variable-type.enum.js.map +0 -1
- package/models/enums/worker-permission.enum.js.map +0 -1
- package/models/index.js.map +0 -1
- package/models/metadata/app-metadata.js.map +0 -1
- package/models/metadata/component-metadata.js.map +0 -1
- package/models/metadata/element-component-metadata.js.map +0 -1
- package/models/metadata/element-metadata.js.map +0 -1
- package/models/metadata/log-channel-metadata.js.map +0 -1
- package/models/metadata/package-metadata.js.map +0 -1
- package/models/metadata/plugin-metadata.js.map +0 -1
- package/models/metadata/variable-metadata.js.map +0 -1
- package/models/profile/log-options.js.map +0 -1
- package/models/profile/profile-component.js.map +0 -1
- package/models/profile/profile.js.map +0 -1
- package/models-document.js.map +0 -1
- package/registry/docs-sidebar.js.map +0 -1
- package/registry/extension-package.js.map +0 -1
- package/registry/extension-registry.js.map +0 -1
- package/registry/module-catalog.js.map +0 -1
- package/registry/package-docs.js.map +0 -1
- package/registry/package-manifest.js.map +0 -1
- package/utils/decode-profile.js.map +0 -1
- package/utils/encrypt-helpers.js.map +0 -1
- package/utils/locate-package-json.js.map +0 -1
- package/utils/materialize-metadata.js.map +0 -1
- package/utils/normalize-metadata.js.map +0 -1
- package/utils/registry-names.js.map +0 -1
- package/utils/resolve-promises.js.map +0 -1
- package/utils/type-guards.js.map +0 -1
- package/utils/uri-to-id.js.map +0 -1
- package/utils/worker-permissions.js.map +0 -1
package/README.md
CHANGED
|
@@ -1 +1,192 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @syncbridge/common
|
|
2
|
+
|
|
3
|
+
What a SyncBridge module is written against. A module is an npm package
|
|
4
|
+
of **components** - clients, servers, connections - and **apps**, which
|
|
5
|
+
SyncBridge runs as workers, each a Node.js process of its own, made of
|
|
6
|
+
components. This package gives you the decorators that describe them, the
|
|
7
|
+
base classes they extend, and their lifecycle.
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
npm i -D @syncbridge/common
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
SyncBridge provides `@syncbridge/common` to every module it runs, so a
|
|
14
|
+
module declares it in `peerDependencies`, never in `dependencies`:
|
|
15
|
+
|
|
16
|
+
```json
|
|
17
|
+
"peerDependencies": { "@syncbridge/common": "^2.0.0" }
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Start a module with `npx @syncbridge/syncbuild init @vendor/name`
|
|
21
|
+
([`@syncbridge/syncbuild`](https://www.npmjs.com/package/@syncbridge/syncbuild)),
|
|
22
|
+
and test it with
|
|
23
|
+
[`@syncbridge/testing`](https://www.npmjs.com/package/@syncbridge/testing).
|
|
24
|
+
|
|
25
|
+
## A component
|
|
26
|
+
|
|
27
|
+
A component is a class that extends `ComponentBase`, decorated with
|
|
28
|
+
`@Component`. Its settings - shown in SyncBridge's UI and kept in the
|
|
29
|
+
worker's profile - are a variables class, given with `UseVariables`:
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import {
|
|
33
|
+
Component,
|
|
34
|
+
ComponentBase,
|
|
35
|
+
DefineVariable,
|
|
36
|
+
VariableType,
|
|
37
|
+
} from '@syncbridge/common';
|
|
38
|
+
|
|
39
|
+
export class WeatherClientVariables {
|
|
40
|
+
@DefineVariable({ label: 'API address', required: true })
|
|
41
|
+
declare url: string;
|
|
42
|
+
|
|
43
|
+
@DefineVariable({ label: 'API key', type: VariableType.Secret })
|
|
44
|
+
declare apiKey?: string;
|
|
45
|
+
|
|
46
|
+
@DefineVariable({ label: 'Interval (s)', default: 60, minValue: 5 })
|
|
47
|
+
declare interval: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@Component({
|
|
51
|
+
displayName: 'Weather client',
|
|
52
|
+
description: 'Reads the weather from a web service',
|
|
53
|
+
tags: ['weather', 'http'],
|
|
54
|
+
})
|
|
55
|
+
export class WeatherClientComponent extends ComponentBase {
|
|
56
|
+
@Component.UseVariables()
|
|
57
|
+
declare values: WeatherClientVariables;
|
|
58
|
+
|
|
59
|
+
protected async _start(abortSignal?: AbortSignal): Promise<void> {
|
|
60
|
+
await super._start(abortSignal);
|
|
61
|
+
this.logger?.info(`Reading ${this.values.url}`);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
protected async _stop(): Promise<void> {
|
|
65
|
+
/* Close what _start opened */
|
|
66
|
+
await super._stop();
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
An element's URI is `<package>:<className>`. A component's class name is
|
|
72
|
+
its class's without `Component` (`@acme/weather:WeatherClient`); an app's
|
|
73
|
+
is its class's (`@acme/weather:WeatherStationApp`). Give `className` to
|
|
74
|
+
choose another.
|
|
75
|
+
|
|
76
|
+
## An app
|
|
77
|
+
|
|
78
|
+
An app extends `AppBase`, decorated with `@App`. It names the components it
|
|
79
|
+
uses with `UseComponent`, by URI. SyncBridge creates them with the values the
|
|
80
|
+
worker's profile gives, and starts them before the app:
|
|
81
|
+
|
|
82
|
+
```ts
|
|
83
|
+
import { App, AppBase, DefineVariable } from '@syncbridge/common';
|
|
84
|
+
import type { WeatherClientComponent } from './weather-client.component.js';
|
|
85
|
+
|
|
86
|
+
export class WeatherStationVariables {
|
|
87
|
+
@DefineVariable({ label: 'Station name', default: 'Station 1' })
|
|
88
|
+
declare name: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@App({ displayName: 'Weather station' })
|
|
92
|
+
export class WeatherStationApp extends AppBase {
|
|
93
|
+
@App.UseVariables()
|
|
94
|
+
declare values: WeatherStationVariables;
|
|
95
|
+
|
|
96
|
+
@App.UseComponent({
|
|
97
|
+
uri: '@acme/weather:WeatherClient',
|
|
98
|
+
required: true,
|
|
99
|
+
})
|
|
100
|
+
declare readonly weather: WeatherClientComponent;
|
|
101
|
+
|
|
102
|
+
protected async _start(abortSignal?: AbortSignal): Promise<void> {
|
|
103
|
+
await super._start(abortSignal);
|
|
104
|
+
this.logger?.info(`${this.values.name} started`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
A component may use components too, with `Component.UseComponent`. A URI
|
|
110
|
+
can name another module's component, for example
|
|
111
|
+
`@syncbridge/net:TcpClient`. Declare that module as a peer as well.
|
|
112
|
+
|
|
113
|
+
## Variables
|
|
114
|
+
|
|
115
|
+
`@DefineVariable` describes a setting. Its type is read from the
|
|
116
|
+
property's TypeScript type when not given. Some options:
|
|
117
|
+
|
|
118
|
+
| Option | Meaning |
|
|
119
|
+
| --- | --- |
|
|
120
|
+
| `label`, `description` | How it is shown |
|
|
121
|
+
| `type` | `VariableType`: `String`, `Secret` (a password or key, kept encrypted in the profile), `Number`, `BigInt`, `Boolean`, `Enum`, `Nested` |
|
|
122
|
+
| `default`, `required` | Its default value, and whether it must be given |
|
|
123
|
+
| `enumValues` | The values of an enum |
|
|
124
|
+
| `enumSource` | Values SyncBridge fills in from the server it runs on: `EnumSource.SerialPorts`, `EnumSource.NetworkAddresses` |
|
|
125
|
+
| `format`, `pattern` | A string's format (`url`, `email`, `date-time`...) or pattern |
|
|
126
|
+
| `minValue`, `maxValue` | A number's range |
|
|
127
|
+
| `isArray` | A list of values |
|
|
128
|
+
| `hotPlug` | A change applies while running, without a restart |
|
|
129
|
+
| `index` | Its order in the UI |
|
|
130
|
+
|
|
131
|
+
## Lifecycle
|
|
132
|
+
|
|
133
|
+
Apps and components are `Runnable`s. Override the protected methods, and
|
|
134
|
+
always call `super`:
|
|
135
|
+
|
|
136
|
+
- `_init()`: once, before the first start.
|
|
137
|
+
- `_start(abortSignal)`: start working. The signal aborts when a stop comes
|
|
138
|
+
while starting.
|
|
139
|
+
- `_stop()`: stop, and release what `_start` took. Close every timer,
|
|
140
|
+
socket and pool: what is left open is logged as a warning when the
|
|
141
|
+
worker ends.
|
|
142
|
+
- `_restart()`: stop and start in place, for example when values change.
|
|
143
|
+
|
|
144
|
+
`status` is a `ServiceStatus`: `stopped`, `starting`, `started`,
|
|
145
|
+
`unhealthy`, `stopping`. Report trouble with
|
|
146
|
+
`this.setStatus(ServiceStatus.unhealthy, message)`. An app's status
|
|
147
|
+
follows its components'.
|
|
148
|
+
|
|
149
|
+
## Logging
|
|
150
|
+
|
|
151
|
+
`this.logger` writes the element's log. A log channel is a log of its own
|
|
152
|
+
that the user can turn on, filter and keep apart, such as what a
|
|
153
|
+
connection sends and receives:
|
|
154
|
+
|
|
155
|
+
```ts
|
|
156
|
+
import { LogChannel } from '@syncbridge/common';
|
|
157
|
+
|
|
158
|
+
@LogChannel({ name: 'communication', title: 'Communication', kind: 'transmit' })
|
|
159
|
+
declare readonly ioLog: LogChannel;
|
|
160
|
+
|
|
161
|
+
// later
|
|
162
|
+
this.ioLog.info('Sent', { bytes: 42 });
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## Permissions
|
|
166
|
+
|
|
167
|
+
SyncBridge runs each worker as a Linux user of its own, under Node's
|
|
168
|
+
permission model. A component or app that needs more than its own data
|
|
169
|
+
directory declares it:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
@Component({
|
|
173
|
+
displayName: 'Serial client',
|
|
174
|
+
permissions: [WorkerPermission.SerialPorts, WorkerPermission.NativeCode],
|
|
175
|
+
})
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
- `SerialPorts`: the serial devices.
|
|
179
|
+
- `NativeCode`: native addons (`.node`), such as `serialport` or `oracledb`.
|
|
180
|
+
- `ChildProcesses`: starting other programs.
|
|
181
|
+
|
|
182
|
+
A subclass has its base's permissions. `spm verify` runs a module under
|
|
183
|
+
the permission model and tells you what it failed to declare.
|
|
184
|
+
|
|
185
|
+
## Examples
|
|
186
|
+
|
|
187
|
+
The modules SyncBridge ships are open source:
|
|
188
|
+
[syncbridge-io/public-modules](https://github.com/syncbridge-io/public-modules).
|
|
189
|
+
|
|
190
|
+
## License
|
|
191
|
+
|
|
192
|
+
[MIT](LICENSE)
|
package/app-factory.js
CHANGED
package/classes/app-base.js
CHANGED
package/classes/base-element.js
CHANGED
package/classes/frame-stream.js
CHANGED
package/classes/runnable.js
CHANGED
package/classes/sb-error.js
CHANGED
package/constants.d.ts
CHANGED
package/constants.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const version = '2.0.
|
|
1
|
+
export const version = '2.0.1';
|
|
2
2
|
export const CLASS_METADATA = Symbol.for('CLASS_METADATA');
|
|
3
3
|
export const CLASS_TYPE = Symbol.for('CLASS_TYPE');
|
|
4
4
|
export const VARIABLE_CONTAINER = Symbol.for('VARIABLE_CONTAINER');
|
|
@@ -8,4 +8,3 @@ export const NODE_ENV = process.env.NODE_ENV === 'test'
|
|
|
8
8
|
: (process.env.NODE_ENV || '').startsWith('dev')
|
|
9
9
|
? 'dev'
|
|
10
10
|
: 'prod';
|
|
11
|
-
//# sourceMappingURL=constants.js.map
|
package/host-link/host-link.js
CHANGED
|
@@ -51,4 +51,3 @@ export function summarizeWorkers(workers) {
|
|
|
51
51
|
export const CONSOLE_USER_HEADER = 'x-sb-console-user';
|
|
52
52
|
export const CONSOLE_USER_NAME_HEADER = 'x-sb-console-user-name';
|
|
53
53
|
export const CONSOLE_ROLE_HEADER = 'x-sb-console-role';
|
|
54
|
-
//# sourceMappingURL=host-link.js.map
|
package/host-link/multiplexer.js
CHANGED
package/host-link/sealed-box.js
CHANGED
package/index.js
CHANGED
package/interfaces/index.js
CHANGED
package/models/index.js
CHANGED
package/models-document.js
CHANGED
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@syncbridge/common",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "SyncBridge Common utilities",
|
|
5
5
|
"author": "Panates Inc",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
8
8
|
"type": "git",
|
|
9
|
-
"url": "git+https://github.com/syncbridge-io/
|
|
9
|
+
"url": "git+https://github.com/syncbridge-io/node-sdk.git",
|
|
10
10
|
"directory": "packages/common"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
@@ -37,5 +37,9 @@
|
|
|
37
37
|
},
|
|
38
38
|
"publishConfig": {
|
|
39
39
|
"access": "public"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/syncbridge-io/node-sdk/tree/main/packages/common#readme",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/syncbridge-io/node-sdk/issues"
|
|
40
44
|
}
|
|
41
45
|
}
|
package/registry/docs-sidebar.js
CHANGED
package/registry/package-docs.js
CHANGED
package/utils/decode-profile.js
CHANGED
package/utils/encrypt-helpers.js
CHANGED
package/utils/registry-names.js
CHANGED
package/utils/type-guards.js
CHANGED
package/utils/uri-to-id.js
CHANGED