dynim-core 1.0.0 → 1.0.3

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.
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { type WidgetConfig } from './widget';
6
6
  import { type DiffEntry } from './diff-state';
7
+ import { type CodeClient } from './code-client';
7
8
  export interface BuilderConfig {
8
9
  logo?: string;
9
10
  onSave?: (diffs: DiffEntry[]) => void;
@@ -22,6 +23,8 @@ export interface BuilderConfig {
22
23
  token: string;
23
24
  refreshToken?: string;
24
25
  }>;
26
+ /** External CodeClient to use (shares state with parent) - if not provided, creates its own */
27
+ codeClient?: CodeClient;
25
28
  }
26
29
  export interface Builder {
27
30
  enter: () => void;
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/builder/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxE,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAW/E,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtE;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,SAAS,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CAskBjE;;;;AAMD,wBAAyC"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/builder/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAA6B,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxE,OAAO,EAAmC,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAO/E,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAIlE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,IAAI,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wCAAwC;IACxC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrE,+FAA+F;IAC/F,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,EAAE,MAAM,OAAO,CAAC;IACxB,UAAU,EAAE,MAAM,SAAS,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,OAAO,CAAC;IAC9B,YAAY,EAAE,MAAM,OAAO,CAAC;IAC5B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,MAAM,GAAE,aAAkB,GAAG,OAAO,CAwlBjE;;;;AAMD,wBAAyC"}
@@ -17,7 +17,7 @@ import { createCodeClient } from './code-client';
17
17
  import { createBuilderClient } from './builder-client';
18
18
  import { buildElementIdentifier, getRelevantStyles } from './element-utils';
19
19
  export function createBuilder(config = {}) {
20
- const { logo = 'Builder', onSave, onExit, onEnter, chatConfig = {}, contentRoot = document.body, pageId = window.location.pathname, apiBase = 'http://localhost:8080', sessionToken, refreshToken, getSession } = config;
20
+ const { logo = 'Builder', onSave, onExit, onEnter, chatConfig = {}, contentRoot = document.body, pageId = window.location.pathname, apiBase = 'http://localhost:8080', sessionToken, refreshToken, getSession, codeClient: externalCodeClient } = config;
21
21
  let isActive = false;
22
22
  let chatWidget = null;
23
23
  let state = null;
@@ -85,54 +85,68 @@ export function createBuilder(config = {}) {
85
85
  const undoBtn = root.querySelector('.builder-bar__btn--undo');
86
86
  const modal = root.querySelector('.builder-modal');
87
87
  let builderClient = null;
88
+ // Track unsubscribe function for external client
89
+ let unsubscribeFromClient = null;
88
90
  function initCodeClient(stateRef) {
89
- client = createCodeClient({
90
- apiBase,
91
- sessionToken,
92
- refreshToken,
93
- getSession,
94
- onMessageUpdate: (message) => {
95
- console.log('[Builder] Message update:', message.status);
96
- // Update the chat UI with the latest text
97
- const messages = stateRef.getState().messages;
98
- const lastMessage = messages[messages.length - 1];
91
+ // Handler for message updates (used by both internal and external client)
92
+ const handleMessageUpdate = (message) => {
93
+ console.log('[Builder] Message update:', message.status);
94
+ // Update the chat UI with the latest text
95
+ const messages = stateRef.getState().messages;
96
+ const lastMessage = messages[messages.length - 1];
97
+ if (lastMessage?.role === 'assistant') {
98
+ stateRef.updateMessage(lastMessage.id, {
99
+ text: message.text || ''
100
+ });
101
+ }
102
+ if (message.status === 'done') {
103
+ console.log('[Builder] Chat complete');
104
+ }
105
+ else if (message.status === 'error') {
106
+ console.log('[Builder] Chat error:', message.error);
99
107
  if (lastMessage?.role === 'assistant') {
100
108
  stateRef.updateMessage(lastMessage.id, {
101
- text: message.text || ''
109
+ text: message.error || 'Something went wrong. Please try again.'
102
110
  });
103
111
  }
104
- if (message.status === 'done') {
105
- console.log('[Builder] Chat complete');
106
- }
107
- else if (message.status === 'error') {
108
- console.log('[Builder] Chat error:', message.error);
112
+ }
113
+ };
114
+ // Use external client if provided, otherwise create our own
115
+ if (externalCodeClient) {
116
+ console.log('[Builder] Using external CodeClient');
117
+ client = externalCodeClient;
118
+ // Subscribe to message updates
119
+ unsubscribeFromClient = client.onMessage(handleMessageUpdate);
120
+ }
121
+ else {
122
+ console.log('[Builder] Creating internal CodeClient');
123
+ client = createCodeClient({
124
+ apiBase,
125
+ sessionToken,
126
+ refreshToken,
127
+ getSession,
128
+ onMessageUpdate: handleMessageUpdate,
129
+ onStreamStart: () => {
130
+ console.log('[Builder] Stream started');
131
+ },
132
+ onStreamEnd: () => {
133
+ console.log('[Builder] Stream ended');
134
+ },
135
+ onError: (error) => {
136
+ console.error('[Builder] Backend error:', error);
137
+ const messages = stateRef.getState().messages;
138
+ const lastMessage = messages[messages.length - 1];
109
139
  if (lastMessage?.role === 'assistant') {
110
140
  stateRef.updateMessage(lastMessage.id, {
111
- text: message.error || 'Something went wrong. Please try again.'
141
+ text: error.message || 'Sorry, something went wrong. Please try again.'
112
142
  });
113
143
  }
144
+ },
145
+ onAuthError: (error) => {
146
+ console.error('[Builder] Auth error:', error);
114
147
  }
115
- },
116
- onStreamStart: () => {
117
- console.log('[Builder] Stream started');
118
- },
119
- onStreamEnd: () => {
120
- console.log('[Builder] Stream ended');
121
- },
122
- onError: (error) => {
123
- console.error('[Builder] Backend error:', error);
124
- const messages = stateRef.getState().messages;
125
- const lastMessage = messages[messages.length - 1];
126
- if (lastMessage?.role === 'assistant') {
127
- stateRef.updateMessage(lastMessage.id, {
128
- text: error.message || 'Sorry, something went wrong. Please try again.'
129
- });
130
- }
131
- },
132
- onAuthError: (error) => {
133
- console.error('[Builder] Auth error:', error);
134
- }
135
- });
148
+ });
149
+ }
136
150
  }
137
151
  function initBuilderClient() {
138
152
  builderClient = createBuilderClient({
@@ -528,6 +542,9 @@ export function createBuilder(config = {}) {
528
542
  exit();
529
543
  chatWidget?.destroy();
530
544
  root.remove();
545
+ // Cleanup external client subscription
546
+ unsubscribeFromClient?.();
547
+ unsubscribeFromClient = null;
531
548
  }
532
549
  };
533
550
  }
@@ -44,6 +44,8 @@ export interface BundleManagerConfig {
44
44
  transitionDuration?: number;
45
45
  /** Timeout for bundle mount in ms (default: 5000) */
46
46
  mountTimeout?: number;
47
+ /** Optional function to get auth token for authenticated bundle requests */
48
+ getAuthToken?: () => string | null | Promise<string | null>;
47
49
  /** Called when bundle starts loading */
48
50
  onLoadStart?: (bundleUrl: string) => void;
49
51
  /** Called when bundle is loaded and visible */
@@ -1 +1 @@
1
- {"version":3,"file":"bundle-manager.d.ts","sourceRoot":"","sources":["../../src/builder/bundle-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC,yDAAyD;IACzD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAEpE,mCAAmC;IACnC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1D,4CAA4C;IAC5C,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEvE,wCAAwC;IACxC,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IAEvE,6CAA6C;IAC7C,gBAAgB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAE/E,uCAAuC;IACvC,kBAAkB,IAAI,WAAW,CAAC;IAElC,uDAAuD;IACvD,aAAa,IAAI,WAAW,GAAG,IAAI,CAAC;IAEpC,4CAA4C;IAC5C,QAAQ,IAAI,OAAO,CAAC;IAEpB,iCAAiC;IACjC,SAAS,IAAI,OAAO,CAAC;IAErB,6BAA6B;IAC7B,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAAC;IAErC,iDAAiD;IACjD,MAAM,IAAI,IAAI,CAAC;IAEf,iDAAiD;IACjD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,MAAM,EAAE,WAAW,CAAC;IAEpB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,wCAAwC;IACxC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1C,+CAA+C;IAC/C,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpD,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CA8Y9E"}
1
+ {"version":3,"file":"bundle-manager.d.ts","sourceRoot":"","sources":["../../src/builder/bundle-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AASH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvC,yDAAyD;IACzD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAEpE,mCAAmC;IACnC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1D,4CAA4C;IAC5C,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAEvE,wCAAwC;IACxC,aAAa,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC;IAEvE,6CAA6C;IAC7C,gBAAgB,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAE/E,uCAAuC;IACvC,kBAAkB,IAAI,WAAW,CAAC;IAElC,uDAAuD;IACvD,aAAa,IAAI,WAAW,GAAG,IAAI,CAAC;IAEpC,4CAA4C;IAC5C,QAAQ,IAAI,OAAO,CAAC;IAEpB,iCAAiC;IACjC,SAAS,IAAI,OAAO,CAAC;IAErB,6BAA6B;IAC7B,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAAC;IAErC,iDAAiD;IACjD,MAAM,IAAI,IAAI,CAAC;IAEf,iDAAiD;IACjD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,mBAAmB;IAClC,sDAAsD;IACtD,MAAM,EAAE,WAAW,CAAC;IAEpB,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAE5D,wCAAwC;IACxC,WAAW,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE1C,+CAA+C;IAC/C,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAE7C,2BAA2B;IAC3B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAEpD,qCAAqC;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,aAAa,CAyZ9E"}
@@ -13,7 +13,7 @@
13
13
  * Create a bundle manager instance
14
14
  */
15
15
  export function createBundleManager(config) {
16
- const { parent, transitionDuration = 300, mountTimeout = 5000, onLoadStart, onLoadComplete, onError, onUnload, } = config;
16
+ const { parent, transitionDuration = 300, mountTimeout = 5000, getAuthToken, onLoadStart, onLoadComplete, onError, onUnload, } = config;
17
17
  // Create wrapper and containers
18
18
  const wrapper = document.createElement('div');
19
19
  wrapper.className = 'dynim-preview-wrapper';
@@ -82,11 +82,19 @@ export function createBundleManager(config) {
82
82
  * Preload bundle code (fetch without executing)
83
83
  */
84
84
  async function preloadBundle(url) {
85
+ const headers = {
86
+ 'Accept': 'application/javascript',
87
+ };
88
+ // Add auth token if available
89
+ if (getAuthToken) {
90
+ const token = await getAuthToken();
91
+ if (token) {
92
+ headers['Authorization'] = `Bearer ${token}`;
93
+ }
94
+ }
85
95
  const response = await fetch(url, {
86
96
  credentials: 'include',
87
- headers: {
88
- 'Accept': 'application/javascript',
89
- },
97
+ headers,
90
98
  });
91
99
  if (!response.ok) {
92
100
  throw new Error(`Failed to fetch bundle: ${response.status} ${response.statusText}`);
@@ -96,6 +96,8 @@ export interface CodeClient {
96
96
  getMessage: () => CodeMessage;
97
97
  /** Reset message state */
98
98
  resetMessage: () => void;
99
+ /** Subscribe to message updates (returns unsubscribe function) */
100
+ onMessage: (callback: (message: CodeMessage) => void) => () => void;
99
101
  }
100
102
  export declare function createCodeClient(config?: CodeClientConfig): CodeClient;
101
103
  //# sourceMappingURL=code-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"code-client.d.ts","sourceRoot":"","sources":["../../src/builder/code-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"code-client.d.ts","sourceRoot":"","sources":["../../src/builder/code-client.ts"],"names":[],"mappings":"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"}
@@ -34,10 +34,17 @@ export function createCodeClient(config = {}) {
34
34
  let currentMessage = createEmptyMessage();
35
35
  // Track if we need to add a line break before next text (after tool use)
36
36
  let needsTextBreak = false;
37
+ // Additional message listeners (for sharing client between components)
38
+ const messageListeners = new Set();
39
+ /** Notify all listeners of message update */
40
+ function notifyListeners() {
41
+ notifyListeners();
42
+ messageListeners.forEach(listener => listener(currentMessage));
43
+ }
37
44
  /** Update message state and notify listeners */
38
45
  function updateMessage(updates) {
39
46
  currentMessage = { ...currentMessage, ...updates };
40
- onMessageUpdate?.(currentMessage);
47
+ notifyListeners();
41
48
  }
42
49
  /** Append to thinking content */
43
50
  function appendThinking(content) {
@@ -50,7 +57,7 @@ export function createCodeClient(config = {}) {
50
57
  ...currentMessage,
51
58
  thinking: currentMessage.thinking + content
52
59
  };
53
- onMessageUpdate?.(currentMessage);
60
+ notifyListeners();
54
61
  }
55
62
  /** Append to text content */
56
63
  function appendText(content) {
@@ -64,7 +71,7 @@ export function createCodeClient(config = {}) {
64
71
  ...currentMessage,
65
72
  text: currentMessage.text + prefix + content
66
73
  };
67
- onMessageUpdate?.(currentMessage);
74
+ notifyListeners();
68
75
  }
69
76
  /** Mark that next text should have a line break (called after tool use) */
70
77
  function markTextBreak() {
@@ -76,7 +83,7 @@ export function createCodeClient(config = {}) {
76
83
  ...currentMessage,
77
84
  edits: [...currentMessage.edits, edit]
78
85
  };
79
- onMessageUpdate?.(currentMessage);
86
+ notifyListeners();
80
87
  }
81
88
  /**
82
89
  * Get a valid session token, refreshing if necessary
@@ -303,7 +310,7 @@ export function createCodeClient(config = {}) {
303
310
  }
304
311
  // Reset message state after save
305
312
  currentMessage = createEmptyMessage();
306
- onMessageUpdate?.(currentMessage);
313
+ notifyListeners();
307
314
  console.log('[CodeClient] Code saved successfully');
308
315
  }
309
316
  catch (error) {
@@ -332,7 +339,7 @@ export function createCodeClient(config = {}) {
332
339
  }
333
340
  // Reset message state after abandon
334
341
  currentMessage = createEmptyMessage();
335
- onMessageUpdate?.(currentMessage);
342
+ notifyListeners();
336
343
  console.log('[CodeClient] Code abandoned successfully');
337
344
  }
338
345
  catch (error) {
@@ -412,7 +419,14 @@ export function createCodeClient(config = {}) {
412
419
  resetMessage: () => {
413
420
  currentMessage = createEmptyMessage();
414
421
  needsTextBreak = false;
415
- onMessageUpdate?.(currentMessage);
422
+ notifyListeners();
423
+ },
424
+ onMessage: (callback) => {
425
+ messageListeners.add(callback);
426
+ // Return unsubscribe function
427
+ return () => {
428
+ messageListeners.delete(callback);
429
+ };
416
430
  }
417
431
  };
418
432
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dynim-core",
3
- "version": "1.0.0",
3
+ "version": "1.0.3",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",