motion-master-client 0.0.1 → 0.0.3

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 (106) hide show
  1. package/.babelrc +3 -0
  2. package/.eslintrc.json +18 -0
  3. package/README.md +44 -2
  4. package/jest.config.ts +15 -0
  5. package/motion-master.proto +1822 -0
  6. package/package.json +6 -9
  7. package/src/{index.d.ts → index.ts} +1 -0
  8. package/src/lib/device-log-line.ts +5 -0
  9. package/src/lib/device-parameter.spec.ts +85 -0
  10. package/src/lib/device-parameter.ts +69 -0
  11. package/src/lib/hardware-description.spec.ts +223 -0
  12. package/src/lib/hardware-description.ts +79 -0
  13. package/src/lib/logger.ts +5 -0
  14. package/src/lib/monitoring-config.ts +6 -0
  15. package/src/lib/monitoring-entry.ts +11 -0
  16. package/src/lib/motion-master-client.ts +94 -0
  17. package/src/lib/motion-master-pub-sub-client.ts +94 -0
  18. package/src/lib/motion-master-pub-sub-socket.ts +33 -0
  19. package/src/lib/motion-master-pub-sub-web-socket.ts +71 -0
  20. package/src/lib/motion-master-pub-sub-worker-socket.ts +58 -0
  21. package/src/lib/motion-master-req-res-client.spec.ts +126 -0
  22. package/src/lib/motion-master-req-res-client.ts +1990 -0
  23. package/src/lib/motion-master-req-res-socket.ts +45 -0
  24. package/src/lib/motion-master-req-res-web-socket.ts +119 -0
  25. package/src/lib/motion-master-req-res-worker-socket.ts +63 -0
  26. package/src/lib/motion-master.proto.d.ts +5084 -0
  27. package/src/lib/motion-master.proto.js +52278 -0
  28. package/src/lib/operators.ts +93 -0
  29. package/src/lib/{options.js → options.ts} +7 -6
  30. package/src/lib/parameter.spec.ts +81 -0
  31. package/src/lib/parameter.ts +119 -0
  32. package/src/lib/request-status-resolver.ts +380 -0
  33. package/src/lib/system-log-line.ts +8 -0
  34. package/src/lib/types.ts +58 -0
  35. package/src/lib/{urls.js → urls.ts} +3 -3
  36. package/src/lib/util.ts +261 -0
  37. package/tsconfig.json +22 -0
  38. package/tsconfig.lib.json +10 -0
  39. package/tsconfig.spec.json +20 -0
  40. package/typedoc.json +10 -0
  41. package/src/index.js +0 -22
  42. package/src/index.js.map +0 -1
  43. package/src/lib/device-log-line.d.ts +0 -5
  44. package/src/lib/device-log-line.js +0 -2
  45. package/src/lib/device-log-line.js.map +0 -1
  46. package/src/lib/hardware-description.d.ts +0 -36
  47. package/src/lib/hardware-description.js +0 -38
  48. package/src/lib/hardware-description.js.map +0 -1
  49. package/src/lib/logger.d.ts +0 -1
  50. package/src/lib/logger.js +0 -5
  51. package/src/lib/logger.js.map +0 -1
  52. package/src/lib/monitoring-config.d.ts +0 -6
  53. package/src/lib/monitoring-config.js +0 -2
  54. package/src/lib/monitoring-config.js.map +0 -1
  55. package/src/lib/monitoring-entry.d.ts +0 -10
  56. package/src/lib/monitoring-entry.js +0 -2
  57. package/src/lib/monitoring-entry.js.map +0 -1
  58. package/src/lib/motion-master-client.d.ts +0 -18
  59. package/src/lib/motion-master-client.js +0 -48
  60. package/src/lib/motion-master-client.js.map +0 -1
  61. package/src/lib/motion-master-pub-sub-client.d.ts +0 -16
  62. package/src/lib/motion-master-pub-sub-client.js +0 -64
  63. package/src/lib/motion-master-pub-sub-client.js.map +0 -1
  64. package/src/lib/motion-master-pub-sub-socket.d.ts +0 -28
  65. package/src/lib/motion-master-pub-sub-socket.js +0 -2
  66. package/src/lib/motion-master-pub-sub-socket.js.map +0 -1
  67. package/src/lib/motion-master-pub-sub-web-socket.d.ts +0 -13
  68. package/src/lib/motion-master-pub-sub-web-socket.js +0 -57
  69. package/src/lib/motion-master-pub-sub-web-socket.js.map +0 -1
  70. package/src/lib/motion-master-pub-sub-worker-socket.d.ts +0 -16
  71. package/src/lib/motion-master-pub-sub-worker-socket.js +0 -37
  72. package/src/lib/motion-master-pub-sub-worker-socket.js.map +0 -1
  73. package/src/lib/motion-master-req-res-client.d.ts +0 -370
  74. package/src/lib/motion-master-req-res-client.js +0 -1067
  75. package/src/lib/motion-master-req-res-client.js.map +0 -1
  76. package/src/lib/motion-master-req-res-socket.d.ts +0 -38
  77. package/src/lib/motion-master-req-res-socket.js +0 -2
  78. package/src/lib/motion-master-req-res-socket.js.map +0 -1
  79. package/src/lib/motion-master-req-res-web-socket.d.ts +0 -20
  80. package/src/lib/motion-master-req-res-web-socket.js +0 -96
  81. package/src/lib/motion-master-req-res-web-socket.js.map +0 -1
  82. package/src/lib/motion-master-req-res-worker-socket.d.ts +0 -15
  83. package/src/lib/motion-master-req-res-worker-socket.js +0 -49
  84. package/src/lib/motion-master-req-res-worker-socket.js.map +0 -1
  85. package/src/lib/operators.d.ts +0 -21
  86. package/src/lib/operators.js +0 -62
  87. package/src/lib/operators.js.map +0 -1
  88. package/src/lib/options.d.ts +0 -10
  89. package/src/lib/options.js.map +0 -1
  90. package/src/lib/parameter.d.ts +0 -9
  91. package/src/lib/parameter.js +0 -2
  92. package/src/lib/parameter.js.map +0 -1
  93. package/src/lib/request-status-resolver.d.ts +0 -4
  94. package/src/lib/request-status-resolver.js +0 -320
  95. package/src/lib/request-status-resolver.js.map +0 -1
  96. package/src/lib/system-log-line.d.ts +0 -8
  97. package/src/lib/system-log-line.js +0 -2
  98. package/src/lib/system-log-line.js.map +0 -1
  99. package/src/lib/types.d.ts +0 -41
  100. package/src/lib/types.js +0 -9
  101. package/src/lib/types.js.map +0 -1
  102. package/src/lib/urls.d.ts +0 -3
  103. package/src/lib/urls.js.map +0 -1
  104. package/src/lib/util.d.ts +0 -33
  105. package/src/lib/util.js +0 -247
  106. package/src/lib/util.js.map +0 -1
@@ -0,0 +1,45 @@
1
+ import { BehaviorSubject, Observable } from "rxjs";
2
+ import { MotionMasterMessage } from "./types";
3
+
4
+ export interface MotionMasterReqResSocket {
5
+ /**
6
+ * Emits a boolean value when socket gets opened or closed.
7
+ */
8
+ readonly opened$: BehaviorSubject<boolean>;
9
+
10
+ /**
11
+ * Motion Master is considered alive when it sends messages in regular time interval.
12
+ */
13
+ readonly alive$: BehaviorSubject<boolean>;
14
+
15
+ /**
16
+ * Decoded message instances coming from Motion Master.
17
+ */
18
+ readonly message$: Observable<MotionMasterMessage>;
19
+
20
+ /**
21
+ * URL set in call to open.
22
+ */
23
+ get url(): string | undefined;
24
+
25
+ /**
26
+ * Open socket.
27
+ *
28
+ * The connected$ and eventually alive$ observables will emit true values.
29
+ */
30
+ open(url: string, pingSystemInterval?: number, systemAliveTimeout?: number): void;
31
+
32
+ /**
33
+ * Close socket.
34
+ *
35
+ * The opened$ and alive$ observables will emit false values.
36
+ */
37
+ close(): void;
38
+
39
+ /**
40
+ * Send an instance of a message.
41
+ *
42
+ * Subscribe to the message$ observable in order to receive the response messages.
43
+ */
44
+ send(message: MotionMasterMessage): void;
45
+ }
@@ -0,0 +1,119 @@
1
+ import { BehaviorSubject, filter, interval, map, Subject, Subscription, tap } from "rxjs";
2
+ import { webSocket, WebSocketSubject, WebSocketSubjectConfig } from "rxjs/webSocket";
3
+ import { logger } from "./logger";
4
+ import { MotionMasterReqResSocket } from "./motion-master-req-res-socket";
5
+ import { MotionMasterMessage } from "./types";
6
+
7
+ export class MotionMasterReqResWebSocket implements MotionMasterReqResSocket {
8
+
9
+ readonly opened$ = new BehaviorSubject<boolean>(false);
10
+
11
+ readonly alive$ = new BehaviorSubject<boolean>(false);
12
+
13
+ readonly message$ = new Subject<MotionMasterMessage>();
14
+
15
+ private aliveTimeoutId = 0;
16
+
17
+ private pingSystem = MotionMasterMessage.create({
18
+ request: { pingSystem: MotionMasterMessage.Request.PingSystem.create() }
19
+ });
20
+
21
+ private pingSystemObserver = { next: () => this.send(this.pingSystem) };
22
+
23
+ private pingSystemSubscription = new Subscription();
24
+
25
+ private webSocket$?: WebSocketSubject<Uint8Array>;
26
+
27
+ private _url?: string;
28
+
29
+ get url(): string | undefined {
30
+ return this._url;
31
+ }
32
+
33
+ open(url: string, pingSystemInterval = 250, systemAliveTimeout = 1000): void {
34
+ if (this.opened$.getValue() === true) {
35
+ throw new Error('MotionMasterReqResWebSocket is already opened!');
36
+ }
37
+
38
+ this._url = url;
39
+
40
+ this.webSocket$ = this.createWebSocket(url, pingSystemInterval);
41
+
42
+ this.webSocket$?.pipe(
43
+ map((data: Uint8Array) => MotionMasterMessage.decode(data)),
44
+ tap(() => this.keepalive(systemAliveTimeout)),
45
+ filter((message) => !(message.status?.systemPong)),
46
+ tap((message) => {
47
+ if (message.status) {
48
+ const keys = Object.keys(message.status).join();
49
+ const motionMasterMessage = message.toJSON ? message.toJSON() : message;
50
+ logger.info({
51
+ namespace: 'reqResMessage',
52
+ motionMasterMessage,
53
+ type: message.type,
54
+ }, `Received ${keys}`);
55
+ }
56
+ }),
57
+ ).subscribe({
58
+ next: (message) => this.message$.next(message),
59
+ error: () => {
60
+ // ignore
61
+ },
62
+ });
63
+ }
64
+
65
+ close(): void {
66
+ clearTimeout(this.aliveTimeoutId);
67
+ this.pingSystemSubscription.unsubscribe();
68
+ this.webSocket$?.unsubscribe();
69
+ }
70
+
71
+ send(message: MotionMasterMessage): void {
72
+ if (!(message.request?.pingSystem)) {
73
+ if (message.request) {
74
+ const keys = Object.keys(message.request).join();
75
+ const motionMasterMessage = message.toJSON ? message.toJSON() : message;
76
+ logger.info({
77
+ namespace: 'reqResMessage',
78
+ motionMasterMessage,
79
+ type: message.type,
80
+ }, `Send ${keys}`);
81
+ }
82
+ }
83
+ this.webSocket$?.next(MotionMasterMessage.encode(message).finish());
84
+ }
85
+
86
+ private createWebSocket(url: string, pingSystemInterval = 250) {
87
+ const webSocketConfig: WebSocketSubjectConfig<Uint8Array> = {
88
+ binaryType: 'arraybuffer',
89
+ closeObserver: {
90
+ next: () => {
91
+ this.opened$.next(false);
92
+ logger.info(`Connection closed ${url}`);
93
+ },
94
+ },
95
+ deserializer: (e: MessageEvent) => new Uint8Array(e.data as unknown as Iterable<number>),
96
+ openObserver: {
97
+ next: () => {
98
+ this.pingSystemSubscription = interval(pingSystemInterval)
99
+ .subscribe(this.pingSystemObserver);
100
+ this.opened$.next(true);
101
+ logger.info(`Connection opened ${url}`);
102
+ },
103
+ },
104
+ serializer: (value: Uint8Array) => value,
105
+ url,
106
+ };
107
+
108
+ return webSocket(webSocketConfig);
109
+ }
110
+
111
+ private keepalive(systemAliveTimeout = 1000) {
112
+ if (this.alive$.getValue() === false) {
113
+ this.alive$.next(true);
114
+ }
115
+ self.clearTimeout(this.aliveTimeoutId);
116
+ this.aliveTimeoutId = self.setTimeout(() => this.alive$.next(false), systemAliveTimeout);
117
+ }
118
+
119
+ }
@@ -0,0 +1,63 @@
1
+ import { BehaviorSubject, Subject } from "rxjs";
2
+ import { logger } from "./logger";
3
+ import { MotionMasterReqResSocket } from "./motion-master-req-res-socket";
4
+ import { MotionMasterMessage } from "./types";
5
+ import { createPlainObjectFromMotionMasterMessage } from "./util";
6
+
7
+ export class MotionMasterReqResWorkerSocket implements MotionMasterReqResSocket {
8
+
9
+ readonly opened$ = new BehaviorSubject<boolean>(false);
10
+
11
+ readonly alive$ = new BehaviorSubject<boolean>(false);
12
+
13
+ readonly message$ = new Subject<MotionMasterMessage>();
14
+
15
+ private _url?: string;
16
+
17
+ constructor(
18
+ public readonly worker: Worker,
19
+ ) { }
20
+
21
+ get url(): string | undefined {
22
+ return this._url;
23
+ }
24
+
25
+ open(url: string, pingSystemInterval = 250, systemAliveTimeout = 1000): void {
26
+ if (this.opened$.getValue() === true) {
27
+ throw new Error('MotionMasterReqResWorkerSocket is already opened!');
28
+ }
29
+
30
+ this._url = url;
31
+
32
+ this.worker.onmessage = ({ data }) => {
33
+ if ('opened' in data) {
34
+ const { opened } = data;
35
+ this.opened$.next(opened);
36
+ logger.info(opened ? `Opened req/res 🔌 ${url}` : `Closed req/res 🔌 ${url}`);
37
+ } else if ('alive' in data) {
38
+ const { alive } = data;
39
+ this.alive$.next(alive);
40
+ logger.info(alive ? `System is alive 💓` : 'System is as dead as 🦤');
41
+ } else if ('message' in data) {
42
+ const { message: motionMasterMessage } = data;
43
+ this.message$.next(motionMasterMessage);
44
+ logger.info({ namespace: 'reqResMessage', motionMasterMessage, type: motionMasterMessage.type }, `Received ${motionMasterMessage.status.type}`);
45
+ }
46
+ }
47
+
48
+ this.worker.postMessage({
49
+ open: { url, pingSystemInterval, systemAliveTimeout },
50
+ });
51
+ }
52
+
53
+ close(): void {
54
+ this.worker.postMessage({ close: true });
55
+ }
56
+
57
+ send(message: MotionMasterMessage): void {
58
+ const motionMasterMessage = createPlainObjectFromMotionMasterMessage(message);
59
+ logger.info({ namespace: 'reqResMessage', motionMasterMessage, type: motionMasterMessage.type }, `Send ${motionMasterMessage.request.type}`);
60
+ this.worker.postMessage({ message });
61
+ }
62
+
63
+ }