@accelint/map-toolkit 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/catalog-info.yaml +6 -3
  3. package/dist/cursor-coordinates/index.d.ts +3 -0
  4. package/dist/cursor-coordinates/index.js +3 -0
  5. package/dist/cursor-coordinates/index.js.map +1 -0
  6. package/dist/cursor-coordinates/use-cursor-coordinates.d.ts +76 -0
  7. package/dist/cursor-coordinates/use-cursor-coordinates.js +161 -0
  8. package/dist/cursor-coordinates/use-cursor-coordinates.js.map +1 -0
  9. package/dist/deckgl/base-map/events.d.ts +1 -0
  10. package/dist/deckgl/base-map/events.js +2 -1
  11. package/dist/deckgl/base-map/events.js.map +1 -1
  12. package/dist/deckgl/base-map/index.d.ts +1 -1
  13. package/dist/deckgl/base-map/index.js +69 -15
  14. package/dist/deckgl/base-map/index.js.map +1 -1
  15. package/dist/deckgl/base-map/provider.d.ts +12 -16
  16. package/dist/deckgl/base-map/provider.js +2 -6
  17. package/dist/deckgl/base-map/provider.js.map +1 -1
  18. package/dist/deckgl/base-map/types.d.ts +29 -8
  19. package/dist/deckgl/text-layer/character-sets.d.ts +7 -0
  20. package/dist/deckgl/text-layer/character-sets.js.map +1 -1
  21. package/dist/deckgl/text-layer/default-settings.js.map +1 -1
  22. package/dist/decorators/deckgl.d.ts +1 -1
  23. package/dist/decorators/deckgl.js.map +1 -1
  24. package/dist/map-mode/index.d.ts +1 -1
  25. package/dist/map-mode/index.js +1 -1
  26. package/dist/map-mode/store.d.ts +35 -109
  27. package/dist/map-mode/store.js +268 -289
  28. package/dist/map-mode/store.js.map +1 -1
  29. package/dist/map-mode/use-map-mode.d.ts +3 -5
  30. package/dist/map-mode/use-map-mode.js +8 -10
  31. package/dist/map-mode/use-map-mode.js.map +1 -1
  32. package/dist/metafile-esm.json +1 -1
  33. package/dist/viewport/constants.d.ts +9 -0
  34. package/dist/viewport/constants.js +11 -0
  35. package/dist/viewport/constants.js.map +1 -0
  36. package/dist/viewport/index.d.ts +13 -0
  37. package/dist/viewport/index.js +6 -0
  38. package/dist/viewport/index.js.map +1 -0
  39. package/dist/viewport/types.d.ts +22 -0
  40. package/dist/viewport/types.js +3 -0
  41. package/dist/viewport/types.js.map +1 -0
  42. package/dist/viewport/use-viewport-state.d.ts +85 -0
  43. package/dist/viewport/use-viewport-state.js +109 -0
  44. package/dist/viewport/use-viewport-state.js.map +1 -0
  45. package/dist/viewport/utils.d.ts +37 -0
  46. package/dist/viewport/utils.js +46 -0
  47. package/dist/viewport/utils.js.map +1 -0
  48. package/dist/viewport/viewport-size.d.ts +42 -0
  49. package/dist/viewport/viewport-size.js +16 -0
  50. package/dist/viewport/viewport-size.js.map +1 -0
  51. package/package.json +15 -20
@@ -4,324 +4,303 @@ import { MapModeEvents } from './events.js';
4
4
 
5
5
  const DEFAULT_MODE = "default";
6
6
  const mapModeBus = Broadcast.getInstance();
7
- class MapModeStore {
8
- constructor(id) {
9
- this.id = id;
10
- this.id = id;
11
- this.setupEventListeners();
7
+ const modeStore = /* @__PURE__ */ new Map();
8
+ const componentSubscribers = /* @__PURE__ */ new Map();
9
+ const busUnsubscribers = /* @__PURE__ */ new Map();
10
+ const subscriptionCache = /* @__PURE__ */ new Map();
11
+ const snapshotCache = /* @__PURE__ */ new Map();
12
+ const requestModeChangeCache = /* @__PURE__ */ new Map();
13
+ function getOrCreateState(instanceId) {
14
+ if (!modeStore.has(instanceId)) {
15
+ modeStore.set(instanceId, {
16
+ mode: DEFAULT_MODE,
17
+ modeOwners: /* @__PURE__ */ new Map(),
18
+ pendingRequests: /* @__PURE__ */ new Map()
19
+ });
12
20
  }
13
- mode = DEFAULT_MODE;
14
- defaultMode = DEFAULT_MODE;
15
- modeOwners = /* @__PURE__ */ new Map();
16
- pendingRequests = /* @__PURE__ */ new Map();
17
- listeners = /* @__PURE__ */ new Set();
18
- bus = mapModeBus;
19
- unsubscribers = [];
20
- /**
21
- * Get current mode snapshot (for useSyncExternalStore)
22
- */
23
- getSnapshot = () => {
24
- return this.mode;
25
- };
26
- /**
27
- * Subscribe to mode changes (for useSyncExternalStore)
28
- */
29
- subscribe = (listener) => {
30
- this.listeners.add(listener);
31
- return () => {
32
- this.listeners.delete(listener);
33
- };
34
- };
35
- /**
36
- * Request a mode change
37
- *
38
- * If the mode change can be auto-accepted (no ownership conflicts), the mode changes immediately.
39
- * Otherwise, an authorization request is emitted and stored as a pending request.
40
- *
41
- * **Important**: If the requester already has a pending authorization request, it will be replaced
42
- * with this new request. Only one pending request per requester is maintained at a time.
43
- *
44
- * @param desiredMode - The mode to switch to (automatically trimmed of whitespace)
45
- * @param requestOwner - Unique identifier of the component requesting the change (automatically trimmed of whitespace)
46
- * @throws Error if either parameter is empty or whitespace-only
47
- *
48
- * @example
49
- * ```ts
50
- * // First request from 'drawing-tool'
51
- * store.requestModeChange('drawing', 'drawing-tool');
52
- * // → Creates pending request with authId 'abc-123'
53
- *
54
- * // Second request from same 'drawing-tool' before first is resolved
55
- * store.requestModeChange('measuring', 'drawing-tool');
56
- * // → Replaces pending request, new authId 'def-456', old 'abc-123' is discarded
57
- * ```
58
- */
59
- requestModeChange = (desiredMode, requestOwner) => {
60
- const trimmedDesiredMode = desiredMode.trim();
61
- const trimmedRequestOwner = requestOwner.trim();
62
- if (!trimmedDesiredMode) {
63
- throw new Error("requestModeChange requires non-empty desiredMode");
64
- }
65
- if (!trimmedRequestOwner) {
66
- throw new Error("requestModeChange requires non-empty requestOwner");
21
+ return modeStore.get(instanceId);
22
+ }
23
+ function notifySubscribers(instanceId) {
24
+ const subscribers = componentSubscribers.get(instanceId);
25
+ if (subscribers) {
26
+ for (const onStoreChange of subscribers) {
27
+ onStoreChange();
67
28
  }
68
- this.bus.emit(MapModeEvents.changeRequest, {
69
- desiredMode: trimmedDesiredMode,
70
- owner: trimmedRequestOwner,
71
- id: this.id
72
- });
73
- };
74
- /**
75
- * Notify all subscribers of state change
76
- */
77
- notify() {
78
- for (const listener of this.listeners) {
79
- listener();
29
+ }
30
+ }
31
+ function shouldAutoAcceptRequest(state, desiredMode, requestOwner) {
32
+ const currentModeOwner = state.modeOwners.get(state.mode);
33
+ const desiredModeOwner = state.modeOwners.get(desiredMode);
34
+ if (desiredMode === DEFAULT_MODE && requestOwner === currentModeOwner) {
35
+ return true;
36
+ }
37
+ if (requestOwner === currentModeOwner) {
38
+ return true;
39
+ }
40
+ if (!(currentModeOwner || desiredModeOwner)) {
41
+ return true;
42
+ }
43
+ if (state.mode === DEFAULT_MODE && requestOwner === desiredModeOwner) {
44
+ return true;
45
+ }
46
+ return false;
47
+ }
48
+ function setMode(instanceId, state, newMode) {
49
+ const previousMode = state.mode;
50
+ state.mode = newMode;
51
+ mapModeBus.emit(MapModeEvents.changed, {
52
+ previousMode,
53
+ currentMode: newMode,
54
+ id: instanceId
55
+ });
56
+ notifySubscribers(instanceId);
57
+ }
58
+ function approveRequestAndRejectOthers(instanceId, state, approvedRequest, excludeAuthId, decisionOwner, reason, emitApproval) {
59
+ const requestsToReject = [];
60
+ for (const request of state.pendingRequests.values()) {
61
+ if (request.authId !== excludeAuthId) {
62
+ requestsToReject.push(request);
80
63
  }
81
64
  }
82
- /**
83
- * Setup event listeners for bus events
84
- *
85
- * Note: Event listeners remain active even after early returns in handlers.
86
- * This is by design - cleanup happens in destroy() which is called automatically
87
- * by MapProvider on unmount. Consumers don't need to manually manage cleanup.
88
- */
89
- setupEventListeners() {
90
- const unsubRequest = this.bus.on(MapModeEvents.changeRequest, (event) => {
91
- const { desiredMode, owner: requestOwner, id } = event.payload;
92
- if (id !== this.id || desiredMode === this.mode) {
93
- return;
94
- }
95
- this.handleModeChangeRequest(desiredMode, requestOwner);
96
- });
97
- this.unsubscribers.push(unsubRequest);
98
- const unsubDecision = this.bus.on(MapModeEvents.changeDecision, (event) => {
99
- const { id, approved, authId, owner } = event.payload;
100
- if (id !== this.id) {
101
- return;
102
- }
103
- this.handleAuthorizationDecision({ approved, authId, owner });
65
+ state.pendingRequests.clear();
66
+ setMode(instanceId, state, approvedRequest.desiredMode);
67
+ if (approvedRequest.desiredMode !== DEFAULT_MODE) {
68
+ state.modeOwners.set(
69
+ approvedRequest.desiredMode,
70
+ approvedRequest.requestOwner
71
+ );
72
+ }
73
+ if (emitApproval) {
74
+ mapModeBus.emit(MapModeEvents.changeDecision, {
75
+ authId: approvedRequest.authId,
76
+ approved: true,
77
+ owner: decisionOwner,
78
+ reason,
79
+ id: instanceId
104
80
  });
105
- this.unsubscribers.push(unsubDecision);
106
- const unsubChanged = this.bus.on(MapModeEvents.changed, (event) => {
107
- const { currentMode, previousMode, id } = event.payload;
108
- if (id !== this.id) {
109
- return;
110
- }
111
- if (currentMode === this.defaultMode && this.pendingRequests.size > 0) {
112
- this.handlePendingRequestsOnDefaultMode(previousMode);
113
- }
81
+ }
82
+ for (const request of requestsToReject) {
83
+ mapModeBus.emit(MapModeEvents.changeDecision, {
84
+ authId: request.authId,
85
+ approved: false,
86
+ owner: decisionOwner,
87
+ reason: "Request auto-rejected because another request was approved",
88
+ id: instanceId
114
89
  });
115
- this.unsubscribers.push(unsubChanged);
116
90
  }
117
- /**
118
- * Determine if a mode change request should be auto-accepted without authorization
119
- */
120
- shouldAutoAcceptRequest(desiredMode, requestOwner, currentModeOwner, desiredModeOwner) {
121
- if (desiredMode === this.defaultMode && requestOwner === currentModeOwner) {
122
- return true;
123
- }
124
- if (requestOwner === currentModeOwner) {
125
- return true;
126
- }
127
- if (!(currentModeOwner || desiredModeOwner)) {
128
- return true;
129
- }
130
- if (this.mode === this.defaultMode && requestOwner === desiredModeOwner) {
131
- return true;
91
+ }
92
+ function handlePendingRequestsOnDefaultMode(instanceId, state, previousMode) {
93
+ const firstEntry = Array.from(state.pendingRequests.values())[0];
94
+ if (!firstEntry) {
95
+ return;
96
+ }
97
+ const previousModeOwner = state.modeOwners.get(previousMode);
98
+ if (!previousModeOwner) {
99
+ return;
100
+ }
101
+ if (firstEntry.desiredMode === DEFAULT_MODE) {
102
+ const allRequests = Array.from(state.pendingRequests.values());
103
+ state.pendingRequests.clear();
104
+ for (const request of allRequests) {
105
+ mapModeBus.emit(MapModeEvents.changeDecision, {
106
+ authId: request.authId,
107
+ approved: false,
108
+ owner: previousModeOwner,
109
+ reason: "Request rejected - already in requested mode",
110
+ id: instanceId
111
+ });
132
112
  }
133
- return false;
113
+ } else {
114
+ approveRequestAndRejectOthers(
115
+ instanceId,
116
+ state,
117
+ firstEntry,
118
+ firstEntry.authId,
119
+ previousModeOwner,
120
+ "Auto-accepted when mode owner returned to default",
121
+ true
122
+ );
134
123
  }
135
- /**
136
- * Handle mode change request logic
137
- */
138
- handleModeChangeRequest(desiredMode, requestOwner) {
139
- const currentModeOwner = this.modeOwners.get(this.mode);
140
- const desiredModeOwner = this.modeOwners.get(desiredMode);
141
- if (this.shouldAutoAcceptRequest(
142
- desiredMode,
143
- requestOwner,
144
- currentModeOwner,
145
- desiredModeOwner
146
- )) {
147
- this.setMode(desiredMode);
148
- if (desiredMode !== this.defaultMode && !desiredModeOwner) {
149
- this.modeOwners.set(desiredMode, requestOwner);
150
- }
151
- this.pendingRequests.delete(requestOwner);
152
- return;
124
+ }
125
+ function handleAuthorizationDecision(instanceId, state, payload) {
126
+ const { approved, authId, owner: decisionOwner } = payload;
127
+ const currentModeOwner = state.modeOwners.get(state.mode);
128
+ if (decisionOwner !== currentModeOwner) {
129
+ console.warn(
130
+ `[MapMode] Authorization decision from "${decisionOwner}" ignored - not the owner of mode "${state.mode}" (owner: ${currentModeOwner || "none"})`
131
+ );
132
+ return;
133
+ }
134
+ let matchingRequestOwner = null;
135
+ let matchingRequest = null;
136
+ for (const [requestOwner, request] of state.pendingRequests.entries()) {
137
+ if (request.authId === authId) {
138
+ matchingRequestOwner = requestOwner;
139
+ matchingRequest = request;
140
+ break;
153
141
  }
154
- const authId = uuid();
155
- this.pendingRequests.set(requestOwner, {
156
- authId,
157
- desiredMode,
158
- currentMode: this.mode,
159
- requestOwner
160
- });
161
- this.bus.emit(MapModeEvents.changeAuthorization, {
142
+ }
143
+ if (!(matchingRequest && matchingRequestOwner)) {
144
+ return;
145
+ }
146
+ if (approved) {
147
+ approveRequestAndRejectOthers(
148
+ instanceId,
149
+ state,
150
+ matchingRequest,
162
151
  authId,
163
- desiredMode,
164
- currentMode: this.mode,
165
- id: this.id
166
- });
152
+ decisionOwner,
153
+ "",
154
+ false
155
+ );
156
+ } else {
157
+ state.pendingRequests.delete(matchingRequestOwner);
167
158
  }
168
- /**
169
- * Handle authorization decision
170
- *
171
- * Processes approval/rejection decisions from mode owners. Only the current mode's owner
172
- * can make authorization decisions. If a decision comes from a non-owner, a warning is
173
- * logged and the decision is ignored to prevent unauthorized mode changes.
174
- *
175
- * @param payload - The authorization decision containing authId, approved status, and owner
176
- */
177
- handleAuthorizationDecision(payload) {
178
- const { approved, authId, owner: decisionOwner } = payload;
179
- const currentModeOwner = this.modeOwners.get(this.mode);
180
- if (decisionOwner !== currentModeOwner) {
181
- console.warn(
182
- `[MapMode] Authorization decision from "${decisionOwner}" ignored - not the owner of mode "${this.mode}" (owner: ${currentModeOwner || "none"})`
183
- );
184
- return;
185
- }
186
- let matchingRequestOwner = null;
187
- let matchingRequest = null;
188
- for (const [requestOwner, request] of this.pendingRequests.entries()) {
189
- if (request.authId === authId) {
190
- matchingRequestOwner = requestOwner;
191
- matchingRequest = request;
192
- break;
193
- }
159
+ }
160
+ function handleModeChangeRequest(instanceId, state, desiredMode, requestOwner) {
161
+ const desiredModeOwner = state.modeOwners.get(desiredMode);
162
+ if (shouldAutoAcceptRequest(state, desiredMode, requestOwner)) {
163
+ setMode(instanceId, state, desiredMode);
164
+ if (desiredMode !== DEFAULT_MODE && !desiredModeOwner) {
165
+ state.modeOwners.set(desiredMode, requestOwner);
194
166
  }
195
- if (!(matchingRequest && matchingRequestOwner)) {
167
+ state.pendingRequests.delete(requestOwner);
168
+ return;
169
+ }
170
+ const authId = uuid();
171
+ state.pendingRequests.set(requestOwner, {
172
+ authId,
173
+ desiredMode,
174
+ currentMode: state.mode,
175
+ requestOwner
176
+ });
177
+ mapModeBus.emit(MapModeEvents.changeAuthorization, {
178
+ authId,
179
+ desiredMode,
180
+ currentMode: state.mode,
181
+ id: instanceId
182
+ });
183
+ }
184
+ function ensureBusListener(instanceId) {
185
+ if (busUnsubscribers.has(instanceId)) {
186
+ return;
187
+ }
188
+ const state = getOrCreateState(instanceId);
189
+ const unsubRequest = mapModeBus.on(MapModeEvents.changeRequest, (event) => {
190
+ const { desiredMode, owner: requestOwner, id } = event.payload;
191
+ if (id !== instanceId || desiredMode === state.mode) {
196
192
  return;
197
193
  }
198
- if (approved) {
199
- this.approveRequestAndRejectOthers(
200
- matchingRequest,
201
- authId,
202
- decisionOwner,
203
- "",
204
- false
205
- );
206
- } else {
207
- this.pendingRequests.delete(matchingRequestOwner);
208
- }
209
- }
210
- /**
211
- * Approve a request and reject all others
212
- */
213
- approveRequestAndRejectOthers(approvedRequest, excludeAuthId, decisionOwner, reason, emitApproval) {
214
- const requestsToReject = [];
215
- for (const request of this.pendingRequests.values()) {
216
- if (request.authId !== excludeAuthId) {
217
- requestsToReject.push(request);
218
- }
194
+ handleModeChangeRequest(instanceId, state, desiredMode, requestOwner);
195
+ });
196
+ const unsubDecision = mapModeBus.on(MapModeEvents.changeDecision, (event) => {
197
+ const { id, approved, authId, owner } = event.payload;
198
+ if (id !== instanceId) {
199
+ return;
219
200
  }
220
- this.pendingRequests.clear();
221
- this.setMode(approvedRequest.desiredMode);
222
- if (approvedRequest.desiredMode !== this.defaultMode) {
223
- this.modeOwners.set(
224
- approvedRequest.desiredMode,
225
- approvedRequest.requestOwner
226
- );
201
+ handleAuthorizationDecision(instanceId, state, { approved, authId, owner });
202
+ });
203
+ const unsubChanged = mapModeBus.on(MapModeEvents.changed, (event) => {
204
+ const { currentMode, previousMode, id } = event.payload;
205
+ if (id !== instanceId) {
206
+ return;
227
207
  }
228
- if (emitApproval) {
229
- this.bus.emit(MapModeEvents.changeDecision, {
230
- authId: approvedRequest.authId,
231
- approved: true,
232
- owner: decisionOwner,
233
- reason,
234
- id: this.id
235
- });
208
+ if (currentMode === DEFAULT_MODE && state.pendingRequests.size > 0) {
209
+ handlePendingRequestsOnDefaultMode(instanceId, state, previousMode);
236
210
  }
237
- for (const request of requestsToReject) {
238
- this.bus.emit(MapModeEvents.changeDecision, {
239
- authId: request.authId,
240
- approved: false,
241
- owner: decisionOwner,
242
- reason: "Request auto-rejected because another request was approved",
243
- id: this.id
244
- });
211
+ });
212
+ busUnsubscribers.set(instanceId, () => {
213
+ unsubRequest();
214
+ unsubDecision();
215
+ unsubChanged();
216
+ });
217
+ }
218
+ function cleanupBusListenerIfNeeded(instanceId) {
219
+ const subscribers = componentSubscribers.get(instanceId);
220
+ if (!subscribers || subscribers.size === 0) {
221
+ const unsub = busUnsubscribers.get(instanceId);
222
+ if (unsub) {
223
+ unsub();
224
+ busUnsubscribers.delete(instanceId);
245
225
  }
226
+ modeStore.delete(instanceId);
227
+ componentSubscribers.delete(instanceId);
228
+ subscriptionCache.delete(instanceId);
229
+ snapshotCache.delete(instanceId);
230
+ requestModeChangeCache.delete(instanceId);
246
231
  }
247
- /**
248
- * Handle pending requests when returning to default mode
249
- */
250
- handlePendingRequestsOnDefaultMode(previousMode) {
251
- const firstEntry = Array.from(this.pendingRequests.values())[0];
252
- if (!firstEntry) {
253
- return;
254
- }
255
- const previousModeOwner = this.modeOwners.get(previousMode);
256
- if (!previousModeOwner) {
257
- return;
232
+ }
233
+ function getOrCreateSubscription(instanceId) {
234
+ const subscription = subscriptionCache.get(instanceId) ?? ((onStoreChange) => {
235
+ getOrCreateState(instanceId);
236
+ ensureBusListener(instanceId);
237
+ let subscriberSet = componentSubscribers.get(instanceId);
238
+ if (!subscriberSet) {
239
+ subscriberSet = /* @__PURE__ */ new Set();
240
+ componentSubscribers.set(instanceId, subscriberSet);
258
241
  }
259
- if (firstEntry.desiredMode === this.defaultMode) {
260
- const allRequests = Array.from(this.pendingRequests.values());
261
- this.pendingRequests.clear();
262
- for (const request of allRequests) {
263
- this.bus.emit(MapModeEvents.changeDecision, {
264
- authId: request.authId,
265
- approved: false,
266
- owner: previousModeOwner,
267
- reason: "Request rejected - already in requested mode",
268
- id: this.id
269
- });
242
+ subscriberSet.add(onStoreChange);
243
+ return () => {
244
+ const currentSubscriberSet = componentSubscribers.get(instanceId);
245
+ if (currentSubscriberSet) {
246
+ currentSubscriberSet.delete(onStoreChange);
270
247
  }
271
- } else {
272
- this.approveRequestAndRejectOthers(
273
- firstEntry,
274
- firstEntry.authId,
275
- previousModeOwner,
276
- "Auto-accepted when mode owner returned to default",
277
- true
278
- );
248
+ cleanupBusListenerIfNeeded(instanceId);
249
+ };
250
+ });
251
+ subscriptionCache.set(instanceId, subscription);
252
+ return subscription;
253
+ }
254
+ function getOrCreateSnapshot(instanceId) {
255
+ const snapshot = snapshotCache.get(instanceId) ?? (() => {
256
+ const state = modeStore.get(instanceId);
257
+ if (!state) {
258
+ return DEFAULT_MODE;
279
259
  }
280
- }
281
- /**
282
- * Set mode and notify listeners
283
- */
284
- setMode(newMode) {
285
- const previousMode = this.mode;
286
- this.mode = newMode;
287
- this.bus.emit(MapModeEvents.changed, {
288
- previousMode,
289
- currentMode: newMode,
290
- id: this.id
291
- });
292
- this.notify();
293
- }
294
- /**
295
- * Clean up store resources
296
- */
297
- destroy() {
298
- for (const unsubscribe of this.unsubscribers) {
299
- unsubscribe();
260
+ return state.mode;
261
+ });
262
+ snapshotCache.set(instanceId, snapshot);
263
+ return snapshot;
264
+ }
265
+ function getOrCreateRequestModeChange(instanceId) {
266
+ const requestModeChange = requestModeChangeCache.get(instanceId) ?? ((desiredMode, requestOwner) => {
267
+ const trimmedDesiredMode = desiredMode.trim();
268
+ const trimmedRequestOwner = requestOwner.trim();
269
+ if (!trimmedDesiredMode) {
270
+ throw new Error("requestModeChange requires non-empty desiredMode");
300
271
  }
301
- this.unsubscribers.length = 0;
302
- this.modeOwners.clear();
303
- this.pendingRequests.clear();
304
- this.listeners.clear();
305
- }
272
+ if (!trimmedRequestOwner) {
273
+ throw new Error("requestModeChange requires non-empty requestOwner");
274
+ }
275
+ mapModeBus.emit(MapModeEvents.changeRequest, {
276
+ desiredMode: trimmedDesiredMode,
277
+ owner: trimmedRequestOwner,
278
+ id: instanceId
279
+ });
280
+ });
281
+ requestModeChangeCache.set(instanceId, requestModeChange);
282
+ return requestModeChange;
306
283
  }
307
- const storeRegistry = /* @__PURE__ */ new Map();
308
- function getOrCreateStore(id) {
309
- if (!storeRegistry.has(id)) {
310
- storeRegistry.set(id, new MapModeStore(id));
284
+ function getCurrentModeOwner(instanceId) {
285
+ const state = modeStore.get(instanceId);
286
+ if (!state) {
287
+ return void 0;
311
288
  }
312
- return storeRegistry.get(id);
289
+ return state.modeOwners.get(state.mode);
313
290
  }
314
- function destroyStore(id) {
315
- const store = storeRegistry.get(id);
316
- if (store) {
317
- store.destroy();
318
- storeRegistry.delete(id);
291
+ function clearMapModeState(instanceId) {
292
+ const unsub = busUnsubscribers.get(instanceId);
293
+ if (unsub) {
294
+ unsub();
295
+ busUnsubscribers.delete(instanceId);
319
296
  }
320
- }
321
- function getStore(id) {
322
- return storeRegistry.get(id);
297
+ modeStore.delete(instanceId);
298
+ componentSubscribers.delete(instanceId);
299
+ subscriptionCache.delete(instanceId);
300
+ snapshotCache.delete(instanceId);
301
+ requestModeChangeCache.delete(instanceId);
323
302
  }
324
303
 
325
- export { MapModeStore, destroyStore, getOrCreateStore, getStore };
304
+ export { clearMapModeState, getCurrentModeOwner, getOrCreateRequestModeChange, getOrCreateSnapshot, getOrCreateSubscription };
326
305
  //# sourceMappingURL=store.js.map
327
306
  //# sourceMappingURL=store.js.map