@fluxdeck/sdk 0.0.3 → 0.1.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.
package/dist/index.d.mts CHANGED
@@ -1,16 +1,65 @@
1
- //#region ../bindings/src/JsonValue.d.ts
1
+ //#region ../bindings/dist/ClientRequestEvent.d.ts
2
+ type ClientRequestEvent = {
3
+ "event": "getPluginSettings";
4
+ name: string;
5
+ };
6
+ //#endregion
7
+ //#region ../bindings/dist/ClientRegisterPayload.d.ts
8
+ type ClientRegisterPayload = {
9
+ clientUuid: string | null;
10
+ name: string;
11
+ };
12
+ //#endregion
13
+ //#region ../bindings/dist/JsonValue.d.ts
2
14
  type JsonValue = null | string | number | boolean | Array<JsonValue> | JsonObject;
3
15
  type JsonObject = {
4
16
  [key: string]: JsonValue;
5
17
  };
6
18
  //#endregion
7
- //#region ../bindings/src/ServerResponseEvent.d.ts
8
- type ServerResponseEvent = {
9
- "event": "getPluginSettings";
19
+ //#region ../bindings/dist/SetBoardIdPayload.d.ts
20
+ type SetBoardIdPayload = {
21
+ clientUuid: string;
22
+ profileId: number;
23
+ boardId: number;
24
+ };
25
+ //#endregion
26
+ //#region ../bindings/dist/ClientEvent.d.ts
27
+ type ClientEvent = {
28
+ "event": "editorRegister";
29
+ payload: string;
30
+ } | {
31
+ "event": "pluginRegister";
32
+ payload: string;
33
+ } | {
34
+ "event": "sendToPlugin";
35
+ name: string;
10
36
  payload: JsonValue;
37
+ } | {
38
+ "event": "sendToEditor";
39
+ name: string;
40
+ payload: JsonValue;
41
+ } | {
42
+ "event": "setPluginSettings";
43
+ name: string;
44
+ payload: JsonValue;
45
+ } | {
46
+ "event": "press";
47
+ payload: number;
48
+ } | {
49
+ "event": "release";
50
+ payload: number;
51
+ } | {
52
+ "event": "setBoardId";
53
+ payload: SetBoardIdPayload;
54
+ } | {
55
+ "event": "clientRegister";
56
+ payload: ClientRegisterPayload;
11
57
  };
12
58
  //#endregion
13
- //#region ../bindings/src/GetActionDto.d.ts
59
+ //#region ../bindings/dist/ConnectionRejectedReason.d.ts
60
+ type ConnectionRejectedReason = "Blocked" | "Denied";
61
+ //#endregion
62
+ //#region ../bindings/dist/GetActionDto.d.ts
14
63
  type GetActionDto = {
15
64
  id: number;
16
65
  uuid: string;
@@ -21,12 +70,12 @@ type GetActionDto = {
21
70
  children: { [key in string]?: Array<GetActionDto> };
22
71
  };
23
72
  //#endregion
24
- //#region ../bindings/src/GetColorDto.d.ts
73
+ //#region ../bindings/dist/GetColorDto.d.ts
25
74
  type GetColorDto = {
26
75
  value: string | null;
27
76
  };
28
77
  //#endregion
29
- //#region ../bindings/src/GetIconDto.d.ts
78
+ //#region ../bindings/dist/GetIconDto.d.ts
30
79
  type GetIconDto = {
31
80
  id: number | null;
32
81
  path: string;
@@ -36,10 +85,10 @@ type GetIconDto = {
36
85
  mode: string | null;
37
86
  };
38
87
  //#endregion
39
- //#region ../bindings/src/TextAlign.d.ts
88
+ //#region ../bindings/dist/TextAlign.d.ts
40
89
  type TextAlign = "top" | "middle" | "bottom";
41
90
  //#endregion
42
- //#region ../bindings/src/GetTitleDto.d.ts
91
+ //#region ../bindings/dist/GetTitleDto.d.ts
43
92
  type GetTitleDto = {
44
93
  value: string | null;
45
94
  align: TextAlign | null;
@@ -48,7 +97,7 @@ type GetTitleDto = {
48
97
  size: number | null;
49
98
  };
50
99
  //#endregion
51
- //#region ../bindings/src/GetStateSnapshotDto.d.ts
100
+ //#region ../bindings/dist/GetStateSnapshotDto.d.ts
52
101
  type GetStateSnapshotDto = {
53
102
  id: number | null;
54
103
  title: GetTitleDto | null;
@@ -56,7 +105,7 @@ type GetStateSnapshotDto = {
56
105
  color: GetColorDto | null;
57
106
  };
58
107
  //#endregion
59
- //#region ../bindings/src/GetItemStateDto.d.ts
108
+ //#region ../bindings/dist/GetItemStateDto.d.ts
60
109
  type GetItemStateDto = {
61
110
  id: number;
62
111
  boardId: number;
@@ -65,7 +114,7 @@ type GetItemStateDto = {
65
114
  state: GetStateSnapshotDto;
66
115
  };
67
116
  //#endregion
68
- //#region ../bindings/src/GetPageDto.d.ts
117
+ //#region ../bindings/dist/GetPageDto.d.ts
69
118
  type GetPageDto = {
70
119
  boardId: number;
71
120
  position: number;
@@ -73,30 +122,36 @@ type GetPageDto = {
73
122
  icon: string | null;
74
123
  };
75
124
  //#endregion
76
- //#region ../bindings/src/GetBoardStateDto.d.ts
125
+ //#region ../bindings/dist/GetBoardStateDto.d.ts
77
126
  type GetBoardStateDto = {
78
127
  boardId: number;
79
128
  page: GetPageDto | null;
80
129
  items: Array<GetItemStateDto>;
81
130
  };
82
131
  //#endregion
83
- //#region ../bindings/src/GetClientDto.d.ts
132
+ //#region ../bindings/dist/GetClientDto.d.ts
84
133
  type GetClientDto = {
85
134
  id: number;
86
135
  uuid: string;
87
136
  name: string;
88
137
  profileId: number;
89
138
  boardId: number;
139
+ /**
140
+ * Whether the Client currently has a live Connection. Derived from the
141
+ * Session Registry, never persisted (see ADR-0007). Defaults to `false`
142
+ * for single-client reads that do not compute Presence.
143
+ */
144
+ online: boolean;
90
145
  };
91
146
  //#endregion
92
- //#region ../bindings/src/GetLayoutDto.d.ts
147
+ //#region ../bindings/dist/GetLayoutDto.d.ts
93
148
  type GetLayoutDto = {
94
149
  profileId: number;
95
150
  rows: number | null;
96
151
  cols: number | null;
97
152
  };
98
153
  //#endregion
99
- //#region ../bindings/src/GetStyleDto.d.ts
154
+ //#region ../bindings/dist/GetStyleDto.d.ts
100
155
  type GetStyleDto = {
101
156
  profileId: number;
102
157
  spacing: number | null;
@@ -109,7 +164,7 @@ type GetStyleDto = {
109
164
  backgroundColor: string | null;
110
165
  };
111
166
  //#endregion
112
- //#region ../bindings/src/GetClientStateDto.d.ts
167
+ //#region ../bindings/dist/GetClientStateDto.d.ts
113
168
  type GetClientStateDto = {
114
169
  clientUuid: string;
115
170
  profileId: number;
@@ -119,8 +174,15 @@ type GetClientStateDto = {
119
174
  style: GetStyleDto;
120
175
  };
121
176
  //#endregion
122
- //#region ../bindings/src/ServerEvent.d.ts
177
+ //#region ../bindings/dist/ServerEvent.d.ts
123
178
  type ServerEvent = {
179
+ "event": "connectionPending";
180
+ } | {
181
+ "event": "connectionRejected";
182
+ reason: ConnectionRejectedReason;
183
+ } | {
184
+ "event": "clientDeleted";
185
+ } | {
124
186
  "event": "trigger";
125
187
  itemId: number;
126
188
  action: GetActionDto;
@@ -162,93 +224,26 @@ type ServerEvent = {
162
224
  "event": "currentStateChanged";
163
225
  };
164
226
  //#endregion
165
- //#region src/event-emitter.d.ts
166
- type Listener<T> = (payload: T) => void;
167
- //#endregion
168
- //#region src/editor.d.ts
169
- type SaveHandler = () => unknown;
170
- declare class Editor {
171
- private connection;
172
- private bridge;
173
- private params;
174
- private saveHandler?;
175
- private eventEmitter;
176
- constructor();
177
- onRecieveFromPlugin<T>(listener: Listener<T>): Promise<() => void>;
178
- sendToPlugin<T extends JsonValue>(data: T): void;
179
- getActionSettings(): Promise<JsonValue>;
180
- onActionSave(handler: SaveHandler): () => void;
181
- getPluginSettings(): Promise<ServerResponseEvent>;
182
- setPluginSettings(data: JsonValue): Promise<void>;
183
- }
184
- //#endregion
185
- //#region ../bindings/src/ClientRequestEvent.d.ts
186
- type ClientRequestEvent = {
227
+ //#region ../bindings/dist/ServerResponseEvent.d.ts
228
+ type ServerResponseEvent = {
187
229
  "event": "getPluginSettings";
188
- name: string;
230
+ payload: JsonValue;
189
231
  };
190
232
  //#endregion
191
- //#region src/types/connection.d.ts
233
+ //#region src/connection.d.ts
192
234
  type Handler<T extends ServerEvent["event"]> = (data: Extract<ServerEvent, {
193
235
  event: T;
194
236
  }>) => void;
195
- type ResponseFor$1<T extends ClientRequestEvent["event"]> = Extract<ServerResponseEvent, {
237
+ type ResponseFor<T extends ClientRequestEvent["event"]> = Extract<ServerResponseEvent, {
196
238
  event: T;
197
239
  }>;
198
- //#endregion
199
- //#region ../bindings/src/ClientRegisterPayload.d.ts
200
- type ClientRegisterPayload = {
201
- clientUuid: string | null;
202
- name: string;
203
- };
204
- //#endregion
205
- //#region ../bindings/src/SetBoardIdPayload.d.ts
206
- type SetBoardIdPayload = {
207
- clientUuid: string;
208
- profileId: number;
209
- boardId: number;
210
- };
211
- //#endregion
212
- //#region ../bindings/src/ClientEvent.d.ts
213
- type ClientEvent = {
214
- "event": "editorRegister";
215
- payload: string;
216
- } | {
217
- "event": "pluginRegister";
218
- payload: string;
219
- } | {
220
- "event": "sendToPlugin";
221
- name: string;
222
- payload: JsonValue;
223
- } | {
224
- "event": "sendToEditor";
225
- name: string;
226
- payload: JsonValue;
227
- } | {
228
- "event": "setPluginSettings";
229
- name: string;
230
- payload: JsonValue;
231
- } | {
232
- "event": "press";
233
- payload: number;
234
- } | {
235
- "event": "release";
236
- payload: number;
237
- } | {
238
- "event": "setBoardId";
239
- payload: SetBoardIdPayload;
240
- } | {
241
- "event": "clientRegister";
242
- payload: ClientRegisterPayload;
243
- };
244
- //#endregion
245
- //#region src/connection.d.ts
246
- type ConnectionStatus = "connecting" | "connected" | "disconnected";
247
- type StatusListener = (status: ConnectionStatus) => void;
248
240
  type ConnectionOptions = {
249
241
  autoreconnect?: boolean;
250
242
  requestTimeout?: number;
243
+ port?: number;
251
244
  };
245
+ type ConnectionStatus = "connecting" | "connected" | "disconnected";
246
+ type StatusListener = (status: ConnectionStatus) => void;
252
247
  declare class Connection {
253
248
  private url;
254
249
  private ws?;
@@ -268,109 +263,92 @@ declare class Connection {
268
263
  private setStatus;
269
264
  reconnect(): void;
270
265
  connect(): void;
271
- private failPendingRequests;
266
+ disableAutoreconnect(): void;
272
267
  close(): void;
273
268
  private send;
274
269
  sendEvent(event: ClientEvent): Promise<void>;
275
270
  on<T extends ServerEvent["event"]>(event: T, handler: Handler<T>): () => void;
276
271
  private onMessage;
277
- request<E extends ClientRequestEvent>(event: E): Promise<ResponseFor$1<E["event"]>>;
272
+ request<E extends ClientRequestEvent>(event: E): Promise<ResponseFor<E["event"]>>;
278
273
  }
279
274
  //#endregion
280
- //#region src/types/bridge.d.ts
281
- type MessageHandler<T extends keyof EventRequests> = (payload: EventRequests[T], event: MessageEvent, respond?: (responsePayload: ResponseFor<T>) => void) => void;
275
+ //#region src/iframe-bridge.d.ts
282
276
  type BridgeOptions = {
283
277
  targetOrigin?: string;
284
278
  timeout?: number;
285
279
  debug?: boolean;
286
280
  };
287
- type MessageMeta = {
288
- timestamp: number;
289
- requestId?: number;
290
- isRequest?: boolean;
291
- isResponse?: boolean;
292
- };
293
- type BridgeMessage<T> = {
294
- type: string;
295
- payload: T;
296
- meta: MessageMeta;
297
- };
298
- interface EventRequests {
299
- SET_ACTION_SETTINGS: {
281
+ interface BridgeRequests {
282
+ SAVE_ACTION_SETTINGS: {
300
283
  id: string;
301
284
  };
302
285
  GET_ACTION_SETTINGS: {
303
286
  id: string;
304
287
  };
305
288
  }
306
- interface EventResponses {
307
- SET_ACTION_SETTINGS: {
289
+ interface BridgeResponses {
290
+ SAVE_ACTION_SETTINGS: {
308
291
  settings: string | null;
309
292
  };
310
293
  GET_ACTION_SETTINGS: {
311
294
  settings: string | null;
312
295
  };
313
296
  }
314
- type ResponseFor<T extends keyof EventRequests> = T extends keyof EventResponses ? EventResponses[T] : never;
315
- //#endregion
316
- //#region src/bridge.d.ts
317
- declare class Bridge<T extends keyof EventRequests = keyof EventRequests> {
297
+ type BridgeMessageType = keyof BridgeRequests;
298
+ type ResponseFor$1<K extends BridgeMessageType> = K extends keyof BridgeResponses ? BridgeResponses[K] : never;
299
+ type MessageHandler<K extends BridgeMessageType> = (payload: BridgeRequests[K], event: MessageEvent, respond?: (responsePayload: ResponseFor$1<K>) => void) => void;
300
+ declare class IframeBridge {
318
301
  private options;
319
302
  private handlers;
320
303
  private pendingRequests;
321
- private requestId;
322
304
  private isParent;
323
305
  private target;
324
306
  private boundHandleMessage;
325
307
  constructor(options?: BridgeOptions);
326
308
  private init;
327
- /**
328
- * Установить цель для отправки сообщений (для родительского окна)
329
- */
309
+ /** Set the target window to post messages to (used by the parent window). */
330
310
  setTarget(iframeElement: HTMLIFrameElement): void;
331
- /**
332
- * Получить целевое окно для отправки сообщений
333
- */
311
+ /** Resolve the window to post messages to. */
334
312
  private getTargetWindow;
335
- /**
336
- * Обработка входящих сообщений
337
- */
313
+ /** Handle an incoming message. */
338
314
  private handleMessage;
339
- /**
340
- * Отправить сообщение
341
- */
315
+ /** Post a fire-and-forget message. */
342
316
  send(type: string, payload?: unknown): void;
343
- /**
344
- * Отправить запрос и ждать ответа
345
- */
346
- request(type: T, payload: EventRequests[T], timeout?: number): Promise<ResponseFor<T>>;
347
- /**
348
- * Отправить ответ на запрос
349
- */
317
+ /** Post a request and wait for its response. */
318
+ request<K extends BridgeMessageType>(type: K, payload: BridgeRequests[K], timeout?: number): Promise<ResponseFor$1<K>>;
319
+ /** Post a response back to the window that issued the request. */
350
320
  private sendResponse;
351
- /**
352
- * Обработать ответ на запрос
353
- */
354
- private handleResponse;
355
- /**
356
- * Подписаться на событие
357
- */
358
- on(type: T, handler: MessageHandler<T>): () => void;
359
- /**
360
- * Отписаться от события
361
- */
362
- off(type: string): void;
363
- /**
364
- * Подписаться на событие один раз
365
- */
366
- once(type: T, handler: MessageHandler<T>): () => void;
367
- /**
368
- * Очистить все обработчики
369
- */
321
+ /** Subscribe to a message type (single handler per type). */
322
+ on<K extends BridgeMessageType>(type: K, handler: MessageHandler<K>): () => void;
323
+ /** Unsubscribe from a message type. */
324
+ off(type: BridgeMessageType): void;
325
+ /** Subscribe to a message type for a single delivery. */
326
+ once<K extends BridgeMessageType>(type: K, handler: MessageHandler<K>): () => void;
327
+ /** Tear down the bridge and reject every outstanding request. */
370
328
  destroy(): void;
371
329
  }
372
330
  //#endregion
331
+ //#region src/editor.d.ts
332
+ type Listener$1<T> = (payload: T) => void;
333
+ type SaveHandler = () => unknown;
334
+ declare class Editor {
335
+ private connection;
336
+ private bridge;
337
+ private params;
338
+ private saveHandler?;
339
+ constructor();
340
+ connect(): void;
341
+ private onReceiveFromPluginListeners;
342
+ onReceiveFromPlugin<T>(listener: Listener$1<T>): () => void;
343
+ sendToPlugin<T extends JsonValue>(data: T): void;
344
+ getActionSettings(): Promise<JsonValue>;
345
+ onActionSave(handler: SaveHandler): () => void;
346
+ getPluginSettings(): Promise<ServerResponseEvent>;
347
+ setPluginSettings(data: JsonValue): Promise<void>;
348
+ }
349
+ //#endregion
373
350
  //#region src/plugin.d.ts
351
+ type Listener<T> = (payload: T) => void;
374
352
  type ActionData<T> = {
375
353
  trigger: string;
376
354
  settings: T;
@@ -379,23 +357,22 @@ interface Action<T> {
379
357
  name: string;
380
358
  onTrigger?: (data: ActionData<T>) => void;
381
359
  }
382
- declare class FluxDeck {
360
+ declare class Plugin {
383
361
  private connection;
384
362
  private actions;
385
363
  private pluginName?;
386
- private eventEmitter;
387
364
  constructor();
388
365
  connect(): void;
389
- private parseSettings;
366
+ private ensurePluginName;
390
367
  private registerPlugin;
391
368
  registerAction<T>(action: Action<T>): void;
392
- onSetSettings<T>(listener: Listener<T>): Promise<() => void>;
393
- onRecieveFromEditor<T>(listener: Listener<T>): Promise<() => void>;
369
+ onPluginSettings<T>(listener: Listener<T>): Promise<() => void>;
370
+ onReceiveFromEditor<T>(listener: Listener<T>): Promise<() => void>;
394
371
  sendToEditor<T extends JsonValue>(data: T): void;
395
372
  getPluginSettings(): Promise<ServerResponseEvent>;
396
373
  setPluginSettings<T extends JsonValue>(data: T): Promise<void>;
397
374
  }
398
- declare const fluxDeck: FluxDeck;
375
+ declare const fluxDeck: Plugin;
399
376
  //#endregion
400
- export { Action, ActionData, Bridge, type BridgeMessage, type BridgeOptions, Connection, ConnectionStatus, Editor, FluxDeck, type MessageHandler, fluxDeck };
377
+ export { Action, ActionData, Connection, ConnectionStatus, Editor, Handler, IframeBridge, Plugin, ResponseFor, fluxDeck };
401
378
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../bindings/src/JsonValue.ts","../../bindings/src/ServerResponseEvent.ts","../../bindings/src/GetActionDto.ts","../../bindings/src/GetColorDto.ts","../../bindings/src/GetIconDto.ts","../../bindings/src/TextAlign.ts","../../bindings/src/GetTitleDto.ts","../../bindings/src/GetStateSnapshotDto.ts","../../bindings/src/GetItemStateDto.ts","../../bindings/src/GetPageDto.ts","../../bindings/src/GetBoardStateDto.ts","../../bindings/src/GetClientDto.ts","../../bindings/src/GetLayoutDto.ts","../../bindings/src/GetStyleDto.ts","../../bindings/src/GetClientStateDto.ts","../../bindings/src/ServerEvent.ts","../src/event-emitter.ts","../src/editor.ts","../../bindings/src/ClientRequestEvent.ts","../src/types/connection.ts","../../bindings/src/ClientRegisterPayload.ts","../../bindings/src/SetBoardIdPayload.ts","../../bindings/src/ClientEvent.ts","../src/connection.ts","../src/types/bridge.ts","../src/bridge.ts","../src/plugin.ts"],"sourcesContent":[],"mappings":";KAEY,SAAA,sCAAgD,MAAM,aAAa;AAAnE,KAA2F,UAAA,GAAlF;EAA6C,CAAA,GAAA,EAAA,MAAA,CAAA,EAAmE,SAAnE;CAAN;;;AAAhD,KCCA,mBAAA,GDDS;EAA6C,OAAA,EAAA,mBAAA;EAAN,OAAA,ECCe,SDDf;CAAmB;;;KEAnE,YAAA;EFAA,EAAA,EAAA,MAAA;EAAsD,IAAA,EAAA,MAAA;EAAN,IAAA,EAAA,MAAA;EAAmB,KAAA,EAAA,MAAA;EAAU,QAAA,EAAA,MAAA;EAAc,QAAA,EAAA,MAAU,GAAA,IAAA;gCEA4C,MAAM;ADCnK,CAAA;;;KEDY,WAAA;EHAA,KAAA,EAAA,MAAS,GAAA,IAAA;CAA6C;;;KIAtD,UAAA;EJAA,EAAA,EAAA,MAAA,GAAS,IAAA;EAA6C,IAAA,EAAA,MAAA;EAAN,OAAA,EAAA,MAAA;EAAmB,KAAA,EAAA,MAAA,GAAA,IAAA;EAAU,KAAA,EAAA,MAAA,GAAA,IAAA;EAAc,IAAA,EAAA,MAAA,GAAU,IAAA;;;;KKArG,SAAA;;;ALAA,KMCA,WAAA,GNDS;EAA6C,KAAA,EAAA,MAAA,GAAA,IAAA;EAAN,KAAA,EMCH,SNDG,GAAA,IAAA;EAAmB,IAAA,EAAA,MAAA,GAAA,IAAA;EAAU,KAAA,EAAA,MAAA,GAAA,IAAA;EAAc,IAAA,EAAA,MAAA,GAAU,IAAA;;;;AAArD,KOGhD,mBAAA,GPHgD;EAAmB,EAAA,EAAA,MAAA,GAAA,IAAA;EAAU,KAAA,EOG3B,WPH2B,GAAA,IAAA;EAAc,IAAA,EOGf,UPHyB,GAAA,IAAA;SOGC;;;;APHtG,KQCA,eAAA,GRDS;EAA6C,EAAA,EAAA,MAAA;EAAN,OAAA,EAAA,MAAA;EAAmB,GAAA,EAAA,MAAA;EAAU,GAAA,EAAA,MAAA;EAAc,KAAA,EQCT,mBRDuC;;;;KSAzH,UAAA;ETAA,OAAA,EAAA,MAAS;EAA6C,QAAA,EAAA,MAAA;EAAN,IAAA,EAAA,MAAA,GAAA,IAAA;EAAmB,IAAA,EAAA,MAAA,GAAA,IAAA;CAAU;;;AAAvB,KUEtD,gBAAA,GVFsD;EAAN,OAAA,EAAA,MAAA;EAAmB,IAAA,EUEvB,UVFuB,GAAA,IAAA;EAAU,KAAA,EUEP,KVFO,CUED,eVFC,CAAA;AAAE,CAAA;;;KWA/E,YAAA;EXAA,EAAA,EAAA,MAAA;EAAsD,IAAA,EAAA,MAAA;EAAN,IAAA,EAAA,MAAA;EAAmB,SAAA,EAAA,MAAA;EAAU,OAAA,EAAA,MAAA;AAAE,CAAA;;;KYA/E,YAAA;EZAA,SAAA,EAAA,MAAS;EAA6C,IAAA,EAAA,MAAA,GAAA,IAAA;EAAN,IAAA,EAAA,MAAA,GAAA,IAAA;CAAmB;;;KaAnE,WAAA;EbAA,SAAA,EAAA,MAAS;EAA6C,OAAA,EAAA,MAAA,GAAA,IAAA;EAAN,UAAA,EAAA,MAAA,GAAA,IAAA;EAAmB,eAAA,EAAA,MAAA,GAAA,IAAA;EAAU,gBAAA,EAAA,MAAA,GAAA,IAAA;EAAc,mBAAU,EAAA,MAAoB,GAAA,IAAA;;;;ACCrI,CAAA;;;ADD4D,KcGhD,iBAAA,GdHgD;EAAmB,UAAA,EAAA,MAAA;EAAU,SAAA,EAAA,MAAA;EAAc,OAAA,EAAA,MAAU;UcGf,MAAM;UAA2B;SAAqB;AbFxJ,CAAA;;;KcOY,WAAA;;EdPA,MAAA,EAAA,MAAA;UcO4D;;;EbR5D,OAAA,EAAA,cAAY;;WaQkI;;EZR9I,OAAA,EAAA,cAAW;;WYQoM;;EXR/M,OAAA,EAAA,mBAAU;;WWQ2Q;;EVRrR,OAAA,EAAA,gBAAS;WUQiU;;;ETP1U,OAAA,ESO+X,iBTPlV;;;;ACEzD,CAAA,GAAY;EAAkD,OAAA,EAAA,YAAA;EAA0B,OAAA,EQK8Z,gBRL9Z;CAA0B,GAAA;EAAW,OAAA,EAAA,YAAA;WQKib,MAAM;;;EPPxiB,OAAA,EOOgmB,WPPjlB;;;WOOqoB;ANRhqB,CAAA,GAAY;;;;;ATAA,KgBAA,QhBAS,CAAA,CAAA,CAAA,GAAA,CAAA,OAAA,EgBAe,ChBAf,EAAA,GAAA,IAAA;;;KiBGhB,WAAA,GjBH6D,GAAA,GAAA,OAAA;AAAN,ciBU/C,MAAA,CjBV+C;EAAmB,QAAA,UAAA;EAAU,QAAA,MAAA;EAAc,QAAA,MAAU;;;;ECCrG,mBAAA,CAAA,CAAA,CAAmB,CAAA,QAAA,EgBkEU,QhBlEkC,CgBkEzB,ChBlEyB,CAAS,CAAA,EgBkEhC,OhBlEgC,CAAA,GAAA,GAAA,IAAA,CAAA;yBgBsE3D,iBAAiB;uBAQb,QAAQ;wBAqBb;EfpGZ,iBAAY,CAAA,CAAA,Ee4GC,Of5G0I,CeoGhI,mBAAA,CfpG+H;0BemHlI,YAAS;;;;KCnH7B,kBAAA;ElBAA,OAAA,EAAA,mBAAS;EAA6C,IAAA,EAAA,MAAA;CAAN;;;AAAA,KmBEhD,OnBFgD,CAAA,UmBE9B,WnBF8B,CAAA,OAAA,CAAA,CAAA,GAAA,CAAA,IAAA,EmBGpD,OnBHoD,CmBG5C,WnBH4C,EAAA;EAAmB,KAAA,EmBGzC,CnBHyC;CAAU,CAAA,EAAA,GAAA,IAAA;KmBuB7E,wBAAsB,+BAA+B,QAC/D;EhBxBU,KAAA,EgByBD,ChBzBC;;;;KiBAA,qBAAA;EpBAA,UAAA,EAAS,MAAA,GAAA,IAAA;EAA6C,IAAA,EAAA,MAAA;CAAN;;;KqBAhD,iBAAA;ErBAA,UAAA,EAAS,MAAA;EAA6C,SAAA,EAAA,MAAA;EAAN,OAAA,EAAA,MAAA;CAAmB;;;AAAnB,KsBGhD,WAAA,GtBHgD;EAAmB,OAAA,EAAA,gBAAA;EAAU,OAAA,EAAA,MAAA;AAAE,CAAA,GAAY;;;;ECC3F,OAAA,EAAA,cAAmB;;WqBEiJ;;EpBHpK,OAAA,EAAA,cAAY;;WoBGyN;;EnBHrO,OAAA,EAAA,mBAAW;;WmBGgS;;ElBH3S,OAAA,EAAA,OAAU;;;;ECAV,OAAA,EAAA,MAAS;;;WiBGua;AhBF5b,CAAA,GAAY;;WgBE6e;;;;AtBH1a,KuBgBnE,gBAAA,GvBhBmE,YAAA,GAAA,WAAA,GAAA,cAAA;KuBkB1E,cAAA,GvBlBoF,CAAA,MAAA,EuBkB1D,gBvBlB0D,EAAA,GAAA,IAAA;AAAE,KuBoBtF,iBAAA,GvBpB4G;;;;ACCrG,csB0BC,UAAA,CtB1BkB;;;;ECDnB,QAAA,eAAY;;;;ECAZ,QAAA,OAAW;;;;ECAX,WAAA,CAAA,OAAU,CAAA,EmBqDC,iBnBrDD;;emB8EP;2BAIY;ElBlFf,QAAA,SAAS;;;;ECCT,KAAA,CAAA,CAAA,EAAA,IAAA;;mBiB6Ja,cAAc;eAIxB,6BACJ,YACE,QAAQ;EhBjKT,QAAA,SAAA;EAAkD,OAAA,CAAA,UgBwMpC,kBhBxMoC,CAAA,CAAA,KAAA,EgByMnD,ChBzMmD,CAAA,EgB0MzD,OhB1MyD,CgB0MjD,ahB1MiD,CgB0MrC,ChB1MqC,CAAA,OAAA,CAAA,CAAA,CAAA;;;;KiBLlD,+BAA+B,2BAChC,cAAc,WAChB,0CACqB,YAAY;AxBD9B,KwBIA,aAAA,GxBJS;EAA6C,YAAA,CAAA,EAAA,MAAA;EAAN,OAAA,CAAA,EAAA,MAAA;EAAmB,KAAA,CAAA,EAAA,OAAA;CAAU;AAAc,KwBU3F,WAAA,GxBVqG;;;;ECCrG,UAAA,CAAA,EAAA,OAAA;;KuBgBA;;EtBjBA,OAAA,EsBmBD,CtBnBC;QsBoBJ;;ApBpBI,UoB6BK,aAAA,CpB7BK;;;;ECAV,mBAAS,EAAA;;;;ACCT,UkBiCK,cAAA,ClBjCwC;;;;ECE7C,mBAAA,EAAA;IAAkD,QAAA,EAAA,MAAA,GAAA,IAAA;EAA0B,CAAA;;AAAqC,KiBoCjH,WjBpCiH,CAAA,UAAA,MiBoCrF,ajBpCqF,CAAA,GiBqC3H,CjBrC2H,SAAA,MiBqC3G,cjBrC2G,GiBqC1F,cjBrC0F,CiBqC3E,CjBrC2E,CAAA,GAAA,KAAA;;;APHjH,cyBUC,MzBVQ,CAAA,UAAA,MyBUe,azBVf,GAAA,MyBUqC,azBVrC,CAAA,CAAA;EAA6C,QAAA,OAAA;EAAN,QAAA,QAAA;EAAmB,QAAA,eAAA;EAAU,QAAA,SAAA;EAAc,QAAA,QAAU;;;wByBmB1F;ExBlBX,QAAA,IAAA;;;;ECDA,SAAA,CAAA,aAAY,EuBmDG,iBvBnDkI,CAAA,EAAA,IAAK;;;;ECAtJ,QAAA,eAAW;;;;ECAX,QAAA,aAAU;;;;ECAV,IAAA,CAAA,IAAA,EAAA,MAAS,EAAA,OAAA,CAAA,EAAA,OAAA,CAAA,EAAA,IAAA;;;;ECCT,OAAA,CAAA,IAAA,EmBkKF,CnBlKa,EAAA,OAAA,EmBmKV,anBnKqD,CmBmKvC,CnBnKuC,CAAA,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EmBqK7D,OnBrK6D,CmBqKrD,WnBrKqD,CmBqKzC,CnBrKyC,CAAA,CAAA;;;;ECEtD,QAAA,YAAA;EAAkD;;;EAA+D,QAAA,cAAA;;;;ECFjH,EAAA,CAAA,IAAA,EiB+PD,CjB/PC,EAAA,OAAe,EiB+PJ,cjB/PuE,CiB+PxD,CjB/PwD,CAAA,CAAA,EAAA,GAAA,GAAA,IAAmB;;;;ECDrG,GAAA,CAAA,IAAA,EAAA,MAAU,CAAA,EAAA,IAAA;;;;ECEV,IAAA,CAAA,IAAA,Ee6QC,Cf7QD,EAAA,OAAgB,Ee6QH,cf7QG,Ce6QY,Cf7QZ,CAAA,CAAA,EAAA,GAAA,GAAA,IAAA;EAA4B;;;EAA+B,OAAA,CAAA,CAAA,EAAA,IAAA;;;;AVFrB,K0BEtD,U1BFsD,CAAA,CAAA,CAAA,GAAA;EAAN,OAAA,EAAA,MAAA;EAAmB,QAAA,E0BInE,C1BJmE;CAAU;AAAc,U0BOtF,M1BPgG,CAAA,CAAA,CAAA,CAAA;;qB0BS5F,WAAW;;AzBRpB,cyBWC,QAAA,CzBXkB;;;;ECDnB,QAAA,YAAY;;;;ECAZ,QAAA,cAAW;4BuBwEK,OAAO;6BAIA,SAAS,KAAE;mCAUL,SAAS,KAAE;EtBtFxC,YAAA,CAAU,UsB0FG,StB1FH,CAAA,CAAA,IAAA,EsB0FoB,CtB1FpB,CAAA,EAAA,IAAA;uBsBsGG,QAZkB,mBAAA;8BAuBP,iBAAiB,IAAC;;ArBjH1C,cqB8HC,QrB9HQ,EqB8HA,QrB9HA"}
1
+ {"version":3,"file":"index.d.mts","names":["ClientRequestEvent","ClientRegisterPayload","JsonValue","Array","JsonObject","SetBoardIdPayload","ClientRegisterPayload","JsonValue","SetBoardIdPayload","ClientEvent","ConnectionRejectedReason","GetActionDto","Array","GetColorDto","GetIconDto","TextAlign","TextAlign","GetTitleDto","GetColorDto","GetIconDto","GetTitleDto","GetStateSnapshotDto","GetStateSnapshotDto","GetItemStateDto","GetPageDto","GetItemStateDto","GetPageDto","GetBoardStateDto","Array","GetClientDto","GetLayoutDto","GetStyleDto","GetBoardStateDto","GetLayoutDto","GetStyleDto","GetClientStateDto","Array","ConnectionRejectedReason","GetActionDto","GetBoardStateDto","GetClientDto","GetClientStateDto","GetItemStateDto","GetLayoutDto","GetStyleDto","JsonValue","ServerEvent","Array","JsonValue","ServerResponseEvent"],"sources":["../../bindings/dist/ClientRequestEvent.d.ts","../../bindings/dist/ClientRegisterPayload.d.ts","../../bindings/dist/JsonValue.d.ts","../../bindings/dist/SetBoardIdPayload.d.ts","../../bindings/dist/ClientEvent.d.ts","../../bindings/dist/ConnectionRejectedReason.d.ts","../../bindings/dist/GetActionDto.d.ts","../../bindings/dist/GetColorDto.d.ts","../../bindings/dist/GetIconDto.d.ts","../../bindings/dist/TextAlign.d.ts","../../bindings/dist/GetTitleDto.d.ts","../../bindings/dist/GetStateSnapshotDto.d.ts","../../bindings/dist/GetItemStateDto.d.ts","../../bindings/dist/GetPageDto.d.ts","../../bindings/dist/GetBoardStateDto.d.ts","../../bindings/dist/GetClientDto.d.ts","../../bindings/dist/GetLayoutDto.d.ts","../../bindings/dist/GetStyleDto.d.ts","../../bindings/dist/GetClientStateDto.d.ts","../../bindings/dist/ServerEvent.d.ts","../../bindings/dist/ServerResponseEvent.d.ts","../src/connection.ts","../src/iframe-bridge.ts","../src/editor.ts","../src/plugin.ts"],"sourcesContent":["export type ClientRequestEvent = {\n \"event\": \"getPluginSettings\";\n name: string;\n};\n//# sourceMappingURL=ClientRequestEvent.d.ts.map","export type ClientRegisterPayload = {\n clientUuid: string | null;\n name: string;\n};\n//# sourceMappingURL=ClientRegisterPayload.d.ts.map","export type JsonValue = null | string | number | boolean | Array<JsonValue> | JsonObject;\nexport type JsonObject = {\n [key: string]: JsonValue;\n};\n//# sourceMappingURL=JsonValue.d.ts.map","export type SetBoardIdPayload = {\n clientUuid: string;\n profileId: number;\n boardId: number;\n};\n//# sourceMappingURL=SetBoardIdPayload.d.ts.map","import type { ClientRegisterPayload } from \"./ClientRegisterPayload\";\nimport type { JsonValue } from \"./JsonValue\";\nimport type { SetBoardIdPayload } from \"./SetBoardIdPayload\";\nexport type ClientEvent = {\n \"event\": \"editorRegister\";\n payload: string;\n} | {\n \"event\": \"pluginRegister\";\n payload: string;\n} | {\n \"event\": \"sendToPlugin\";\n name: string;\n payload: JsonValue;\n} | {\n \"event\": \"sendToEditor\";\n name: string;\n payload: JsonValue;\n} | {\n \"event\": \"setPluginSettings\";\n name: string;\n payload: JsonValue;\n} | {\n \"event\": \"press\";\n payload: number;\n} | {\n \"event\": \"release\";\n payload: number;\n} | {\n \"event\": \"setBoardId\";\n payload: SetBoardIdPayload;\n} | {\n \"event\": \"clientRegister\";\n payload: ClientRegisterPayload;\n};\n//# sourceMappingURL=ClientEvent.d.ts.map","export type ConnectionRejectedReason = \"Blocked\" | \"Denied\";\n//# sourceMappingURL=ConnectionRejectedReason.d.ts.map","export type GetActionDto = {\n id: number;\n uuid: string;\n type: string;\n group: string;\n position: number;\n settings: string | null;\n children: {\n [key in string]?: Array<GetActionDto>;\n };\n};\n//# sourceMappingURL=GetActionDto.d.ts.map","export type GetColorDto = {\n value: string | null;\n};\n//# sourceMappingURL=GetColorDto.d.ts.map","export type GetIconDto = {\n id: number | null;\n path: string;\n version: number;\n color: string | null;\n scale: number | null;\n mode: string | null;\n};\n//# sourceMappingURL=GetIconDto.d.ts.map","export type TextAlign = \"top\" | \"middle\" | \"bottom\";\n//# sourceMappingURL=TextAlign.d.ts.map","import type { TextAlign } from \"./TextAlign\";\nexport type GetTitleDto = {\n value: string | null;\n align: TextAlign | null;\n font: string | null;\n color: string | null;\n size: number | null;\n};\n//# sourceMappingURL=GetTitleDto.d.ts.map","import type { GetColorDto } from \"./GetColorDto\";\nimport type { GetIconDto } from \"./GetIconDto\";\nimport type { GetTitleDto } from \"./GetTitleDto\";\nexport type GetStateSnapshotDto = {\n id: number | null;\n title: GetTitleDto | null;\n icon: GetIconDto | null;\n color: GetColorDto | null;\n};\n//# sourceMappingURL=GetStateSnapshotDto.d.ts.map","import type { GetStateSnapshotDto } from \"./GetStateSnapshotDto\";\nexport type GetItemStateDto = {\n id: number;\n boardId: number;\n row: number;\n col: number;\n state: GetStateSnapshotDto;\n};\n//# sourceMappingURL=GetItemStateDto.d.ts.map","export type GetPageDto = {\n boardId: number;\n position: number;\n name: string | null;\n icon: string | null;\n};\n//# sourceMappingURL=GetPageDto.d.ts.map","import type { GetItemStateDto } from \"./GetItemStateDto\";\nimport type { GetPageDto } from \"./GetPageDto\";\nexport type GetBoardStateDto = {\n boardId: number;\n page: GetPageDto | null;\n items: Array<GetItemStateDto>;\n};\n//# sourceMappingURL=GetBoardStateDto.d.ts.map","export type GetClientDto = {\n id: number;\n uuid: string;\n name: string;\n profileId: number;\n boardId: number;\n /**\n * Whether the Client currently has a live Connection. Derived from the\n * Session Registry, never persisted (see ADR-0007). Defaults to `false`\n * for single-client reads that do not compute Presence.\n */\n online: boolean;\n};\n//# sourceMappingURL=GetClientDto.d.ts.map","export type GetLayoutDto = {\n profileId: number;\n rows: number | null;\n cols: number | null;\n};\n//# sourceMappingURL=GetLayoutDto.d.ts.map","export type GetStyleDto = {\n profileId: number;\n spacing: number | null;\n itemBorder: number | null;\n itemBorderColor: string | null;\n itemBorderRadius: number | null;\n itemBackgroundColor: string | null;\n itemBackgroundImage: string | null;\n backgroundImage: string | null;\n backgroundColor: string | null;\n};\n//# sourceMappingURL=GetStyleDto.d.ts.map","import type { GetBoardStateDto } from \"./GetBoardStateDto\";\nimport type { GetLayoutDto } from \"./GetLayoutDto\";\nimport type { GetStyleDto } from \"./GetStyleDto\";\nexport type GetClientStateDto = {\n clientUuid: string;\n profileId: number;\n boardId: number;\n boards: Array<GetBoardStateDto>;\n layout: GetLayoutDto;\n style: GetStyleDto;\n};\n//# sourceMappingURL=GetClientStateDto.d.ts.map","import type { ConnectionRejectedReason } from \"./ConnectionRejectedReason\";\nimport type { GetActionDto } from \"./GetActionDto\";\nimport type { GetBoardStateDto } from \"./GetBoardStateDto\";\nimport type { GetClientDto } from \"./GetClientDto\";\nimport type { GetClientStateDto } from \"./GetClientStateDto\";\nimport type { GetItemStateDto } from \"./GetItemStateDto\";\nimport type { GetLayoutDto } from \"./GetLayoutDto\";\nimport type { GetStyleDto } from \"./GetStyleDto\";\nimport type { JsonValue } from \"./JsonValue\";\nexport type ServerEvent = {\n \"event\": \"connectionPending\";\n} | {\n \"event\": \"connectionRejected\";\n reason: ConnectionRejectedReason;\n} | {\n \"event\": \"clientDeleted\";\n} | {\n \"event\": \"trigger\";\n itemId: number;\n action: GetActionDto;\n kind: string;\n} | {\n \"event\": \"sendToPlugin\";\n name: string;\n payload: JsonValue;\n} | {\n \"event\": \"sendToEditor\";\n name: string;\n payload: JsonValue;\n} | {\n \"event\": \"setPluginSettings\";\n name: string;\n payload: JsonValue;\n} | {\n \"event\": \"clientRegister\";\n payload: GetClientDto;\n} | {\n \"event\": \"clientState\";\n payload: GetClientStateDto;\n} | {\n \"event\": \"profileChanged\";\n payload: number;\n} | {\n \"event\": \"boardState\";\n payload: GetBoardStateDto;\n} | {\n \"event\": \"itemsState\";\n payload: Array<GetItemStateDto>;\n} | {\n \"event\": \"styleState\";\n payload: GetStyleDto;\n} | {\n \"event\": \"layoutState\";\n payload: GetLayoutDto;\n} | {\n \"event\": \"currentStateChanged\";\n};\n//# sourceMappingURL=ServerEvent.d.ts.map","import type { JsonValue } from \"./JsonValue\";\nexport type ServerResponseEvent = {\n \"event\": \"getPluginSettings\";\n payload: JsonValue;\n};\n//# sourceMappingURL=ServerResponseEvent.d.ts.map"],"mappings":";KAAYA,kBAAAA;EAAAA,OAAAA,EAAAA,mBAAkB;;;;;KCAlBC,qBAAAA;EDAAD,UAAAA,EAAAA,MAAAA,GAAkB,IAAA;;;;;KEAlBE,SAAAA,sCAA+CC,MAAMD,aAAaE;AFAlEJ,KECAI,UAAAA,GFDkB;iBEEXF;;;;KCFPG,iBAAAA;EHAAL,UAAAA,EAAAA,MAAAA;;;;;;KIGAS,WAAAA;;EHHAR,OAAAA,EAAAA,MAAAA;;;;ACAZ,CAAA,GAAYC;EAAqDA,OAAAA,EAAAA,cAAAA;EAANC,IAAAA,EAAAA,MAAAA;EAAmBC,OAAAA,EEYjEG,SFZiEH;CAAU,GAAA;EAC5EA,OAAAA,EAAAA,cAAU;;WEeTG;;EDhBDF,OAAAA,EAAAA,mBAAiB;;WCoBhBE;;EAjBDE,OAAAA,EAAAA,OAAW;EASVF,OAAAA,EAAAA,MAAAA;CAIAA,GAAAA;EAIAA,OAAAA,EAAAA,SAAAA;EASAC,OAAAA,EAAAA,MAAAA;CAGAF,GAAAA;EAAqB,OAAA,EAAA,YAAA;WAHrBE;;;EC7BDE,OAAAA,EDgCCJ,qBChCuB;;;;KAAxBI,wBAAAA;;;KCAAC,YAAAA;ENAAX,EAAAA,EAAAA,MAAAA;;;;ECAAC,QAAAA,EAAAA,MAAAA;;gCKQcW,MAAMD,eJRpBT;CAAqDA;;;KKArDW,WAAAA;EPAAb,KAAAA,EAAAA,MAAAA,GAAAA,IAAAA;;;;KQAAc,UAAAA;ERAAd,EAAAA,EAAAA,MAAAA,GAAAA,IAAAA;;;;ECAAC,KAAAA,EAAAA,MAAAA,GAAAA,IAAAA;;;;;KQAAc,SAAAA;;;ATAAf,KUCAiB,WAAAA,GVDkB;;SUGnBD;;ETHCf,KAAAA,EAAAA,MAAAA,GAAAA,IAAAA;;;;;KUGAoB,mBAAAA;;EVHApB,KAAAA,EUKDmB,WVLCnB,GAAAA,IAAqB;QUMvBkB;SACCD;;;;AXPClB,KYCAuB,eAAAA,GZDkB;;;;ECAlBtB,GAAAA,EAAAA,MAAAA;SWMDqB;;;;KCNCE,UAAAA;EbAAxB,OAAAA,EAAAA,MAAAA;;;;ACAZ,CAAA;;;KaEY2B,gBAAAA;;QAEFD;EbJEzB,KAAAA,EaKD2B,KbLC3B,CaKKwB,ebLgB,CAAA;;;;KcArBI,YAAAA;EfAA7B,EAAAA,EAAAA,MAAAA;;;;ECAAC,OAAAA,EAAAA,MAAAA;;;;ACAZ;;EAA2DE,MAAAA,EAAAA,OAAAA;CAAmBC;;;KcAlE0B,YAAAA;EhBAA9B,SAAAA,EAAAA,MAAAA;;;;;;KiBAA+B,WAAAA;EjBAA/B,SAAAA,EAAAA,MAAAA;;;;ECAAC,gBAAAA,EAAAA,MAAqB,GAAA,IAAA;;;;ECArBC,eAAS,EAAA,MAAA,GAAA,IAAA;CAA4CA;;;KgBGrDiC,iBAAAA;;EjBHAlC,SAAAA,EAAAA,MAAAA;;UiBOAmC,MAAMJ;UACNC;EhBRA/B,KAAAA,EgBSDgC,WhBTU;CAA4ChC;;;AAArDA,KiBSA4C,WAAAA,GjBTS;EAA4C5C,OAAAA,EAAAA,mBAAAA;CAANC,GAAAA;EAAmBC,OAAAA,EAAAA,oBAAAA;EAAU,MAAA,EiBa5EiC,wBjBb4E;AACxF,CAAA,GAAYjC;;;;ECDAC,MAAAA,EAAAA,MAAAA;UgBmBAiC;;;EfhBA7B,OAAAA,EAAAA,cAAW;EASVF,IAAAA,EAAAA,MAAAA;EAIAA,OAAAA,EeQAsC,SfRAtC;CAIAA,GAAAA;EASAC,OAAAA,EAAAA,cAAAA;EAGAF,IAAAA,EAAAA,MAAAA;EAAqB,OAAA,EeJrBuC,SfIqB;;;;EChCtBnC,OAAAA,EcgCCmC,SdhCDnC;;;WcmCC8B;AbnCb,CAAA,GAAY7B;;WasCC8B;;EZtCD5B,OAAAA,EAAAA,gBAAW;;;;ECAXC,OAAAA,EW4CCyB,gBX5CS;;;WW+CTQ,MAAML;AV/CnB,CAAA,GAAY3B;;WUkDC6B;;ETjDD3B,OAAAA,EAAAA,aAAW;WSoDV0B;;;ARlDb,CAAA;;;AXHY3C,KoBCAiD,mBAAAA,GpBDkB;;WoBGjBD;;;;KCKD,kBAAkB,+BACtB,QAAQ;EpBTJ/C,KAAAA,EoBS0B,CpBT1BA;;KoBYA,sBAAsB,+BAA+B,QAC/D;SACS;AnBdX,CAAA,CAAA;KmBiBK,iBAAA,GnBjB4DC;EAANC,aAAAA,CAAAA,EAAAA,OAAAA;EAAmBC,cAAAA,CAAAA,EAAAA,MAAAA;EAAU,IAAA,CAAA,EAAA,MAAA;AACxF,CAAA;KmBsBY,gBAAA;KAEP,cAAA,YAA0B;cAgBlB,UAAA;ElBzCDC,QAAAA,GAAAA;;;;ECGAI,QAAAA,OAAW;EASVF,QAAAA,MAAAA;EAIAA,QAAAA,eAAAA;EAIAA,QAAAA,OAAAA;EASAC,QAAAA,MAAAA;EAGAF,QAAAA,iBAAAA;EAAqB,QAAA,OAAA;wBiBoCX;;eAyBR;EhB7FHI,cAAAA,CAAAA,QAAAA,EgBiGe,chBjGS,CAAA,EAAA,GAAA,GAAA,IAAA;;;;ECAxBC,oBAAY,CAAA,CAAA,EAAA,IAQQA;;;mBekKP,cAAc;Ed1K3BE,EAAAA,CAAAA,Uc8KG,Wd9KQ,CAAA,OAAA,CAAA,CAAA,CAAA,KAAA,Ec+KZ,Cd/KY,EAAA,OAAA,EcgLV,OdhLU,CcgLF,CdhLE,CAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;oBcoNG,2BACf,IACN,QAAQ,YAAY;;;;KCpNpB,aAAA;EtBFOb,YAAAA,CAAAA,EAAAA,MAAkB;;;;ACA9B,UqBqBU,cAAA,CrBrBEC;;;;ECAAC,mBAAS,EAAA;IAA4CA,EAAAA,EAAAA,MAAAA;EAANC,CAAAA;;UoB0BjD,eAAA,CpB1B8E;EAC5EC,oBAAU,EAAA;;;;ICDVC,QAAAA,EAAAA,MAAiB,GAAA,IAAA;;;KmB+BxB,iBAAA,SAA0B;AlB5B/B,KkB8BK,alB9BOI,CAAAA,UkB8Be,iBlB9BJ,CAAA,GkB+BrB,ClB/BqB,SAAA,MkB+BL,elB/BK,GkB+Ba,elB/Bb,CkB+B6B,ClB/B7B,CAAA,GAAA,KAAA;KkBiClB,clBxBQF,CAAAA,UkBwBiB,iBlBxBjBA,CAAAA,GAAAA,CAAAA,OAAAA,EkByBF,clBzBEA,CkByBa,ClBzBbA,CAAAA,EAAAA,KAAAA,EkB0BJ,YlB1BIA,EAAAA,OAAAA,CAAAA,EAAAA,CAAAA,eAAAA,EkB2BiB,alB3BjBA,CkB2B6B,ClB3B7BA,CAAAA,EAAAA,GAAAA,IAAAA,EAAAA,GAAAA,IAAAA;AAIAA,ckB4BA,YAAA,ClB5BAA;EAIAA,QAAAA,OAAAA;EASAC,QAAAA,QAAAA;EAGAF,QAAAA,eAAAA;EAAqB,QAAA,QAAA;;;wBkBoBX;EjBpDXI,QAAAA,IAAAA;;2BiB+Ee;;EhB/EfC,QAAAA,eAAY;;;;ECAZE,IAAAA,CAAAA,IAAAA,EAAAA,MAAW,EAAA,OAAA,CAAA,EAAA,OAAA,CAAA,EAAA,IAAA;;oBeiLH,yBACV,YACG,eAAe,uBAEvB,QAAQ,cAAY;;EdrLbC,QAAAA,YAAU;;ec0OP,yBACL,YACG,eAAe;;Eb5OhBC,GAAAA,CAAAA,IAAAA,EauPA,iBbvPS,CAAA,EAAA,IAAA;;iBa4PJ,yBACP,YACG,eAAe;;EZ7PhBE,OAAAA,CAAAA,CAAAA,EAAAA,IAAW;;;;AVDvB,KuBKK,UvBLOjB,CAAAA,CAAAA,CAAAA,GAAAA,CAAAA,OAAkB,EuBKD,CvBLC,EAAA,GAAA,IAAA;KuBOzB,WAAA;cAOQ,MAAA;;EtBdDC,QAAAA,MAAAA;;;;ECAAC,OAAAA,CAAAA,CAAAA,EAAAA,IAAS;EAA4CA,QAAAA,4BAAAA;EAANC,mBAAAA,CAAAA,CAAAA,CAAAA,CAAAA,QAAAA,EqB4ExB,UrB5EwBA,CqB4Ef,CrB5EeA,CAAAA,CAAAA,EAAAA,GAAAA,GAAAA,IAAAA;EAAmBC,YAAAA,CAAAA,UqBqFrD,SrBrFqDA,CAAAA,CAAAA,IAAAA,EqBqFpC,CrBrFoCA,CAAAA,EAAAA,IAAAA;EAAU,iBAAA,CAAA,CAAA,EqB6F3D,OrB7F2D,CqB6FnD,SrB7FmD,CAAA;EAC5EA,YAAAA,CAAU,OAAA,EqBoGE,WrBnGLF,CAAAA,EAAS,GAAA,GAAA,IAAA;uBqB2GH,QARU,mBAAA;0BAeH,YAAS;;;;AvBpHzC,KwBIK,QxBJOF,CAAAA,CAAAA,CAAAA,GAAAA,CAAAA,OAAkB,EwBID,CxBJC,EAAA,GAAA,IAAA;KwBMlB;;YAEA;AvBRZ,CAAA;UuBWiB;;qBAEI,WAAW;AtBbhC;AAAiEE,csBgBpD,MAAA,CtBhBoDA;EAANC,QAAAA,UAAAA;EAAmBC,QAAAA,OAAAA;EAAU,QAAA,UAAA;EAC5EA,WAAAA,CAAAA;;;;ECDAC,cAAAA,CAAAA,CAAAA,CAAAA,CAAAA,MAAiB,EqBkED,MrBlEC,CqBkEM,CrBlEN,CAAA,CAAA,EAAA,IAAA;gCqBsES,SAAS,KAAE;mCAWR,SAAS,KAAE;yBAM3B,iBAAiB;EpBpF9BI,iBAAW,CAAA,CAAA,EoB8FE,OpB9FF,CoBoFoB,mBAAA,CpBpFpB;EASVF,iBAAAA,CAAAA,UoB2FuB,SpB3FvBA,CAAAA,CAAAA,IAAAA,EoB2FwC,CpB3FxCA,CAAAA,EoB2FyC,OpB3FzCA,CAAAA,IAAAA,CAAAA;;AAQAA,coB0FA,QpB1FAA,EoB0FQ,MpB1FRA"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{nanoid as e}from"nanoid";var t=class{options;handlers;pendingRequests;requestId;isParent;target;boundHandleMessage;constructor(e={}){this.options={targetOrigin:`*`,timeout:5e3,debug:!1,...e},this.handlers=new Map,this.pendingRequests=new Map,this.requestId=0,this.isParent=window.parent!==window,this.target=null,this.boundHandleMessage=this.handleMessage.bind(this),this.init()}init(){window.addEventListener(`message`,this.boundHandleMessage),this.options.debug&&console.log(`[IframeBridge] Инициализирован`,{isParent:this.isParent,targetOrigin:this.options.targetOrigin})}setTarget(e){e instanceof HTMLIFrameElement?this.target=e.contentWindow:console.error(`[IframeBridge] Неверный элемент iframe`)}getTargetWindow(){return this.isParent?window.parent:this.target?this.target:(console.error(`[IframeBridge] Target не установлен. Используйте setTarget() для родительского окна`),null)}handleMessage(e){if(this.options.targetOrigin!==`*`&&e.origin!==this.options.targetOrigin){this.options.debug&&console.warn(`[IframeBridge] Сообщение от неизвестного origin:`,e.origin);return}let{type:t,payload:n,meta:r}=e.data;if(!t)return;if(this.options.debug&&console.log(`[IframeBridge] Получено сообщение:`,{type:t,payload:n,_meta:r}),r?.isResponse&&r?.requestId!==void 0){this.handleResponse(r.requestId,n);return}let i=this.handlers.get(t);i&&(r?.isRequest&&r?.requestId!==void 0?i(n,e,t=>{this.sendResponse(r.requestId,t,e.source)}):i(n,e))}send(e,t={}){let n=this.getTargetWindow();if(!n)return;let r={type:e,payload:t,meta:{timestamp:Date.now()}};n.postMessage(r,this.options.targetOrigin),this.options.debug&&console.log(`[IframeBridge] Отправлено сообщение:`,r)}request(e,t,n=this.options.timeout){return new Promise((r,i)=>{let a=this.getTargetWindow();if(!a){i(Error(`Target window не найден`));return}let o=++this.requestId,s=window.setTimeout(()=>{this.pendingRequests.delete(o),i(Error(`Request timeout: ${e}`))},n);this.pendingRequests.set(o,{resolve:r,reject:i,timeoutId:s});let c={type:e,payload:t,meta:{requestId:o,isRequest:!0,timestamp:Date.now()}};a.postMessage(c,this.options.targetOrigin),this.options.debug&&console.log(`[IframeBridge] Отправлен запрос:`,c)})}sendResponse(e,t,n){let r={type:`__response__`,payload:t,meta:{requestId:e,isResponse:!0,timestamp:Date.now()}};n.postMessage(r,this.options.targetOrigin),this.options.debug&&console.log(`[IframeBridge] Отправлен ответ:`,r)}handleResponse(e,t,n){let r=this.pendingRequests.get(e);r&&(clearTimeout(r.timeoutId),this.pendingRequests.delete(e),n?r.reject(Error(n)):r.resolve(t))}on(e,t){return this.handlers.set(e,t),()=>this.off(e)}off(e){this.handlers.delete(e)}once(e,t){return this.on(e,(...n)=>{t(...n),this.off(e)})}destroy(){this.handlers.clear(),this.pendingRequests.forEach(({reject:e,timeoutId:t})=>{clearTimeout(t),e(Error(`Bridge destroyed`))}),this.pendingRequests.clear(),window.removeEventListener(`message`,this.boundHandleMessage),this.options.debug&&console.log(`[IframeBridge] Уничтожен`)}},n=t;function r(){return typeof process<`u`?`localhost`:location.hostname}var i=class{url=`ws://${r()}:3001/ws`;ws;handlers=[];pendingRequests=new Map;options={autoreconnect:!0,requestTimeout:3e4};status=`disconnected`;statusListeners=new Set;resolve;reject;connectionPromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});backoff=this.createBackoff();constructor(e={}){for(let t in e){let n=t;e[n]!=null&&(this.options[n]=e[n])}}createBackoff({min:e=1e3,max:t=32e3,factor:n=2}={}){let r=e;return{next(){let e=r;return r=Math.min(r*n,t),e},reset(){r=e}}}getStatus(){return this.status}onStatusChange(e){return this.statusListeners.add(e),()=>{this.statusListeners.delete(e)}}setStatus(e){if(this.status!==e){this.status=e;for(let t of this.statusListeners)t(e)}}reconnect(){this.status===`disconnected`&&this.connect()}connect(){this.setStatus(`connecting`),this.connectionPromise=new Promise((e,t)=>{this.resolve=e,this.reject=t}),this.ws?.close(),this.ws=new WebSocket(this.url),this.ws.onopen=()=>{this.setStatus(`connected`),this.resolve?.(),this.backoff.reset()},this.ws.onmessage=e=>{this.onMessage(e.data)},this.ws.onclose=()=>{this.setStatus(`disconnected`),this.failPendingRequests(Error(`WebSocket connection closed`)),this.options.autoreconnect&&setTimeout(()=>this.reconnect(),this.backoff.next())},this.ws.onerror=e=>{console.error(`WebSocket error:`,e),this.reject?.()}}failPendingRequests(e){for(let t of this.pendingRequests.values())clearTimeout(t.timeoutId),t.reject(e);this.pendingRequests.clear()}close(){this.ws?.close()}async send(e){await this.connectionPromise,this.ws?.send(JSON.stringify(e))}async sendEvent(e){return this.send({type:`event`,event:e})}on(e,t){let n={event:e,handler:t};return this.handlers.push(n),()=>{this.handlers=this.handlers.filter(e=>e!==n)}}onMessage(e){let t=JSON.parse(e);if(t.type===`response`&&t.requestId){let e=this.pendingRequests.get(t.requestId);e&&(clearTimeout(e.timeoutId),this.pendingRequests.delete(t.requestId),e.resolve(t.event));return}if(t.type===`event`){let e=this.handlers.filter(e=>e.event==t.event.event);for(let n of e)n.handler(t.event)}}async request(t){let n=e(),r=new Promise((e,r)=>{let i=setTimeout(()=>{this.pendingRequests.delete(n),r(Error(`Request timeout: ${t.event}`))},this.options.requestTimeout);this.pendingRequests.set(n,{resolve:t=>e(t),reject:r,timeoutId:i})});try{await this.send({type:`request`,requestId:n,event:t})}catch(e){let t=this.pendingRequests.get(n);t&&(clearTimeout(t.timeoutId),this.pendingRequests.delete(n),t.reject(e instanceof Error?e:Error(String(e))))}return r}},a=class{listeners={};emit(e,t){for(let n of this.listeners[e]??[])n(t)}on(e,t){let n=this.listeners[e]??[];return n.push(t),this.listeners[e]=n,()=>{this.listeners[e]=this.listeners[e]?.filter(e=>e!==t)??[]}}},o=class{connection;bridge;params;saveHandler;eventEmitter=new a;constructor(){if(typeof window>`u`)throw Error(`Flux Deck Editor must be used only in plugin editor`);let e=new URLSearchParams(location.search),t=t=>{let n=e.get(t);if(n===null)throw Error(`${t} must be provided`);return n};this.params={id:t(`id`),group:t(`group`)},this.connection=new i,this.connection.connect(),this.connection.sendEvent({event:`editorRegister`,payload:this.params.group}),this.connection.on(`sendToEditor`,e=>{this.eventEmitter.emit(`sendToEditor`,e.payload)}),this.bridge=new n,this.bridge.on(`SET_ACTION_SETTINGS`,(e,t,n)=>{if(e.id==this.params.id&&this.saveHandler){let e=this.saveHandler();try{let t=JSON.stringify(e);n?.({settings:t})}catch(e){console.error(e),n?.({settings:null})}}})}async onRecieveFromPlugin(e){return this.eventEmitter.on(`sendToEditor`,e)}sendToPlugin(e){this.connection.sendEvent({event:`sendToPlugin`,name:this.params.group,payload:e})}async getActionSettings(){return(e=>{try{return typeof e==`string`?JSON.parse(e):{}}catch(e){return console.error(e),{}}})((await this.bridge.request(`GET_ACTION_SETTINGS`,{id:this.params.id})).settings)}onActionSave(e){return this.saveHandler=e,()=>{this.saveHandler=void 0}}async getPluginSettings(){return await this.connection.request({name:this.params.group,event:`getPluginSettings`})}async setPluginSettings(e){return this.connection.sendEvent({name:this.params.group,event:`setPluginSettings`,payload:e})}},s=class{connection;actions=[];pluginName;eventEmitter=new a;constructor(){typeof process<`u`&&(this.pluginName=process?.argv[2]),this.connection=new i}connect(){if(typeof process<`u`&&!this.pluginName)throw Error(`No plugin name`);this.connection.on(`trigger`,e=>{for(let t of this.actions)t.name==e.action.type&&t.onTrigger?.({trigger:e.kind,settings:this.parseSettings(e.action.settings)})}),this.connection.on(`setPluginSettings`,e=>{this.eventEmitter.emit(`setPluginSettings`,e.payload)}),this.connection.on(`sendToPlugin`,e=>{this.eventEmitter.emit(`sendToPlugin`,e.payload)}),this.connection.connect(),this.pluginName&&this.registerPlugin(this.pluginName)}parseSettings(e){try{return JSON.parse(e??`{}`)}catch(e){return console.error(e),{}}}registerPlugin(e){this.connection.sendEvent({event:`pluginRegister`,payload:e})}registerAction(e){this.actions.push(e)}async onSetSettings(e){let t=this.eventEmitter.on(`setPluginSettings`,e);return e((await this.getPluginSettings()).payload),t}async onRecieveFromEditor(e){return this.eventEmitter.on(`sendToPlugin`,e)}sendToEditor(e){if(!this.pluginName)throw Error(`No plugin name`);this.connection.sendEvent({event:`sendToEditor`,name:this.pluginName,payload:e})}async getPluginSettings(){if(!this.pluginName)throw Error(`No plugin name`);return this.connection.request({name:this.pluginName,event:`getPluginSettings`})}async setPluginSettings(e){if(!this.pluginName)throw Error(`No plugin name`);return this.connection.sendEvent({name:this.pluginName,event:`setPluginSettings`,payload:e})}};const c=new s;export{t as Bridge,i as Connection,o as Editor,s as FluxDeck,c as fluxDeck};
1
+ import{nanoid as e}from"nanoid";var t=class{pending=new Map;create(t){let n=e();return{id:n,promise:new Promise((e,r)=>{let i=setTimeout(()=>{this.pending.delete(n),r(Error(`Request timed out`))},t);this.pending.set(n,{resolve:t=>e(t),reject:r,timeoutId:i})})}}resolve(e,t){let n=this.pending.get(e);n&&(clearTimeout(n.timeoutId),this.pending.delete(e),n.resolve(t))}reject(e,t){let n=this.pending.get(e);n&&(clearTimeout(n.timeoutId),this.pending.delete(e),n.reject(t))}rejectAll(e){for(let t of this.pending.values())clearTimeout(t.timeoutId),t.reject(e);this.pending.clear()}};function n(e){if(e.port!=null)return`ws://localhost:${e.port}/ws`;if(typeof location<`u`&&location.host)return`ws://${location.host}/ws`;throw Error(`Port must be set for Node connection`)}var r=class{url;ws;handlers=new Map;pendingRequests=new t;options;status=`disconnected`;statusListeners=new Set;resolve;reject;connectionPromise=new Promise((e,t)=>{this.resolve=e,this.reject=t});backoff=this.createBackoff();constructor(e={}){this.options={autoreconnect:e.autoreconnect??!0,requestTimeout:e.requestTimeout??3e4,port:e.port},this.url=n(e)}createBackoff({min:e=1e3,max:t=32e3,factor:n=2}={}){let r=e;return{next(){let e=r;return r=Math.min(r*n,t),e},reset(){r=e}}}getStatus(){return this.status}onStatusChange(e){return this.statusListeners.add(e),()=>{this.statusListeners.delete(e)}}setStatus(e){if(this.status!==e){this.status=e;for(let t of this.statusListeners)t(e)}}reconnect(){this.status===`disconnected`&&this.connect()}connect(){this.setStatus(`connecting`),this.connectionPromise=new Promise((e,t)=>{this.resolve=e,this.reject=t}),this.ws?.close(),this.ws=new WebSocket(this.url),this.ws.onopen=()=>{this.setStatus(`connected`),this.resolve?.(),this.backoff.reset()},this.ws.onmessage=e=>{this.onMessage(e.data)},this.ws.onclose=()=>{this.setStatus(`disconnected`),this.pendingRequests.rejectAll(Error(`WebSocket connection closed`)),this.options.autoreconnect&&setTimeout(()=>this.reconnect(),this.backoff.next())},this.ws.onerror=e=>{console.error(`WebSocket error:`,e),this.reject?.(Error(`WebSocket error`))}}disableAutoreconnect(){this.options.autoreconnect=!1}close(){this.ws?.close()}async send(e){await this.connectionPromise,this.ws?.send(JSON.stringify(e))}async sendEvent(e){return this.send({type:`event`,event:e})}on(e,t){let n=this.handlers.get(e);n||(n=new Set,this.handlers.set(e,n));let r=t;return n.add(r),()=>{n.delete(r)}}onMessage(e){let t=JSON.parse(e);if(t.type===`response`&&t.requestId){this.pendingRequests.resolve(t.requestId,t.event);return}if(t.type===`event`){let e=this.handlers.get(t.event.event);if(e)for(let n of e)n(t.event)}}async request(e){let{id:t,promise:n}=this.pendingRequests.create(this.options.requestTimeout);try{await this.send({type:`request`,requestId:t,event:e})}catch(e){this.pendingRequests.reject(t,e instanceof Error?e:Error(String(e)))}return n}},i=class{options;handlers=new Map;pendingRequests=new t;isParent;target;boundHandleMessage;constructor(e={}){this.options={targetOrigin:`*`,timeout:5e3,debug:!1,...e},this.isParent=window.parent!==window,this.target=null,this.boundHandleMessage=this.handleMessage.bind(this),this.init()}init(){window.addEventListener(`message`,this.boundHandleMessage),this.options.debug&&console.log(`[IframeBridge] Initialized`,{isParent:this.isParent,targetOrigin:this.options.targetOrigin})}setTarget(e){e instanceof HTMLIFrameElement?this.target=e.contentWindow:console.error(`[IframeBridge] Invalid iframe element`)}getTargetWindow(){return this.isParent?window.parent:this.target?this.target:(console.error(`[IframeBridge] Target is not set. Call setTarget() on the parent window`),null)}handleMessage(e){if(this.options.targetOrigin!==`*`&&e.origin!==this.options.targetOrigin){this.options.debug&&console.warn(`[IframeBridge] Message from unknown origin:`,e.origin);return}let{type:t,payload:n,meta:r}=e.data;if(!t)return;if(this.options.debug&&console.log(`[IframeBridge] Received message:`,{type:t,payload:n,meta:r}),r?.isResponse&&r.requestId!==void 0){this.pendingRequests.resolve(r.requestId,n);return}let i=this.handlers.get(t);if(i)if(r?.isRequest&&r.requestId!==void 0){let{requestId:a}=r,o=e.source;i(n,e,e=>{this.sendResponse(t,a,e,o)})}else i(n,e)}send(e,t={}){let n=this.getTargetWindow();if(!n)return;let r={type:e,payload:t,meta:{timestamp:Date.now()}};n.postMessage(r,this.options.targetOrigin),this.options.debug&&console.log(`[IframeBridge] Sent message:`,r)}request(e,t,n=this.options.timeout){let r=this.getTargetWindow();if(!r)return Promise.reject(Error(`Target window not found`));let{id:i,promise:a}=this.pendingRequests.create(n),o={type:e,payload:t,meta:{requestId:i,isRequest:!0,timestamp:Date.now()}};return r.postMessage(o,this.options.targetOrigin),this.options.debug&&console.log(`[IframeBridge] Sent request:`,o),a}sendResponse(e,t,n,r){let i={type:e,payload:n,meta:{requestId:t,isResponse:!0,timestamp:Date.now()}};r.postMessage(i,this.options.targetOrigin),this.options.debug&&console.log(`[IframeBridge] Sent response:`,i)}on(e,t){return this.handlers.set(e,t),()=>this.off(e)}off(e){this.handlers.delete(e)}once(e,t){return this.on(e,(...n)=>{t(...n),this.off(e)})}destroy(){this.handlers.clear(),this.pendingRequests.rejectAll(Error(`Bridge destroyed`)),window.removeEventListener(`message`,this.boundHandleMessage),this.options.debug&&console.log(`[IframeBridge] Destroyed`)}};function a(e){try{return JSON.parse(e??`{}`)}catch(e){return console.error(e),{}}}function o(e){return JSON.stringify(e)}function s(e,t){return{get(){return e.request({name:t,event:`getPluginSettings`})},set(n){return e.sendEvent({name:t,event:`setPluginSettings`,payload:n})}}}var c=class{connection;bridge;params;saveHandler;constructor(){if(typeof window>`u`)throw Error(`Flux Deck Editor must be used only in plugin editor`);let e=new URLSearchParams(location.search),t=t=>{let n=e.get(t);if(n===null)throw Error(`${t} must be provided`);return n};this.params={id:t(`id`),group:t(`group`)},this.connection=new r,this.bridge=new i,this.bridge.on(`SAVE_ACTION_SETTINGS`,(e,t,n)=>{if(e.id==this.params.id&&this.saveHandler){let e=this.saveHandler();try{n?.({settings:o(e)})}catch(e){console.error(e),n?.({settings:null})}}})}connect(){this.connection.on(`sendToEditor`,e=>{this.onReceiveFromPluginListeners.forEach(t=>{t(e.payload)})}),this.connection.connect(),this.connection.sendEvent({event:`editorRegister`,payload:this.params.group})}onReceiveFromPluginListeners=new Set;onReceiveFromPlugin(e){return this.onReceiveFromPluginListeners.add(e),()=>{this.onReceiveFromPluginListeners.delete(e)}}sendToPlugin(e){this.connection.sendEvent({event:`sendToPlugin`,name:this.params.group,payload:e})}async getActionSettings(){return a((await this.bridge.request(`GET_ACTION_SETTINGS`,{id:this.params.id})).settings)}onActionSave(e){return this.saveHandler=e,()=>{this.saveHandler=void 0}}async getPluginSettings(){return await this.connection.request({name:this.params.group,event:`getPluginSettings`})}async setPluginSettings(e){return this.connection.sendEvent({name:this.params.group,event:`setPluginSettings`,payload:e})}},l=class{connection;actions=[];pluginName;constructor(){if(typeof process<`u`){this.pluginName=process?.argv[2];let e=Number(process?.argv[3]);this.connection=new r(Number.isNaN(e)?{}:{port:e})}else this.connection=new r}connect(){this.ensurePluginName(),this.connection.on(`trigger`,e=>{for(let t of this.actions)t.name==e.action.type&&t.onTrigger?.({trigger:e.kind,settings:a(e.action.settings)})}),this.connection.connect(),this.pluginName&&this.registerPlugin(this.pluginName)}ensurePluginName(){if(!this.pluginName)throw Error(`No plugin name`);return this.pluginName}registerPlugin(e){this.connection.sendEvent({event:`pluginRegister`,payload:e})}registerAction(e){this.actions.push(e)}async onPluginSettings(e){let t=this.ensurePluginName(),n=s(this.connection,t),r=this.connection.on(`setPluginSettings`,t=>{e(t.payload)});return e((await n.get()).payload),r}async onReceiveFromEditor(e){return this.connection.on(`sendToPlugin`,t=>{e(t.payload)})}sendToEditor(e){let t=this.ensurePluginName();this.connection.sendEvent({event:`sendToEditor`,name:t,payload:e})}async getPluginSettings(){let e=this.ensurePluginName();return s(this.connection,e).get()}async setPluginSettings(e){let t=this.ensurePluginName();return s(this.connection,t).set(e)}};const u=new l;export{r as Connection,c as Editor,i as IframeBridge,l as Plugin,u as fluxDeck};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["message: BridgeMessage<unknown>","message: BridgeMessage<EventRequests[T]>","message: BridgeMessage<EventResponses[T]>","wrappedHandler: MessageHandler<T>","Bridge"],"sources":["../src/bridge.ts","../src/connection.ts","../src/event-emitter.ts","../src/editor.ts","../src/plugin.ts"],"sourcesContent":["// Vibecoded by Claude\n\nimport type {\n BridgeOptions,\n MessageHandler,\n PendingRequest,\n BridgeMessage,\n EventRequests,\n ResponseFor,\n EventResponses,\n} from \"./types/bridge\";\n\nexport class Bridge<T extends keyof EventRequests = keyof EventRequests> {\n private options: Required<BridgeOptions>;\n private handlers: Map<string, MessageHandler<T>>;\n private pendingRequests: Map<number, PendingRequest<T>>;\n private requestId: number;\n private isParent: boolean;\n private target: Window | null;\n private boundHandleMessage: (event: MessageEvent) => void;\n\n constructor(options: BridgeOptions = {}) {\n this.options = {\n targetOrigin: \"*\",\n timeout: 5000,\n debug: false,\n ...options,\n };\n\n this.handlers = new Map();\n this.pendingRequests = new Map();\n this.requestId = 0;\n this.isParent = window.parent !== window;\n this.target = null;\n this.boundHandleMessage = this.handleMessage.bind(this);\n\n this.init();\n }\n\n private init(): void {\n window.addEventListener(\"message\", this.boundHandleMessage);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Инициализирован\", {\n isParent: this.isParent,\n targetOrigin: this.options.targetOrigin,\n });\n }\n }\n\n /**\n * Установить цель для отправки сообщений (для родительского окна)\n */\n setTarget(iframeElement: HTMLIFrameElement): void {\n if (iframeElement instanceof HTMLIFrameElement) {\n this.target = iframeElement.contentWindow;\n } else {\n console.error(\"[IframeBridge] Неверный элемент iframe\");\n }\n }\n\n /**\n * Получить целевое окно для отправки сообщений\n */\n private getTargetWindow(): Window | null {\n // Если мы внутри iframe - отправляем родителю\n if (this.isParent) {\n return window.parent;\n }\n\n // Если мы родитель - отправляем в iframe\n if (this.target) {\n return this.target;\n }\n\n console.error(\n \"[IframeBridge] Target не установлен. Используйте setTarget() для родительского окна\",\n );\n\n return null;\n }\n\n /**\n * Обработка входящих сообщений\n */\n private handleMessage(event: MessageEvent): void {\n // Проверка origin\n // TODO: not necessary to check origin\n if (\n this.options.targetOrigin !== \"*\" &&\n event.origin !== this.options.targetOrigin\n ) {\n if (this.options.debug) {\n console.warn(\n \"[IframeBridge] Сообщение от неизвестного origin:\",\n event.origin,\n );\n }\n return;\n }\n\n const data = event.data as BridgeMessage<unknown>;\n const { type, payload, meta } = data;\n\n if (!type) return;\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Получено сообщение:\", {\n type,\n payload,\n _meta: meta,\n });\n }\n\n // Если это ответ на запрос\n if (meta?.isResponse && meta?.requestId !== undefined) {\n this.handleResponse(meta.requestId, payload as ResponseFor<T>);\n return;\n }\n\n // Обработка обычного события\n const handler = this.handlers.get(type);\n if (handler) {\n // Если нужен ответ\n if (meta?.isRequest && meta?.requestId !== undefined) {\n const respond = (responsePayload: EventResponses[T]): void => {\n this.sendResponse(\n meta.requestId!,\n responsePayload,\n event.source as Window,\n );\n };\n handler(payload as EventRequests[T], event, respond);\n } else {\n handler(payload as EventRequests[T], event);\n }\n }\n }\n\n /**\n * Отправить сообщение\n */\n send(type: string, payload: unknown = {}): void {\n const targetWindow = this.getTargetWindow();\n if (!targetWindow) return;\n\n const message: BridgeMessage<unknown> = {\n type,\n payload,\n meta: {\n timestamp: Date.now(),\n },\n };\n\n targetWindow.postMessage(message, this.options.targetOrigin);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Отправлено сообщение:\", message);\n }\n }\n\n /**\n * Отправить запрос и ждать ответа\n */\n request(\n type: T,\n payload: EventRequests[T],\n timeout: number = this.options.timeout,\n ): Promise<ResponseFor<T>> {\n return new Promise((resolve, reject) => {\n const targetWindow = this.getTargetWindow();\n if (!targetWindow) {\n reject(new Error(\"Target window не найден\"));\n return;\n }\n\n const requestId = ++this.requestId;\n\n // Таймаут для запроса\n const timeoutId = window.setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error(`Request timeout: ${type}`));\n }, timeout);\n\n // Сохраняем промис\n this.pendingRequests.set(requestId, {\n resolve,\n reject,\n timeoutId,\n });\n\n const message: BridgeMessage<EventRequests[T]> = {\n type,\n payload,\n meta: {\n requestId,\n isRequest: true,\n timestamp: Date.now(),\n },\n };\n\n targetWindow.postMessage(message, this.options.targetOrigin);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Отправлен запрос:\", message);\n }\n });\n }\n\n /**\n * Отправить ответ на запрос\n */\n private sendResponse(\n requestId: number,\n payload: EventResponses[T],\n targetWindow: Window,\n ): void {\n const message: BridgeMessage<EventResponses[T]> = {\n type: \"__response__\",\n payload,\n meta: {\n requestId,\n isResponse: true,\n timestamp: Date.now(),\n },\n };\n\n targetWindow.postMessage(message, this.options.targetOrigin);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Отправлен ответ:\", message);\n }\n }\n\n /**\n * Обработать ответ на запрос\n */\n private handleResponse(\n requestId: number,\n payload: ResponseFor<T>,\n error?: string | null,\n ): void {\n const pending = this.pendingRequests.get(requestId);\n if (!pending) return;\n\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(requestId);\n\n if (error) {\n pending.reject(new Error(error));\n } else {\n pending.resolve(payload);\n }\n }\n\n /**\n * Подписаться на событие\n */\n on(type: T, handler: MessageHandler<T>): () => void {\n this.handlers.set(type, handler);\n return () => this.off(type);\n }\n\n /**\n * Отписаться от события\n */\n off(type: string): void {\n this.handlers.delete(type);\n }\n\n /**\n * Подписаться на событие один раз\n */\n once(type: T, handler: MessageHandler<T>): () => void {\n const wrappedHandler: MessageHandler<T> = (...args) => {\n handler(...args);\n this.off(type);\n };\n return this.on(type, wrappedHandler);\n }\n\n /**\n * Очистить все обработчики\n */\n destroy(): void {\n this.handlers.clear();\n this.pendingRequests.forEach(({ reject, timeoutId }) => {\n clearTimeout(timeoutId);\n reject(new Error(\"Bridge destroyed\"));\n });\n this.pendingRequests.clear();\n window.removeEventListener(\"message\", this.boundHandleMessage);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Уничтожен\");\n }\n }\n}\n\nexport default Bridge;\nexport type { BridgeOptions, MessageHandler, BridgeMessage };\n","import { nanoid } from \"nanoid\";\nimport type { WsClientMessage } from \"@fluxdeck/bindings/WsClientMessage\";\nimport type {\n EventHandlers,\n PendingRequests,\n Handler,\n ResponseFor,\n EventHandler,\n} from \"./types/connection\";\nimport type { ClientRequestEvent } from \"@fluxdeck/bindings/ClientRequestEvent\";\nimport type { WsServerMessage } from \"@fluxdeck/bindings/WsServerMessage\";\nimport type { ClientEvent } from \"@fluxdeck/bindings/ClientEvent\";\nimport type { ServerEvent } from \"@fluxdeck/bindings/ServerEvent\";\n\nfunction getHostname() {\n return typeof process !== \"undefined\" ? \"localhost\" : location.hostname;\n}\n\nexport type ConnectionStatus = \"connecting\" | \"connected\" | \"disconnected\";\n\ntype StatusListener = (status: ConnectionStatus) => void;\n\ntype ConnectionOptions = {\n autoreconnect?: boolean;\n requestTimeout?: number;\n};\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30000;\n\nexport class Connection {\n private url: string = `ws://${getHostname()}:3001/ws`;\n\n private ws?: WebSocket;\n\n private handlers: EventHandlers = [];\n private pendingRequests: PendingRequests = new Map();\n\n private options: Required<ConnectionOptions> = {\n autoreconnect: true,\n requestTimeout: DEFAULT_REQUEST_TIMEOUT_MS,\n };\n\n private status: ConnectionStatus = \"disconnected\";\n private statusListeners = new Set<StatusListener>();\n\n private resolve?: () => void;\n private reject?: () => void;\n\n private connectionPromise: Promise<void> = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n\n private backoff = this.createBackoff();\n\n constructor(options: ConnectionOptions = {}) {\n for (const key in options) {\n const property = key as keyof ConnectionOptions;\n\n if (options[property] != undefined) {\n this.options[property] = options[property] as never;\n }\n }\n }\n\n private createBackoff({ min = 1000, max = 32000, factor = 2 } = {}) {\n let delay = min;\n\n return {\n next() {\n const current = delay;\n delay = Math.min(delay * factor, max);\n return current;\n },\n reset() {\n delay = min;\n },\n };\n }\n\n getStatus(): ConnectionStatus {\n return this.status;\n }\n\n onStatusChange(listener: StatusListener): () => void {\n this.statusListeners.add(listener);\n return () => {\n this.statusListeners.delete(listener);\n };\n }\n\n private setStatus(next: ConnectionStatus) {\n if (this.status === next) return;\n this.status = next;\n for (const listener of this.statusListeners) {\n listener(next);\n }\n }\n\n reconnect() {\n if (this.status === \"disconnected\") {\n this.connect();\n }\n }\n\n connect() {\n this.setStatus(\"connecting\");\n\n this.connectionPromise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n\n this.ws?.close();\n this.ws = new WebSocket(this.url);\n\n this.ws.onopen = () => {\n this.setStatus(\"connected\");\n\n this.resolve?.();\n this.backoff.reset();\n };\n\n this.ws.onmessage = (event) => {\n this.onMessage(event.data);\n };\n\n this.ws.onclose = () => {\n this.setStatus(\"disconnected\");\n this.failPendingRequests(new Error(\"WebSocket connection closed\"));\n\n if (this.options.autoreconnect) {\n setTimeout(() => this.reconnect(), this.backoff.next());\n }\n };\n\n this.ws.onerror = (err) => {\n console.error(\"WebSocket error:\", err);\n this.reject?.();\n };\n }\n\n private failPendingRequests(error: Error) {\n for (const pending of this.pendingRequests.values()) {\n clearTimeout(pending.timeoutId);\n pending.reject(error);\n }\n\n this.pendingRequests.clear();\n }\n\n close() {\n this.ws?.close();\n }\n\n private async send(msg: WsClientMessage): Promise<void> {\n await this.connectionPromise;\n this.ws?.send(JSON.stringify(msg));\n }\n\n async sendEvent(event: ClientEvent): Promise<void> {\n return this.send({ type: \"event\", event });\n }\n\n on<T extends ServerEvent[\"event\"]>(\n event: T,\n handler: Handler<T>,\n ): () => void {\n const eventHandler = { event, handler } as unknown as EventHandler<\n ServerEvent[\"event\"]\n >;\n\n this.handlers.push(eventHandler);\n\n return () => {\n this.handlers = this.handlers.filter((value) => value !== eventHandler);\n };\n }\n\n private onMessage(raw: string) {\n const msg = JSON.parse(raw) as WsServerMessage;\n\n if (msg.type === \"response\" && msg.requestId) {\n const pending = this.pendingRequests.get(msg.requestId);\n\n if (pending) {\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(msg.requestId);\n pending.resolve(msg.event);\n }\n\n return;\n }\n\n if (msg.type === \"event\") {\n const handlers = this.handlers.filter(\n (value) => value.event == msg.event.event,\n );\n\n for (const eventHandler of handlers) {\n eventHandler.handler(msg.event);\n }\n }\n }\n\n async request<E extends ClientRequestEvent>(\n event: E,\n ): Promise<ResponseFor<E[\"event\"]>> {\n const requestId = nanoid();\n\n const promise = new Promise<ResponseFor<E[\"event\"]>>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pendingRequests.delete(requestId);\n reject(new Error(`Request timeout: ${event.event}`));\n }, this.options.requestTimeout);\n\n this.pendingRequests.set(requestId, {\n resolve: (value) => resolve(value as ResponseFor<E[\"event\"]>),\n reject,\n timeoutId,\n });\n });\n\n try {\n await this.send({\n type: \"request\",\n requestId,\n event,\n });\n } catch (err) {\n const pending = this.pendingRequests.get(requestId);\n if (pending) {\n clearTimeout(pending.timeoutId);\n this.pendingRequests.delete(requestId);\n pending.reject(err instanceof Error ? err : new Error(String(err)));\n }\n }\n\n return promise;\n }\n}\n","import type { ServerEvent } from \"@fluxdeck/bindings/ServerEvent\";\n\nexport type Listener<T> = (payload: T) => void;\n\nexport class EventEmitter {\n private listeners: Record<string, Listener<unknown>[]> = {};\n\n emit(event: string, data: unknown) {\n for (const listener of this.listeners[event] ?? []) {\n listener(data);\n }\n }\n\n on(event: ServerEvent[\"event\"], listener: Listener<unknown>) {\n const listeners = this.listeners[event] ?? [];\n listeners.push(listener);\n this.listeners[event] = listeners;\n return () => {\n this.listeners[event] =\n this.listeners[event]?.filter((cb) => cb !== listener) ?? [];\n };\n }\n}\n","import type { JsonValue } from \"@fluxdeck/bindings/JsonValue\";\nimport Bridge from \"./bridge\";\nimport { Connection } from \"./connection\";\nimport { EventEmitter, Listener } from \"./event-emitter\";\n\ntype SaveHandler = () => unknown;\n\ntype EditorParams = {\n id: string;\n group: string;\n};\n\nexport class Editor {\n private connection: Connection;\n private bridge: Bridge;\n private params: EditorParams;\n private saveHandler?: SaveHandler;\n private eventEmitter = new EventEmitter();\n\n constructor() {\n if (typeof window === \"undefined\") {\n throw Error(\"Flux Deck Editor must be used only in plugin editor\");\n }\n\n const urlParams = new URLSearchParams(location.search);\n\n const getStringParam = (key: string): string => {\n const value = urlParams.get(key);\n\n if (value === null) {\n throw Error(`${key} must be provided`);\n }\n\n return value;\n };\n\n this.params = {\n id: getStringParam(\"id\"),\n group: getStringParam(\"group\"),\n };\n\n this.connection = new Connection();\n this.connection.connect();\n\n this.connection.sendEvent({\n event: \"editorRegister\",\n payload: this.params.group,\n });\n\n this.connection.on(\"sendToEditor\", (data) => {\n this.eventEmitter.emit(\"sendToEditor\", data.payload);\n });\n\n this.bridge = new Bridge();\n this.bridge.on(\"SET_ACTION_SETTINGS\", (payload, _event, respond) => {\n if (payload.id == this.params.id && this.saveHandler) {\n const settings = this.saveHandler();\n\n try {\n const string = JSON.stringify(settings);\n respond?.({ settings: string });\n } catch (err) {\n console.error(err);\n respond?.({ settings: null });\n }\n }\n });\n }\n\n async onRecieveFromPlugin<T>(listener: Listener<T>) {\n return this.eventEmitter.on(\"sendToEditor\", listener as Listener<unknown>);\n }\n\n sendToPlugin<T extends JsonValue>(data: T) {\n this.connection.sendEvent({\n event: \"sendToPlugin\",\n name: this.params.group,\n payload: data,\n });\n }\n\n async getActionSettings(): Promise<JsonValue> {\n const parse = (data: string | null) => {\n try {\n if (typeof data == \"string\") {\n return JSON.parse(data);\n } else {\n return {};\n }\n } catch (err) {\n console.error(err);\n return {};\n }\n };\n\n const response = await this.bridge.request(\"GET_ACTION_SETTINGS\", {\n id: this.params.id,\n });\n\n return parse(response.settings);\n }\n\n onActionSave(handler: SaveHandler) {\n this.saveHandler = handler;\n\n return () => {\n this.saveHandler = undefined;\n };\n }\n\n async getPluginSettings() {\n return await this.connection.request({\n name: this.params.group,\n event: \"getPluginSettings\",\n });\n }\n\n async setPluginSettings(data: JsonValue) {\n return this.connection.sendEvent({\n name: this.params.group,\n event: \"setPluginSettings\",\n payload: data,\n });\n }\n}\n","import type { JsonValue } from \"@fluxdeck/bindings/JsonValue\";\nimport { Connection } from \"./connection\";\nimport { EventEmitter, Listener } from \"./event-emitter\";\n\nexport type ActionData<T> = {\n trigger: string;\n settings: T;\n};\n\nexport interface Action<T> {\n name: string;\n onTrigger?: (data: ActionData<T>) => void;\n}\n\nexport class FluxDeck {\n private connection: Connection;\n private actions: Action<unknown>[] = [];\n\n private pluginName?: string;\n\n private eventEmitter = new EventEmitter();\n\n constructor() {\n if (typeof process != \"undefined\") {\n this.pluginName = process?.argv[2];\n }\n\n this.connection = new Connection();\n }\n\n connect() {\n if (typeof process != \"undefined\" && !this.pluginName) {\n throw Error(\"No plugin name\");\n }\n\n this.connection.on(\"trigger\", (data) => {\n for (const action of this.actions) {\n if (action.name == data.action.type) {\n action.onTrigger?.({\n trigger: data.kind,\n settings: this.parseSettings(data.action.settings),\n });\n }\n }\n });\n\n this.connection.on(\"setPluginSettings\", (data) => {\n this.eventEmitter.emit(\"setPluginSettings\", data.payload);\n });\n\n this.connection.on(\"sendToPlugin\", (data) => {\n this.eventEmitter.emit(\"sendToPlugin\", data.payload);\n });\n\n this.connection.connect();\n\n if (this.pluginName) {\n this.registerPlugin(this.pluginName);\n }\n }\n\n private parseSettings(str: string | null) {\n try {\n return JSON.parse(str ?? \"{}\");\n } catch (err) {\n console.error(err);\n return {};\n }\n }\n\n private registerPlugin(name: string) {\n this.connection.sendEvent({ event: \"pluginRegister\", payload: name });\n }\n\n registerAction<T>(action: Action<T>) {\n this.actions.push(action as Action<unknown>);\n }\n\n async onSetSettings<T>(listener: Listener<T>) {\n const on = this.eventEmitter.on(\n \"setPluginSettings\",\n listener as Listener<unknown>,\n );\n const settings = await this.getPluginSettings();\n listener(settings.payload as T);\n return on;\n }\n\n async onRecieveFromEditor<T>(listener: Listener<T>) {\n return this.eventEmitter.on(\"sendToPlugin\", listener as Listener<unknown>);\n }\n\n sendToEditor<T extends JsonValue>(data: T) {\n if (!this.pluginName) {\n throw Error(\"No plugin name\");\n }\n\n this.connection.sendEvent({\n event: \"sendToEditor\",\n name: this.pluginName,\n payload: data,\n });\n }\n\n async getPluginSettings() {\n if (!this.pluginName) {\n throw Error(\"No plugin name\");\n }\n\n return this.connection.request({\n name: this.pluginName,\n event: \"getPluginSettings\",\n });\n }\n\n async setPluginSettings<T extends JsonValue>(data: T) {\n if (!this.pluginName) {\n throw Error(\"No plugin name\");\n }\n\n return this.connection.sendEvent({\n name: this.pluginName,\n event: \"setPluginSettings\",\n payload: data,\n });\n }\n}\n\nexport const fluxDeck = new FluxDeck();\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["message: BridgeMessage<unknown>","message: BridgeMessage<BridgeRequests[K]>","wrappedHandler: MessageHandler<K>"],"sources":["../src/pending-requests.ts","../src/connection.ts","../src/iframe-bridge.ts","../src/settings.ts","../src/editor.ts","../src/plugin.ts"],"sourcesContent":["import { nanoid } from \"nanoid\";\n\ntype PendingEntry = {\n resolve: (value: unknown) => void;\n reject: (reason: Error) => void;\n timeoutId: ReturnType<typeof setTimeout>;\n};\n\nexport class PendingRequests {\n private pending = new Map<string, PendingEntry>();\n\n create<R>(timeoutMs: number): { id: string; promise: Promise<R> } {\n const id = nanoid();\n\n const promise = new Promise<R>((resolve, reject) => {\n const timeoutId = setTimeout(() => {\n this.pending.delete(id);\n reject(new Error(\"Request timed out\"));\n }, timeoutMs);\n\n this.pending.set(id, {\n resolve: (value) => resolve(value as R),\n reject,\n timeoutId,\n });\n });\n\n return { id, promise };\n }\n\n resolve(id: string, value: unknown): void {\n const entry = this.pending.get(id);\n if (!entry) return;\n\n clearTimeout(entry.timeoutId);\n this.pending.delete(id);\n entry.resolve(value);\n }\n\n reject(id: string, error: Error): void {\n const entry = this.pending.get(id);\n if (!entry) return;\n\n clearTimeout(entry.timeoutId);\n this.pending.delete(id);\n entry.reject(error);\n }\n\n rejectAll(error: Error): void {\n for (const entry of this.pending.values()) {\n clearTimeout(entry.timeoutId);\n entry.reject(error);\n }\n\n this.pending.clear();\n }\n}\n","import type { WsClientMessage } from \"@fluxdeck/bindings/WsClientMessage\";\nimport type { ClientRequestEvent } from \"@fluxdeck/bindings/ClientRequestEvent\";\nimport type { WsServerMessage } from \"@fluxdeck/bindings/WsServerMessage\";\nimport type { ClientEvent } from \"@fluxdeck/bindings/ClientEvent\";\nimport type { ServerEvent } from \"@fluxdeck/bindings/ServerEvent\";\nimport type { ServerResponseEvent } from \"@fluxdeck/bindings/ServerResponseEvent\";\nimport { PendingRequests } from \"./pending-requests\";\n\nexport type Handler<T extends ServerEvent[\"event\"]> = (\n data: Extract<ServerEvent, { event: T }>,\n) => void;\n\nexport type ResponseFor<T extends ClientRequestEvent[\"event\"]> = Extract<\n ServerResponseEvent,\n { event: T }\n>;\n\ntype ConnectionOptions = {\n autoreconnect?: boolean;\n requestTimeout?: number;\n port?: number;\n};\n\nexport type ConnectionStatus = \"connecting\" | \"connected\" | \"disconnected\";\n\ntype StatusListener = (status: ConnectionStatus) => void;\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30000;\n\nfunction resolveUrl(options: ConnectionOptions): string {\n if (options.port != undefined) {\n return `ws://localhost:${options.port}/ws`;\n }\n\n if (typeof location !== \"undefined\" && location.host) {\n return `ws://${location.host}/ws`;\n }\n\n throw Error(\"Port must be set for Node connection\");\n}\n\nexport class Connection {\n private url: string;\n\n private ws?: WebSocket;\n\n private handlers = new Map<string, Set<Handler<ServerEvent[\"event\"]>>>();\n private pendingRequests = new PendingRequests();\n\n private options: {\n autoreconnect: boolean;\n requestTimeout: number;\n port?: number;\n };\n\n private status: ConnectionStatus = \"disconnected\";\n private statusListeners = new Set<StatusListener>();\n\n private resolve?: () => void;\n private reject?: (error: Error) => void;\n\n private connectionPromise: Promise<void> = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n\n private backoff = this.createBackoff();\n\n constructor(options: ConnectionOptions = {}) {\n this.options = {\n autoreconnect: options.autoreconnect ?? true,\n requestTimeout: options.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS,\n port: options.port,\n };\n\n this.url = resolveUrl(options);\n }\n\n private createBackoff({ min = 1000, max = 32000, factor = 2 } = {}) {\n let delay = min;\n\n return {\n next() {\n const current = delay;\n delay = Math.min(delay * factor, max);\n return current;\n },\n reset() {\n delay = min;\n },\n };\n }\n\n getStatus(): ConnectionStatus {\n return this.status;\n }\n\n onStatusChange(listener: StatusListener): () => void {\n this.statusListeners.add(listener);\n return () => {\n this.statusListeners.delete(listener);\n };\n }\n\n private setStatus(next: ConnectionStatus) {\n if (this.status === next) return;\n this.status = next;\n for (const listener of this.statusListeners) {\n listener(next);\n }\n }\n\n reconnect() {\n if (this.status === \"disconnected\") {\n this.connect();\n }\n }\n\n connect() {\n this.setStatus(\"connecting\");\n\n this.connectionPromise = new Promise((resolve, reject) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n\n this.ws?.close();\n this.ws = new WebSocket(this.url);\n\n this.ws.onopen = () => {\n this.setStatus(\"connected\");\n\n this.resolve?.();\n this.backoff.reset();\n };\n\n this.ws.onmessage = (event) => {\n this.onMessage(event.data);\n };\n\n this.ws.onclose = () => {\n this.setStatus(\"disconnected\");\n this.pendingRequests.rejectAll(\n new Error(\"WebSocket connection closed\"),\n );\n\n if (this.options.autoreconnect) {\n setTimeout(() => this.reconnect(), this.backoff.next());\n }\n };\n\n this.ws.onerror = (err) => {\n console.error(\"WebSocket error:\", err);\n this.reject?.(new Error(\"WebSocket error\"));\n };\n }\n\n disableAutoreconnect() {\n this.options.autoreconnect = false;\n }\n\n close() {\n this.ws?.close();\n }\n\n private async send(msg: WsClientMessage): Promise<void> {\n await this.connectionPromise;\n this.ws?.send(JSON.stringify(msg));\n }\n\n async sendEvent(event: ClientEvent): Promise<void> {\n return this.send({ type: \"event\", event });\n }\n\n on<T extends ServerEvent[\"event\"]>(\n event: T,\n handler: Handler<T>,\n ): () => void {\n let handlers = this.handlers.get(event);\n if (!handlers) {\n handlers = new Set();\n this.handlers.set(event, handlers);\n }\n\n const typedHandler = handler as unknown as Handler<\n ServerEvent[\"event\"]\n >;\n handlers.add(typedHandler);\n\n return () => {\n handlers!.delete(typedHandler);\n };\n }\n\n private onMessage(raw: string) {\n const msg = JSON.parse(raw) as WsServerMessage;\n\n if (msg.type === \"response\" && msg.requestId) {\n this.pendingRequests.resolve(msg.requestId, msg.event);\n return;\n }\n\n if (msg.type === \"event\") {\n const handlers = this.handlers.get(msg.event.event);\n if (handlers) {\n for (const handler of handlers) {\n handler(msg.event);\n }\n }\n }\n }\n\n async request<E extends ClientRequestEvent>(\n event: E,\n ): Promise<ResponseFor<E[\"event\"]>> {\n const { id: requestId, promise } = this.pendingRequests.create<\n ResponseFor<E[\"event\"]>\n >(this.options.requestTimeout);\n\n try {\n await this.send({\n type: \"request\",\n requestId,\n event,\n });\n } catch (err) {\n this.pendingRequests.reject(\n requestId,\n err instanceof Error ? err : new Error(String(err)),\n );\n }\n\n return promise;\n }\n}\n","import { PendingRequests } from \"./pending-requests\";\n\ntype BridgeOptions = {\n targetOrigin?: string;\n timeout?: number;\n debug?: boolean;\n};\n\ntype MessageMeta = {\n timestamp: number;\n requestId?: string;\n isRequest?: boolean;\n isResponse?: boolean;\n};\n\ntype BridgeMessage<T> = {\n type: string;\n payload: T;\n meta: MessageMeta;\n};\n\ninterface BridgeRequests {\n SAVE_ACTION_SETTINGS: { id: string };\n GET_ACTION_SETTINGS: { id: string };\n}\n\ninterface BridgeResponses {\n SAVE_ACTION_SETTINGS: { settings: string | null };\n GET_ACTION_SETTINGS: { settings: string | null };\n}\n\ntype BridgeMessageType = keyof BridgeRequests;\n\ntype ResponseFor<K extends BridgeMessageType> =\n K extends keyof BridgeResponses ? BridgeResponses[K] : never;\n\ntype MessageHandler<K extends BridgeMessageType> = (\n payload: BridgeRequests[K],\n event: MessageEvent,\n respond?: (responsePayload: ResponseFor<K>) => void,\n) => void;\n\nconst DEFAULT_TIMEOUT_MS = 5000;\n\nexport class IframeBridge {\n private options: Required<BridgeOptions>;\n private handlers = new Map<string, MessageHandler<BridgeMessageType>>();\n private pendingRequests = new PendingRequests();\n private isParent: boolean;\n private target: Window | null;\n private boundHandleMessage: (event: MessageEvent) => void;\n\n constructor(options: BridgeOptions = {}) {\n this.options = {\n targetOrigin: \"*\",\n timeout: DEFAULT_TIMEOUT_MS,\n debug: false,\n ...options,\n };\n\n this.isParent = window.parent !== window;\n this.target = null;\n this.boundHandleMessage = this.handleMessage.bind(this);\n\n this.init();\n }\n\n private init(): void {\n window.addEventListener(\"message\", this.boundHandleMessage);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Initialized\", {\n isParent: this.isParent,\n targetOrigin: this.options.targetOrigin,\n });\n }\n }\n\n /** Set the target window to post messages to (used by the parent window). */\n setTarget(iframeElement: HTMLIFrameElement): void {\n if (iframeElement instanceof HTMLIFrameElement) {\n this.target = iframeElement.contentWindow;\n } else {\n console.error(\"[IframeBridge] Invalid iframe element\");\n }\n }\n\n /** Resolve the window to post messages to. */\n private getTargetWindow(): Window | null {\n // Inside an iframe: post to the parent.\n if (this.isParent) {\n return window.parent;\n }\n\n // Parent window: post to the iframe.\n if (this.target) {\n return this.target;\n }\n\n console.error(\n \"[IframeBridge] Target is not set. Call setTarget() on the parent window\",\n );\n\n return null;\n }\n\n /** Handle an incoming message. */\n private handleMessage(event: MessageEvent): void {\n // TODO: not necessary to check origin\n if (\n this.options.targetOrigin !== \"*\" &&\n event.origin !== this.options.targetOrigin\n ) {\n if (this.options.debug) {\n console.warn(\n \"[IframeBridge] Message from unknown origin:\",\n event.origin,\n );\n }\n return;\n }\n\n const data = event.data as BridgeMessage<unknown>;\n const { type, payload, meta } = data;\n\n if (!type) return;\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Received message:\", { type, payload, meta });\n }\n\n // A response is identified by its response meta and request id.\n if (meta?.isResponse && meta.requestId !== undefined) {\n this.pendingRequests.resolve(meta.requestId, payload);\n return;\n }\n\n const handler = this.handlers.get(type);\n if (!handler) return;\n\n if (meta?.isRequest && meta.requestId !== undefined) {\n const { requestId } = meta;\n const source = event.source as Window;\n\n handler(\n payload as BridgeRequests[BridgeMessageType],\n event,\n (responsePayload) => {\n this.sendResponse(type, requestId, responsePayload, source);\n },\n );\n } else {\n handler(payload as BridgeRequests[BridgeMessageType], event);\n }\n }\n\n /** Post a fire-and-forget message. */\n send(type: string, payload: unknown = {}): void {\n const targetWindow = this.getTargetWindow();\n if (!targetWindow) return;\n\n const message: BridgeMessage<unknown> = {\n type,\n payload,\n meta: {\n timestamp: Date.now(),\n },\n };\n\n targetWindow.postMessage(message, this.options.targetOrigin);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Sent message:\", message);\n }\n }\n\n /** Post a request and wait for its response. */\n request<K extends BridgeMessageType>(\n type: K,\n payload: BridgeRequests[K],\n timeout: number = this.options.timeout,\n ): Promise<ResponseFor<K>> {\n const targetWindow = this.getTargetWindow();\n if (!targetWindow) {\n return Promise.reject(new Error(\"Target window not found\"));\n }\n\n const { id: requestId, promise } =\n this.pendingRequests.create<ResponseFor<K>>(timeout);\n\n const message: BridgeMessage<BridgeRequests[K]> = {\n type,\n payload,\n meta: {\n requestId,\n isRequest: true,\n timestamp: Date.now(),\n },\n };\n\n targetWindow.postMessage(message, this.options.targetOrigin);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Sent request:\", message);\n }\n\n return promise;\n }\n\n /** Post a response back to the window that issued the request. */\n private sendResponse(\n type: string,\n requestId: string,\n payload: unknown,\n targetWindow: Window,\n ): void {\n const message: BridgeMessage<unknown> = {\n type,\n payload,\n meta: {\n requestId,\n isResponse: true,\n timestamp: Date.now(),\n },\n };\n\n targetWindow.postMessage(message, this.options.targetOrigin);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Sent response:\", message);\n }\n }\n\n /** Subscribe to a message type (single handler per type). */\n on<K extends BridgeMessageType>(\n type: K,\n handler: MessageHandler<K>,\n ): () => void {\n this.handlers.set(\n type,\n handler as unknown as MessageHandler<BridgeMessageType>,\n );\n\n return () => this.off(type);\n }\n\n /** Unsubscribe from a message type. */\n off(type: BridgeMessageType): void {\n this.handlers.delete(type);\n }\n\n /** Subscribe to a message type for a single delivery. */\n once<K extends BridgeMessageType>(\n type: K,\n handler: MessageHandler<K>,\n ): () => void {\n const wrappedHandler: MessageHandler<K> = (...args) => {\n handler(...args);\n this.off(type);\n };\n\n return this.on(type, wrappedHandler);\n }\n\n /** Tear down the bridge and reject every outstanding request. */\n destroy(): void {\n this.handlers.clear();\n this.pendingRequests.rejectAll(new Error(\"Bridge destroyed\"));\n window.removeEventListener(\"message\", this.boundHandleMessage);\n\n if (this.options.debug) {\n console.log(\"[IframeBridge] Destroyed\");\n }\n }\n}\n","import type { JsonValue } from \"@fluxdeck/bindings/JsonValue\";\nimport type { Connection } from \"./connection\";\n\nexport function parseJsonSettings(str: string | null): JsonValue {\n try {\n return JSON.parse(str ?? \"{}\");\n } catch (err) {\n console.error(err);\n return {};\n }\n}\n\nexport function serializeSettings(value: JsonValue): string {\n return JSON.stringify(value);\n}\n\nexport function pluginSettings(connection: Connection, name: string) {\n return {\n get() {\n return connection.request({\n name,\n event: \"getPluginSettings\",\n });\n },\n set(data: JsonValue) {\n return connection.sendEvent({\n name,\n event: \"setPluginSettings\",\n payload: data,\n });\n },\n };\n}\n","import type { JsonValue } from \"@fluxdeck/bindings/JsonValue\";\nimport { IframeBridge } from \"./iframe-bridge\";\nimport { Connection } from \"./connection\";\nimport { parseJsonSettings, serializeSettings } from \"./settings\";\n\ntype Listener<T> = (payload: T) => void;\n\ntype SaveHandler = () => unknown;\n\ntype EditorParams = {\n id: string;\n group: string;\n};\n\nexport class Editor {\n private connection: Connection;\n private bridge: IframeBridge;\n private params: EditorParams;\n private saveHandler?: SaveHandler;\n\n constructor() {\n if (typeof window === \"undefined\") {\n throw Error(\"Flux Deck Editor must be used only in plugin editor\");\n }\n\n const urlParams = new URLSearchParams(location.search);\n\n const getStringParam = (key: string): string => {\n const value = urlParams.get(key);\n\n if (value === null) {\n throw Error(`${key} must be provided`);\n }\n\n return value;\n };\n\n this.params = {\n id: getStringParam(\"id\"),\n group: getStringParam(\"group\"),\n };\n\n this.connection = new Connection();\n this.bridge = new IframeBridge();\n\n this.bridge.on(\"SAVE_ACTION_SETTINGS\", (payload, _event, respond) => {\n if (payload.id == this.params.id && this.saveHandler) {\n const settings = this.saveHandler();\n\n try {\n respond?.({ settings: serializeSettings(settings as JsonValue) });\n } catch (err) {\n console.error(err);\n respond?.({ settings: null });\n }\n }\n });\n }\n\n connect() {\n this.connection.on(\"sendToEditor\", (data) => {\n this.onReceiveFromPluginListeners.forEach((listener) => {\n listener(data.payload);\n });\n });\n\n this.connection.connect();\n\n this.connection.sendEvent({\n event: \"editorRegister\",\n payload: this.params.group,\n });\n }\n\n private onReceiveFromPluginListeners = new Set<Listener<unknown>>();\n\n onReceiveFromPlugin<T>(listener: Listener<T>) {\n this.onReceiveFromPluginListeners.add(\n listener as Listener<unknown>,\n );\n return () => {\n this.onReceiveFromPluginListeners.delete(listener as Listener<unknown>);\n };\n }\n\n sendToPlugin<T extends JsonValue>(data: T) {\n this.connection.sendEvent({\n event: \"sendToPlugin\",\n name: this.params.group,\n payload: data,\n });\n }\n\n async getActionSettings(): Promise<JsonValue> {\n const response = await this.bridge.request(\"GET_ACTION_SETTINGS\", {\n id: this.params.id,\n });\n\n return parseJsonSettings(response.settings);\n }\n\n onActionSave(handler: SaveHandler) {\n this.saveHandler = handler;\n\n return () => {\n this.saveHandler = undefined;\n };\n }\n\n async getPluginSettings() {\n return await this.connection.request({\n name: this.params.group,\n event: \"getPluginSettings\",\n });\n }\n\n async setPluginSettings(data: JsonValue) {\n return this.connection.sendEvent({\n name: this.params.group,\n event: \"setPluginSettings\",\n payload: data,\n });\n }\n}\n","import type { JsonValue } from \"@fluxdeck/bindings/JsonValue\";\nimport { Connection } from \"./connection\";\nimport { parseJsonSettings, pluginSettings } from \"./settings\";\n\ntype Listener<T> = (payload: T) => void;\n\nexport type ActionData<T> = {\n trigger: string;\n settings: T;\n};\n\nexport interface Action<T> {\n name: string;\n onTrigger?: (data: ActionData<T>) => void;\n}\n\nexport class Plugin {\n private connection: Connection;\n private actions: Action<unknown>[] = [];\n private pluginName?: string;\n\n constructor() {\n if (typeof process != \"undefined\") {\n this.pluginName = process?.argv[2];\n\n const port = Number(process?.argv[3]);\n this.connection = new Connection(\n Number.isNaN(port) ? {} : { port },\n );\n } else {\n this.connection = new Connection();\n }\n }\n\n connect() {\n this.ensurePluginName();\n\n this.connection.on(\"trigger\", (data) => {\n for (const action of this.actions) {\n if (action.name == data.action.type) {\n action.onTrigger?.({\n trigger: data.kind,\n settings: parseJsonSettings(data.action.settings),\n });\n }\n }\n });\n\n this.connection.connect();\n\n if (this.pluginName) {\n this.registerPlugin(this.pluginName);\n }\n }\n\n private ensurePluginName(): string {\n if (!this.pluginName) {\n throw Error(\"No plugin name\");\n }\n return this.pluginName;\n }\n\n private registerPlugin(name: string) {\n this.connection.sendEvent({ event: \"pluginRegister\", payload: name });\n }\n\n registerAction<T>(action: Action<T>) {\n this.actions.push(action as Action<unknown>);\n }\n\n async onPluginSettings<T>(listener: Listener<T>) {\n const name = this.ensurePluginName();\n const accessor = pluginSettings(this.connection, name);\n const on = this.connection.on(\"setPluginSettings\", (data) => {\n listener(data.payload as T);\n });\n const settings = await accessor.get();\n listener(settings.payload as T);\n return on;\n }\n\n async onReceiveFromEditor<T>(listener: Listener<T>) {\n return this.connection.on(\"sendToPlugin\", (data) => {\n listener(data.payload as T);\n });\n }\n\n sendToEditor<T extends JsonValue>(data: T) {\n const name = this.ensurePluginName();\n\n this.connection.sendEvent({\n event: \"sendToEditor\",\n name,\n payload: data,\n });\n }\n\n async getPluginSettings() {\n const name = this.ensurePluginName();\n const accessor = pluginSettings(this.connection, name);\n return accessor.get();\n }\n\n async setPluginSettings<T extends JsonValue>(data: T) {\n const name = this.ensurePluginName();\n const accessor = pluginSettings(this.connection, name);\n return accessor.set(data);\n }\n}\n\nexport const fluxDeck = new Plugin();\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluxdeck/sdk",
3
- "version": "0.0.3",
3
+ "version": "0.1.0",
4
4
  "description": "Flux Deck SDK",
5
5
  "license": "MIT",
6
6
  "author": "Mikhail Morozov",