@companion-module/host 0.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 (66) hide show
  1. package/README.md +19 -0
  2. package/dist/__tests__/ipc-wrapper.spec.d.ts +2 -0
  3. package/dist/__tests__/ipc-wrapper.spec.d.ts.map +1 -0
  4. package/dist/__tests__/ipc-wrapper.spec.js +272 -0
  5. package/dist/__tests__/ipc-wrapper.spec.js.map +1 -0
  6. package/dist/api.d.ts +360 -0
  7. package/dist/api.d.ts.map +1 -0
  8. package/dist/api.js +8 -0
  9. package/dist/api.js.map +1 -0
  10. package/dist/context.d.ts +125 -0
  11. package/dist/context.d.ts.map +1 -0
  12. package/dist/context.js +2 -0
  13. package/dist/context.js.map +1 -0
  14. package/dist/instance.d.ts +51 -0
  15. package/dist/instance.d.ts.map +1 -0
  16. package/dist/instance.js +317 -0
  17. package/dist/instance.js.map +1 -0
  18. package/dist/internal/__tests__/feedback.spec.d.ts +2 -0
  19. package/dist/internal/__tests__/feedback.spec.d.ts.map +1 -0
  20. package/dist/internal/__tests__/feedback.spec.js +686 -0
  21. package/dist/internal/__tests__/feedback.spec.js.map +1 -0
  22. package/dist/internal/__tests__/serializeIsVisibleFn.spec.d.ts +2 -0
  23. package/dist/internal/__tests__/serializeIsVisibleFn.spec.d.ts.map +1 -0
  24. package/dist/internal/__tests__/serializeIsVisibleFn.spec.js +119 -0
  25. package/dist/internal/__tests__/serializeIsVisibleFn.spec.js.map +1 -0
  26. package/dist/internal/__tests__/upgrade.spec.d.ts +2 -0
  27. package/dist/internal/__tests__/upgrade.spec.d.ts.map +1 -0
  28. package/dist/internal/__tests__/upgrade.spec.js +280 -0
  29. package/dist/internal/__tests__/upgrade.spec.js.map +1 -0
  30. package/dist/internal/actions.d.ts +16 -0
  31. package/dist/internal/actions.d.ts.map +1 -0
  32. package/dist/internal/actions.js +212 -0
  33. package/dist/internal/actions.js.map +1 -0
  34. package/dist/internal/base.d.ts +4 -0
  35. package/dist/internal/base.d.ts.map +1 -0
  36. package/dist/internal/base.js +31 -0
  37. package/dist/internal/base.js.map +1 -0
  38. package/dist/internal/feedback.d.ts +19 -0
  39. package/dist/internal/feedback.d.ts.map +1 -0
  40. package/dist/internal/feedback.js +296 -0
  41. package/dist/internal/feedback.js.map +1 -0
  42. package/dist/internal/upgrade.d.ts +15 -0
  43. package/dist/internal/upgrade.d.ts.map +1 -0
  44. package/dist/internal/upgrade.js +168 -0
  45. package/dist/internal/upgrade.js.map +1 -0
  46. package/dist/ipc-wrapper.d.ts +37 -0
  47. package/dist/ipc-wrapper.d.ts.map +1 -0
  48. package/dist/ipc-wrapper.js +123 -0
  49. package/dist/ipc-wrapper.js.map +1 -0
  50. package/dist/logging.d.ts +3 -0
  51. package/dist/logging.d.ts.map +1 -0
  52. package/dist/logging.js +4 -0
  53. package/dist/logging.js.map +1 -0
  54. package/dist/main.d.ts +5 -0
  55. package/dist/main.d.ts.map +1 -0
  56. package/dist/main.js +5 -0
  57. package/dist/main.js.map +1 -0
  58. package/dist/plugin.d.ts +25 -0
  59. package/dist/plugin.d.ts.map +1 -0
  60. package/dist/plugin.js +301 -0
  61. package/dist/plugin.js.map +1 -0
  62. package/dist/versions.d.ts +10 -0
  63. package/dist/versions.d.ts.map +1 -0
  64. package/dist/versions.js +2 -0
  65. package/dist/versions.js.map +1 -0
  66. package/package.json +31 -0
@@ -0,0 +1,212 @@
1
+ import { createModuleLogger, } from '@companion-module/base';
2
+ function convertActionInstanceToEvent(action) {
3
+ return {
4
+ id: action.id,
5
+ actionId: action.actionId,
6
+ controlId: action.controlId,
7
+ options: action.options,
8
+ };
9
+ }
10
+ export class ActionManager {
11
+ #logger = createModuleLogger('ActionManager');
12
+ #parseVariablesInString;
13
+ #setActionDefinitions;
14
+ #setCustomVariableValue;
15
+ #actionDefinitions = new Map();
16
+ #actionInstances = new Map();
17
+ constructor(parseVariablesInString, setActionDefinitions, setCustomVariableValue) {
18
+ this.#parseVariablesInString = parseVariablesInString;
19
+ this.#setActionDefinitions = setActionDefinitions;
20
+ this.#setCustomVariableValue = setCustomVariableValue;
21
+ }
22
+ async handleExecuteAction(action, surfaceId) {
23
+ const actionDefinition = this.#actionDefinitions.get(action.actionId);
24
+ if (!actionDefinition) {
25
+ return {
26
+ success: false,
27
+ errorMessage: `Action definition not found for: ${action.actionId}`,
28
+ };
29
+ }
30
+ const context = {
31
+ parseVariablesInString: async (text) => {
32
+ const res = await this.#parseVariablesInString(text, {
33
+ controlId: action.controlId,
34
+ actionInstanceId: action.id,
35
+ feedbackInstanceId: undefined,
36
+ });
37
+ return res;
38
+ },
39
+ setCustomVariableValue: (variableName, value) => {
40
+ this.#setCustomVariableValue(action.controlId, variableName, value);
41
+ },
42
+ };
43
+ try {
44
+ await actionDefinition.callback({
45
+ id: action.id,
46
+ actionId: action.actionId,
47
+ controlId: action.controlId,
48
+ options: action.options,
49
+ surfaceId: surfaceId,
50
+ }, context);
51
+ return {
52
+ success: true,
53
+ errorMessage: undefined,
54
+ };
55
+ }
56
+ catch (e) {
57
+ return {
58
+ success: false,
59
+ errorMessage: e?.message ?? String(e),
60
+ };
61
+ }
62
+ }
63
+ handleUpdateActions(actions) {
64
+ for (const [id, action] of Object.entries(actions)) {
65
+ const existing = this.#actionInstances.get(id);
66
+ if (existing) {
67
+ // Call unsubscribe
68
+ const definition = this.#actionDefinitions.get(existing.actionId);
69
+ if (definition?.unsubscribe && !definition.skipUnsubscribeOnOptionsChange) {
70
+ const context = {
71
+ parseVariablesInString: async (text) => {
72
+ // No-op, any values parsed here will not be stable
73
+ return text;
74
+ },
75
+ setCustomVariableValue: () => {
76
+ throw new Error(`setCustomVariableValue is not available during unsubscribe`);
77
+ },
78
+ };
79
+ Promise.resolve(definition.unsubscribe(convertActionInstanceToEvent(existing), context)).catch((e) => {
80
+ this.#logger.error(`Action unsubscribe failed: ${JSON.stringify(existing)} - ${e?.message ?? e} ${e?.stack}`);
81
+ });
82
+ }
83
+ }
84
+ if (!action || action.disabled) {
85
+ // Deleted
86
+ this.#actionInstances.delete(id);
87
+ }
88
+ else {
89
+ // TODO module-lib - deep freeze the action to avoid mutation?
90
+ this.#actionInstances.set(id, action);
91
+ // Inserted or updated
92
+ const definition = this.#actionDefinitions.get(action.actionId);
93
+ if (definition?.subscribe) {
94
+ const context = {
95
+ parseVariablesInString: async (text) => {
96
+ // No-op, any values parsed here will not be stable
97
+ return text;
98
+ },
99
+ setCustomVariableValue: () => {
100
+ throw new Error(`setCustomVariableValue is not available during subscribe`);
101
+ },
102
+ };
103
+ Promise.resolve(definition.subscribe(convertActionInstanceToEvent(action), context)).catch((e) => {
104
+ this.#logger.error(`Action subscribe failed: ${JSON.stringify(action)} - ${e?.message ?? e} ${e?.stack}`);
105
+ });
106
+ }
107
+ }
108
+ }
109
+ }
110
+ async handleLearnAction(action) {
111
+ const definition = this.#actionDefinitions.get(action.actionId);
112
+ if (definition && definition.learn) {
113
+ const context = {
114
+ parseVariablesInString: async (text) => {
115
+ const res = await this.#parseVariablesInString(text, {
116
+ controlId: action.controlId,
117
+ actionInstanceId: action.id,
118
+ feedbackInstanceId: undefined,
119
+ });
120
+ return res;
121
+ },
122
+ setCustomVariableValue: () => {
123
+ throw new Error(`setCustomVariableValue is not available during learn`);
124
+ },
125
+ };
126
+ const newOptions = await definition.learn({
127
+ id: action.id,
128
+ actionId: action.actionId,
129
+ controlId: action.controlId,
130
+ options: action.options,
131
+ surfaceId: undefined,
132
+ }, context);
133
+ return {
134
+ options: newOptions,
135
+ };
136
+ }
137
+ else {
138
+ // Not supported
139
+ return {
140
+ options: undefined,
141
+ };
142
+ }
143
+ }
144
+ setActionDefinitions(actions) {
145
+ const hostActions = [];
146
+ this.#actionDefinitions.clear();
147
+ for (const [actionId, action] of Object.entries(actions)) {
148
+ if (action) {
149
+ hostActions.push({
150
+ id: actionId,
151
+ name: action.name,
152
+ description: action.description,
153
+ options: action.options,
154
+ optionsToIgnoreForSubscribe: action.optionsToIgnoreForSubscribe,
155
+ hasLearn: !!action.learn,
156
+ learnTimeout: action.learnTimeout,
157
+ hasLifecycleFunctions: !!action.subscribe || !!action.unsubscribe,
158
+ });
159
+ // Remember the definition locally
160
+ this.#actionDefinitions.set(actionId, action);
161
+ }
162
+ }
163
+ this.#setActionDefinitions(hostActions);
164
+ }
165
+ subscribeActions(actionIds) {
166
+ let actions = Array.from(this.#actionInstances.values());
167
+ const actionIdSet = new Set(actionIds);
168
+ if (actionIdSet.size)
169
+ actions = actions.filter((fb) => actionIdSet.has(fb.actionId));
170
+ for (const act of actions) {
171
+ const def = this.#actionDefinitions.get(act.actionId);
172
+ if (def?.subscribe) {
173
+ const context = {
174
+ parseVariablesInString: async (text) => {
175
+ // No-op, any values parsed here will not be stable
176
+ return text;
177
+ },
178
+ setCustomVariableValue: () => {
179
+ throw new Error(`setCustomVariableValue is not available during subscribe`);
180
+ },
181
+ };
182
+ Promise.resolve(def.subscribe(convertActionInstanceToEvent(act), context)).catch((e) => {
183
+ this.#logger.error(`Action subscribe failed: ${JSON.stringify(act)} - ${e?.message ?? e} ${e?.stack}`);
184
+ });
185
+ }
186
+ }
187
+ }
188
+ unsubscribeActions(actionIds) {
189
+ let actions = Array.from(this.#actionInstances.values());
190
+ const actionIdSet = new Set(actionIds);
191
+ if (actionIdSet.size)
192
+ actions = actions.filter((fb) => actionIdSet.has(fb.actionId));
193
+ for (const act of actions) {
194
+ const def = this.#actionDefinitions.get(act.actionId);
195
+ if (def && def.unsubscribe) {
196
+ const context = {
197
+ parseVariablesInString: async (text) => {
198
+ // No-op, any values parsed here will not be stable
199
+ return text;
200
+ },
201
+ setCustomVariableValue: () => {
202
+ throw new Error(`setCustomVariableValue is not available during unsubscribe`);
203
+ },
204
+ };
205
+ Promise.resolve(def.unsubscribe(convertActionInstanceToEvent(act), context)).catch((e) => {
206
+ this.#logger.error(`Action unsubscribe failed: ${JSON.stringify(act)} - ${e?.message ?? e} ${e?.stack}`);
207
+ });
208
+ }
209
+ }
210
+ }
211
+ }
212
+ //# sourceMappingURL=actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions.js","sourceRoot":"","sources":["../../src/internal/actions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { CompanionInputFieldBase } from '@companion-module/base';
2
+ import type { EncodeIsVisible } from '../context.js';
3
+ export declare function serializeIsVisibleFn<T extends CompanionInputFieldBase>(options: T[]): EncodeIsVisible<T>[];
4
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../src/internal/base.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAEpD,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,uBAAuB,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC,CAAC,CAAC,EAAE,CA6B1G"}
@@ -0,0 +1,31 @@
1
+ export function serializeIsVisibleFn(options) {
2
+ return (options ?? []).map((option) => {
3
+ if ('isVisibleExpression' in option && typeof option.isVisibleExpression === 'string') {
4
+ return {
5
+ ...option,
6
+ isVisibleFnType: 'expression',
7
+ isVisibleFn: option.isVisibleExpression,
8
+ isVisible: undefined,
9
+ isVisibleExpression: undefined,
10
+ };
11
+ }
12
+ else if ('isVisible' in option && typeof option.isVisible === 'function') {
13
+ return {
14
+ ...option,
15
+ isVisibleFn: option.isVisible.toString(),
16
+ isVisibleFnType: 'function',
17
+ isVisible: undefined,
18
+ isVisibleExpression: undefined,
19
+ };
20
+ }
21
+ // ignore any existing `isVisibleFn` to avoid code injection
22
+ return {
23
+ ...option,
24
+ isVisible: undefined,
25
+ isVisibleFn: undefined,
26
+ isVisibleFnType: undefined,
27
+ isVisibleExpression: undefined,
28
+ };
29
+ });
30
+ }
31
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/internal/base.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,oBAAoB,CAAoC,OAAY;IACnF,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;QACrC,IAAI,qBAAqB,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YACvF,OAAO;gBACN,GAAG,MAAM;gBACT,eAAe,EAAE,YAAY;gBAC7B,WAAW,EAAE,MAAM,CAAC,mBAAmB;gBACvC,SAAS,EAAE,SAAS;gBACpB,mBAAmB,EAAE,SAAS;aAC9B,CAAA;QACF,CAAC;aAAM,IAAI,WAAW,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,UAAU,EAAE,CAAC;YAC5E,OAAO;gBACN,GAAG,MAAM;gBACT,WAAW,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE;gBACxC,eAAe,EAAE,UAAU;gBAC3B,SAAS,EAAE,SAAS;gBACpB,mBAAmB,EAAE,SAAS;aAC9B,CAAA;QACF,CAAC;QAED,4DAA4D;QAC5D,OAAO;YACN,GAAG,MAAM;YACT,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,SAAS;YACtB,eAAe,EAAE,SAAS;YAC1B,mBAAmB,EAAE,SAAS;SAC9B,CAAA;IACF,CAAC,CAAC,CAAA;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { type CompanionFeedbackDefinitions, type CompanionOptionValues } from '@companion-module/base';
2
+ import type { FeedbackInstance, HostFeedbackDefinition, HostFeedbackValue, ParseVariablesInfo } from '../context.js';
3
+ export declare class FeedbackManager {
4
+ #private;
5
+ get parseVariablesContext(): string | undefined;
6
+ constructor(parseVariablesInString: (text: string, info: ParseVariablesInfo) => Promise<string>, setFeedbackDefinitions: (feedbacks: HostFeedbackDefinition[]) => void, updateFeedbackValues: (values: HostFeedbackValue[]) => void);
7
+ getDefinitionIds(): string[];
8
+ getInstanceIds(): string[];
9
+ handleUpdateFeedbacks(feedbacks: Record<string, FeedbackInstance | null | undefined>): void;
10
+ handleLearnFeedback(feedback: FeedbackInstance): Promise<{
11
+ options: CompanionOptionValues | undefined;
12
+ }>;
13
+ setFeedbackDefinitions(feedbacks: CompanionFeedbackDefinitions): void;
14
+ checkFeedbacks(feedbackTypes: string[]): void;
15
+ checkFeedbacksById(feedbackIds: string[]): void;
16
+ subscribeFeedbacks(feedbackIds: string[]): void;
17
+ unsubscribeFeedbacks(feedbackIds: string[]): void;
18
+ }
19
+ //# sourceMappingURL=feedback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/internal/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAIN,KAAK,4BAA4B,EAEjC,KAAK,qBAAqB,EAI1B,MAAM,wBAAwB,CAAA;AAE/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAoBpH,qBAAa,eAAe;;IAkB3B,IAAW,qBAAqB,IAAI,MAAM,GAAG,SAAS,CAErD;gBAGA,sBAAsB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,KAAK,OAAO,CAAC,MAAM,CAAC,EACnF,sBAAsB,EAAE,CAAC,SAAS,EAAE,sBAAsB,EAAE,KAAK,IAAI,EACrE,oBAAoB,EAAE,CAAC,MAAM,EAAE,iBAAiB,EAAE,KAAK,IAAI;IAOrD,gBAAgB,IAAI,MAAM,EAAE;IAG5B,cAAc,IAAI,MAAM,EAAE;IAI1B,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,IAAI;IA0DrF,mBAAmB,CAC/B,QAAQ,EAAE,gBAAgB,GACxB,OAAO,CAAC;QAAE,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAAA;KAAE,CAAC;IAyK1D,sBAAsB,CAAC,SAAS,EAAE,4BAA4B,GAAG,IAAI;IA2BrE,cAAc,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI;IAa7C,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;IAO/C,kBAAkB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;IAuB/C,oBAAoB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;CAsBjD"}
@@ -0,0 +1,296 @@
1
+ import { assertNever, createModuleLogger, } from '@companion-module/base';
2
+ import debounceFn from 'debounce-fn';
3
+ function convertFeedbackInstanceToEvent(type, feedback) {
4
+ return {
5
+ type: type,
6
+ id: feedback.id,
7
+ feedbackId: feedback.feedbackId,
8
+ controlId: feedback.controlId,
9
+ options: feedback.options,
10
+ };
11
+ }
12
+ export class FeedbackManager {
13
+ #logger = createModuleLogger('FeedbackManager');
14
+ #parseVariablesInString;
15
+ #setFeedbackDefinitions;
16
+ #updateFeedbackValues;
17
+ #feedbackDefinitions = new Map();
18
+ #feedbackInstances = new Map();
19
+ // Feedback values waiting to be sent
20
+ #pendingFeedbackValues = new Map();
21
+ // Feedbacks currently being checked
22
+ #feedbacksBeingChecked = new Map();
23
+ // while in a context which provides an alternate parseVariablesInString, we should log when the original is called
24
+ #parseVariablesContext;
25
+ get parseVariablesContext() {
26
+ return this.#parseVariablesContext;
27
+ }
28
+ constructor(parseVariablesInString, setFeedbackDefinitions, updateFeedbackValues) {
29
+ this.#parseVariablesInString = parseVariablesInString;
30
+ this.#setFeedbackDefinitions = setFeedbackDefinitions;
31
+ this.#updateFeedbackValues = updateFeedbackValues;
32
+ }
33
+ getDefinitionIds() {
34
+ return Array.from(this.#feedbackDefinitions.keys());
35
+ }
36
+ getInstanceIds() {
37
+ return Array.from(this.#feedbackInstances.keys());
38
+ }
39
+ handleUpdateFeedbacks(feedbacks) {
40
+ for (const [id, feedback] of Object.entries(feedbacks)) {
41
+ const existing = this.#feedbackInstances.get(id);
42
+ if (existing && !feedback) {
43
+ // Call unsubscribe
44
+ const definition = this.#feedbackDefinitions.get(existing.feedbackId);
45
+ if (definition?.unsubscribe) {
46
+ const context = {
47
+ parseVariablesInString: async (text) => {
48
+ // No-op, any values parsed here will not be stable
49
+ return text;
50
+ },
51
+ };
52
+ Promise.resolve(definition.unsubscribe(convertFeedbackInstanceToEvent(definition.type, existing), context)).catch((e) => {
53
+ this.#logger.error(`Feedback unsubscribe failed: ${JSON.stringify(existing)} - ${e?.message ?? e} ${e?.stack}`);
54
+ });
55
+ }
56
+ }
57
+ if (!feedback || feedback.disabled) {
58
+ // Deleted
59
+ this.#feedbackInstances.delete(id);
60
+ }
61
+ else {
62
+ // TODO module-lib - deep freeze the feedback to avoid mutation?
63
+ this.#feedbackInstances.set(id, { ...feedback });
64
+ // Inserted
65
+ if (!existing) {
66
+ const definition = this.#feedbackDefinitions.get(feedback.feedbackId);
67
+ if (definition?.subscribe) {
68
+ const context = {
69
+ parseVariablesInString: async (text) => {
70
+ // No-op, any values parsed here will not be stable
71
+ return text;
72
+ },
73
+ };
74
+ Promise.resolve(definition.subscribe(convertFeedbackInstanceToEvent(definition.type, feedback), context)).catch((e) => {
75
+ this.#logger.error(`Feedback subscribe failed: ${JSON.stringify(feedback)} - ${e?.message ?? e} ${e?.stack}`);
76
+ });
77
+ }
78
+ }
79
+ // update the feedback value
80
+ this.#triggerCheckFeedback(id);
81
+ }
82
+ }
83
+ }
84
+ async handleLearnFeedback(feedback) {
85
+ const definition = this.#feedbackDefinitions.get(feedback.feedbackId);
86
+ if (definition && definition.learn) {
87
+ const context = {
88
+ parseVariablesInString: async (text) => {
89
+ const res = await this.#parseVariablesInString(text, {
90
+ controlId: feedback.controlId,
91
+ actionInstanceId: undefined,
92
+ feedbackInstanceId: feedback.id,
93
+ });
94
+ return res;
95
+ },
96
+ };
97
+ const newOptions = await definition.learn({
98
+ id: feedback.id,
99
+ feedbackId: feedback.feedbackId,
100
+ controlId: feedback.controlId,
101
+ options: feedback.options,
102
+ type: definition.type,
103
+ }, context);
104
+ return {
105
+ options: newOptions,
106
+ };
107
+ }
108
+ else {
109
+ // Not supported
110
+ return {
111
+ options: undefined,
112
+ };
113
+ }
114
+ }
115
+ #triggerCheckFeedback(id) {
116
+ const existingRecheck = this.#feedbacksBeingChecked.get(id);
117
+ if (existingRecheck) {
118
+ // Already being checked
119
+ existingRecheck.needsRecheck = true;
120
+ return;
121
+ }
122
+ const feedback0 = this.#feedbackInstances.get(id);
123
+ if (!feedback0)
124
+ return;
125
+ const feedback = feedback0;
126
+ const feedbackCheckStatus = {
127
+ needsRecheck: false,
128
+ };
129
+ // mark it as being checked
130
+ this.#feedbacksBeingChecked.set(id, feedbackCheckStatus);
131
+ Promise.resolve()
132
+ .then(async () => {
133
+ const definition = this.#feedbackDefinitions.get(feedback.feedbackId);
134
+ let value;
135
+ // Calculate the new value for the feedback
136
+ if (definition) {
137
+ // Set this while the promise starts executing
138
+ this.#parseVariablesContext = `Feedback ${feedback.feedbackId} (${id})`;
139
+ const context = {
140
+ parseVariablesInString: async (text) => {
141
+ const res = await this.#parseVariablesInString(text, {
142
+ controlId: feedback.controlId,
143
+ actionInstanceId: undefined,
144
+ feedbackInstanceId: id,
145
+ });
146
+ return res;
147
+ },
148
+ };
149
+ switch (definition.type) {
150
+ case 'boolean':
151
+ value = definition.callback({
152
+ ...convertFeedbackInstanceToEvent('boolean', feedback),
153
+ type: 'boolean',
154
+ }, context);
155
+ break;
156
+ case 'value':
157
+ value = definition.callback({
158
+ ...convertFeedbackInstanceToEvent('value', feedback),
159
+ type: 'value',
160
+ }, context);
161
+ break;
162
+ case 'advanced':
163
+ value = definition.callback({
164
+ ...convertFeedbackInstanceToEvent('advanced', feedback),
165
+ type: 'advanced',
166
+ image: feedback.image,
167
+ }, context);
168
+ break;
169
+ default:
170
+ assertNever(definition);
171
+ break;
172
+ }
173
+ this.#parseVariablesContext = undefined;
174
+ }
175
+ // Await the value before looking at this.#pendingFeedbackValues, to avoid race conditions
176
+ const resolvedValue = await value;
177
+ this.#pendingFeedbackValues.set(id, {
178
+ id: id,
179
+ controlId: feedback.controlId,
180
+ feedbackType: definition?.type,
181
+ value: resolvedValue,
182
+ });
183
+ this.#sendFeedbackValues();
184
+ })
185
+ .catch((e) => {
186
+ console.error(`Feedback check failed: ${JSON.stringify(feedback)} - ${e?.message ?? e} ${e?.stack}`);
187
+ })
188
+ .finally(() => {
189
+ // ensure this.#parseVariablesContext is cleared
190
+ this.#parseVariablesContext = undefined;
191
+ // it is no longer being checked
192
+ this.#feedbacksBeingChecked.delete(id);
193
+ // If queued, trigger a check
194
+ if (feedbackCheckStatus.needsRecheck) {
195
+ setImmediate(() => {
196
+ this.#triggerCheckFeedback(id);
197
+ });
198
+ }
199
+ });
200
+ }
201
+ /**
202
+ * Send pending feedback values (from this.#pendingFeedbackValues) to companion, with a debounce
203
+ */
204
+ #sendFeedbackValues = debounceFn(() => {
205
+ const newValues = this.#pendingFeedbackValues;
206
+ this.#pendingFeedbackValues = new Map();
207
+ // Send the new values back
208
+ if (newValues.size > 0) {
209
+ this.#updateFeedbackValues(Array.from(newValues.values()));
210
+ }
211
+ }, {
212
+ wait: 5,
213
+ maxWait: 25,
214
+ });
215
+ setFeedbackDefinitions(feedbacks) {
216
+ const hostFeedbacks = [];
217
+ this.#feedbackDefinitions.clear();
218
+ for (const [feedbackId, feedback] of Object.entries(feedbacks)) {
219
+ if (feedback) {
220
+ hostFeedbacks.push({
221
+ id: feedbackId,
222
+ name: feedback.name,
223
+ description: feedback.description,
224
+ options: feedback.options,
225
+ type: feedback.type,
226
+ defaultStyle: feedback.type === 'boolean' ? feedback.defaultStyle : undefined,
227
+ hasLearn: !!feedback.learn,
228
+ learnTimeout: feedback.learnTimeout,
229
+ showInvert: feedback.type === 'boolean' ? feedback.showInvert : false,
230
+ });
231
+ // Remember the definition locally
232
+ this.#feedbackDefinitions.set(feedbackId, feedback);
233
+ }
234
+ }
235
+ this.#setFeedbackDefinitions(hostFeedbacks);
236
+ }
237
+ checkFeedbacks(feedbackTypes) {
238
+ const types = new Set(feedbackTypes);
239
+ for (const [id, feedback] of this.#feedbackInstances.entries()) {
240
+ const definition = this.#feedbackDefinitions.get(feedback.feedbackId);
241
+ if (definition) {
242
+ if (types.size === 0 || types.has(feedback.feedbackId)) {
243
+ // update the feedback value
244
+ this.#triggerCheckFeedback(id);
245
+ }
246
+ }
247
+ }
248
+ }
249
+ checkFeedbacksById(feedbackIds) {
250
+ for (const id of feedbackIds) {
251
+ // update the feedback value
252
+ this.#triggerCheckFeedback(id);
253
+ }
254
+ }
255
+ subscribeFeedbacks(feedbackIds) {
256
+ let feedbacks = Array.from(this.#feedbackInstances.values());
257
+ const feedbackIdSet = new Set(feedbackIds);
258
+ if (feedbackIdSet.size)
259
+ feedbacks = feedbacks.filter((fb) => feedbackIdSet.has(fb.feedbackId));
260
+ for (const fb of feedbacks) {
261
+ const def = this.#feedbackDefinitions.get(fb.feedbackId);
262
+ if (def?.subscribe) {
263
+ const context = {
264
+ parseVariablesInString: async (text) => {
265
+ // No-op, any values parsed here will not be stable
266
+ return text;
267
+ },
268
+ };
269
+ Promise.resolve(def.subscribe(convertFeedbackInstanceToEvent(def.type, fb), context)).catch((e) => {
270
+ this.#logger.error(`Feedback subscribe failed: ${JSON.stringify(fb)} - ${e?.message ?? e} ${e?.stack}`);
271
+ });
272
+ }
273
+ }
274
+ }
275
+ unsubscribeFeedbacks(feedbackIds) {
276
+ let feedbacks = Array.from(this.#feedbackInstances.values());
277
+ const feedbackIdSet = new Set(feedbackIds);
278
+ if (feedbackIdSet.size)
279
+ feedbacks = feedbacks.filter((fb) => feedbackIdSet.has(fb.feedbackId));
280
+ for (const fb of feedbacks) {
281
+ const def = this.#feedbackDefinitions.get(fb.feedbackId);
282
+ if (def && def.unsubscribe) {
283
+ const context = {
284
+ parseVariablesInString: async (text) => {
285
+ // No-op, any values parsed here will not be stable
286
+ return text;
287
+ },
288
+ };
289
+ Promise.resolve(def.unsubscribe(convertFeedbackInstanceToEvent(def.type, fb), context)).catch((e) => {
290
+ this.#logger.error(`Feedback unsubscribe failed: ${JSON.stringify(fb)} - ${e?.message ?? e} ${e?.stack}`);
291
+ });
292
+ }
293
+ }
294
+ }
295
+ }
296
+ //# sourceMappingURL=feedback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feedback.js","sourceRoot":"","sources":["../../src/internal/feedback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type CompanionStaticUpgradeScript } from '@companion-module/base';
2
+ import type { UpgradeActionInstance, UpgradeFeedbackInstance, UpgradeActionAndFeedbackInstancesResponse } from '../context.js';
3
+ /**
4
+ * Run through the upgrade scripts for the given data
5
+ * Note: this updates the inputs in place, but the result needs to be sent back to companion
6
+ * @param allActions Actions that may need upgrading
7
+ * @param allFeedbacks Feedbacks that may need upgrading
8
+ * @param defaultUpgradeIndex The lastUpgradeIndex of the connection, if known
9
+ * @param upgradeScripts The scripts that may be run
10
+ * @param config The current config of the module
11
+ * @param skipConfigAndSecretsUpgrade Whether to skip upgrading the config and secrets
12
+ * @returns The upgraded data that needs persisting
13
+ */
14
+ export declare function runThroughUpgradeScripts(allActionsArray: UpgradeActionInstance[], allFeedbacksArray: UpgradeFeedbackInstance[], defaultUpgradeIndex: number | null, upgradeScripts: CompanionStaticUpgradeScript<any, any>[], config: unknown, secrets: unknown, skipConfigAndSecretsUpgrade: boolean): UpgradeActionAndFeedbackInstancesResponse;
15
+ //# sourceMappingURL=upgrade.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/internal/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,KAAK,4BAA4B,EAGjC,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EACX,qBAAqB,EACrB,uBAAuB,EACvB,yCAAyC,EACzC,MAAM,eAAe,CAAA;AAEtB;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CACvC,eAAe,EAAE,qBAAqB,EAAE,EACxC,iBAAiB,EAAE,uBAAuB,EAAE,EAC5C,mBAAmB,EAAE,MAAM,GAAG,IAAI,EAClC,cAAc,EAAE,4BAA4B,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EACxD,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,OAAO,EAChB,2BAA2B,EAAE,OAAO,GAClC,yCAAyC,CAgL3C"}