@ccheever/exact-ibex-runtime 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/package.json +63 -0
  2. package/src/abort/AbortController.ts +23 -0
  3. package/src/abort/AbortSignal.ts +152 -0
  4. package/src/abort/index.ts +2 -0
  5. package/src/accessibility.ts +12 -0
  6. package/src/arraybuffer-detach.ts +109 -0
  7. package/src/base64/base64.ts +168 -0
  8. package/src/base64/index.ts +1 -0
  9. package/src/blob/Blob.ts +259 -0
  10. package/src/blob/File.ts +59 -0
  11. package/src/blob/FormData.ts +323 -0
  12. package/src/blob/index.ts +3 -0
  13. package/src/bootstrap.ts +1946 -0
  14. package/src/broadcast/BroadcastChannel.ts +280 -0
  15. package/src/broadcast/index.ts +5 -0
  16. package/src/cache/Cache.ts +349 -0
  17. package/src/cache/CacheStorage.ts +89 -0
  18. package/src/cache/index.ts +27 -0
  19. package/src/camera/index.ts +6202 -0
  20. package/src/camera/processor.worker.ts +194 -0
  21. package/src/camera/scene.ts +195 -0
  22. package/src/clipboard/Clipboard.ts +129 -0
  23. package/src/clipboard/ClipboardItem.ts +97 -0
  24. package/src/clipboard/index.ts +6 -0
  25. package/src/clone/index.ts +1 -0
  26. package/src/clone/structuredClone.ts +389 -0
  27. package/src/clone/transferableSymbols.ts +2 -0
  28. package/src/compression/CompressionStream.ts +146 -0
  29. package/src/compression/DecompressionStream.ts +342 -0
  30. package/src/compression/index.ts +4 -0
  31. package/src/console/Console.ts +341 -0
  32. package/src/console/index.ts +2 -0
  33. package/src/core/accessibility-state.ts +263 -0
  34. package/src/core/accessibility.ts +184 -0
  35. package/src/core/agent-state.ts +37 -0
  36. package/src/core/diagnostics-logs.ts +144 -0
  37. package/src/core/host-call-bridge.ts +16 -0
  38. package/src/core/i18n-helpers.ts +189 -0
  39. package/src/core/locale-state.ts +253 -0
  40. package/src/core/locale.ts +95 -0
  41. package/src/crypto/Crypto.ts +2743 -0
  42. package/src/crypto/index.ts +1 -0
  43. package/src/diagnostics/logs.ts +7 -0
  44. package/src/encoding/TextDecoder.ts +1181 -0
  45. package/src/encoding/TextDecoderStream.ts +58 -0
  46. package/src/encoding/TextEncoder.ts +180 -0
  47. package/src/encoding/TextEncoderStream.ts +39 -0
  48. package/src/encoding/index.ts +8 -0
  49. package/src/events/CloseEvent.ts +91 -0
  50. package/src/events/DOMException.ts +409 -0
  51. package/src/events/ErrorEvent.ts +39 -0
  52. package/src/events/Event.ts +151 -0
  53. package/src/events/EventTarget.ts +280 -0
  54. package/src/events/FocusEvent.ts +27 -0
  55. package/src/events/KeyboardEvent.ts +46 -0
  56. package/src/events/MessageEvent.ts +61 -0
  57. package/src/events/ProgressEvent.ts +33 -0
  58. package/src/events/PromiseRejectionEvent.ts +31 -0
  59. package/src/events/index.ts +52 -0
  60. package/src/eventsource/EventSource.ts +371 -0
  61. package/src/eventsource/index.ts +2 -0
  62. package/src/fetch/Headers.ts +642 -0
  63. package/src/fetch/Request.ts +760 -0
  64. package/src/fetch/Response.ts +543 -0
  65. package/src/fetch/body.ts +1256 -0
  66. package/src/fetch/cookie-jar.ts +566 -0
  67. package/src/fetch/demo.ts +207 -0
  68. package/src/fetch/errors.ts +101 -0
  69. package/src/fetch/fetch.ts +2610 -0
  70. package/src/fetch/index.ts +101 -0
  71. package/src/fetch/native-bridge.ts +65 -0
  72. package/src/fetch/types.ts +258 -0
  73. package/src/filereader/FileReader.ts +236 -0
  74. package/src/filereader/index.ts +1 -0
  75. package/src/fs/Dirent.ts +39 -0
  76. package/src/fs/ExactFile.ts +450 -0
  77. package/src/fs/Stats.ts +80 -0
  78. package/src/fs/index.ts +944 -0
  79. package/src/fs/promises.ts +386 -0
  80. package/src/fs/shared.ts +328 -0
  81. package/src/http-server/index.js +697 -0
  82. package/src/http-server/index.ts +27 -0
  83. package/src/identity.generated.ts +14 -0
  84. package/src/index.ts +283 -0
  85. package/src/indexeddb/IDBCursor.ts +188 -0
  86. package/src/indexeddb/IDBDatabase.ts +343 -0
  87. package/src/indexeddb/IDBFactory.ts +269 -0
  88. package/src/indexeddb/IDBIndex.ts +194 -0
  89. package/src/indexeddb/IDBKeyRange.ts +109 -0
  90. package/src/indexeddb/IDBObjectStore.ts +468 -0
  91. package/src/indexeddb/IDBRequest.ts +163 -0
  92. package/src/indexeddb/IDBTransaction.ts +207 -0
  93. package/src/indexeddb/index.ts +34 -0
  94. package/src/indexeddb/utils.ts +52 -0
  95. package/src/inspect/index.ts +1 -0
  96. package/src/inspect/inspect.ts +465 -0
  97. package/src/internal/detect.ts +104 -0
  98. package/src/locale.ts +10 -0
  99. package/src/location/index.ts +1059 -0
  100. package/src/locks/LockManager.ts +460 -0
  101. package/src/locks/index.ts +12 -0
  102. package/src/media/VideoFrame.ts +58 -0
  103. package/src/messaging/MessageChannel.ts +31 -0
  104. package/src/messaging/MessagePort.ts +180 -0
  105. package/src/messaging/index.ts +2 -0
  106. package/src/messaging.ts +247 -0
  107. package/src/native/NativeModules.ts +354 -0
  108. package/src/native/index.ts +1 -0
  109. package/src/navigator/Navigator.ts +351 -0
  110. package/src/navigator/index.ts +1 -0
  111. package/src/node/Buffer.ts +1786 -0
  112. package/src/node/index.ts +4 -0
  113. package/src/node/path.ts +495 -0
  114. package/src/node/process.ts +2528 -0
  115. package/src/performance/Performance.ts +532 -0
  116. package/src/performance/index.ts +21 -0
  117. package/src/polyfills/array.ts +236 -0
  118. package/src/polyfills/arraybuffer.ts +172 -0
  119. package/src/polyfills/groupby.ts +85 -0
  120. package/src/polyfills/index.ts +85 -0
  121. package/src/polyfills/intl.ts +1956 -0
  122. package/src/polyfills/iterator.ts +479 -0
  123. package/src/polyfills/promise.ts +37 -0
  124. package/src/polyfills/set.ts +245 -0
  125. package/src/polyfills/string.ts +85 -0
  126. package/src/polyfills/typedarray.ts +110 -0
  127. package/src/promise-rejection-tracking.ts +464 -0
  128. package/src/react-native/index.ts +388 -0
  129. package/src/runtime-entry.ts +55 -0
  130. package/src/scheduling/AnimationFrame.ts +105 -0
  131. package/src/scheduling/IdleCallback.ts +167 -0
  132. package/src/scheduling/index.ts +13 -0
  133. package/src/security/Capabilities.ts +1146 -0
  134. package/src/security/Permissions.ts +392 -0
  135. package/src/security/capability-bits.generated.ts +63 -0
  136. package/src/security/index.ts +16 -0
  137. package/src/sqlite/Database.ts +456 -0
  138. package/src/sqlite/Statement.ts +206 -0
  139. package/src/sqlite/constants.ts +79 -0
  140. package/src/sqlite/errors.ts +25 -0
  141. package/src/sqlite/index.ts +34 -0
  142. package/src/sqlite/module.js +438 -0
  143. package/src/storage/Storage.ts +291 -0
  144. package/src/storage/StorageManager.ts +91 -0
  145. package/src/storage/index.ts +3 -0
  146. package/src/stream-compat.ts +47 -0
  147. package/src/streams/ReadableStream.ts +4131 -0
  148. package/src/streams/TransformStream.ts +375 -0
  149. package/src/streams/WritableStream.ts +866 -0
  150. package/src/streams/index.ts +41 -0
  151. package/src/timers/Timers.ts +296 -0
  152. package/src/timers/index.ts +11 -0
  153. package/src/url/URL.ts +656 -0
  154. package/src/url/URLPattern.ts +850 -0
  155. package/src/url/URLSearchParams.ts +244 -0
  156. package/src/url/index.ts +9 -0
  157. package/src/websocket/WebSocket.ts +770 -0
  158. package/src/websocket/WebSocketError.ts +52 -0
  159. package/src/websocket/WebSocketStream.ts +628 -0
  160. package/src/websocket/index.ts +7 -0
  161. package/src/window/index.ts +872 -0
@@ -0,0 +1,409 @@
1
+ /**
2
+ * DOMException - Web Standard DOMException Implementation
3
+ *
4
+ * @see https://webidl.spec.whatwg.org/#dfn-DOMException
5
+ */
6
+
7
+ // Legacy error code mapping
8
+ // Note: NotAllowedError (0) is a newer error without a legacy code
9
+ const legacyErrorCodes: Record<string, number> = {
10
+ IndexSizeError: 1,
11
+ DOMStringSizeError: 2,
12
+ HierarchyRequestError: 3,
13
+ WrongDocumentError: 4,
14
+ InvalidCharacterError: 5,
15
+ NoDataAllowedError: 6,
16
+ NoModificationAllowedError: 7,
17
+ NotFoundError: 8,
18
+ NotSupportedError: 9,
19
+ InUseAttributeError: 10,
20
+ InvalidStateError: 11,
21
+ SyntaxError: 12,
22
+ InvalidModificationError: 13,
23
+ NamespaceError: 14,
24
+ InvalidAccessError: 15,
25
+ ValidationError: 16,
26
+ TypeMismatchError: 17,
27
+ SecurityError: 18,
28
+ NetworkError: 19,
29
+ AbortError: 20,
30
+ URLMismatchError: 21,
31
+ QuotaExceededError: 22,
32
+ TimeoutError: 23,
33
+ InvalidNodeTypeError: 24,
34
+ DataCloneError: 25,
35
+ // Modern errors without legacy codes
36
+ NotAllowedError: 0,
37
+ OperationError: 0,
38
+ NotReadableError: 0,
39
+ UnknownError: 0,
40
+ ConstraintError: 0,
41
+ TransactionInactiveError: 0,
42
+ ReadOnlyError: 0,
43
+ VersionError: 0,
44
+ };
45
+
46
+ export class DOMException implements Error {
47
+ // Legacy error code constants
48
+ declare static readonly INDEX_SIZE_ERR: number;
49
+ declare static readonly DOMSTRING_SIZE_ERR: number;
50
+ declare static readonly HIERARCHY_REQUEST_ERR: number;
51
+ declare static readonly WRONG_DOCUMENT_ERR: number;
52
+ declare static readonly INVALID_CHARACTER_ERR: number;
53
+ declare static readonly NO_DATA_ALLOWED_ERR: number;
54
+ declare static readonly NO_MODIFICATION_ALLOWED_ERR: number;
55
+ declare static readonly NOT_FOUND_ERR: number;
56
+ declare static readonly NOT_SUPPORTED_ERR: number;
57
+ declare static readonly INUSE_ATTRIBUTE_ERR: number;
58
+ declare static readonly INVALID_STATE_ERR: number;
59
+ declare static readonly SYNTAX_ERR: number;
60
+ declare static readonly INVALID_MODIFICATION_ERR: number;
61
+ declare static readonly NAMESPACE_ERR: number;
62
+ declare static readonly INVALID_ACCESS_ERR: number;
63
+ declare static readonly VALIDATION_ERR: number;
64
+ declare static readonly TYPE_MISMATCH_ERR: number;
65
+ declare static readonly SECURITY_ERR: number;
66
+ declare static readonly NETWORK_ERR: number;
67
+ declare static readonly ABORT_ERR: number;
68
+ declare static readonly URL_MISMATCH_ERR: number;
69
+ declare static readonly QUOTA_EXCEEDED_ERR: number;
70
+ declare static readonly TIMEOUT_ERR: number;
71
+ declare static readonly INVALID_NODE_TYPE_ERR: number;
72
+ declare static readonly DATA_CLONE_ERR: number;
73
+
74
+ readonly name: string;
75
+ readonly message: string;
76
+ readonly code: number;
77
+ stack?: string;
78
+
79
+ constructor(message?: string, name?: string) {
80
+ this.message = message ?? "";
81
+ this.name = name ?? "Error";
82
+ this.code = legacyErrorCodes[this.name] ?? 0;
83
+
84
+ // Maintain proper stack trace in V8/Hermes
85
+ if (typeof Error.captureStackTrace === "function") {
86
+ Error.captureStackTrace(this, DOMException);
87
+ } else {
88
+ this.stack = new Error(this.message).stack;
89
+ }
90
+ }
91
+
92
+ // Override toString for proper formatting
93
+ toString(): string {
94
+ return `${this.name}: ${this.message}`;
95
+ }
96
+ }
97
+
98
+ Object.setPrototypeOf(DOMException.prototype, Error.prototype);
99
+ Object.setPrototypeOf(DOMException, Error);
100
+ Object.defineProperties(DOMException, {
101
+ INDEX_SIZE_ERR: { value: 1, enumerable: true, configurable: true },
102
+ DOMSTRING_SIZE_ERR: { value: 2, enumerable: true, configurable: true },
103
+ HIERARCHY_REQUEST_ERR: { value: 3, enumerable: true, configurable: true },
104
+ WRONG_DOCUMENT_ERR: { value: 4, enumerable: true, configurable: true },
105
+ INVALID_CHARACTER_ERR: { value: 5, enumerable: true, configurable: true },
106
+ NO_DATA_ALLOWED_ERR: { value: 6, enumerable: true, configurable: true },
107
+ NO_MODIFICATION_ALLOWED_ERR: { value: 7, enumerable: true, configurable: true },
108
+ NOT_FOUND_ERR: { value: 8, enumerable: true, configurable: true },
109
+ NOT_SUPPORTED_ERR: { value: 9, enumerable: true, configurable: true },
110
+ INUSE_ATTRIBUTE_ERR: { value: 10, enumerable: true, configurable: true },
111
+ INVALID_STATE_ERR: { value: 11, enumerable: true, configurable: true },
112
+ SYNTAX_ERR: { value: 12, enumerable: true, configurable: true },
113
+ INVALID_MODIFICATION_ERR: { value: 13, enumerable: true, configurable: true },
114
+ NAMESPACE_ERR: { value: 14, enumerable: true, configurable: true },
115
+ INVALID_ACCESS_ERR: { value: 15, enumerable: true, configurable: true },
116
+ VALIDATION_ERR: { value: 16, enumerable: true, configurable: true },
117
+ TYPE_MISMATCH_ERR: { value: 17, enumerable: true, configurable: true },
118
+ SECURITY_ERR: { value: 18, enumerable: true, configurable: true },
119
+ NETWORK_ERR: { value: 19, enumerable: true, configurable: true },
120
+ ABORT_ERR: { value: 20, enumerable: true, configurable: true },
121
+ URL_MISMATCH_ERR: { value: 21, enumerable: true, configurable: true },
122
+ QUOTA_EXCEEDED_ERR: { value: 22, enumerable: true, configurable: true },
123
+ TIMEOUT_ERR: { value: 23, enumerable: true, configurable: true },
124
+ INVALID_NODE_TYPE_ERR: { value: 24, enumerable: true, configurable: true },
125
+ DATA_CLONE_ERR: { value: 25, enumerable: true, configurable: true },
126
+ });
127
+
128
+ // Ensure constructor.name survives minification/bundling.
129
+ Object.defineProperty(DOMException, 'name', { value: 'DOMException', configurable: true });
130
+ Object.defineProperty(DOMException.prototype, Symbol.toStringTag, {
131
+ value: 'DOMException',
132
+ configurable: true,
133
+ });
134
+
135
+ function createGlobalDOMException(message: string, name: string): DOMException {
136
+ const globalCtor =
137
+ typeof globalThis === "object" &&
138
+ globalThis !== null &&
139
+ typeof (globalThis as any).DOMException === "function"
140
+ ? ((globalThis as any).DOMException as new (message?: string, name?: string) => DOMException)
141
+ : DOMException;
142
+ return new globalCtor(message, name);
143
+ }
144
+
145
+ // Common exception factory functions for convenience
146
+ export function createAbortError(message = "The operation was aborted."): DOMException {
147
+ return createGlobalDOMException(message, "AbortError");
148
+ }
149
+
150
+ export function createNetworkError(message = "A network error occurred."): DOMException {
151
+ return createGlobalDOMException(message, "NetworkError");
152
+ }
153
+
154
+ export function createTimeoutError(message = "The operation timed out."): DOMException {
155
+ return createGlobalDOMException(message, "TimeoutError");
156
+ }
157
+
158
+ export function createQuotaExceededError(message = "The quota has been exceeded."): DOMException {
159
+ return createGlobalDOMException(message, "QuotaExceededError");
160
+ }
161
+
162
+ export function createDataCloneError(message = "The object could not be cloned."): DOMException {
163
+ return createGlobalDOMException(message, "DataCloneError");
164
+ }
165
+
166
+ export function createInvalidStateError(message = "The object is in an invalid state."): DOMException {
167
+ return createGlobalDOMException(message, "InvalidStateError");
168
+ }
169
+
170
+ export function createNotSupportedError(message = "The operation is not supported."): DOMException {
171
+ return createGlobalDOMException(message, "NotSupportedError");
172
+ }
173
+
174
+ export function createSyntaxError(message = "A syntax error occurred."): DOMException {
175
+ return createGlobalDOMException(message, "SyntaxError");
176
+ }
177
+
178
+ export function createSecurityError(message = "A security error occurred."): DOMException {
179
+ return createGlobalDOMException(message, "SecurityError");
180
+ }
181
+
182
+ export function createOperationError(message = "The operation failed."): DOMException {
183
+ return createGlobalDOMException(message, "OperationError");
184
+ }
185
+
186
+ /**
187
+ * Create a NotAllowedError for capability/permission denials.
188
+ * Used when a capability check fails.
189
+ * @see JS_RUNTIME_SECURITY.md Section 10
190
+ */
191
+ export function createNotAllowedError(message = "The request is not allowed."): DOMException {
192
+ return createGlobalDOMException(message, "NotAllowedError");
193
+ }
194
+
195
+ /**
196
+ * Denial reasons for capability errors.
197
+ * Aligned with JS_CAPABILITY_SECURITY_MODEL_SPEC_AND_PLAN.md
198
+ *
199
+ * Note: Uses string intersection to allow unknown reasons for forward compatibility.
200
+ * New OS versions may introduce new denial reasons.
201
+ */
202
+ export type CapabilityDenialReason =
203
+ | 'os_denied' // User denied at OS level
204
+ | 'os_restricted' // System policy (parental controls, MDM)
205
+ | 'broker_denied' // View broker denied
206
+ | 'module_not_granted' // Import capability missing
207
+ | 'app_not_granted' // App root capability missing
208
+ | 'requires_settings' // User must enable in Settings
209
+ | 'capability_unknown' // Capability not recognized by runtime
210
+ | 'os_version_too_low' // OS version doesn't support this capability
211
+ | 'temporarily_unavailable' // Capability temporarily unavailable
212
+ | (string & {}); // Forward compatibility for unknown reasons
213
+
214
+ /**
215
+ * Broad categories for denial reasons.
216
+ * Use this in switch statements for forward-compatible handling.
217
+ */
218
+ export type CapabilityDenialCategory =
219
+ | 'user_action_required' // User can fix by granting permission
220
+ | 'system_restricted' // System policy prevents access
221
+ | 'not_configured' // App/module hasn't been granted capability
222
+ | 'temporarily_unavailable' // May work later
223
+ | 'permanently_unavailable' // Will never work on this device/OS
224
+ | 'unknown'; // Unrecognized reason - handle gracefully
225
+
226
+ /**
227
+ * Error thrown when a capability check fails.
228
+ * Extends DOMException with additional context for capability denials.
229
+ *
230
+ * Designed for forward compatibility:
231
+ * - Use `reasonCategory` for switch statements (handles unknown reasons)
232
+ * - Use `denialReason` for logging/debugging (may contain future values)
233
+ * - Check `canRequestAgain` to know if prompting user is possible
234
+ *
235
+ * @example
236
+ * ```ts
237
+ * try {
238
+ * requireCapability('device:location');
239
+ * } catch (e) {
240
+ * if (e instanceof CapabilityDeniedError) {
241
+ * switch (e.reasonCategory) {
242
+ * case 'user_action_required':
243
+ * showPermissionPrompt(e.settingsUrl);
244
+ * break;
245
+ * case 'permanently_unavailable':
246
+ * hideLocationFeature();
247
+ * break;
248
+ * default:
249
+ * showGenericError(e.getUserMessage());
250
+ * }
251
+ * }
252
+ * }
253
+ * ```
254
+ *
255
+ * @see JS_CAPABILITY_SECURITY_MODEL_SPEC_AND_PLAN.md
256
+ */
257
+ export class CapabilityDeniedError extends DOMException {
258
+ /**
259
+ * The capability that was denied
260
+ */
261
+ readonly capability: string;
262
+
263
+ /**
264
+ * The specific reason for the denial.
265
+ * May contain values not in CapabilityDenialReason type for forward compatibility.
266
+ */
267
+ readonly denialReason: CapabilityDenialReason;
268
+
269
+ /**
270
+ * Broad category for the denial reason.
271
+ * Use this for switch statements to handle unknown reasons gracefully.
272
+ */
273
+ readonly reasonCategory: CapabilityDenialCategory;
274
+
275
+ /**
276
+ * Whether the capability can be requested again (e.g., via permission prompt)
277
+ */
278
+ readonly canRequestAgain: boolean;
279
+
280
+ /**
281
+ * URL to settings where user can enable this capability (platform-specific)
282
+ */
283
+ readonly settingsUrl?: string;
284
+
285
+ /**
286
+ * Additional platform-specific metadata.
287
+ * May contain information about why the capability was denied.
288
+ */
289
+ readonly metadata?: Record<string, unknown>;
290
+
291
+ constructor(
292
+ capability: string,
293
+ reason: CapabilityDenialReason = 'module_not_granted',
294
+ canRequestAgain: boolean = false,
295
+ settingsUrl?: string,
296
+ metadata?: Record<string, unknown>,
297
+ ) {
298
+ super(`Capability denied: ${capability}`, 'NotAllowedError');
299
+ this.capability = capability;
300
+ this.denialReason = reason;
301
+ this.reasonCategory = this._categorizeReason(reason);
302
+ this.canRequestAgain = canRequestAgain;
303
+ this.settingsUrl = settingsUrl;
304
+ this.metadata = metadata;
305
+
306
+ // Maintain proper stack trace
307
+ if (Error.captureStackTrace) {
308
+ Error.captureStackTrace(this, CapabilityDeniedError);
309
+ }
310
+ }
311
+
312
+ /**
313
+ * Categorize a denial reason for forward-compatible handling.
314
+ */
315
+ private _categorizeReason(reason: CapabilityDenialReason): CapabilityDenialCategory {
316
+ switch (reason) {
317
+ case 'os_denied':
318
+ case 'requires_settings':
319
+ return 'user_action_required';
320
+
321
+ case 'os_restricted':
322
+ return 'system_restricted';
323
+
324
+ case 'broker_denied':
325
+ case 'module_not_granted':
326
+ case 'app_not_granted':
327
+ return 'not_configured';
328
+
329
+ case 'temporarily_unavailable':
330
+ return 'temporarily_unavailable';
331
+
332
+ case 'capability_unknown':
333
+ case 'os_version_too_low':
334
+ return 'permanently_unavailable';
335
+
336
+ default:
337
+ // Unknown reason - return 'unknown' for forward compatibility
338
+ return 'unknown';
339
+ }
340
+ }
341
+
342
+ /**
343
+ * Returns a user-friendly message based on the denial reason.
344
+ * Handles unknown reasons gracefully.
345
+ */
346
+ getUserMessage(): string {
347
+ // Handle known reasons with specific messages
348
+ switch (this.denialReason) {
349
+ case 'os_denied':
350
+ return `Permission for ${this.capability} was denied. ${this.canRequestAgain ? 'You can request access again.' : 'Please enable it in system settings.'}`;
351
+ case 'os_restricted':
352
+ return `Access to ${this.capability} is restricted by system policy.`;
353
+ case 'broker_denied':
354
+ return `The application does not have permission for ${this.capability}.`;
355
+ case 'module_not_granted':
356
+ return `This module does not have the ${this.capability} capability.`;
357
+ case 'app_not_granted':
358
+ return `This application does not have the ${this.capability} capability.`;
359
+ case 'requires_settings':
360
+ return `Please enable ${this.capability} in Settings.`;
361
+ case 'capability_unknown':
362
+ return `The capability ${this.capability} is not available on this device.`;
363
+ case 'os_version_too_low':
364
+ return `The capability ${this.capability} requires a newer operating system version.`;
365
+ case 'temporarily_unavailable':
366
+ return `The capability ${this.capability} is temporarily unavailable. Please try again later.`;
367
+ }
368
+
369
+ // For unknown reasons, use category to provide helpful message
370
+ switch (this.reasonCategory) {
371
+ case 'user_action_required':
372
+ return `Permission required for ${this.capability}. Please grant access in settings.`;
373
+ case 'system_restricted':
374
+ return `Access to ${this.capability} is restricted.`;
375
+ case 'not_configured':
376
+ return `The capability ${this.capability} has not been configured.`;
377
+ case 'temporarily_unavailable':
378
+ return `${this.capability} is temporarily unavailable.`;
379
+ case 'permanently_unavailable':
380
+ return `${this.capability} is not available on this device.`;
381
+ default:
382
+ return `Capability denied: ${this.capability}`;
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Check if this error is for an unknown/future reason.
388
+ * Useful for logging or analytics.
389
+ */
390
+ isUnknownReason(): boolean {
391
+ return this.reasonCategory === 'unknown';
392
+ }
393
+ }
394
+
395
+ /**
396
+ * Create a NotAllowedError specifically for capability denials.
397
+ * Includes the capability name in the message for debugging.
398
+ *
399
+ * @deprecated Use CapabilityDeniedError directly for more context
400
+ */
401
+ export function createCapabilityDeniedError(
402
+ capability: string,
403
+ reason?: CapabilityDenialReason,
404
+ canRequestAgain?: boolean,
405
+ settingsUrl?: string,
406
+ metadata?: Record<string, unknown>,
407
+ ): CapabilityDeniedError {
408
+ return new CapabilityDeniedError(capability, reason, canRequestAgain, settingsUrl, metadata);
409
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * ErrorEvent - Event for runtime errors
3
+ *
4
+ * Used for reporting script errors and Worker errors.
5
+ * @see https://html.spec.whatwg.org/multipage/webappapis.html#errorevent
6
+ */
7
+
8
+ import { Event, EventInit } from './Event';
9
+
10
+ export interface ErrorEventInit extends EventInit {
11
+ message?: string;
12
+ filename?: string;
13
+ lineno?: number;
14
+ colno?: number;
15
+ error?: any;
16
+ }
17
+
18
+ export class ErrorEvent extends Event {
19
+ readonly message: string;
20
+ readonly filename: string;
21
+ readonly lineno: number;
22
+ readonly colno: number;
23
+ readonly error: any;
24
+
25
+ constructor(type: string, eventInitDict?: ErrorEventInit) {
26
+ super(type, eventInitDict);
27
+ this.message = eventInitDict?.message ?? '';
28
+ this.filename = eventInitDict?.filename ?? '';
29
+ this.lineno = eventInitDict?.lineno ?? 0;
30
+ this.colno = eventInitDict?.colno ?? 0;
31
+ this.error = eventInitDict?.error ?? null;
32
+ }
33
+
34
+ get [Symbol.toStringTag](): string {
35
+ return 'ErrorEvent';
36
+ }
37
+ }
38
+
39
+ export default ErrorEvent;
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Event - Web Standard Event Implementation
3
+ *
4
+ * @see https://dom.spec.whatwg.org/#interface-event
5
+ */
6
+
7
+ export interface EventInit {
8
+ bubbles?: boolean;
9
+ cancelable?: boolean;
10
+ composed?: boolean;
11
+ }
12
+
13
+ // Shared getter function defined OUTSIDE the class so it is available before
14
+ // any Event instances are constructed (Babel transpiles static class fields as
15
+ // post-class assignments, but the constructor may run before those assignments
16
+ // in the same IIFE scope). Per spec, desc1.get === desc2.get for different
17
+ // Event instances, so a single shared function is required.
18
+ const _isTrustedGetter = function(this: Event): boolean {
19
+ return false;
20
+ };
21
+
22
+ export class Event {
23
+ // Event phase constants
24
+ static readonly NONE = 0;
25
+ static readonly CAPTURING_PHASE = 1;
26
+ static readonly AT_TARGET = 2;
27
+ static readonly BUBBLING_PHASE = 3;
28
+
29
+ readonly type: string;
30
+ readonly bubbles: boolean;
31
+ readonly cancelable: boolean;
32
+ readonly composed: boolean;
33
+ readonly timeStamp: number;
34
+ // Mutable during dispatch
35
+ private _target: EventTarget | null = null;
36
+ private _currentTarget: EventTarget | null = null;
37
+ private _eventPhase: number = Event.NONE;
38
+ private _defaultPrevented: boolean = false;
39
+ private _stopPropagationFlag: boolean = false;
40
+ private _stopImmediatePropagationFlag: boolean = false;
41
+ private _inPassiveListener: boolean = false;
42
+
43
+ constructor(type: string, eventInitDict?: EventInit) {
44
+ this.type = type;
45
+ this.bubbles = eventInitDict?.bubbles ?? false;
46
+ this.cancelable = eventInitDict?.cancelable ?? false;
47
+ this.composed = eventInitDict?.composed ?? false;
48
+ this.timeStamp = performance?.now?.() ?? Date.now();
49
+ // Per spec, isTrusted must be an own property with a getter (no setter)
50
+ // so that it shows up in Object.getOwnPropertyDescriptor().
51
+ Object.defineProperty(this, "isTrusted", {
52
+ get: _isTrustedGetter,
53
+ configurable: false,
54
+ enumerable: true,
55
+ });
56
+ }
57
+
58
+ get target(): EventTarget | null {
59
+ return this._target;
60
+ }
61
+
62
+ get currentTarget(): EventTarget | null {
63
+ return this._currentTarget;
64
+ }
65
+
66
+ get eventPhase(): number {
67
+ return this._eventPhase;
68
+ }
69
+
70
+ get defaultPrevented(): boolean {
71
+ return this._defaultPrevented;
72
+ }
73
+
74
+ preventDefault(): void {
75
+ if (this.cancelable && !this._inPassiveListener) {
76
+ this._defaultPrevented = true;
77
+ }
78
+ // Per spec: calling preventDefault in a passive listener should be a no-op
79
+ // but implementations may log a warning
80
+ }
81
+
82
+ stopPropagation(): void {
83
+ this._stopPropagationFlag = true;
84
+ }
85
+
86
+ stopImmediatePropagation(): void {
87
+ this._stopPropagationFlag = true;
88
+ this._stopImmediatePropagationFlag = true;
89
+ }
90
+
91
+ composedPath(): EventTarget[] {
92
+ // In a non-DOM environment, the path is just the target
93
+ if (this._target) {
94
+ return [this._target];
95
+ }
96
+ return [];
97
+ }
98
+
99
+ // Internal methods for EventTarget dispatch
100
+ /** @internal */
101
+ _setTarget(target: EventTarget | null): void {
102
+ this._target = target;
103
+ }
104
+
105
+ /** @internal */
106
+ _setCurrentTarget(currentTarget: EventTarget | null): void {
107
+ this._currentTarget = currentTarget;
108
+ }
109
+
110
+ /** @internal */
111
+ _setEventPhase(phase: number): void {
112
+ this._eventPhase = phase;
113
+ }
114
+
115
+ /** @internal */
116
+ _isPropagationStopped(): boolean {
117
+ return this._stopPropagationFlag;
118
+ }
119
+
120
+ /** @internal */
121
+ _isImmediatePropagationStopped(): boolean {
122
+ return this._stopImmediatePropagationFlag;
123
+ }
124
+
125
+ /** @internal */
126
+ _resetFlags(): void {
127
+ this._stopPropagationFlag = false;
128
+ this._stopImmediatePropagationFlag = false;
129
+ this._defaultPrevented = false;
130
+ this._eventPhase = Event.NONE;
131
+ this._inPassiveListener = false;
132
+ }
133
+
134
+ /** @internal */
135
+ _setInPassiveListener(passive: boolean): void {
136
+ this._inPassiveListener = passive;
137
+ }
138
+ }
139
+
140
+ export interface CustomEventInit<T = any> extends EventInit {
141
+ detail?: T;
142
+ }
143
+
144
+ export class CustomEvent<T = any> extends Event {
145
+ readonly detail: T;
146
+
147
+ constructor(type: string, eventInitDict?: CustomEventInit<T>) {
148
+ super(type, eventInitDict);
149
+ this.detail = eventInitDict?.detail as T;
150
+ }
151
+ }