stagelinq 1.0.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.
Files changed (45) hide show
  1. package/.gitattributes +2 -0
  2. package/.prettierignore +7 -0
  3. package/.prettierrc.js +10 -0
  4. package/.vscode/launch.json +40 -0
  5. package/.vscode/tasks.json +24 -0
  6. package/Databases/Databases.ts +69 -0
  7. package/Databases/DbConnection.ts +42 -0
  8. package/Databases/index.ts +2 -0
  9. package/LICENSE +674 -0
  10. package/LogEmitter/index.ts +51 -0
  11. package/README.md +83 -0
  12. package/StageLinq/index.ts +58 -0
  13. package/TODO.md +5 -0
  14. package/albumArt/index.ts +2 -0
  15. package/albumArt/maybeDownloadFiles.ts +34 -0
  16. package/cli/index.ts +142 -0
  17. package/devices/Player.ts +182 -0
  18. package/devices/PlayerMessageQueue.ts +62 -0
  19. package/index.ts +5 -0
  20. package/network/NetworkDevice.ts +287 -0
  21. package/network/StageLinqDevices.ts +215 -0
  22. package/network/StageLinqListener.ts +50 -0
  23. package/network/announce.ts +133 -0
  24. package/network/index.ts +4 -0
  25. package/package.json +31 -0
  26. package/services/FileTransfer.ts +298 -0
  27. package/services/Service.ts +144 -0
  28. package/services/StateMap.ts +170 -0
  29. package/services/index.ts +3 -0
  30. package/stagelinq.code-workspace +16 -0
  31. package/tsconfig.json +13 -0
  32. package/types/common.ts +240 -0
  33. package/types/database.ts +50 -0
  34. package/types/index.ts +53 -0
  35. package/types/player.ts +41 -0
  36. package/types/tokens.ts +39 -0
  37. package/utils/Context.ts +45 -0
  38. package/utils/ReadContext.ts +114 -0
  39. package/utils/WriteContext.ts +105 -0
  40. package/utils/getTempFilePath.ts +23 -0
  41. package/utils/hex.ts +62 -0
  42. package/utils/index.ts +6 -0
  43. package/utils/log.ts +0 -0
  44. package/utils/sleep.ts +3 -0
  45. package/utils/tcp.ts +17 -0
@@ -0,0 +1,240 @@
1
+ export const ANNOUNCEMENT_INTERVAL = 1000; // in ms
2
+ export const LISTEN_PORT = 51337;
3
+ export const LISTEN_TIMEOUT = 5000; // in ms
4
+ export const MESSAGE_TIMEOUT = 3000; // in ms
5
+ export const CONNECT_TIMEOUT = 5000; // in ms
6
+ export const DOWNLOAD_TIMEOUT = 60000; // in ms
7
+ export const DISCOVERY_MESSAGE_MARKER = 'airD';
8
+
9
+ export enum Action {
10
+ Login = 'DISCOVERER_HOWDY_',
11
+ Logout = 'DISCOVERER_EXIT_',
12
+ }
13
+
14
+ export enum MessageId {
15
+ ServicesAnnouncement = 0x0,
16
+ TimeStamp = 0x1,
17
+ ServicesRequest = 0x2,
18
+ }
19
+
20
+ export enum StageLinqValue {
21
+ ClientLibrarianDevicesControllerCurrentDevice = '/Client/Librarian/DevicesController/CurrentDevice',
22
+ ClientLibrarianDevicesControllerHasSDCardConnected = '/Client/Librarian/DevicesController/HasSDCardConnected',
23
+ ClientLibrarianDevicesControllerHasUsbDeviceConnected = '/Client/Librarian/DevicesController/HasUsbDeviceConnected',
24
+ ClientPreferencesLayerB = '/Client/Preferences/LayerB',
25
+ ClientPreferencesPlayer = '/Client/Preferences/Player',
26
+ ClientPreferencesProfileApplicationPlayerColor1 = '/Client/Preferences/Profile/Application/PlayerColor1',
27
+ ClientPreferencesProfileApplicationPlayerColor1A = '/Client/Preferences/Profile/Application/PlayerColor1A',
28
+ ClientPreferencesProfileApplicationPlayerColor1B = '/Client/Preferences/Profile/Application/PlayerColor1B',
29
+ ClientPreferencesProfileApplicationPlayerColor2 = '/Client/Preferences/Profile/Application/PlayerColor2',
30
+ ClientPreferencesProfileApplicationPlayerColor2A = '/Client/Preferences/Profile/Application/PlayerColor2A',
31
+ ClientPreferencesProfileApplicationPlayerColor2B = '/Client/Preferences/Profile/Application/PlayerColor2B',
32
+ ClientPreferencesProfileApplicationPlayerColor3 = '/Client/Preferences/Profile/Application/PlayerColor3',
33
+ ClientPreferencesProfileApplicationPlayerColor3A = '/Client/Preferences/Profile/Application/PlayerColor3A',
34
+ ClientPreferencesProfileApplicationPlayerColor3B = '/Client/Preferences/Profile/Application/PlayerColor3B',
35
+ ClientPreferencesProfileApplicationPlayerColor4 = '/Client/Preferences/Profile/Application/PlayerColor4',
36
+ ClientPreferencesProfileApplicationPlayerColor4A = '/Client/Preferences/Profile/Application/PlayerColor4A',
37
+ ClientPreferencesProfileApplicationPlayerColor4B = '/Client/Preferences/Profile/Application/PlayerColor4B',
38
+ ClientPreferencesProfileApplicationSyncMode = '/Client/Preferences/Profile/Application/SyncMode',
39
+ EngineDeck1CurrentBPM = '/Engine/Deck1/CurrentBPM',
40
+ EngineDeck1ExternalMixerVolume = '/Engine/Deck1/ExternalMixerVolume',
41
+ EngineDeck1ExternalScratchWheelTouch = '/Engine/Deck1/ExternalScratchWheelTouch',
42
+ EngineDeck1PadsView = '/Engine/Deck1/Pads/View',
43
+ EngineDeck1Play = '/Engine/Deck1/Play',
44
+ EngineDeck1PlayState = '/Engine/Deck1/PlayState',
45
+ EngineDeck1PlayStatePath = '/Engine/Deck1/PlayStatePath',
46
+ EngineDeck1Speed = '/Engine/Deck1/Speed',
47
+ EngineDeck1SpeedNeutral = '/Engine/Deck1/SpeedNeutral',
48
+ EngineDeck1SpeedOffsetDown = '/Engine/Deck1/SpeedOffsetDown',
49
+ EngineDeck1SpeedOffsetUp = '/Engine/Deck1/SpeedOffsetUp',
50
+ EngineDeck1SpeedRange = '/Engine/Deck1/SpeedRange',
51
+ EngineDeck1SpeedState = '/Engine/Deck1/SpeedState',
52
+ EngineDeck1SyncMode = '/Engine/Deck1/SyncMode',
53
+ EngineDeck1TrackArtistName = '/Engine/Deck1/Track/ArtistName',
54
+ EngineDeck1TrackBleep = '/Engine/Deck1/Track/Bleep',
55
+ EngineDeck1TrackCuePosition = '/Engine/Deck1/Track/CuePosition',
56
+ EngineDeck1TrackCurrentBPM = '/Engine/Deck1/Track/CurrentBPM',
57
+ EngineDeck1TrackCurrentKeyIndex = '/Engine/Deck1/Track/CurrentKeyIndex',
58
+ EngineDeck1TrackCurrentLoopInPosition = '/Engine/Deck1/Track/CurrentLoopInPosition',
59
+ EngineDeck1TrackCurrentLoopOutPosition = '/Engine/Deck1/Track/CurrentLoopOutPosition',
60
+ EngineDeck1TrackCurrentLoopSizeInBeats = '/Engine/Deck1/Track/CurrentLoopSizeInBeats',
61
+ EngineDeck1TrackKeyLock = '/Engine/Deck1/Track/KeyLock',
62
+ EngineDeck1TrackLoopEnableState = '/Engine/Deck1/Track/LoopEnableState',
63
+ EngineDeck1TrackLoopQuickLoop1 = '/Engine/Deck1/Track/Loop/QuickLoop1',
64
+ EngineDeck1TrackLoopQuickLoop2 = '/Engine/Deck1/Track/Loop/QuickLoop2',
65
+ EngineDeck1TrackLoopQuickLoop3 = '/Engine/Deck1/Track/Loop/QuickLoop3',
66
+ EngineDeck1TrackLoopQuickLoop4 = '/Engine/Deck1/Track/Loop/QuickLoop4',
67
+ EngineDeck1TrackLoopQuickLoop5 = '/Engine/Deck1/Track/Loop/QuickLoop5',
68
+ EngineDeck1TrackLoopQuickLoop6 = '/Engine/Deck1/Track/Loop/QuickLoop6',
69
+ EngineDeck1TrackLoopQuickLoop7 = '/Engine/Deck1/Track/Loop/QuickLoop7',
70
+ EngineDeck1TrackLoopQuickLoop8 = '/Engine/Deck1/Track/Loop/QuickLoop8',
71
+ EngineDeck1TrackPlayPauseLEDState = '/Engine/Deck1/Track/PlayPauseLEDState',
72
+ EngineDeck1TrackSampleRate = '/Engine/Deck1/Track/SampleRate',
73
+ EngineDeck1TrackSongAnalyzed = '/Engine/Deck1/Track/SongAnalyzed',
74
+ EngineDeck1TrackSongLoaded = '/Engine/Deck1/Track/SongLoaded',
75
+ EngineDeck1TrackSongName = '/Engine/Deck1/Track/SongName',
76
+ EngineDeck1TrackSoundSwitchGUID = '/Engine/Deck1/Track/SoundSwitchGuid',
77
+ EngineDeck1TrackTrackBytes = '/Engine/Deck1/Track/TrackBytes',
78
+ EngineDeck1TrackTrackData = '/Engine/Deck1/Track/TrackData',
79
+ EngineDeck1TrackTrackLength = '/Engine/Deck1/Track/TrackLength',
80
+ EngineDeck1TrackTrackName = '/Engine/Deck1/Track/TrackName',
81
+ EngineDeck1TrackTrackNetworkPath = '/Engine/Deck1/Track/TrackNetworkPath',
82
+ EngineDeck1TrackTrackURI = '/Engine/Deck1/Track/TrackUri',
83
+ EngineDeck1TrackTrackWasPlayed = '/Engine/Deck1/Track/TrackWasPlayed',
84
+ EngineDeck2CurrentBPM = '/Engine/Deck2/CurrentBPM',
85
+ EngineDeck2ExternalMixerVolume = '/Engine/Deck2/ExternalMixerVolume',
86
+ EngineDeck2ExternalScratchWheelTouch = '/Engine/Deck2/ExternalScratchWheelTouch',
87
+ EngineDeck2PadsView = '/Engine/Deck2/Pads/View',
88
+ EngineDeck2Play = '/Engine/Deck2/Play',
89
+ EngineDeck2PlayState = '/Engine/Deck2/PlayState',
90
+ EngineDeck2PlayStatePath = '/Engine/Deck2/PlayStatePath',
91
+ EngineDeck2Speed = '/Engine/Deck2/Speed',
92
+ EngineDeck2SpeedNeutral = '/Engine/Deck2/SpeedNeutral',
93
+ EngineDeck2SpeedOffsetDown = '/Engine/Deck2/SpeedOffsetDown',
94
+ EngineDeck2SpeedOffsetUp = '/Engine/Deck2/SpeedOffsetUp',
95
+ EngineDeck2SpeedRange = '/Engine/Deck2/SpeedRange',
96
+ EngineDeck2SpeedState = '/Engine/Deck2/SpeedState',
97
+ EngineDeck2SyncMode = '/Engine/Deck2/SyncMode',
98
+ EngineDeck2TrackArtistName = '/Engine/Deck2/Track/ArtistName',
99
+ EngineDeck2TrackBleep = '/Engine/Deck2/Track/Bleep',
100
+ EngineDeck2TrackCuePosition = '/Engine/Deck2/Track/CuePosition',
101
+ EngineDeck2TrackCurrentBPM = '/Engine/Deck2/Track/CurrentBPM',
102
+ EngineDeck2TrackCurrentKeyIndex = '/Engine/Deck2/Track/CurrentKeyIndex',
103
+ EngineDeck2TrackCurrentLoopInPosition = '/Engine/Deck2/Track/CurrentLoopInPosition',
104
+ EngineDeck2TrackCurrentLoopOutPosition = '/Engine/Deck2/Track/CurrentLoopOutPosition',
105
+ EngineDeck2TrackCurrentLoopSizeInBeats = '/Engine/Deck2/Track/CurrentLoopSizeInBeats',
106
+ EngineDeck2TrackKeyLock = '/Engine/Deck2/Track/KeyLock',
107
+ EngineDeck2TrackLoopEnableState = '/Engine/Deck2/Track/LoopEnableState',
108
+ EngineDeck2TrackLoopQuickLoop1 = '/Engine/Deck2/Track/Loop/QuickLoop1',
109
+ EngineDeck2TrackLoopQuickLoop2 = '/Engine/Deck2/Track/Loop/QuickLoop2',
110
+ EngineDeck2TrackLoopQuickLoop3 = '/Engine/Deck2/Track/Loop/QuickLoop3',
111
+ EngineDeck2TrackLoopQuickLoop4 = '/Engine/Deck2/Track/Loop/QuickLoop4',
112
+ EngineDeck2TrackLoopQuickLoop5 = '/Engine/Deck2/Track/Loop/QuickLoop5',
113
+ EngineDeck2TrackLoopQuickLoop6 = '/Engine/Deck2/Track/Loop/QuickLoop6',
114
+ EngineDeck2TrackLoopQuickLoop7 = '/Engine/Deck2/Track/Loop/QuickLoop7',
115
+ EngineDeck2TrackLoopQuickLoop8 = '/Engine/Deck2/Track/Loop/QuickLoop8',
116
+ EngineDeck2TrackPlayPauseLEDState = '/Engine/Deck2/Track/PlayPauseLEDState',
117
+ EngineDeck2TrackSampleRate = '/Engine/Deck2/Track/SampleRate',
118
+ EngineDeck2TrackSongAnalyzed = '/Engine/Deck2/Track/SongAnalyzed',
119
+ EngineDeck2TrackSongLoaded = '/Engine/Deck2/Track/SongLoaded',
120
+ EngineDeck2TrackSongName = '/Engine/Deck2/Track/SongName',
121
+ EngineDeck2TrackSoundSwitchGUID = '/Engine/Deck2/Track/SoundSwitchGuid',
122
+ EngineDeck2TrackTrackBytes = '/Engine/Deck2/Track/TrackBytes',
123
+ EngineDeck2TrackTrackData = '/Engine/Deck2/Track/TrackData',
124
+ EngineDeck2TrackTrackLength = '/Engine/Deck2/Track/TrackLength',
125
+ EngineDeck2TrackTrackName = '/Engine/Deck2/Track/TrackName',
126
+ EngineDeck2TrackTrackNetworkPath = '/Engine/Deck2/Track/TrackNetworkPath',
127
+ EngineDeck2TrackTrackURI = '/Engine/Deck2/Track/TrackUri',
128
+ EngineDeck2TrackTrackWasPlayed = '/Engine/Deck2/Track/TrackWasPlayed',
129
+ EngineDeck3CurrentBPM = '/Engine/Deck3/CurrentBPM',
130
+ EngineDeck3ExternalMixerVolume = '/Engine/Deck3/ExternalMixerVolume',
131
+ EngineDeck3ExternalScratchWheelTouch = '/Engine/Deck3/ExternalScratchWheelTouch',
132
+ EngineDeck3PadsView = '/Engine/Deck3/Pads/View',
133
+ EngineDeck3Play = '/Engine/Deck3/Play',
134
+ EngineDeck3PlayState = '/Engine/Deck3/PlayState',
135
+ EngineDeck3PlayStatePath = '/Engine/Deck3/PlayStatePath',
136
+ EngineDeck3Speed = '/Engine/Deck3/Speed',
137
+ EngineDeck3SpeedNeutral = '/Engine/Deck3/SpeedNeutral',
138
+ EngineDeck3SpeedOffsetDown = '/Engine/Deck3/SpeedOffsetDown',
139
+ EngineDeck3SpeedOffsetUp = '/Engine/Deck3/SpeedOffsetUp',
140
+ EngineDeck3SpeedRange = '/Engine/Deck3/SpeedRange',
141
+ EngineDeck3SpeedState = '/Engine/Deck3/SpeedState',
142
+ EngineDeck3SyncMode = '/Engine/Deck3/SyncMode',
143
+ EngineDeck3TrackArtistName = '/Engine/Deck3/Track/ArtistName',
144
+ EngineDeck3TrackBleep = '/Engine/Deck3/Track/Bleep',
145
+ EngineDeck3TrackCuePosition = '/Engine/Deck3/Track/CuePosition',
146
+ EngineDeck3TrackCurrentBPM = '/Engine/Deck3/Track/CurrentBPM',
147
+ EngineDeck3TrackCurrentKeyIndex = '/Engine/Deck3/Track/CurrentKeyIndex',
148
+ EngineDeck3TrackCurrentLoopInPosition = '/Engine/Deck3/Track/CurrentLoopInPosition',
149
+ EngineDeck3TrackCurrentLoopOutPosition = '/Engine/Deck3/Track/CurrentLoopOutPosition',
150
+ EngineDeck3TrackCurrentLoopSizeInBeats = '/Engine/Deck3/Track/CurrentLoopSizeInBeats',
151
+ EngineDeck3TrackKeyLock = '/Engine/Deck3/Track/KeyLock',
152
+ EngineDeck3TrackLoopEnableState = '/Engine/Deck3/Track/LoopEnableState',
153
+ EngineDeck3TrackLoopQuickLoop1 = '/Engine/Deck3/Track/Loop/QuickLoop1',
154
+ EngineDeck3TrackLoopQuickLoop2 = '/Engine/Deck3/Track/Loop/QuickLoop2',
155
+ EngineDeck3TrackLoopQuickLoop3 = '/Engine/Deck3/Track/Loop/QuickLoop3',
156
+ EngineDeck3TrackLoopQuickLoop4 = '/Engine/Deck3/Track/Loop/QuickLoop4',
157
+ EngineDeck3TrackLoopQuickLoop5 = '/Engine/Deck3/Track/Loop/QuickLoop5',
158
+ EngineDeck3TrackLoopQuickLoop6 = '/Engine/Deck3/Track/Loop/QuickLoop6',
159
+ EngineDeck3TrackLoopQuickLoop7 = '/Engine/Deck3/Track/Loop/QuickLoop7',
160
+ EngineDeck3TrackLoopQuickLoop8 = '/Engine/Deck3/Track/Loop/QuickLoop8',
161
+ EngineDeck3TrackPlayPauseLEDState = '/Engine/Deck3/Track/PlayPauseLEDState',
162
+ EngineDeck3TrackSampleRate = '/Engine/Deck3/Track/SampleRate',
163
+ EngineDeck3TrackSongAnalyzed = '/Engine/Deck3/Track/SongAnalyzed',
164
+ EngineDeck3TrackSongLoaded = '/Engine/Deck3/Track/SongLoaded',
165
+ EngineDeck3TrackSongName = '/Engine/Deck3/Track/SongName',
166
+ EngineDeck3TrackSoundSwitchGUID = '/Engine/Deck3/Track/SoundSwitchGuid',
167
+ EngineDeck3TrackTrackBytes = '/Engine/Deck3/Track/TrackBytes',
168
+ EngineDeck3TrackTrackData = '/Engine/Deck3/Track/TrackData',
169
+ EngineDeck3TrackTrackLength = '/Engine/Deck3/Track/TrackLength',
170
+ EngineDeck3TrackTrackName = '/Engine/Deck3/Track/TrackName',
171
+ EngineDeck3TrackTrackNetworkPath = '/Engine/Deck3/Track/TrackNetworkPath',
172
+ EngineDeck3TrackTrackURI = '/Engine/Deck3/Track/TrackUri',
173
+ EngineDeck3TrackTrackWasPlayed = '/Engine/Deck3/Track/TrackWasPlayed',
174
+ EngineDeck4CurrentBPM = '/Engine/Deck4/CurrentBPM',
175
+ EngineDeck4ExternalMixerVolume = '/Engine/Deck4/ExternalMixerVolume',
176
+ EngineDeck4ExternalScratchWheelTouch = '/Engine/Deck4/ExternalScratchWheelTouch',
177
+ EngineDeck4PadsView = '/Engine/Deck4/Pads/View',
178
+ EngineDeck4Play = '/Engine/Deck4/Play',
179
+ EngineDeck4PlayState = '/Engine/Deck4/PlayState',
180
+ EngineDeck4PlayStatePath = '/Engine/Deck4/PlayStatePath',
181
+ EngineDeck4Speed = '/Engine/Deck4/Speed',
182
+ EngineDeck4SpeedNeutral = '/Engine/Deck4/SpeedNeutral',
183
+ EngineDeck4SpeedOffsetDown = '/Engine/Deck4/SpeedOffsetDown',
184
+ EngineDeck4SpeedOffsetUp = '/Engine/Deck4/SpeedOffsetUp',
185
+ EngineDeck4SpeedRange = '/Engine/Deck4/SpeedRange',
186
+ EngineDeck4SpeedState = '/Engine/Deck4/SpeedState',
187
+ EngineDeck4SyncMode = '/Engine/Deck4/SyncMode',
188
+ EngineDeck4TrackArtistName = '/Engine/Deck4/Track/ArtistName',
189
+ EngineDeck4TrackBleep = '/Engine/Deck4/Track/Bleep',
190
+ EngineDeck4TrackCuePosition = '/Engine/Deck4/Track/CuePosition',
191
+ EngineDeck4TrackCurrentBPM = '/Engine/Deck4/Track/CurrentBPM',
192
+ EngineDeck4TrackCurrentKeyIndex = '/Engine/Deck4/Track/CurrentKeyIndex',
193
+ EngineDeck4TrackCurrentLoopInPosition = '/Engine/Deck4/Track/CurrentLoopInPosition',
194
+ EngineDeck4TrackCurrentLoopOutPosition = '/Engine/Deck4/Track/CurrentLoopOutPosition',
195
+ EngineDeck4TrackCurrentLoopSizeInBeats = '/Engine/Deck4/Track/CurrentLoopSizeInBeats',
196
+ EngineDeck4TrackKeyLock = '/Engine/Deck4/Track/KeyLock',
197
+ EngineDeck4TrackLoopEnableState = '/Engine/Deck4/Track/LoopEnableState',
198
+ EngineDeck4TrackLoopQuickLoop1 = '/Engine/Deck4/Track/Loop/QuickLoop1',
199
+ EngineDeck4TrackLoopQuickLoop2 = '/Engine/Deck4/Track/Loop/QuickLoop2',
200
+ EngineDeck4TrackLoopQuickLoop3 = '/Engine/Deck4/Track/Loop/QuickLoop3',
201
+ EngineDeck4TrackLoopQuickLoop4 = '/Engine/Deck4/Track/Loop/QuickLoop4',
202
+ EngineDeck4TrackLoopQuickLoop5 = '/Engine/Deck4/Track/Loop/QuickLoop5',
203
+ EngineDeck4TrackLoopQuickLoop6 = '/Engine/Deck4/Track/Loop/QuickLoop6',
204
+ EngineDeck4TrackLoopQuickLoop7 = '/Engine/Deck4/Track/Loop/QuickLoop7',
205
+ EngineDeck4TrackLoopQuickLoop8 = '/Engine/Deck4/Track/Loop/QuickLoop8',
206
+ EngineDeck4TrackPlayPauseLEDState = '/Engine/Deck4/Track/PlayPauseLEDState',
207
+ EngineDeck4TrackSampleRate = '/Engine/Deck4/Track/SampleRate',
208
+ EngineDeck4TrackSongAnalyzed = '/Engine/Deck4/Track/SongAnalyzed',
209
+ EngineDeck4TrackSongLoaded = '/Engine/Deck4/Track/SongLoaded',
210
+ EngineDeck4TrackSongName = '/Engine/Deck4/Track/SongName',
211
+ EngineDeck4TrackSoundSwitchGUID = '/Engine/Deck4/Track/SoundSwitchGuid',
212
+ EngineDeck4TrackTrackBytes = '/Engine/Deck4/Track/TrackBytes',
213
+ EngineDeck4TrackTrackData = '/Engine/Deck4/Track/TrackData',
214
+ EngineDeck4TrackTrackLength = '/Engine/Deck4/Track/TrackLength',
215
+ EngineDeck4TrackTrackName = '/Engine/Deck4/Track/TrackName',
216
+ EngineDeck4TrackTrackNetworkPath = '/Engine/Deck4/Track/TrackNetworkPath',
217
+ EngineDeck4TrackTrackURI = '/Engine/Deck4/Track/TrackUri',
218
+ EngineDeck4TrackTrackWasPlayed = '/Engine/Deck4/Track/TrackWasPlayed',
219
+ EngineDeckCount = '/Engine/DeckCount',
220
+ GUIDecksDeckActiveDeck = '/GUI/Decks/Deck/ActiveDeck',
221
+ GUIViewLayerLayerB = '/GUI/ViewLayer/LayerB',
222
+ MixerCH1faderPosition = '/Mixer/CH1faderPosition',
223
+ MixerCH2faderPosition = '/Mixer/CH2faderPosition',
224
+ MixerCH3faderPosition = '/Mixer/CH3faderPosition',
225
+ MixerCH4faderPosition = '/Mixer/CH4faderPosition',
226
+ MixerCrossfaderPosition = '/Mixer/CrossfaderPosition',
227
+
228
+ MixerNumberOfChannels = '/Mixer/NumberOfChannels',
229
+ ClientPreferencesPlayerJogColorA = '/Client/Preferences/PlayerJogColorA',
230
+ ClientPreferencesPlayerJogColorB = '/Client/Preferences/PlayerJogColorB',
231
+ EngineDeck1DeckIsMaster = '/Client/Deck1/DeckIsMaster',
232
+ EngineDeck2DeckIsMaster = '/Client/Deck2/DeckIsMaster',
233
+ ClientPreferencesLayerA = '/Client/Preferences/LayerA',
234
+ EngineSyncNetworkMasterStatus = '/Engine/Sync/Network/MasterStatus',
235
+ EngineMasterMasterTempo = '/Engine/Master/MasterTempo',
236
+ MixerChannelAssignment1 = '/Mixer/ChannelAssignment1',
237
+ MixerChannelAssignment2 = '/Mixer/ChannelAssignment2',
238
+ MixerChannelAssignment3 = '/Mixer/ChannelAssignment3',
239
+ MixerChannelAssignment4 = '/Mixer/ChannelAssignment4',
240
+ }
@@ -0,0 +1,50 @@
1
+ export interface Track {
2
+ id: number,
3
+ playOrder: number,
4
+ length: number,
5
+ bpm: number,
6
+ year: number,
7
+ path: string,
8
+ filename: string,
9
+ bitrate: number,
10
+ bpmAnalyzed: number,
11
+ albumArtId: number,
12
+ fileBytes: number,
13
+ title: string,
14
+ artist: string,
15
+ album: string,
16
+ genre: string,
17
+ comment: string,
18
+ label: string,
19
+ composer: string,
20
+ remixer: string,
21
+ key: number,
22
+ rating: number,
23
+ albumArt: string,
24
+ timeLastPlayed: string,
25
+ isPlayed: boolean,
26
+ fileType: string,
27
+ isAnalyzed: boolean,
28
+ dateCreated: string,
29
+ dateAdded: string,
30
+ isAvailable: boolean,
31
+ isMetadataOfPackedTrackChanged: boolean,
32
+ isPerfomanceDataOfPackedTrackChanged: boolean,
33
+ playedIndicator: number,
34
+ isMetadataImported: boolean,
35
+ pdbImportKey: number,
36
+ streamingSource: string,
37
+ uri: string,
38
+ isBeatGridLocked: boolean,
39
+ originDatabaseUuid: string,
40
+ originTrackId: number,
41
+ trackData: Buffer,
42
+ overviewWaveFormData: Buffer,
43
+ beatData: Buffer,
44
+ quickCues: Buffer,
45
+ loops: Buffer,
46
+ thirdPartySourceId: number,
47
+ streamingFlags: number,
48
+ explicitLyrics: boolean,
49
+ activeOnLoadLoops: number
50
+ }
package/types/index.ts ADDED
@@ -0,0 +1,53 @@
1
+ import { DiscoveryMessageOptions } from '../network';
2
+
3
+ export * from './common';
4
+ export * from './database';
5
+ export * from './player';
6
+ export * from './tokens';
7
+
8
+ export interface DiscoveryMessage {
9
+ token: Uint8Array;
10
+ source: string;
11
+ action: string;
12
+ software: {
13
+ name: string;
14
+ version: string;
15
+ };
16
+ port: number;
17
+ }
18
+
19
+ export interface ServicePorts {
20
+ [key: string]: number;
21
+ }
22
+
23
+ export interface ServiceMessage<T> {
24
+ id: number;
25
+ message: T;
26
+ }
27
+
28
+ export interface Source {
29
+ name: string;
30
+ database: {
31
+ location: string;
32
+ size: number;
33
+ };
34
+ }
35
+
36
+ export interface FileTransferInfo {
37
+ txid: number;
38
+ size: number;
39
+ }
40
+
41
+ // TODO: Maybe some kind of validation?
42
+ export type IpAddress = string;
43
+
44
+ export interface ConnectionInfo extends DiscoveryMessage {
45
+ address: IpAddress;
46
+ }
47
+
48
+
49
+ export interface StageLinqOptions {
50
+ maxRetries?: number;
51
+ actingAs?: DiscoveryMessageOptions;
52
+ downloadDbSources?: boolean;
53
+ }
@@ -0,0 +1,41 @@
1
+
2
+ export interface PlayerStatus {
3
+ address: string;
4
+ artist: string;
5
+ currentBpm: number
6
+ deck: string;
7
+ externalMixerVolume: number;
8
+ fileLocation: string;
9
+ hasTrackData: boolean;
10
+ jogColor: string;
11
+ layer: string;
12
+ masterStatus: boolean;
13
+ masterTempo: number;
14
+ play: boolean;
15
+ player: number;
16
+ playState: boolean;
17
+ port: number;
18
+ songLoaded: boolean;
19
+ title: string;
20
+ trackNetworkPath: string;
21
+
22
+ source: string;
23
+ dbSourceName: string;
24
+ trackPath: string;
25
+ }
26
+
27
+ export interface PlayerLayerState {
28
+ layer: string;
29
+ artist?: string;
30
+ currentBpm?: number;
31
+ externalMixerVolume?: number;
32
+ fileLocation?: string;
33
+ hasTrackData?: boolean;
34
+ jogColor?: string;
35
+ play?: boolean;
36
+ player?: string;
37
+ playState?: boolean;
38
+ songLoaded?: boolean;
39
+ title?: string;
40
+ trackNetworkPath?: string;
41
+ }
@@ -0,0 +1,39 @@
1
+ import { DiscoveryMessageOptions } from '../network';
2
+
3
+ export const Tokens = {
4
+ SoundSwitch: new Uint8Array([82, 253, 252, 7, 33, 130, 101, 79, 22, 63, 95, 15, 154, 98, 29, 114]),
5
+ Sc6000_1: new Uint8Array([ 130, 139, 235, 2, 218, 31, 78, 104, 166, 175, 176, 177, 103, 234, 240, 162 ]),
6
+ Sc6000_2: new Uint8Array([ 38, 210, 56, 103, 28, 214, 78, 63, 128, 161, 17, 130, 106, 196, 17, 32 ]),
7
+ Resolume: new Uint8Array([ 136, 250, 32, 153, 172, 122, 79, 63, 188, 22, 169, 149, 219, 218, 42, 66 ])
8
+ }
9
+
10
+ export const ActingAsDevice: {[name: string]: DiscoveryMessageOptions} = {
11
+ NowPlaying: {
12
+ name: 'nowplaying',
13
+ version: '2.2.0',
14
+ source: 'np2',
15
+ token: Tokens.SoundSwitch
16
+ },
17
+
18
+ Sc6000_1: {
19
+ name: 'sc6000',
20
+ version: '2.3.1',
21
+ source: 'JP13',
22
+ token: Tokens.Sc6000_1
23
+ },
24
+
25
+ Sc6000_2: {
26
+ name: 'sc6000',
27
+ version: '2.3.1',
28
+ source: 'JP13',
29
+ token: Tokens.Sc6000_2
30
+ },
31
+
32
+ Resolume: {
33
+ name: 'resolume',
34
+ version: '10.0.0',
35
+ source: 'res',
36
+ token: Tokens.Resolume
37
+ }
38
+
39
+ }
@@ -0,0 +1,45 @@
1
+ import { strict as assert } from 'assert';
2
+
3
+ export class Context {
4
+ protected buffer: ArrayBuffer;
5
+ protected pos: number;
6
+ protected readonly littleEndian: boolean;
7
+
8
+ constructor(p_buffer: ArrayBuffer, p_littleEndian?: boolean) {
9
+ this.buffer = p_buffer;
10
+ this.pos = 0;
11
+ this.littleEndian = p_littleEndian === undefined || !!p_littleEndian;
12
+ }
13
+
14
+ sizeLeft() {
15
+ return this.buffer.byteLength - this.pos;
16
+ }
17
+
18
+ tell() {
19
+ return this.pos;
20
+ }
21
+
22
+ seek(p_bytes: number) {
23
+ assert(this.pos + p_bytes >= 0);
24
+ assert(this.pos + p_bytes <= this.buffer.byteLength);
25
+
26
+ this.pos += p_bytes;
27
+ }
28
+
29
+ set(p_offset: number) {
30
+ assert(p_offset >= 0 && p_offset <= this.buffer.byteLength);
31
+ this.pos = p_offset;
32
+ }
33
+
34
+ isEOF() {
35
+ return this.pos >= this.buffer.byteLength;
36
+ }
37
+
38
+ isLittleEndian() {
39
+ return this.littleEndian;
40
+ }
41
+
42
+ rewind() {
43
+ this.pos = 0;
44
+ }
45
+ }
@@ -0,0 +1,114 @@
1
+ import { strict as assert } from 'assert';
2
+ import { Context } from './Context';
3
+
4
+ function fromCString(p_buffer: Uint8Array): string {
5
+ const arr = String.fromCharCode.apply(null, p_buffer).split('\0');
6
+ assert(arr.length > 0);
7
+ return arr[0];
8
+ }
9
+
10
+ export class ReadContext extends Context {
11
+ constructor(p_buffer: ArrayBuffer, p_littleEndian = false) {
12
+ super(p_buffer, p_littleEndian);
13
+ }
14
+
15
+ read(p_bytes: number): Uint8Array {
16
+ const bytesToRead = Math.min(this.sizeLeft(), p_bytes);
17
+ if (bytesToRead <= 0) {
18
+ return null;
19
+ }
20
+
21
+ const view = new Uint8Array(this.buffer, this.pos, bytesToRead);
22
+ this.pos += bytesToRead;
23
+ assert(view.byteLength === bytesToRead);
24
+ return view;
25
+ }
26
+
27
+ readRemaining(): Uint8Array {
28
+ return this.read(this.sizeLeft());
29
+ }
30
+
31
+ readRemainingAsNewBuffer(): Buffer {
32
+ const view = this.readRemaining();
33
+ const newArrayBuffer = view.buffer.slice(view.byteOffset, view.byteOffset + view.length);
34
+ return Buffer.from(newArrayBuffer);
35
+ }
36
+
37
+ getString(p_bytes: number): string {
38
+ const buf = this.read(p_bytes);
39
+ return fromCString(buf);
40
+ }
41
+
42
+ readNetworkStringUTF16(): string {
43
+ // node.js only supports little endian of UTF16, and we need big endian, so read one by one
44
+ const bytes = this.readUInt32();
45
+ assert(bytes <= this.sizeLeft());
46
+ assert(bytes % 2 === 0); // Should be 2 bytes per character; otherwise assert
47
+
48
+ let result = '';
49
+ for (let i = 0; i < bytes / 2; ++i) {
50
+ result += String.fromCharCode(this.readUInt16());
51
+ }
52
+ return result;
53
+ }
54
+
55
+ readUInt64(): bigint {
56
+ const offset = this.pos;
57
+ if (offset + 8 <= this.buffer.byteLength) {
58
+ const value = new DataView(this.buffer).getBigUint64(this.pos, this.littleEndian);
59
+ this.pos += 8;
60
+ return value;
61
+ }
62
+
63
+ assert.fail(`Read outside buffer`);
64
+ return null;
65
+ }
66
+
67
+ readUInt32(): number {
68
+ const offset = this.pos;
69
+ if (offset + 4 <= this.buffer.byteLength) {
70
+ const value = new DataView(this.buffer).getUint32(this.pos, this.littleEndian);
71
+ this.pos += 4;
72
+ return value;
73
+ }
74
+
75
+ assert.fail(`Read outside buffer`);
76
+ return null;
77
+ }
78
+
79
+ readInt32(): number {
80
+ const offset = this.pos;
81
+ if (offset + 4 <= this.buffer.byteLength) {
82
+ const value = new DataView(this.buffer).getInt32(this.pos, this.littleEndian);
83
+ this.pos += 4;
84
+ return value;
85
+ }
86
+
87
+ assert.fail(`Read outside buffer`);
88
+ return null;
89
+ }
90
+
91
+ readUInt16(): number {
92
+ const offset = this.pos;
93
+ if (offset + 2 <= this.buffer.byteLength) {
94
+ const value = new DataView(this.buffer).getUint16(this.pos, this.littleEndian);
95
+ this.pos += 2;
96
+ return value;
97
+ }
98
+
99
+ assert.fail(`Read outside buffer`);
100
+ return null;
101
+ }
102
+
103
+ readUInt8(): number {
104
+ const offset = this.pos;
105
+ if (offset + 1 <= this.buffer.byteLength) {
106
+ const value = new DataView(this.buffer).getUint8(this.pos);
107
+ this.pos += 1;
108
+ return value;
109
+ }
110
+
111
+ assert.fail(`Read outside buffer`);
112
+ return null;
113
+ }
114
+ }