dhd-control-api
Version:
Typescript library for the DHD Control API
1,642 lines (1,592 loc) • 52.1 kB
JavaScript
// src/index.ts
import { z as z40, ZodBoolean, ZodString } from "zod";
// src/api/audio/levels/index.ts
import { z as z2 } from "zod";
// src/utils.ts
import { z } from "zod";
var assertNever = (value) => {
throw new Error(`Unexpected value: ${value}`);
};
var numberedObject = (schema) => z.record(z.coerce.number(), schema);
// src/api/audio/levels/index.ts
var audioLevelsImmutable = z2.object({
_name: z2.string(),
_mode: z2.union([z2.literal("PPM"), z2.literal("VU"), z2.literal("TruePeak")]),
_left: z2.number(),
_right: z2.number(),
_correlation: z2.number()
});
var audioLevels = audioLevelsImmutable;
var audioLevelsGetHandlers = {
["/audio/levels"]: {
paramsSchema: null,
responseSchema: numberedObject(audioLevels)
},
["/audio/levels/{levelDetectID}"]: {
paramsSchema: z2.object({
levelDetectID: z2.number()
}),
responseSchema: audioLevels
}
};
// src/api/audio/loudness/index.ts
import { z as z3 } from "zod";
var audioLoudnessImmutable = z3.object({
_leveli: z3.number(),
_levelm: z3.number(),
_levelo: z3.number(),
_levels: z3.number(),
_levelu: z3.number(),
_maxm: z3.number(),
_maxpeak: z3.number(),
_maxs: z3.number(),
_mode: z3.string(),
// TODO: Request modes and change to enum
_name: z3.string(),
_peak: z3.number()
});
var audioLoudness = audioLoudnessImmutable;
var audioLoudnessGetHandlers = {
["/audio/loudness"]: {
paramsSchema: null,
responseSchema: numberedObject(audioLoudness)
},
["/audio/loudness/{levelDetectID}"]: {
paramsSchema: z3.object({
levelDetectID: z3.number()
}),
responseSchema: audioLoudness
}
};
// src/api/audio/mixers/index.ts
import { z as z28 } from "zod";
// src/api/audio/mixers/automix/index.ts
import { z as z4 } from "zod";
var audioMixersAutomixImmutable = z4.object({
_active: z4.boolean()
});
var audioMixersAutomixMutable = z4.object({
maxattenuation: z4.number(),
passiveattenuation: z4.number(),
hold: z4.number(),
ratio: z4.number(),
release: z4.number()
});
var audioMixersAutomix = audioMixersAutomixImmutable.merge(
audioMixersAutomixMutable
);
var audioMixersAutomixGetHandlers = {
["/audio/mixers/{mixerID}/automix"]: {
paramsSchema: z4.object({
mixerID: z4.number(),
automixID: z4.number()
}),
responseSchema: numberedObject(audioMixersAutomix)
},
["/audio/mixers/{mixerID}/automix/{automixID}"]: {
paramsSchema: z4.object({
mixerID: z4.number(),
automixID: z4.number()
}),
responseSchema: audioMixersAutomix
}
};
var audioMixersAutomixSetHandlers = {
["/audio/mixers/{mixerID}/automix/{automixID}"]: {
paramsSchema: z4.object({
mixerID: z4.number(),
automixID: z4.number()
}),
payloadSchema: audioMixersAutomixMutable,
responseSchema: audioMixersAutomixMutable
}
};
// src/api/audio/mixers/cleanfeeds/index.ts
import { z as z5 } from "zod";
var audioMixersCleanfeedsImmutable = z5.object({
_active: z5.boolean()
});
var audioMixersCleanfeedsMutable = z5.object({
cut: z5.boolean(),
n: z5.boolean(),
outgain: z5.number(),
outsel: z5.boolean(),
srcsel: z5.number()
});
var audioMixersCleanfeeds = audioMixersCleanfeedsImmutable.merge(
audioMixersCleanfeedsMutable
);
var audioMixersCleanfeedsGetHandlers = {
["/audio/mixers/{mixerID}/cleanfeeds"]: {
paramsSchema: z5.object({
mixerID: z5.number()
}),
responseSchema: numberedObject(audioMixersCleanfeeds)
},
["/audio/mixers/{mixerID}/cleanfeeds/{cleanfeedID}"]: {
paramsSchema: z5.object({
mixerID: z5.number(),
cleanfeedID: z5.number()
}),
responseSchema: audioMixersCleanfeeds
}
};
var audioMixersCleanfeedsSetHandlers = {
["/audio/mixers/{mixerID}/cleanfeeds/{cleanfeedID}"]: {
paramsSchema: z5.object({
mixerID: z5.number(),
cleanfeedID: z5.number()
}),
payloadSchema: audioMixersCleanfeedsMutable,
responseSchema: audioMixersCleanfeedsMutable
}
};
// src/api/audio/mixers/faders/index.ts
import { z as z24 } from "zod";
// src/api/audio/mixers/faders/meters/index.ts
import { z as z6 } from "zod";
var audioMixersFadersFaderMeterImmutable = z6.object({
_afl: z6.array(z6.number()),
_input: z6.array(z6.number()),
_pfl: z6.array(z6.number())
});
var audioMixersFadersFaderMeters = audioMixersFadersFaderMeterImmutable;
// src/api/audio/mixers/faders/mutegroups/index.ts
import { z as z7 } from "zod";
var audioMixersFadersFaderMutegroupsMutegroupMutable = z7.boolean();
var audioMixersFadersFaderMutegroupsMutegroup = audioMixersFadersFaderMutegroupsMutegroupMutable;
var audioMixersFadersFaderMutegroupsGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/mutegroups"]: {
paramsSchema: z7.object({
mixerID: z7.number(),
faderID: z7.number()
}),
responseSchema: numberedObject(audioMixersFadersFaderMutegroupsMutegroup)
},
["/audio/mixers/{mixerID}/faders/{faderID}/mutegroups/{mutegroupID}"]: {
paramsSchema: z7.object({
mixerID: z7.number(),
faderID: z7.number(),
mutegroupID: z7.number()
}),
responseSchema: audioMixersFadersFaderMutegroupsMutegroup
}
};
var audioMixersFadersFaderMutegroupsSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/mutegroups/{mutegroupID}"]: {
paramsSchema: z7.object({
mixerID: z7.number(),
faderID: z7.number(),
mutegroupID: z7.number()
}),
payloadSchema: audioMixersFadersFaderMutegroupsMutegroupMutable,
responseSchema: audioMixersFadersFaderMutegroupsMutegroupMutable
}
};
// src/api/audio/mixers/faders/options/index.ts
import { z as z8 } from "zod";
var audioMixersFadersFaderOptionsMutable = z8.object({
autooffair: z8.boolean(),
combilogic0: z8.boolean(),
timerreset: z8.boolean()
});
var audioMixersFadersFaderOptions = audioMixersFadersFaderOptionsMutable;
// src/api/audio/mixers/faders/paramlist/index.ts
import { z as z9 } from "zod";
var audioMixersFadersFaderParamlistImmutable = z9.array(
// TODO: Ask for all possible values
z9.enum([
"subsonic",
"agc",
"expander",
"eq1",
"eq2",
"eq3",
"eq4",
"deesser2",
"compressor",
"limiter"
])
);
var audioMixersFadersFaderParamlist = audioMixersFadersFaderParamlistImmutable;
// src/api/audio/mixers/faders/params/index.ts
import { z as z23 } from "zod";
// src/api/audio/mixers/faders/params/agc.ts
import { z as z10 } from "zod";
var audioMixersFadersFaderParamsParamAGCImmutable = z10.object({
_active: z10.boolean(),
_gainreduction: z10.number()
});
var audioMixersFadersFaderParamsParamAGCMutable = z10.object({
freeze: z10.boolean(),
gain: z10.number(),
level: z10.number(),
on: z10.boolean(),
threshold: z10.number(),
velocity: z10.number()
});
var audioMixersFadersFaderParamsParamAGC = audioMixersFadersFaderParamsParamAGCImmutable.merge(
audioMixersFadersFaderParamsParamAGCMutable
);
var audioMixersFadersFaderParamsParamAGCGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/agc"]: {
paramsSchema: z10.object({
mixerID: z10.number(),
faderID: z10.number()
}),
responseSchema: audioMixersFadersFaderParamsParamAGC
}
};
var audioMixersFadersFaderParamsParamAGCSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/agc"]: {
paramsSchema: z10.object({
mixerID: z10.number(),
faderID: z10.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamAGCMutable,
responseSchema: audioMixersFadersFaderParamsParamAGCMutable
}
};
// src/api/audio/mixers/faders/params/compressor.ts
import { z as z11 } from "zod";
var audioMixersFadersFaderParamsParamCompressorImmutable = z11.object({
_active: z11.boolean(),
_gainreduction: z11.number()
});
var audioMixersFadersFaderParamsParamCompressorMutable = z11.object({
attack: z11.number(),
gain: z11.number(),
on: z11.boolean(),
ratio: z11.number(),
release: z11.number(),
threshold: z11.number()
});
var audioMixersFadersFaderParamsParamCompressor = audioMixersFadersFaderParamsParamCompressorImmutable.merge(
audioMixersFadersFaderParamsParamCompressorMutable
);
var audioMixersFadersFaderParamsParamCompressorGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/compressor"]: {
paramsSchema: z11.object({
mixerID: z11.number(),
faderID: z11.number()
}),
responseSchema: audioMixersFadersFaderParamsParamCompressor
}
};
var audioMixersFadersFaderParamsParamCompressorSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/compressor"]: {
paramsSchema: z11.object({
mixerID: z11.number(),
faderID: z11.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamCompressorMutable,
responseSchema: audioMixersFadersFaderParamsParamCompressorMutable
}
};
// src/api/audio/mixers/faders/params/deesser.ts
import { z as z12 } from "zod";
var audioMixersFadersFaderParamsParamDeesserImmutable = z12.object({
_active: z12.boolean()
});
var audioMixersFadersFaderParamsParamDeesserMutable = z12.object({
bandwidth: z12.number(),
on: z12.boolean(),
ratio: z12.number(),
sharpness: z12.number()
});
var audioMixersFadersFaderParamsParamDeesser = audioMixersFadersFaderParamsParamDeesserImmutable.merge(
audioMixersFadersFaderParamsParamDeesserMutable
);
var audioMixersFadersFaderParamsParamDeesser2Immutable = z12.object({
_active: z12.boolean(),
_gainreduction: z12.number()
});
var audioMixersFadersFaderParamsParamDeesser2Mutable = z12.object({
frequency: z12.number(),
on: z12.boolean(),
threshold: z12.number()
});
var audioMixersFadersFaderParamsParamDeesser2 = audioMixersFadersFaderParamsParamDeesser2Immutable.merge(
audioMixersFadersFaderParamsParamDeesser2Mutable
);
var audioMixersFadersFaderParamsParamDeesserGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/deesser"]: {
paramsSchema: z12.object({
mixerID: z12.number(),
faderID: z12.number()
}),
responseSchema: audioMixersFadersFaderParamsParamDeesser
},
["/audio/mixers/{mixerID}/faders/{faderID}/params/deesser2"]: {
paramsSchema: z12.object({
mixerID: z12.number(),
faderID: z12.number()
}),
responseSchema: audioMixersFadersFaderParamsParamDeesser2
}
};
var audioMixersFadersFaderParamsParamDeesserSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/deesser"]: {
paramsSchema: z12.object({
mixerID: z12.number(),
faderID: z12.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamDeesserMutable,
responseSchema: audioMixersFadersFaderParamsParamDeesserMutable
},
["/audio/mixers/{mixerID}/faders/{faderID}/params/deesser2"]: {
paramsSchema: z12.object({
mixerID: z12.number(),
faderID: z12.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamDeesser2Mutable,
responseSchema: audioMixersFadersFaderParamsParamDeesser2Mutable
}
};
// src/api/audio/mixers/faders/params/eq.ts
import { z as z13 } from "zod";
var audioMixersFadersFaderParamsParamEQImmutable = z13.object({
_active: z13.boolean()
});
var audioMixersFadersFaderParamsParamEQMutable = z13.object({
frequency: z13.number(),
gain: z13.number(),
on: z13.boolean(),
q: z13.number(),
type: z13.number()
});
var audioMixersFadersFaderParamsParamEQ = audioMixersFadersFaderParamsParamEQImmutable.merge(
audioMixersFadersFaderParamsParamEQMutable
);
var audioMixersFadersFaderParamsParamEQGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/eq{eqID}"]: {
paramsSchema: z13.object({
mixerID: z13.number(),
faderID: z13.number(),
eqID: z13.number()
}),
responseSchema: audioMixersFadersFaderParamsParamEQ
}
};
var audioMixersFadersFaderParamsParamEQSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/eq{eqID}"]: {
paramsSchema: z13.object({
mixerID: z13.number(),
faderID: z13.number(),
eqID: z13.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamEQMutable,
responseSchema: audioMixersFadersFaderParamsParamEQMutable
}
};
// src/api/audio/mixers/faders/params/expander.ts
import { z as z14 } from "zod";
var audioMixersFadersFaderParamsParamExpanderImmutable = z14.object({
_active: z14.boolean(),
_gainreduction: z14.number()
});
var audioMixersFadersFaderParamsParamExpanderMutable = z14.object({
attack: z14.number(),
gain: z14.number(),
on: z14.boolean(),
ratio: z14.number(),
release: z14.number(),
threshold: z14.number()
});
var audioMixersFadersFaderParamsParamExpander = audioMixersFadersFaderParamsParamExpanderImmutable.merge(
audioMixersFadersFaderParamsParamExpanderMutable
);
var audioMixersFadersFaderParamsParamExpanderGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/expander"]: {
paramsSchema: z14.object({
mixerID: z14.number(),
faderID: z14.number()
}),
responseSchema: audioMixersFadersFaderParamsParamExpander
}
};
var audioMixersFadersFaderParamsParamExpanderSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/expander"]: {
paramsSchema: z14.object({
mixerID: z14.number(),
faderID: z14.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamExpanderMutable,
responseSchema: audioMixersFadersFaderParamsParamExpanderMutable
}
};
// src/api/audio/mixers/faders/params/gain.ts
import { z as z15 } from "zod";
var audioMixersFadersFaderParamsParamGainAGainImmutable = z15.object({
_max: z15.number(),
_min: z15.number(),
_step: z15.number()
});
var audioMixersFadersFaderParamsParamGainAGainMutable = z15.object({
inc: z15.number(),
value: z15.number()
});
var audioMixersFadersFaderParamsParamGainAGain = audioMixersFadersFaderParamsParamGainAGainImmutable.merge(
audioMixersFadersFaderParamsParamGainAGainMutable
);
var audioMixersFadersFaderParamsParamGainImmutable = z15.object({
_active: z15.boolean(),
_hasagain: z15.boolean(),
_hasp48: z15.boolean(),
// TODO: Check if including again in the immutable schema is correct
// or if it should be extended in the exported schema
again: audioMixersFadersFaderParamsParamGainAGain
});
var audioMixersFadersFaderParamsParamGainMutable = z15.object({
dgain: z15.number(),
p48: z15.boolean(),
phase: z15.boolean()
});
var audioMixersFadersFaderParamsParamGain = audioMixersFadersFaderParamsParamGainImmutable.merge(
audioMixersFadersFaderParamsParamGainMutable
);
var audioMixersFadersFaderParamsParamGainGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/gain"]: {
paramsSchema: z15.object({
mixerID: z15.number(),
faderID: z15.number()
}),
responseSchema: audioMixersFadersFaderParamsParamGain
},
["/audio/mixers/{mixerID}/faders/{faderID}/params/gain/again"]: {
paramsSchema: z15.object({
mixerID: z15.number(),
faderID: z15.number()
}),
responseSchema: audioMixersFadersFaderParamsParamGainAGain
}
};
var audioMixersFadersFaderParamsParamGainSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/gain"]: {
paramsSchema: z15.object({
mixerID: z15.number(),
faderID: z15.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamGainMutable,
responseSchema: audioMixersFadersFaderParamsParamGainMutable
},
["/audio/mixers/{mixerID}/faders/{faderID}/params/gain/again"]: {
paramsSchema: z15.object({
mixerID: z15.number(),
faderID: z15.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamGainAGainMutable,
responseSchema: audioMixersFadersFaderParamsParamGainAGainMutable
}
};
// src/api/audio/mixers/faders/params/gate.ts
import { z as z16 } from "zod";
var audioMixersFadersFaderParamsParamGateImmutable = z16.object({
_active: z16.boolean(),
_gainreduction: z16.number()
});
var audioMixersFadersFaderParamsParamGateMutable = z16.object({
attack: z16.number(),
attenuation: z16.number(),
on: z16.boolean(),
release: z16.number(),
threshold: z16.number()
});
var audioMixersFadersFaderParamsParamGate = audioMixersFadersFaderParamsParamGateImmutable.merge(
audioMixersFadersFaderParamsParamGateMutable
);
var audioMixersFadersFaderParamsParamGateGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/gate"]: {
paramsSchema: z16.object({
mixerID: z16.number(),
faderID: z16.number()
}),
responseSchema: audioMixersFadersFaderParamsParamGate
}
};
var audioMixersFadersFaderParamsParamGateSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/gate"]: {
paramsSchema: z16.object({
mixerID: z16.number(),
faderID: z16.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamGateMutable,
responseSchema: audioMixersFadersFaderParamsParamGateMutable
}
};
// src/api/audio/mixers/faders/params/limiter.ts
import { z as z17 } from "zod";
var audioMixersFadersFaderParamsParamLimiterImmutable = z17.object({
_active: z17.boolean(),
_gainreduction: z17.number()
});
var audioMixersFadersFaderParamsParamLimiterMutable = z17.object({
on: z17.boolean(),
release: z17.number(),
threshold: z17.number()
});
var audioMixersFadersFaderParamsParamLimiter = audioMixersFadersFaderParamsParamLimiterImmutable.merge(
audioMixersFadersFaderParamsParamLimiterMutable
);
var audioMixersFadersFaderParamsParamLimiterGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/limiter"]: {
paramsSchema: z17.object({
mixerID: z17.number(),
faderID: z17.number()
}),
responseSchema: audioMixersFadersFaderParamsParamLimiter
}
};
var audioMixersFadersFaderParamsParamLimiterSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/limiter"]: {
paramsSchema: z17.object({
mixerID: z17.number(),
faderID: z17.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamLimiterMutable,
responseSchema: audioMixersFadersFaderParamsParamLimiterMutable
}
};
// src/api/audio/mixers/faders/params/panbal.ts
import { z as z18 } from "zod";
var audioMixersFadersFaderParamsParamPanbalImmutable = z18.object({
_active: z18.boolean()
});
var audioMixersFadersFaderParamsParamPanbalMutable = z18.object({
divergency: z18.number(),
lfeonly: z18.boolean(),
lfesend: z18.number(),
matrix: z18.number(),
panbal: z18.number(),
rear: z18.number()
});
var audioMixersFadersFaderParamsParamPanbal = audioMixersFadersFaderParamsParamPanbalImmutable.merge(
audioMixersFadersFaderParamsParamPanbalMutable
);
var audioMixersFadersFaderParamsParamPanbalGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/panbal"]: {
paramsSchema: z18.object({
mixerID: z18.number(),
faderID: z18.number()
}),
responseSchema: audioMixersFadersFaderParamsParamPanbal
}
};
var audioMixersFadersFaderParamsParamPanbalSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/panbal"]: {
paramsSchema: z18.object({
mixerID: z18.number(),
faderID: z18.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamPanbalMutable,
responseSchema: audioMixersFadersFaderParamsParamPanbalMutable
}
};
// src/api/audio/mixers/faders/params/r128agc.ts
import { z as z19 } from "zod";
var audioMixersFadersFaderParamsParamR128AGCImmutable = z19.object({
_active: z19.boolean(),
_gainreduction: z19.number()
});
var audioMixersFadersFaderParamsParamR128AGCMutable = z19.object({
freeze: z19.boolean(),
gain: z19.number(),
level: z19.number(),
on: z19.boolean(),
threshold: z19.number(),
velocity: z19.number()
});
var audioMixersFadersFaderParamsParamR128AGC = audioMixersFadersFaderParamsParamR128AGCImmutable.merge(
audioMixersFadersFaderParamsParamR128AGCMutable
);
var audioMixersFadersFaderParamsParamR128AGCGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/r128agc"]: {
paramsSchema: z19.object({
mixerID: z19.number(),
faderID: z19.number()
}),
responseSchema: audioMixersFadersFaderParamsParamR128AGC
}
};
var audioMixersFadersFaderParamsParamR128AGCSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/r128agc"]: {
paramsSchema: z19.object({
mixerID: z19.number(),
faderID: z19.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamR128AGCMutable,
responseSchema: audioMixersFadersFaderParamsParamR128AGCMutable
}
};
// src/api/audio/mixers/faders/params/subsonic.ts
import { z as z20 } from "zod";
var audioMixersFadersFaderParamsParamSubsonicImmutable = z20.object({
_active: z20.boolean()
});
var audioMixersFadersFaderParamsParamSubsonicMutable = z20.object({
frequency: z20.number(),
on: z20.boolean()
});
var audioMixersFadersFaderParamsParamSubsonic = audioMixersFadersFaderParamsParamSubsonicImmutable.merge(
audioMixersFadersFaderParamsParamSubsonicMutable
);
var audioMixersFadersFaderParamsParamSubsonicGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/gate"]: {
paramsSchema: z20.object({
mixerID: z20.number(),
faderID: z20.number()
}),
responseSchema: audioMixersFadersFaderParamsParamSubsonic
}
};
var audioMixersFadersFaderParamsParamSubsonicSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/gate"]: {
paramsSchema: z20.object({
mixerID: z20.number(),
faderID: z20.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamSubsonicMutable,
responseSchema: audioMixersFadersFaderParamsParamSubsonicMutable
}
};
// src/api/audio/mixers/faders/params/swc.ts
import { z as z21 } from "zod";
var audioMixersFadersFaderParamsParamSwcImmutable = z21.object({
_active: z21.boolean()
});
var audioMixersFadersFaderParamsParamSwcMutable = z21.object({
direction: z21.number(),
type: z21.boolean(),
width: z21.number()
});
var audioMixersFadersFaderParamsParamSwc = audioMixersFadersFaderParamsParamSwcImmutable.merge(
audioMixersFadersFaderParamsParamSwcMutable
);
var audioMixersFadersFaderParamsParamSwcGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/swc"]: {
paramsSchema: z21.object({
mixerID: z21.number(),
faderID: z21.number()
}),
responseSchema: audioMixersFadersFaderParamsParamSwc
}
};
var audioMixersFadersFaderParamsParamSwcSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/swc"]: {
paramsSchema: z21.object({
mixerID: z21.number(),
faderID: z21.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamSwcMutable,
responseSchema: audioMixersFadersFaderParamsParamSwcMutable
}
};
// src/api/audio/mixers/faders/params/varfilter.ts
import { z as z22 } from "zod";
var audioMixersFadersFaderParamsParamVarfilterImmutable = z22.object({
_active: z22.boolean()
});
var audioMixersFadersFaderParamsParamVarfilterMutable = z22.object({
frequency: z22.number(),
hipass: z22.boolean(),
on: z22.boolean(),
order: z22.number()
});
var audioMixersFadersFaderParamsParamVarfilter = audioMixersFadersFaderParamsParamVarfilterImmutable.merge(
audioMixersFadersFaderParamsParamVarfilterMutable
);
var audioMixersFadersFaderParamsParamVarfilterGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/varfilter{filtID}"]: {
paramsSchema: z22.object({
mixerID: z22.number(),
faderID: z22.number(),
filtID: z22.number()
}),
responseSchema: audioMixersFadersFaderParamsParamVarfilter
}
};
var audioMixersFadersFaderParamsParamVarfilterSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params/varfilter{filtID}"]: {
paramsSchema: z22.object({
mixerID: z22.number(),
faderID: z22.number(),
filtID: z22.number()
}),
payloadSchema: audioMixersFadersFaderParamsParamVarfilterMutable,
responseSchema: audioMixersFadersFaderParamsParamVarfilterMutable
}
};
// src/api/audio/mixers/faders/params/index.ts
var audioMixersFadersFaderParamsParams = z23.object({
agc: audioMixersFadersFaderParamsParamAGC,
compressor: audioMixersFadersFaderParamsParamCompressor,
deesser: audioMixersFadersFaderParamsParamDeesser,
deesser2: audioMixersFadersFaderParamsParamDeesser2,
// TODO: Check if eq is correct, or if it should be eq1, eq2, eq3 and eq4
eq: audioMixersFadersFaderParamsParamEQ,
expander: audioMixersFadersFaderParamsParamExpander,
gain: audioMixersFadersFaderParamsParamGain,
gate: audioMixersFadersFaderParamsParamGate,
limiter: audioMixersFadersFaderParamsParamLimiter,
panbal: audioMixersFadersFaderParamsParamPanbal,
r128agc: audioMixersFadersFaderParamsParamR128AGC,
subsonic: audioMixersFadersFaderParamsParamSubsonic,
swc: audioMixersFadersFaderParamsParamSwc,
varfilter: audioMixersFadersFaderParamsParamVarfilter
});
var audioMixersFadersFaderParamsGetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}/params"]: {
paramsSchema: z23.object({
mixerID: z23.number(),
faderID: z23.number()
}),
responseSchema: audioMixersFadersFaderParamsParams
},
...audioMixersFadersFaderParamsParamAGCGetHandlers,
...audioMixersFadersFaderParamsParamCompressorGetHandlers,
...audioMixersFadersFaderParamsParamDeesserGetHandlers,
...audioMixersFadersFaderParamsParamEQGetHandlers,
...audioMixersFadersFaderParamsParamExpanderGetHandlers,
...audioMixersFadersFaderParamsParamGainGetHandlers,
...audioMixersFadersFaderParamsParamGateGetHandlers,
...audioMixersFadersFaderParamsParamLimiterGetHandlers,
...audioMixersFadersFaderParamsParamPanbalGetHandlers,
...audioMixersFadersFaderParamsParamR128AGCGetHandlers,
...audioMixersFadersFaderParamsParamSubsonicGetHandlers,
...audioMixersFadersFaderParamsParamSwcGetHandlers,
...audioMixersFadersFaderParamsParamVarfilterGetHandlers
};
var audioMixersFadersFaderParamsSetHandlers = {
...audioMixersFadersFaderParamsParamAGCSetHandlers,
...audioMixersFadersFaderParamsParamCompressorSetHandlers,
...audioMixersFadersFaderParamsParamDeesserSetHandlers,
...audioMixersFadersFaderParamsParamEQSetHandlers,
...audioMixersFadersFaderParamsParamExpanderSetHandlers,
...audioMixersFadersFaderParamsParamGainSetHandlers,
...audioMixersFadersFaderParamsParamGateSetHandlers,
...audioMixersFadersFaderParamsParamLimiterSetHandlers,
...audioMixersFadersFaderParamsParamPanbalSetHandlers,
...audioMixersFadersFaderParamsParamR128AGCSetHandlers,
...audioMixersFadersFaderParamsParamSubsonicSetHandlers,
...audioMixersFadersFaderParamsParamSwcSetHandlers,
...audioMixersFadersFaderParamsParamVarfilterSetHandlers
};
// src/api/audio/mixers/faders/index.ts
var audioMixersFadersFaderImmutable = z24.object({
_channelcnt: z24.number(),
_defaultlabel: z24.string(),
_faderstart: z24.boolean(),
_lastloadedsnap: z24.string(),
_poolavailable: z24.boolean(),
_readystate: z24.boolean(),
_usecleanfeed: z24.number(),
meter: audioMixersFadersFaderMeters,
mutegroups: numberedObject(audioMixersFadersFaderMutegroupsMutegroup),
_paramlist: audioMixersFadersFaderParamlist,
options: audioMixersFadersFaderOptions,
params: audioMixersFadersFaderParamsParams
});
var audioMixersFadersFaderMutable = z24.object({
altinput: z24.boolean(),
bypass: z24.boolean(),
fader: z24.number(),
isolate: z24.boolean(),
label: z24.string(),
memo: z24.boolean(),
offair: z24.boolean(),
on: z24.boolean(),
pfl1: z24.boolean(),
pfl2: z24.boolean(),
preparation: z24.boolean(),
solo: z24.boolean(),
sourceid: z24.number(),
vcagroup: z24.number(),
voice: z24.boolean()
});
var audioMixersFadersFader = audioMixersFadersFaderImmutable.merge(
audioMixersFadersFaderMutable
);
var audioMixersFadersFaderGetHandlers = {
["/audio/mixers/{mixerID}/faders"]: {
paramsSchema: z24.object({
mixerID: z24.number()
}),
responseSchema: numberedObject(audioMixersFadersFader)
},
["/audio/mixers/{mixerID}/faders/{faderID}"]: {
paramsSchema: z24.object({
mixerID: z24.number(),
faderID: z24.number()
}),
responseSchema: audioMixersFadersFader
},
...audioMixersFadersFaderMutegroupsGetHandlers,
...audioMixersFadersFaderParamsGetHandlers
};
var audioMixersFadersFaderSetHandlers = {
["/audio/mixers/{mixerID}/faders/{faderID}"]: {
paramsSchema: z24.object({
mixerID: z24.number(),
faderID: z24.number()
}),
payloadSchema: audioMixersFadersFaderMutable,
responseSchema: audioMixersFadersFaderMutable
},
...audioMixersFadersFaderMutegroupsSetHandlers,
...audioMixersFadersFaderParamsSetHandlers
};
// src/api/audio/mixers/mutegroups/index.ts
import { z as z25 } from "zod";
var audioMixersMutegroupsMutegroupImmutable = z25.boolean();
var audioMixersMutegroupsMutegroup = audioMixersMutegroupsMutegroupImmutable;
var audioMixersMutegroupsGetHandlers = {
["/audio/mixers/{mixerID}/mutegroups"]: {
paramsSchema: z25.object({
mixerID: z25.number()
}),
responseSchema: numberedObject(audioMixersMutegroupsMutegroup)
},
["/audio/mixers/{mixerID}/mutegroups/{mutegroupID}"]: {
paramsSchema: z25.object({
mixerID: z25.number(),
mutegroupID: z25.number()
}),
responseSchema: audioMixersMutegroupsMutegroup
}
};
// src/api/audio/mixers/options/index.ts
import { z as z26 } from "zod";
var audioMixersOptionsPflMutable = z26.object({
afl: z26.boolean(),
aflwhenon: z26.boolean(),
mix: z26.boolean(),
reset: z26.boolean(),
resetfader: z26.boolean(),
return: z26.boolean()
});
var audioMixersOptionsPfl = audioMixersOptionsPflMutable;
var audioMixersOptionsImmutable = z26.object({
pfl1: audioMixersOptionsPfl,
pfl2: audioMixersOptionsPfl
});
var audioMixersOptionsMutable = z26.object({
directoffair: z26.boolean()
});
var audioMixersOptions = audioMixersOptionsImmutable.merge(
audioMixersOptionsMutable
);
var audioMixersOptionsGetHandlers = {
["/audio/mixers/{mixerID}/options"]: {
paramsSchema: z26.object({
mixerID: z26.number()
}),
responseSchema: audioMixersOptions
},
["/audio/mixers/{mixerID}/options/pfl1"]: {
paramsSchema: z26.object({
mixerID: z26.number()
}),
responseSchema: audioMixersOptionsPfl
},
["/audio/mixers/{mixerID}/options/pfl2"]: {
paramsSchema: z26.object({
mixerID: z26.number()
}),
responseSchema: audioMixersOptionsPfl
}
};
var audioMixersOptionsSetHandlers = {
["/audio/mixers/{mixerID}/options"]: {
paramsSchema: z26.object({
mixerID: z26.number()
}),
payloadSchema: audioMixersOptionsMutable,
responseSchema: audioMixersOptionsMutable
},
["/audio/mixers/{mixerID}/options/pfl1"]: {
paramsSchema: z26.object({
mixerID: z26.number()
}),
payloadSchema: audioMixersOptionsPflMutable,
responseSchema: audioMixersOptionsPflMutable
},
["/audio/mixers/{mixerID}/options/pfl2"]: {
paramsSchema: z26.object({
mixerID: z26.number()
}),
payloadSchema: audioMixersOptionsPflMutable,
responseSchema: audioMixersOptionsPflMutable
}
};
// src/api/audio/mixers/sourcelist/index.ts
import { z as z27 } from "zod";
var audioMixersSourcelistItemImmutable = z27.object({
_defaultlabel: z27.string(),
_label: z27.string(),
_sourceid: z27.number()
});
var audioMixersSourcelistItem = audioMixersSourcelistItemImmutable;
var audioMixersSourcelist = z27.array(audioMixersSourcelistItem);
var audioMixersSourcelistGetHandlers = {
["/audio/mixers/{mixerID}/sourcelist"]: {
paramsSchema: z27.object({
mixerID: z27.number()
}),
responseSchema: audioMixersSourcelist
}
};
// src/api/audio/mixers/index.ts
var audioMixersMixerImmutable = z28.object({
_lastloadedsnap: z28.string(),
automix: numberedObject(audioMixersAutomix),
cleanfeeds: numberedObject(audioMixersCleanfeeds),
faders: numberedObject(audioMixersFadersFader),
mutegroups: numberedObject(audioMixersMutegroupsMutegroup),
options: audioMixersOptions,
sourcelist: audioMixersSourcelist
});
var audioMixersMixer = audioMixersMixerImmutable;
var audioMixersGetHandlers = {
["/audio/mixers"]: {
paramsSchema: null,
responseSchema: numberedObject(audioMixersMixer)
},
["/audio/mixers/{mixerID}"]: {
paramsSchema: z28.object({
mixerID: z28.number()
}),
responseSchema: audioMixersMixer
},
...audioMixersAutomixGetHandlers,
...audioMixersCleanfeedsGetHandlers,
...audioMixersFadersFaderGetHandlers,
...audioMixersMutegroupsGetHandlers,
...audioMixersOptionsGetHandlers,
...audioMixersSourcelistGetHandlers
};
var audioMixersSetHandlers = {
...audioMixersAutomixSetHandlers,
...audioMixersCleanfeedsSetHandlers,
...audioMixersFadersFaderSetHandlers,
...audioMixersOptionsSetHandlers
};
// src/api/audio/pots/index.ts
import { z as z29 } from "zod";
var audioPotsPotImmutable = z29.object({
_max: z29.number(),
_min: z29.number(),
_name: z29.string(),
_step: z29.number()
});
var audioPotsPotMutable = z29.object({
value: z29.number()
});
var audioPotsPot = audioPotsPotImmutable.merge(audioPotsPotMutable);
var audioPotsGetHandlers = {
["/audio/pots"]: {
paramsSchema: null,
responseSchema: numberedObject(audioPotsPot)
},
["/audio/pots/{potID}"]: {
paramsSchema: z29.object({
potID: z29.number()
}),
responseSchema: audioPotsPot
}
};
var audioPotsSetHandlers = {
["/audio/pots/{potID}"]: {
paramsSchema: z29.object({
potID: z29.number()
}),
payloadSchema: audioPotsPotMutable,
responseSchema: audioPotsPotMutable
}
};
// src/api/audio/routing/index.ts
import { z as z33 } from "zod";
// src/api/audio/routing/inputs/index.ts
import { z as z30 } from "zod";
var audioRoutingInputImmutable = z30.object({
_channels: z30.number(),
_device: z30.string(),
_name: z30.string()
});
var audioRoutingInput = audioRoutingInputImmutable;
var audioRoutingInputsGetHandlers = {
["/audio/routing/inputs"]: {
paramsSchema: null,
responseSchema: numberedObject(audioRoutingInput)
},
["/audio/routing/inputs/{inputID}"]: {
paramsSchema: z30.object({
inputID: z30.number()
}),
responseSchema: audioRoutingInput
}
};
// src/api/audio/routing/outputs/index.ts
import { z as z31 } from "zod";
var audioRoutingOutputImmutable = z31.object({
_channels: z31.number(),
_device: z31.string(),
_name: z31.string()
});
var audioRoutingOutput = audioRoutingOutputImmutable;
var audioRoutingOutputsGetHandlers = {
["/audio/routing/outputs"]: {
paramsSchema: null,
responseSchema: numberedObject(audioRoutingOutput)
},
["/audio/routing/outputs/{outputID}"]: {
paramsSchema: z31.object({
outputID: z31.number()
}),
responseSchema: audioRoutingOutput
}
};
// src/api/audio/routing/routes/index.ts
import { z as z32 } from "zod";
var audioRoutingRouteMutable = z32.string();
var audioRoutingRoute = audioRoutingRouteMutable;
var audioRoutingRoutesGetHandlers = {
["/audio/routing/routes"]: {
paramsSchema: null,
responseSchema: numberedObject(audioRoutingRoute)
},
["/audio/routing/routes/{routeID}"]: {
paramsSchema: z32.object({
routeID: z32.number()
}),
responseSchema: audioRoutingRoute
}
};
var audioRoutingRoutesSetHandlers = {
["/audio/routing/routes/{routeID}"]: {
paramsSchema: z32.object({
// TODO: Check if routeID is actually a number.
routeID: z32.number()
}),
responseSchema: audioRoutingRouteMutable,
payloadSchema: audioRoutingRouteMutable
}
};
// src/api/audio/routing/index.ts
var audioRouting = z33.object({
inputs: numberedObject(audioRoutingInput),
outputs: numberedObject(audioRoutingOutput),
routes: numberedObject(audioRoutingRoute)
});
var audioRoutingGetHandlers = {
["/audio/routing"]: {
paramsSchema: null,
responseSchema: audioRouting
},
...audioRoutingInputsGetHandlers,
...audioRoutingOutputsGetHandlers,
...audioRoutingRoutesGetHandlers
};
var audioRoutingSetHandlers = {
...audioRoutingRoutesSetHandlers
};
// src/api/audio/selectors/index.ts
import { z as z36 } from "zod";
// src/api/audio/selectors/selectors/index.ts
import { z as z34 } from "zod";
var audioSelectorSelectorImmutable = z34.object({
_name: z34.string(),
_sourcelist: z34.string()
});
var audioSelectorSelectorMutable = z34.object({
left: z34.string(),
right: z34.string()
});
var audioSelectorsSelector = audioSelectorSelectorImmutable.merge(
audioSelectorSelectorMutable
);
var audioSelectorsSelectorsGetHandlers = {
["/audio/selectors/selectors"]: {
paramsSchema: null,
responseSchema: numberedObject(audioSelectorsSelector)
},
["/audio/selectors/selectors/{selectorID}"]: {
paramsSchema: z34.object({
selectorID: z34.number()
}),
responseSchema: audioSelectorsSelector
}
};
var audioSelectorsSelectorsSetHandlers = {
["/audio/selectors/selectors/{selectorID}"]: {
paramsSchema: z34.object({
selectorID: z34.number()
}),
responseSchema: audioSelectorSelectorMutable,
payloadSchema: audioSelectorSelectorMutable
}
};
// src/api/audio/selectors/sourcelists/index.ts
import { z as z35 } from "zod";
var audioSelectorsSourcelistImmutable = z35.object({
_name: z35.string(),
entries: numberedObject(
z35.object({
_label: z35.string(),
_sourcel: z35.string(),
_sourcer: z35.string()
})
)
});
var audioSelectorsSourcelist = audioSelectorsSourcelistImmutable;
var audioSelectorsSourcelistsGetHandlers = {
["/audio/selectors/sourcelists"]: {
paramsSchema: null,
responseSchema: numberedObject(audioSelectorsSourcelist)
},
["/audio/selectors/sourcelists/{sourcelistID}"]: {
paramsSchema: z35.object({
sourcelistID: z35.number()
}),
responseSchema: audioSelectorsSourcelist
}
};
// src/api/audio/selectors/index.ts
var audioSelectors = z36.object({
selectors: numberedObject(audioSelectorsSelector),
sourcelists: z36.any()
// TODO: Implement sourcelists
});
var audioSelectorsGetHandlers = {
["/audio/selectors"]: {
paramsSchema: null,
responseSchema: audioSelectors
},
...audioSelectorsSelectorsGetHandlers,
...audioSelectorsSourcelistsGetHandlers
};
var audioSelectorsSetHandlers = {
...audioSelectorsSelectorsSetHandlers
};
// src/api/audio/index.ts
var audioGetHandlers = {
...audioLevelsGetHandlers,
...audioLoudnessGetHandlers,
...audioMixersGetHandlers,
...audioPotsGetHandlers,
...audioRoutingGetHandlers,
...audioSelectorsGetHandlers
};
var audioSetHandlers = {
...audioMixersSetHandlers,
...audioPotsSetHandlers,
...audioRoutingSetHandlers,
...audioSelectorsSetHandlers
};
// src/api/control/logics/index.ts
import { z as z37 } from "zod";
var controlLogicsLogicImmutable = z37.object({
_name: z37.string(),
_path: z37.string()
});
var controlLogicsLogicMutable = z37.object({
value: z37.boolean()
});
var controlLogicsLogic = controlLogicsLogicImmutable.merge(
controlLogicsLogicMutable
);
var controlLogicsGetHandlers = {
["/control/logics"]: {
paramsSchema: null,
responseSchema: numberedObject(controlLogicsLogic)
},
["/control/logics/{logicID}"]: {
paramsSchema: z37.object({
logicID: z37.number()
}),
responseSchema: controlLogicsLogic
}
};
var controlLogicsSetHandlers = {
["/control/logics/{logicID}"]: {
paramsSchema: z37.object({
logicID: z37.number()
}),
payloadSchema: controlLogicsLogicMutable,
responseSchema: controlLogicsLogicMutable
}
};
// src/api/control/index.ts
var controlGetHandlers = {
...controlLogicsGetHandlers
};
var controlSetHandlers = {
...controlLogicsSetHandlers
};
// src/api/general/index.ts
import { z as z38 } from "zod";
var general = z38.object({
_api_version: z38.string(),
_firmware_version: z38.string(),
_hardwareserial: z38.string(),
_hourmeter: z38.number(),
_sync2ok: z38.boolean(),
_syncsource: z38.number(),
_systemfrequency: z38.number(),
_systemtime: z38.number(),
_uptime: z38.number()
});
var generalGetHandlers = {
["/general"]: {
paramsSchema: null,
responseSchema: general
}
};
// src/api/index.ts
var dhdHandlers = {
get: {
...audioGetHandlers,
...controlGetHandlers,
...generalGetHandlers
},
set: {
...audioSetHandlers,
...controlSetHandlers
}
};
// src/log.ts
import debug from "debug";
var log = {
debug: debug("dhd-control-api:debug"),
error: debug("dhd-control-api:error"),
info: debug("dhd-control-api:info"),
warn: debug("dhd-control-api:warn")
};
log.error.color = "1";
log.info.color = "2";
log.debug.color = "4";
log.warn.color = "3";
// src/schemas.ts
import { z as z39 } from "zod";
var dhdWebSocketAuthResponse = z39.object({
msgID: z39.string(),
method: z39.literal("auth"),
success: z39.literal(true)
});
var dhdWebSocketBaseResponse = (method) => z39.object({
msgID: z39.string(),
method: z39.literal(method),
success: z39.literal(true),
path: z39.string(),
payload: z39.any()
});
var dhdWebSocketErrorResponse = (method) => z39.object({
msgID: z39.string(),
method: z39.literal(method),
success: z39.literal(false),
error: z39.object({
code: z39.number(),
message: z39.string()
})
});
var dhdWebSocketResponse = z39.union([
dhdWebSocketAuthResponse,
dhdWebSocketErrorResponse("auth"),
dhdWebSocketBaseResponse("get"),
dhdWebSocketErrorResponse("get"),
dhdWebSocketBaseResponse("set"),
dhdWebSocketErrorResponse("set")
]);
// src/index.ts
var dhdOptionsSchema = z40.object({
/**
* The hostname or IP address of the DHD device.
*
* @example 10.0.0.1
* @example dhd.local
*/
host: z40.string(),
/**
* The token used to authenticate with the DHD device.
*/
token: z40.string().regex(/^[0-9a-f]{8}-[0-9a-f]{8}-[0-9a-f]{8}-[0-9a-f]{8}$/i, {
message: "Invalid token format"
}),
/**
* The type of connection to use when connecting to the DHD device. Please
* note that the connection via REST has a rate limit of 1 request per second.
*
* @default 'websocket'
*/
connectionType: z40.union([z40.literal("websocket"), z40.literal("rest")]).default("websocket"),
/**
* Connect to the DHD device using a secure WebSocket connection or HTTPS-requests.
*
* @default false
*/
secure: z40.boolean().default(false),
/**
* Connect to the DHD device automatically when the instance is created.
*
* @default true
*/
autoConnect: z40.boolean().default(true),
/**
* Automatically reconnect to the DHD device if the connection is lost.
*
* @default true
*/
autoReconnect: z40.boolean().default(true)
});
var DHD = class {
options;
socket = null;
reconnectTimeout = null;
requestMap = /* @__PURE__ */ new Map();
eventHandlers = /* @__PURE__ */ new Map();
constructor(options) {
this.options = dhdOptionsSchema.parse(options);
if (this.options.autoConnect !== false) {
this.connect();
}
if (this.options.connectionType === "rest") {
setTimeout(() => this.emit("ready"), 0);
}
}
on = (event, handler) => {
if (!this.eventHandlers.has(event)) {
this.eventHandlers.set(event, []);
}
this.eventHandlers.get(event).push(handler);
};
off = (event, handler) => {
if (!this.eventHandlers.has(event)) {
return;
}
const eventHandlers = this.eventHandlers.get(event);
if (eventHandlers) {
this.eventHandlers.set(
event,
eventHandlers.filter((h) => h !== handler)
);
}
};
emit = (event, ...args) => {
const eventHandlers = this.eventHandlers.get(event);
if (eventHandlers) {
for (const handler of eventHandlers) {
handler(...args);
}
}
};
/**
* Connect to the DHD device via WebSocket. This method is called automatically
* when the instance is created and the `autoConnect` option is not set to `false`.
* This method does nothing if the `connectionType` option is not set to `websocket`.
*
* @returns void
*/
connect = () => {
if (this.options.connectionType !== "websocket") {
return;
}
this.clearReconnectTimeout();
if (this.socket) {
if (this.socket.readyState === WebSocket.OPEN) {
this.socket.close();
}
this.socket = null;
}
const protocol = this.options.secure ? "wss" : "ws";
const url = new URL("/api/ws", `${protocol}://${this.options.host}`);
this.socket = new WebSocket(url);
this.socket.onopen = async () => {
log.info("Connection open");
await this.authenticateWebSocket();
this.emit("connect");
this.clearReconnectTimeout();
};
this.socket.onclose = (close) => {
if (close.wasClean) {
log.info("Connection closed cleanly");
} else {
log.error("Connection closed unexpectedly");
}
this.emit("disconnect");
if (this.options.autoReconnect !== false) {
this.reconnect();
}
};
this.socket.onerror = (error) => {
log.error("Connection error");
log.error(error);
this.emit("error", new Error(error.message));
if (this.options.autoReconnect !== false) {
this.reconnect();
}
};
this.socket.onmessage = this.handleMessage;
};
reconnect = () => {
if (this.options.autoReconnect !== false) {
this.reconnectTimeout = setTimeout(() => {
log.warn("Reconnecting...");
this.emit("reconnect");
this.connect();
}, 1e3);
}
};
clearReconnectTimeout = () => {
if (this.reconnectTimeout) {
clearTimeout(this.reconnectTimeout);
this.reconnectTimeout = null;
}
};
authenticateWebSocket = async () => {
if (!this.socket || this.socket.readyState !== WebSocket.OPEN) {
log.error("WebSocket connection is not open");
return;
}
await this.webSocketRequest({
requestPayload: {
method: "auth",
token: this.options.token
}
});
};
handleMessage = ({ data }) => {
try {
log.debug("Received message from WebSocket", data);
const parsedMessage = dhdWebSocketResponse.safeParse(JSON.parse(data));
if (!parsedMessage.success) {
log.error("Failed to parse message from DHD WebSocket");
log.error(parsedMessage.error.issues.flat());
return;
}
const message = parsedMessage.data;
switch (message.method) {
case "auth": {
if (message.success) {
log.info("Successfully authenticated on WebSocket");
this.emit("authenticated");
this.emit("ready");
} else {
log.error("Failed to authenticate on WebSocket");
}
this.requestMap.delete(message.msgID);
break;
}
case "get":
case "set": {
if (this.requestMap.has(message.msgID)) {
const promise = this.requestMap.get(message.msgID);
if (message.success !== true) {
log.error("Received error from DHD device");
log.error(
`Code ${message.error?.code ?? "Unknown"} ${message.error?.message ?? ""}`.trim()
);
promise?.reject(
// TODO: Create own error class for DHD errors
new Error(message.error?.message ?? "Unknown error")
);
} else {
promise?.resolve(message.payload);
}
this.requestMap.delete(message.msgID);
}
break;
}
default: {
assertNever(message);
break;
}
}
} catch (error) {
log.error("Failed to parse message");
log.error(error);
}
};
/**
* Get data from the DHD device.
*
* @example
* await dhd.get("/audio/levels/{levelDetectID}", {
* params: { levelDetectID: 1 },
* });
*
*/
get = async (...[
path,
{ params } = { params: void 0 }
]) => {
const { paramsSchema, responseSchema } = dhdHandlers.get[path];
return this.dhdRequest({
path,
params: paramsSchema?.parse(params),
responseSchema
});
};
/**
* Set data in the DHD device.
*
* @example
* await dhd.set("/audio/selectors/selectors/{selectorID}", {
* params: { selectorID: 1 },
* payload: { left: "40" },
* });
*
*/
set = async (...[
path,
{ params, payload }
]) => {
const { paramsSchema, responseSchema, payloadSchema } = dhdHandlers.set[path];
return this.dhdRequest({
path,
params: paramsSchema?.parse(params),
// TODO: This is a dirty fix for string payloads. Check if there is
// a better way to handle this.
responseSchema: responseSchema instanceof ZodString || responseSchema instanceof ZodBoolean ? responseSchema.optional() : responseSchema.partial(),
payload: (payloadSchema instanceof ZodString || payloadSchema instanceof ZodBoolean ? payloadSchema.optional() : payloadSchema.partial()).parse(payload)
});
};
dhdRequest = async ({
path,
params,
responseSchema,
payload
}) => {
let pathWithParams = path;
if (params) {
for (const [key, value] of Object.entries(params)) {
pathWithParams = pathWithParams.replace(`{${key}}`, `${value}`);
}
}
log.info(`GET ${pathWithParams} via ${this.options.connectionType}`);
const requestPayload = typeof payload === "undefined" ? {
method: "get",
path: pathWithParams
} : {
method: "set",
path: pathWithParams,
payload
};
switch (this.options.connectionType) {
case "websocket": {
return this.webSocketRequest({ requestPayload });
}
case "rest": {
const response = await this.fetchRequest({
requestPayload: {
...requestPayload,
token: this.options.token
}
});
return responseSchema.parse(response);
}
default: {
return assertNever(this.options.connectionType);
}
}
};
generateMsgID = () => {
return Math.random().t