@djodjonx/x32-simulator 0.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.
Files changed (86) hide show
  1. package/.commitlintrc.json +3 -0
  2. package/.github/workflows/publish.yml +38 -0
  3. package/.husky/commit-msg +1 -0
  4. package/.husky/pre-commit +1 -0
  5. package/.oxlintrc.json +56 -0
  6. package/CHANGELOG.md +11 -0
  7. package/INSTALL.md +107 -0
  8. package/LICENSE +21 -0
  9. package/README.md +141 -0
  10. package/dist/UdpNetworkGateway-BrroQ6-Q.mjs +1189 -0
  11. package/dist/UdpNetworkGateway-Ccdd7Us5.cjs +1265 -0
  12. package/dist/index.cjs +7 -0
  13. package/dist/index.d.cts +207 -0
  14. package/dist/index.d.mts +207 -0
  15. package/dist/index.mjs +3 -0
  16. package/dist/server.cjs +1060 -0
  17. package/dist/server.d.cts +10 -0
  18. package/dist/server.d.mts +10 -0
  19. package/dist/server.mjs +1055 -0
  20. package/docs/OSC-Communication.md +184 -0
  21. package/docs/X32-INTERNAL.md +262 -0
  22. package/docs/X32-OSC.pdf +0 -0
  23. package/docs/behringer-x32-x32-osc-remote-protocol-en-44463.pdf +0 -0
  24. package/package.json +68 -0
  25. package/src/application/use-cases/BroadcastUpdatesUseCase.ts +120 -0
  26. package/src/application/use-cases/ManageSessionsUseCase.ts +9 -0
  27. package/src/application/use-cases/ProcessPacketUseCase.ts +26 -0
  28. package/src/application/use-cases/SimulationService.ts +122 -0
  29. package/src/domain/entities/SubscriptionManager.ts +126 -0
  30. package/src/domain/entities/X32State.ts +78 -0
  31. package/src/domain/models/MeterConfig.ts +22 -0
  32. package/src/domain/models/MeterData.ts +59 -0
  33. package/src/domain/models/OscMessage.ts +93 -0
  34. package/src/domain/models/X32Address.ts +78 -0
  35. package/src/domain/models/X32Node.ts +43 -0
  36. package/src/domain/models/types.ts +96 -0
  37. package/src/domain/ports/ILogger.ts +27 -0
  38. package/src/domain/ports/INetworkGateway.ts +8 -0
  39. package/src/domain/ports/IStateRepository.ts +16 -0
  40. package/src/domain/services/MeterService.ts +46 -0
  41. package/src/domain/services/OscMessageHandler.ts +88 -0
  42. package/src/domain/services/SchemaFactory.ts +308 -0
  43. package/src/domain/services/SchemaRegistry.ts +67 -0
  44. package/src/domain/services/StaticResponseService.ts +52 -0
  45. package/src/domain/services/strategies/BatchStrategy.ts +74 -0
  46. package/src/domain/services/strategies/MeterStrategy.ts +45 -0
  47. package/src/domain/services/strategies/NodeDiscoveryStrategy.ts +36 -0
  48. package/src/domain/services/strategies/OscCommandStrategy.ts +22 -0
  49. package/src/domain/services/strategies/StateAccessStrategy.ts +71 -0
  50. package/src/domain/services/strategies/StaticResponseStrategy.ts +42 -0
  51. package/src/domain/services/strategies/SubscriptionStrategy.ts +56 -0
  52. package/src/infrastructure/mappers/OscCodec.ts +54 -0
  53. package/src/infrastructure/repositories/InMemoryStateRepository.ts +21 -0
  54. package/src/infrastructure/services/ConsoleLogger.ts +177 -0
  55. package/src/infrastructure/services/UdpNetworkGateway.ts +71 -0
  56. package/src/presentation/cli/server.ts +194 -0
  57. package/src/presentation/library/library.ts +9 -0
  58. package/tests/application/use-cases/BroadcastUpdatesUseCase.test.ts +104 -0
  59. package/tests/application/use-cases/ManageSessionsUseCase.test.ts +12 -0
  60. package/tests/application/use-cases/ProcessPacketUseCase.test.ts +49 -0
  61. package/tests/application/use-cases/SimulationService.test.ts +77 -0
  62. package/tests/domain/entities/SubscriptionManager.test.ts +50 -0
  63. package/tests/domain/entities/X32State.test.ts +52 -0
  64. package/tests/domain/models/MeterData.test.ts +23 -0
  65. package/tests/domain/models/OscMessage.test.ts +38 -0
  66. package/tests/domain/models/X32Address.test.ts +30 -0
  67. package/tests/domain/models/X32Node.test.ts +30 -0
  68. package/tests/domain/services/MeterService.test.ts +27 -0
  69. package/tests/domain/services/OscMessageHandler.test.ts +51 -0
  70. package/tests/domain/services/SchemaRegistry.test.ts +47 -0
  71. package/tests/domain/services/StaticResponseService.test.ts +15 -0
  72. package/tests/domain/services/strategies/BatchStrategy.test.ts +41 -0
  73. package/tests/domain/services/strategies/MeterStrategy.test.ts +19 -0
  74. package/tests/domain/services/strategies/NodeDiscoveryStrategy.test.ts +22 -0
  75. package/tests/domain/services/strategies/StateAccessStrategy.test.ts +49 -0
  76. package/tests/domain/services/strategies/StaticResponseStrategy.test.ts +15 -0
  77. package/tests/domain/services/strategies/SubscriptionStrategy.test.ts +45 -0
  78. package/tests/infrastructure/mappers/OscCodec.test.ts +41 -0
  79. package/tests/infrastructure/repositories/InMemoryStateRepository.test.ts +29 -0
  80. package/tests/infrastructure/services/ConsoleLogger.test.ts +74 -0
  81. package/tests/infrastructure/services/UdpNetworkGateway.test.ts +61 -0
  82. package/tests/presentation/cli/server.test.ts +178 -0
  83. package/tests/presentation/library/library.test.ts +13 -0
  84. package/tsconfig.json +21 -0
  85. package/tsdown.config.ts +15 -0
  86. package/vitest.config.ts +9 -0
package/dist/index.cjs ADDED
@@ -0,0 +1,7 @@
1
+ const require_UdpNetworkGateway = require('./UdpNetworkGateway-Ccdd7Us5.cjs');
2
+
3
+ exports.ConsoleLogger = require_UdpNetworkGateway.ConsoleLogger;
4
+ exports.InMemoryStateRepository = require_UdpNetworkGateway.InMemoryStateRepository;
5
+ exports.LogCategory = require_UdpNetworkGateway.LogCategory;
6
+ exports.SimulationService = require_UdpNetworkGateway.SimulationService;
7
+ exports.UdpNetworkGateway = require_UdpNetworkGateway.UdpNetworkGateway;
@@ -0,0 +1,207 @@
1
+ import { EventEmitter } from "node:events";
2
+
3
+ //#region src/domain/models/types.d.ts
4
+ type OscArgumentValue = Buffer | boolean | number | string;
5
+ type OscArgument = OscArgumentValue | {
6
+ type: string;
7
+ value: OscArgumentValue;
8
+ };
9
+ interface OscPacket {
10
+ oscType: 'bundle' | 'message';
11
+ address: string;
12
+ args: OscArgument[];
13
+ elements?: OscPacket[];
14
+ }
15
+ interface RemoteClient {
16
+ address: string;
17
+ port: number;
18
+ }
19
+ interface OscMsg {
20
+ address: string;
21
+ args: OscArgumentValue[];
22
+ }
23
+ interface X32Node {
24
+ type: 'f' | 'i' | 's';
25
+ default: number | string;
26
+ }
27
+ interface Subscriber {
28
+ address: string;
29
+ port: number;
30
+ expires: number;
31
+ type: 'batch' | 'format' | 'meter' | 'path';
32
+ path?: string;
33
+ meterPath?: string;
34
+ alias?: string;
35
+ pattern?: string;
36
+ paths?: string[];
37
+ start?: number;
38
+ count?: number;
39
+ factor?: number;
40
+ args?: number[];
41
+ }
42
+ interface OscReply {
43
+ address: string;
44
+ args: OscArgument[];
45
+ }
46
+ //#endregion
47
+ //#region src/domain/ports/INetworkGateway.d.ts
48
+ interface INetworkGateway {
49
+ start(port: number, ip: string): Promise<void>;
50
+ stop(): Promise<void>;
51
+ send(target: RemoteClient, address: string, args: any[]): void;
52
+ onPacket(callback: (packet: OscPacket, source: RemoteClient) => void): void;
53
+ }
54
+ //#endregion
55
+ //#region src/domain/ports/ILogger.d.ts
56
+ type LogData = Buffer | Error | LogData[] | boolean | number | string | {
57
+ [key: string]: LogData;
58
+ } | null | undefined;
59
+ declare enum LogCategory {
60
+ SYSTEM = "SYSTEM",
61
+ OSC_IN = "OSC_IN",
62
+ OSC_OUT = "OSC_OUT",
63
+ DISPATCH = "DISPATCH",
64
+ STATE = "STATE",
65
+ SUB = "SUB",
66
+ METER = "METER",
67
+ }
68
+ interface ILogger {
69
+ debug(category: string, msg: string, data?: LogData): void;
70
+ info(category: string, msg: string, data?: LogData): void;
71
+ warn(category: string, msg: string, data?: LogData): void;
72
+ error(category: string, msg: string, err?: LogData): void;
73
+ }
74
+ //#endregion
75
+ //#region src/domain/models/X32Node.d.ts
76
+ declare class X32Node$1 {
77
+ readonly type: 'f' | 'i' | 's';
78
+ readonly default: number | string;
79
+ constructor(type: 'f' | 'i' | 's', defaultValue: number | string);
80
+ validate(value: any): boolean;
81
+ static from(obj: {
82
+ type: 'f' | 'i' | 's';
83
+ default: number | string;
84
+ }): X32Node$1;
85
+ }
86
+ //#endregion
87
+ //#region src/domain/entities/X32State.d.ts
88
+ declare class X32State extends EventEmitter {
89
+ private state;
90
+ private readonly defaultState;
91
+ constructor(schema: Record<string, X32Node$1>);
92
+ reset(): void;
93
+ get(address: string): number | string | undefined;
94
+ set(address: string, value: number | string): void;
95
+ handleMuteGroupChange(groupIdx: number, isOn: number): void;
96
+ }
97
+ //#endregion
98
+ //#region src/domain/ports/IStateRepository.d.ts
99
+ interface IStateRepository {
100
+ getState(): X32State;
101
+ reset(): void;
102
+ }
103
+ //#endregion
104
+ //#region src/domain/services/SchemaFactory.d.ts
105
+ declare class SchemaFactory {
106
+ createSchema(): Record<string, X32Node$1>;
107
+ private node;
108
+ private generateChannelStrip;
109
+ private generateNodes;
110
+ private generateRange;
111
+ private generateOutputs;
112
+ }
113
+ //#endregion
114
+ //#region src/domain/services/SchemaRegistry.d.ts
115
+ declare class SchemaRegistry {
116
+ private schemaFactory;
117
+ private readonly _schema;
118
+ constructor(schemaFactory: SchemaFactory);
119
+ getSchema(): Record<string, X32Node$1>;
120
+ getNode(path: string): X32Node$1 | undefined;
121
+ has(path: string): boolean;
122
+ getAllPaths(): string[];
123
+ getRootFromIndex(index: number): string | null;
124
+ }
125
+ //#endregion
126
+ //#region src/application/use-cases/SimulationService.d.ts
127
+ declare class SimulationService {
128
+ private gateway;
129
+ private logger;
130
+ private stateRepo;
131
+ private schemaRegistry;
132
+ private port;
133
+ private ip;
134
+ private subscriptionManager;
135
+ private messageHandler;
136
+ private processPacket;
137
+ private broadcastUpdates;
138
+ private manageSessions;
139
+ private meterService;
140
+ private staticResponseService;
141
+ private updateInterval;
142
+ private cleanupInterval;
143
+ constructor(gateway: INetworkGateway, logger: ILogger, stateRepo: IStateRepository, schemaRegistry: SchemaRegistry, port?: number, ip?: string, name?: string, model?: string);
144
+ start(): Promise<void>;
145
+ stop(): Promise<void>;
146
+ resetState(): void;
147
+ }
148
+ //#endregion
149
+ //#region src/infrastructure/repositories/InMemoryStateRepository.d.ts
150
+ declare class InMemoryStateRepository implements IStateRepository {
151
+ private logger;
152
+ private state;
153
+ constructor(logger: ILogger, schemaRegistry: SchemaRegistry);
154
+ getState(): X32State;
155
+ reset(): void;
156
+ }
157
+ //#endregion
158
+ //#region src/infrastructure/services/ConsoleLogger.d.ts
159
+ declare enum LogLevel {
160
+ DEBUG = 0,
161
+ INFO = 1,
162
+ WARN = 2,
163
+ ERROR = 3,
164
+ NONE = 4,
165
+ }
166
+ declare class ConsoleLogger implements ILogger {
167
+ private static instance;
168
+ private level;
169
+ private hiddenPatterns;
170
+ private enabledCategories;
171
+ constructor();
172
+ static getInstance(): ConsoleLogger;
173
+ setLevel(level: LogLevel): void;
174
+ enableCategory(cat: string): void;
175
+ disableCategory(cat: string): void;
176
+ debug(category: string, msg: string, data?: LogData): void;
177
+ info(category: string, msg: string, data?: LogData): void;
178
+ warn(category: string, msg: string, data?: LogData): void;
179
+ error(category: string, msg: string, err?: LogData): void;
180
+ private shouldHide;
181
+ private format;
182
+ }
183
+ //#endregion
184
+ //#region src/infrastructure/mappers/OscCodec.d.ts
185
+ declare class OscCodec {
186
+ private schemaRegistry;
187
+ constructor(schemaRegistry: SchemaRegistry);
188
+ decode(msg: Buffer): OscPacket;
189
+ encode(address: string, args: OscArgument[]): Buffer;
190
+ private createMessage;
191
+ }
192
+ //#endregion
193
+ //#region src/infrastructure/services/UdpNetworkGateway.d.ts
194
+ declare class UdpNetworkGateway implements INetworkGateway {
195
+ private logger;
196
+ private codec;
197
+ private socket;
198
+ private isRunning;
199
+ private packetCallback;
200
+ constructor(logger: ILogger, codec: OscCodec);
201
+ onPacket(callback: (packet: OscPacket, source: RemoteClient) => void): void;
202
+ start(port: number, ip: string): Promise<void>;
203
+ stop(): Promise<void>;
204
+ send(target: RemoteClient, address: string, args: any[]): void;
205
+ }
206
+ //#endregion
207
+ export { ConsoleLogger, type ILogger, type INetworkGateway, type IStateRepository, InMemoryStateRepository, LogCategory, type LogData, OscArgument, OscArgumentValue, OscMsg, OscPacket, OscReply, RemoteClient, SimulationService, Subscriber, UdpNetworkGateway, X32Node };
@@ -0,0 +1,207 @@
1
+ import { EventEmitter } from "node:events";
2
+
3
+ //#region src/domain/models/types.d.ts
4
+ type OscArgumentValue = Buffer | boolean | number | string;
5
+ type OscArgument = OscArgumentValue | {
6
+ type: string;
7
+ value: OscArgumentValue;
8
+ };
9
+ interface OscPacket {
10
+ oscType: 'bundle' | 'message';
11
+ address: string;
12
+ args: OscArgument[];
13
+ elements?: OscPacket[];
14
+ }
15
+ interface RemoteClient {
16
+ address: string;
17
+ port: number;
18
+ }
19
+ interface OscMsg {
20
+ address: string;
21
+ args: OscArgumentValue[];
22
+ }
23
+ interface X32Node {
24
+ type: 'f' | 'i' | 's';
25
+ default: number | string;
26
+ }
27
+ interface Subscriber {
28
+ address: string;
29
+ port: number;
30
+ expires: number;
31
+ type: 'batch' | 'format' | 'meter' | 'path';
32
+ path?: string;
33
+ meterPath?: string;
34
+ alias?: string;
35
+ pattern?: string;
36
+ paths?: string[];
37
+ start?: number;
38
+ count?: number;
39
+ factor?: number;
40
+ args?: number[];
41
+ }
42
+ interface OscReply {
43
+ address: string;
44
+ args: OscArgument[];
45
+ }
46
+ //#endregion
47
+ //#region src/domain/ports/INetworkGateway.d.ts
48
+ interface INetworkGateway {
49
+ start(port: number, ip: string): Promise<void>;
50
+ stop(): Promise<void>;
51
+ send(target: RemoteClient, address: string, args: any[]): void;
52
+ onPacket(callback: (packet: OscPacket, source: RemoteClient) => void): void;
53
+ }
54
+ //#endregion
55
+ //#region src/domain/ports/ILogger.d.ts
56
+ type LogData = Buffer | Error | LogData[] | boolean | number | string | {
57
+ [key: string]: LogData;
58
+ } | null | undefined;
59
+ declare enum LogCategory {
60
+ SYSTEM = "SYSTEM",
61
+ OSC_IN = "OSC_IN",
62
+ OSC_OUT = "OSC_OUT",
63
+ DISPATCH = "DISPATCH",
64
+ STATE = "STATE",
65
+ SUB = "SUB",
66
+ METER = "METER",
67
+ }
68
+ interface ILogger {
69
+ debug(category: string, msg: string, data?: LogData): void;
70
+ info(category: string, msg: string, data?: LogData): void;
71
+ warn(category: string, msg: string, data?: LogData): void;
72
+ error(category: string, msg: string, err?: LogData): void;
73
+ }
74
+ //#endregion
75
+ //#region src/domain/models/X32Node.d.ts
76
+ declare class X32Node$1 {
77
+ readonly type: 'f' | 'i' | 's';
78
+ readonly default: number | string;
79
+ constructor(type: 'f' | 'i' | 's', defaultValue: number | string);
80
+ validate(value: any): boolean;
81
+ static from(obj: {
82
+ type: 'f' | 'i' | 's';
83
+ default: number | string;
84
+ }): X32Node$1;
85
+ }
86
+ //#endregion
87
+ //#region src/domain/entities/X32State.d.ts
88
+ declare class X32State extends EventEmitter {
89
+ private state;
90
+ private readonly defaultState;
91
+ constructor(schema: Record<string, X32Node$1>);
92
+ reset(): void;
93
+ get(address: string): number | string | undefined;
94
+ set(address: string, value: number | string): void;
95
+ handleMuteGroupChange(groupIdx: number, isOn: number): void;
96
+ }
97
+ //#endregion
98
+ //#region src/domain/ports/IStateRepository.d.ts
99
+ interface IStateRepository {
100
+ getState(): X32State;
101
+ reset(): void;
102
+ }
103
+ //#endregion
104
+ //#region src/domain/services/SchemaFactory.d.ts
105
+ declare class SchemaFactory {
106
+ createSchema(): Record<string, X32Node$1>;
107
+ private node;
108
+ private generateChannelStrip;
109
+ private generateNodes;
110
+ private generateRange;
111
+ private generateOutputs;
112
+ }
113
+ //#endregion
114
+ //#region src/domain/services/SchemaRegistry.d.ts
115
+ declare class SchemaRegistry {
116
+ private schemaFactory;
117
+ private readonly _schema;
118
+ constructor(schemaFactory: SchemaFactory);
119
+ getSchema(): Record<string, X32Node$1>;
120
+ getNode(path: string): X32Node$1 | undefined;
121
+ has(path: string): boolean;
122
+ getAllPaths(): string[];
123
+ getRootFromIndex(index: number): string | null;
124
+ }
125
+ //#endregion
126
+ //#region src/application/use-cases/SimulationService.d.ts
127
+ declare class SimulationService {
128
+ private gateway;
129
+ private logger;
130
+ private stateRepo;
131
+ private schemaRegistry;
132
+ private port;
133
+ private ip;
134
+ private subscriptionManager;
135
+ private messageHandler;
136
+ private processPacket;
137
+ private broadcastUpdates;
138
+ private manageSessions;
139
+ private meterService;
140
+ private staticResponseService;
141
+ private updateInterval;
142
+ private cleanupInterval;
143
+ constructor(gateway: INetworkGateway, logger: ILogger, stateRepo: IStateRepository, schemaRegistry: SchemaRegistry, port?: number, ip?: string, name?: string, model?: string);
144
+ start(): Promise<void>;
145
+ stop(): Promise<void>;
146
+ resetState(): void;
147
+ }
148
+ //#endregion
149
+ //#region src/infrastructure/repositories/InMemoryStateRepository.d.ts
150
+ declare class InMemoryStateRepository implements IStateRepository {
151
+ private logger;
152
+ private state;
153
+ constructor(logger: ILogger, schemaRegistry: SchemaRegistry);
154
+ getState(): X32State;
155
+ reset(): void;
156
+ }
157
+ //#endregion
158
+ //#region src/infrastructure/services/ConsoleLogger.d.ts
159
+ declare enum LogLevel {
160
+ DEBUG = 0,
161
+ INFO = 1,
162
+ WARN = 2,
163
+ ERROR = 3,
164
+ NONE = 4,
165
+ }
166
+ declare class ConsoleLogger implements ILogger {
167
+ private static instance;
168
+ private level;
169
+ private hiddenPatterns;
170
+ private enabledCategories;
171
+ constructor();
172
+ static getInstance(): ConsoleLogger;
173
+ setLevel(level: LogLevel): void;
174
+ enableCategory(cat: string): void;
175
+ disableCategory(cat: string): void;
176
+ debug(category: string, msg: string, data?: LogData): void;
177
+ info(category: string, msg: string, data?: LogData): void;
178
+ warn(category: string, msg: string, data?: LogData): void;
179
+ error(category: string, msg: string, err?: LogData): void;
180
+ private shouldHide;
181
+ private format;
182
+ }
183
+ //#endregion
184
+ //#region src/infrastructure/mappers/OscCodec.d.ts
185
+ declare class OscCodec {
186
+ private schemaRegistry;
187
+ constructor(schemaRegistry: SchemaRegistry);
188
+ decode(msg: Buffer): OscPacket;
189
+ encode(address: string, args: OscArgument[]): Buffer;
190
+ private createMessage;
191
+ }
192
+ //#endregion
193
+ //#region src/infrastructure/services/UdpNetworkGateway.d.ts
194
+ declare class UdpNetworkGateway implements INetworkGateway {
195
+ private logger;
196
+ private codec;
197
+ private socket;
198
+ private isRunning;
199
+ private packetCallback;
200
+ constructor(logger: ILogger, codec: OscCodec);
201
+ onPacket(callback: (packet: OscPacket, source: RemoteClient) => void): void;
202
+ start(port: number, ip: string): Promise<void>;
203
+ stop(): Promise<void>;
204
+ send(target: RemoteClient, address: string, args: any[]): void;
205
+ }
206
+ //#endregion
207
+ export { ConsoleLogger, type ILogger, type INetworkGateway, type IStateRepository, InMemoryStateRepository, LogCategory, type LogData, OscArgument, OscArgumentValue, OscMsg, OscPacket, OscReply, RemoteClient, SimulationService, Subscriber, UdpNetworkGateway, X32Node };
package/dist/index.mjs ADDED
@@ -0,0 +1,3 @@
1
+ import { a as SimulationService, i as InMemoryStateRepository, n as ConsoleLogger, s as LogCategory, t as UdpNetworkGateway } from "./UdpNetworkGateway-BrroQ6-Q.mjs";
2
+
3
+ export { ConsoleLogger, InMemoryStateRepository, LogCategory, SimulationService, UdpNetworkGateway };