@fluxdeck/sdk 0.0.3 → 0.0.4

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
@@ -248,6 +248,7 @@ type StatusListener = (status: ConnectionStatus) => void;
248
248
  type ConnectionOptions = {
249
249
  autoreconnect?: boolean;
250
250
  requestTimeout?: number;
251
+ port?: number;
251
252
  };
252
253
  declare class Connection {
253
254
  private url;
@@ -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":"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"}
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":"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"}
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{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(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 i=class{url;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])}this.url=r(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.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(){if(typeof process<`u`){this.pluginName=process?.argv[2];let e=Number(process?.argv[3]);this.connection=new i(Number.isNaN(e)?{}:{port:e})}else 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};
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":"gCAYA,IAAa,EAAb,KAAyE,CACvE,QACA,SACA,gBACA,UACA,SACA,OACA,mBAEA,YAAY,EAAyB,EAAE,CAAE,CACvC,KAAK,QAAU,CACb,aAAc,IACd,QAAS,IACT,MAAO,GACP,GAAG,EACJ,CAED,KAAK,SAAW,IAAI,IACpB,KAAK,gBAAkB,IAAI,IAC3B,KAAK,UAAY,EACjB,KAAK,SAAW,OAAO,SAAW,OAClC,KAAK,OAAS,KACd,KAAK,mBAAqB,KAAK,cAAc,KAAK,KAAK,CAEvD,KAAK,MAAM,CAGb,MAAqB,CACnB,OAAO,iBAAiB,UAAW,KAAK,mBAAmB,CAEvD,KAAK,QAAQ,OACf,QAAQ,IAAI,iCAAkC,CAC5C,SAAU,KAAK,SACf,aAAc,KAAK,QAAQ,aAC5B,CAAC,CAON,UAAU,EAAwC,CAC5C,aAAyB,kBAC3B,KAAK,OAAS,EAAc,cAE5B,QAAQ,MAAM,yCAAyC,CAO3D,iBAAyC,CAevC,OAbI,KAAK,SACA,OAAO,OAIZ,KAAK,OACA,KAAK,QAGd,QAAQ,MACN,sFACD,CAEM,MAMT,cAAsB,EAA2B,CAG/C,GACE,KAAK,QAAQ,eAAiB,KAC9B,EAAM,SAAW,KAAK,QAAQ,aAC9B,CACI,KAAK,QAAQ,OACf,QAAQ,KACN,mDACA,EAAM,OACP,CAEH,OAIF,GAAM,CAAE,OAAM,UAAS,QADV,EAAM,KAGnB,GAAI,CAAC,EAAM,OAWX,GATI,KAAK,QAAQ,OACf,QAAQ,IAAI,qCAAsC,CAChD,OACA,UACA,MAAO,EACR,CAAC,CAIA,GAAM,YAAc,GAAM,YAAc,IAAA,GAAW,CACrD,KAAK,eAAe,EAAK,UAAW,EAA0B,CAC9D,OAIF,IAAM,EAAU,KAAK,SAAS,IAAI,EAAK,CACnC,IAEE,GAAM,WAAa,GAAM,YAAc,IAAA,GAQzC,EAAQ,EAA6B,EAPpB,GAA6C,CAC5D,KAAK,aACH,EAAK,UACL,EACA,EAAM,OACP,EAEiD,CAEpD,EAAQ,EAA6B,EAAM,EAQjD,KAAK,EAAc,EAAmB,EAAE,CAAQ,CAC9C,IAAM,EAAe,KAAK,iBAAiB,CAC3C,GAAI,CAAC,EAAc,OAEnB,IAAMA,EAAkC,CACtC,OACA,UACA,KAAM,CACJ,UAAW,KAAK,KAAK,CACtB,CACF,CAED,EAAa,YAAY,EAAS,KAAK,QAAQ,aAAa,CAExD,KAAK,QAAQ,OACf,QAAQ,IAAI,uCAAwC,EAAQ,CAOhE,QACE,EACA,EACA,EAAkB,KAAK,QAAQ,QACN,CACzB,OAAO,IAAI,SAAS,EAAS,IAAW,CACtC,IAAM,EAAe,KAAK,iBAAiB,CAC3C,GAAI,CAAC,EAAc,CACjB,EAAW,MAAM,0BAA0B,CAAC,CAC5C,OAGF,IAAM,EAAY,EAAE,KAAK,UAGnB,EAAY,OAAO,eAAiB,CACxC,KAAK,gBAAgB,OAAO,EAAU,CACtC,EAAW,MAAM,oBAAoB,IAAO,CAAC,EAC5C,EAAQ,CAGX,KAAK,gBAAgB,IAAI,EAAW,CAClC,UACA,SACA,YACD,CAAC,CAEF,IAAMC,EAA2C,CAC/C,OACA,UACA,KAAM,CACJ,YACA,UAAW,GACX,UAAW,KAAK,KAAK,CACtB,CACF,CAED,EAAa,YAAY,EAAS,KAAK,QAAQ,aAAa,CAExD,KAAK,QAAQ,OACf,QAAQ,IAAI,mCAAoC,EAAQ,EAE1D,CAMJ,aACE,EACA,EACA,EACM,CACN,IAAMC,EAA4C,CAChD,KAAM,eACN,UACA,KAAM,CACJ,YACA,WAAY,GACZ,UAAW,KAAK,KAAK,CACtB,CACF,CAED,EAAa,YAAY,EAAS,KAAK,QAAQ,aAAa,CAExD,KAAK,QAAQ,OACf,QAAQ,IAAI,kCAAmC,EAAQ,CAO3D,eACE,EACA,EACA,EACM,CACN,IAAM,EAAU,KAAK,gBAAgB,IAAI,EAAU,CAC9C,IAEL,aAAa,EAAQ,UAAU,CAC/B,KAAK,gBAAgB,OAAO,EAAU,CAElC,EACF,EAAQ,OAAW,MAAM,EAAM,CAAC,CAEhC,EAAQ,QAAQ,EAAQ,EAO5B,GAAG,EAAS,EAAwC,CAElD,OADA,KAAK,SAAS,IAAI,EAAM,EAAQ,KACnB,KAAK,IAAI,EAAK,CAM7B,IAAI,EAAoB,CACtB,KAAK,SAAS,OAAO,EAAK,CAM5B,KAAK,EAAS,EAAwC,CAKpD,OAAO,KAAK,GAAG,GAJ4B,GAAG,IAAS,CACrD,EAAQ,GAAG,EAAK,CAChB,KAAK,IAAI,EAAK,EAEoB,CAMtC,SAAgB,CACd,KAAK,SAAS,OAAO,CACrB,KAAK,gBAAgB,SAAS,CAAE,SAAQ,eAAgB,CACtD,aAAa,EAAU,CACvB,EAAW,MAAM,mBAAmB,CAAC,EACrC,CACF,KAAK,gBAAgB,OAAO,CAC5B,OAAO,oBAAoB,UAAW,KAAK,mBAAmB,CAE1D,KAAK,QAAQ,OACf,QAAQ,IAAI,2BAA2B,GAK7C,EAAe,EC7Rf,SAAS,GAAc,CACrB,OAAO,OAAO,QAAY,IAAc,YAAc,SAAS,SAcjE,IAAa,EAAb,KAAwB,CACtB,IAAsB,QAAQ,GAAa,CAAC,UAE5C,GAEA,SAAkC,EAAE,CACpC,gBAA2C,IAAI,IAE/C,QAA+C,CAC7C,cAAe,GACf,eAAgB,IACjB,CAED,OAAmC,eACnC,gBAA0B,IAAI,IAE9B,QACA,OAEA,kBAA2C,IAAI,SAAS,EAAS,IAAW,CAC1E,KAAK,QAAU,EACf,KAAK,OAAS,GACd,CAEF,QAAkB,KAAK,eAAe,CAEtC,YAAY,EAA6B,EAAE,CAAE,CAC3C,IAAK,IAAM,KAAO,EAAS,CACzB,IAAM,EAAW,EAEb,EAAQ,IAAa,OACvB,KAAK,QAAQ,GAAY,EAAQ,KAKvC,cAAsB,CAAE,MAAM,IAAM,MAAM,KAAO,SAAS,GAAM,EAAE,CAAE,CAClE,IAAI,EAAQ,EAEZ,MAAO,CACL,MAAO,CACL,IAAM,EAAU,EAEhB,MADA,GAAQ,KAAK,IAAI,EAAQ,EAAQ,EAAI,CAC9B,GAET,OAAQ,CACN,EAAQ,GAEX,CAGH,WAA8B,CAC5B,OAAO,KAAK,OAGd,eAAe,EAAsC,CAEnD,OADA,KAAK,gBAAgB,IAAI,EAAS,KACrB,CACX,KAAK,gBAAgB,OAAO,EAAS,EAIzC,UAAkB,EAAwB,CACpC,QAAK,SAAW,EACpB,MAAK,OAAS,EACd,IAAK,IAAM,KAAY,KAAK,gBAC1B,EAAS,EAAK,EAIlB,WAAY,CACN,KAAK,SAAW,gBAClB,KAAK,SAAS,CAIlB,SAAU,CACR,KAAK,UAAU,aAAa,CAE5B,KAAK,kBAAoB,IAAI,SAAS,EAAS,IAAW,CACxD,KAAK,QAAU,EACf,KAAK,OAAS,GACd,CAEF,KAAK,IAAI,OAAO,CAChB,KAAK,GAAK,IAAI,UAAU,KAAK,IAAI,CAEjC,KAAK,GAAG,WAAe,CACrB,KAAK,UAAU,YAAY,CAE3B,KAAK,WAAW,CAChB,KAAK,QAAQ,OAAO,EAGtB,KAAK,GAAG,UAAa,GAAU,CAC7B,KAAK,UAAU,EAAM,KAAK,EAG5B,KAAK,GAAG,YAAgB,CACtB,KAAK,UAAU,eAAe,CAC9B,KAAK,oBAAwB,MAAM,8BAA8B,CAAC,CAE9D,KAAK,QAAQ,eACf,eAAiB,KAAK,WAAW,CAAE,KAAK,QAAQ,MAAM,CAAC,EAI3D,KAAK,GAAG,QAAW,GAAQ,CACzB,QAAQ,MAAM,mBAAoB,EAAI,CACtC,KAAK,UAAU,EAInB,oBAA4B,EAAc,CACxC,IAAK,IAAM,KAAW,KAAK,gBAAgB,QAAQ,CACjD,aAAa,EAAQ,UAAU,CAC/B,EAAQ,OAAO,EAAM,CAGvB,KAAK,gBAAgB,OAAO,CAG9B,OAAQ,CACN,KAAK,IAAI,OAAO,CAGlB,MAAc,KAAK,EAAqC,CACtD,MAAM,KAAK,kBACX,KAAK,IAAI,KAAK,KAAK,UAAU,EAAI,CAAC,CAGpC,MAAM,UAAU,EAAmC,CACjD,OAAO,KAAK,KAAK,CAAE,KAAM,QAAS,QAAO,CAAC,CAG5C,GACE,EACA,EACY,CACZ,IAAM,EAAe,CAAE,QAAO,UAAS,CAMvC,OAFA,KAAK,SAAS,KAAK,EAAa,KAEnB,CACX,KAAK,SAAW,KAAK,SAAS,OAAQ,GAAU,IAAU,EAAa,EAI3E,UAAkB,EAAa,CAC7B,IAAM,EAAM,KAAK,MAAM,EAAI,CAE3B,GAAI,EAAI,OAAS,YAAc,EAAI,UAAW,CAC5C,IAAM,EAAU,KAAK,gBAAgB,IAAI,EAAI,UAAU,CAEnD,IACF,aAAa,EAAQ,UAAU,CAC/B,KAAK,gBAAgB,OAAO,EAAI,UAAU,CAC1C,EAAQ,QAAQ,EAAI,MAAM,EAG5B,OAGF,GAAI,EAAI,OAAS,QAAS,CACxB,IAAM,EAAW,KAAK,SAAS,OAC5B,GAAU,EAAM,OAAS,EAAI,MAAM,MACrC,CAED,IAAK,IAAM,KAAgB,EACzB,EAAa,QAAQ,EAAI,MAAM,EAKrC,MAAM,QACJ,EACkC,CAClC,IAAM,EAAY,GAAQ,CAEpB,EAAU,IAAI,SAAkC,EAAS,IAAW,CACxE,IAAM,EAAY,eAAiB,CACjC,KAAK,gBAAgB,OAAO,EAAU,CACtC,EAAW,MAAM,oBAAoB,EAAM,QAAQ,CAAC,EACnD,KAAK,QAAQ,eAAe,CAE/B,KAAK,gBAAgB,IAAI,EAAW,CAClC,QAAU,GAAU,EAAQ,EAAiC,CAC7D,SACA,YACD,CAAC,EACF,CAEF,GAAI,CACF,MAAM,KAAK,KAAK,CACd,KAAM,UACN,YACA,QACD,CAAC,OACK,EAAK,CACZ,IAAM,EAAU,KAAK,gBAAgB,IAAI,EAAU,CAC/C,IACF,aAAa,EAAQ,UAAU,CAC/B,KAAK,gBAAgB,OAAO,EAAU,CACtC,EAAQ,OAAO,aAAe,MAAQ,EAAU,MAAM,OAAO,EAAI,CAAC,CAAC,EAIvE,OAAO,IC1OE,EAAb,KAA0B,CACxB,UAAyD,EAAE,CAE3D,KAAK,EAAe,EAAe,CACjC,IAAK,IAAM,KAAY,KAAK,UAAU,IAAU,EAAE,CAChD,EAAS,EAAK,CAIlB,GAAG,EAA6B,EAA6B,CAC3D,IAAM,EAAY,KAAK,UAAU,IAAU,EAAE,CAG7C,OAFA,EAAU,KAAK,EAAS,CACxB,KAAK,UAAU,GAAS,MACX,CACX,KAAK,UAAU,GACb,KAAK,UAAU,IAAQ,OAAQ,GAAO,IAAO,EAAS,EAAI,EAAE,ICPvD,EAAb,KAAoB,CAClB,WACA,OACA,OACA,YACA,aAAuB,IAAI,EAE3B,aAAc,CACZ,GAAI,OAAO,OAAW,IACpB,MAAM,MAAM,sDAAsD,CAGpE,IAAM,EAAY,IAAI,gBAAgB,SAAS,OAAO,CAEhD,EAAkB,GAAwB,CAC9C,IAAM,EAAQ,EAAU,IAAI,EAAI,CAEhC,GAAI,IAAU,KACZ,MAAM,MAAM,GAAG,EAAI,mBAAmB,CAGxC,OAAO,GAGT,KAAK,OAAS,CACZ,GAAI,EAAe,KAAK,CACxB,MAAO,EAAe,QAAQ,CAC/B,CAED,KAAK,WAAa,IAAI,EACtB,KAAK,WAAW,SAAS,CAEzB,KAAK,WAAW,UAAU,CACxB,MAAO,iBACP,QAAS,KAAK,OAAO,MACtB,CAAC,CAEF,KAAK,WAAW,GAAG,eAAiB,GAAS,CAC3C,KAAK,aAAa,KAAK,eAAgB,EAAK,QAAQ,EACpD,CAEF,KAAK,OAAS,IAAIE,EAClB,KAAK,OAAO,GAAG,uBAAwB,EAAS,EAAQ,IAAY,CAClE,GAAI,EAAQ,IAAM,KAAK,OAAO,IAAM,KAAK,YAAa,CACpD,IAAM,EAAW,KAAK,aAAa,CAEnC,GAAI,CACF,IAAM,EAAS,KAAK,UAAU,EAAS,CACvC,IAAU,CAAE,SAAU,EAAQ,CAAC,OACxB,EAAK,CACZ,QAAQ,MAAM,EAAI,CAClB,IAAU,CAAE,SAAU,KAAM,CAAC,IAGjC,CAGJ,MAAM,oBAAuB,EAAuB,CAClD,OAAO,KAAK,aAAa,GAAG,eAAgB,EAA8B,CAG5E,aAAkC,EAAS,CACzC,KAAK,WAAW,UAAU,CACxB,MAAO,eACP,KAAM,KAAK,OAAO,MAClB,QAAS,EACV,CAAC,CAGJ,MAAM,mBAAwC,CAkB5C,OAjBe,GAAwB,CACrC,GAAI,CAIA,OAHE,OAAO,GAAQ,SACV,KAAK,MAAM,EAAK,CAEhB,EAAE,OAEJ,EAAK,CAEZ,OADA,QAAQ,MAAM,EAAI,CACX,EAAE,KAII,MAAM,KAAK,OAAO,QAAQ,sBAAuB,CAChE,GAAI,KAAK,OAAO,GACjB,CAAC,EAEoB,SAAS,CAGjC,aAAa,EAAsB,CAGjC,MAFA,MAAK,YAAc,MAEN,CACX,KAAK,YAAc,IAAA,IAIvB,MAAM,mBAAoB,CACxB,OAAO,MAAM,KAAK,WAAW,QAAQ,CACnC,KAAM,KAAK,OAAO,MAClB,MAAO,oBACR,CAAC,CAGJ,MAAM,kBAAkB,EAAiB,CACvC,OAAO,KAAK,WAAW,UAAU,CAC/B,KAAM,KAAK,OAAO,MAClB,MAAO,oBACP,QAAS,EACV,CAAC,GC5GO,EAAb,KAAsB,CACpB,WACA,QAAqC,EAAE,CAEvC,WAEA,aAAuB,IAAI,EAE3B,aAAc,CACR,OAAO,QAAW,MACpB,KAAK,WAAa,SAAS,KAAK,IAGlC,KAAK,WAAa,IAAI,EAGxB,SAAU,CACR,GAAI,OAAO,QAAW,KAAe,CAAC,KAAK,WACzC,MAAM,MAAM,iBAAiB,CAG/B,KAAK,WAAW,GAAG,UAAY,GAAS,CACtC,IAAK,IAAM,KAAU,KAAK,QACpB,EAAO,MAAQ,EAAK,OAAO,MAC7B,EAAO,YAAY,CACjB,QAAS,EAAK,KACd,SAAU,KAAK,cAAc,EAAK,OAAO,SAAS,CACnD,CAAC,EAGN,CAEF,KAAK,WAAW,GAAG,oBAAsB,GAAS,CAChD,KAAK,aAAa,KAAK,oBAAqB,EAAK,QAAQ,EACzD,CAEF,KAAK,WAAW,GAAG,eAAiB,GAAS,CAC3C,KAAK,aAAa,KAAK,eAAgB,EAAK,QAAQ,EACpD,CAEF,KAAK,WAAW,SAAS,CAErB,KAAK,YACP,KAAK,eAAe,KAAK,WAAW,CAIxC,cAAsB,EAAoB,CACxC,GAAI,CACF,OAAO,KAAK,MAAM,GAAO,KAAK,OACvB,EAAK,CAEZ,OADA,QAAQ,MAAM,EAAI,CACX,EAAE,EAIb,eAAuB,EAAc,CACnC,KAAK,WAAW,UAAU,CAAE,MAAO,iBAAkB,QAAS,EAAM,CAAC,CAGvE,eAAkB,EAAmB,CACnC,KAAK,QAAQ,KAAK,EAA0B,CAG9C,MAAM,cAAiB,EAAuB,CAC5C,IAAM,EAAK,KAAK,aAAa,GAC3B,oBACA,EACD,CAGD,OADA,GADiB,MAAM,KAAK,mBAAmB,EAC7B,QAAa,CACxB,EAGT,MAAM,oBAAuB,EAAuB,CAClD,OAAO,KAAK,aAAa,GAAG,eAAgB,EAA8B,CAG5E,aAAkC,EAAS,CACzC,GAAI,CAAC,KAAK,WACR,MAAM,MAAM,iBAAiB,CAG/B,KAAK,WAAW,UAAU,CACxB,MAAO,eACP,KAAM,KAAK,WACX,QAAS,EACV,CAAC,CAGJ,MAAM,mBAAoB,CACxB,GAAI,CAAC,KAAK,WACR,MAAM,MAAM,iBAAiB,CAG/B,OAAO,KAAK,WAAW,QAAQ,CAC7B,KAAM,KAAK,WACX,MAAO,oBACR,CAAC,CAGJ,MAAM,kBAAuC,EAAS,CACpD,GAAI,CAAC,KAAK,WACR,MAAM,MAAM,iBAAiB,CAG/B,OAAO,KAAK,WAAW,UAAU,CAC/B,KAAM,KAAK,WACX,MAAO,oBACP,QAAS,EACV,CAAC,GAIN,MAAa,EAAW,IAAI"}
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 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 type ConnectionStatus = \"connecting\" | \"connected\" | \"disconnected\";\n\ntype StatusListener = (status: ConnectionStatus) => void;\n\ntype ConnectionOptions = {\n autoreconnect?: boolean;\n requestTimeout?: number;\n port?: number;\n};\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30000;\n\nexport class Connection {\n private url: string;\n\n private ws?: WebSocket;\n\n private handlers: EventHandlers = [];\n private pendingRequests: PendingRequests = new Map();\n\n private options: 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 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.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 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 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluxdeck/sdk",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "description": "Flux Deck SDK",
5
5
  "license": "MIT",
6
6
  "author": "Mikhail Morozov",