arcane-os 0.2.2 → 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.
- package/CHANGELOG.md +29 -0
- package/README.md +8 -8
- package/browser-runtime/ARCANE_SDK_BROWSER_RELEASE.json +29 -22
- package/browser-runtime/ai/ARCANE_AI_BROWSER_SPEECH_COMPONENTS.json +203 -0
- package/browser-runtime/ai/browser-kokoro-worker.mjs +11 -2
- package/browser-runtime/ai/browser-speech-artifacts.mjs +3230 -397
- package/browser-runtime/ai/browser-speech-providers.mjs +1141 -157
- package/browser-runtime/ai/browser-speech.mjs +2 -0
- package/browser-runtime/ai/browser-whisper-worker.mjs +11 -2
- package/browser-runtime/ai/model-controller.mjs +285 -95
- package/browser-runtime/ai/speech-worker-client.mjs +247 -32
- package/browser-runtime/ai/speech-worker-runtime.mjs +2310 -167
- package/browser-runtime/event-manager.mjs +1097 -1
- package/docs/architecture.md +2 -2
- package/docs/event-manager.md +155 -27
- package/docs/reference/README.md +27 -27
- package/docs/reference/ai/browser-speech-package-authority.json +835 -0
- package/docs/reference/ai/browser-speech.md +1162 -246
- package/docs/reference/ai/browser-wasm.md +18 -7
- package/docs/reference/availability-and-normalization.md +6 -3
- package/docs/reference/behavioral-testing.md +29 -6
- package/docs/reference/cli.md +117 -9
- package/docs/reference/core/arcane-ai-contracts.md +1 -1
- package/docs/reference/event-manager.md +577 -32
- package/docs/reference/inventory/package-api.json +478 -2
- package/docs/reference/inventory/runtime-components.json +108 -44
- package/docs/reference/inventory/runtime-modules.json +131 -53
- package/docs/reference/mail.md +316 -0
- package/docs/reference/protocols.md +157 -43
- package/docs/reference/runtime-components.md +258 -83
- package/docs/reference/runtime-modules.md +613 -77
- package/docs/reference/sdk-api.md +1014 -25
- package/package.json +5 -4
- package/runtime/ARCANE_RUNTIME_RELEASE.json +145 -140
- package/runtime/arcane/components/app-bar.html +34 -13
- package/runtime/arcane/components/assistant-panel.html +110 -57
- package/runtime/arcane/components/calculator.html +7 -4
- package/runtime/arcane/components/chart.html +58 -17
- package/runtime/arcane/components/chat.html +606 -136
- package/runtime/arcane/components/conversation-view.html +13 -6
- package/runtime/arcane/components/dashboard-config.html +96 -59
- package/runtime/arcane/components/data-maintenance.html +69 -14
- package/runtime/arcane/components/data-view.html +53 -7
- package/runtime/arcane/components/directory-picker.html +118 -32
- package/runtime/arcane/components/document-inspector.html +47 -10
- package/runtime/arcane/components/file-drop.html +81 -35
- package/runtime/arcane/components/file-inspector.html +72 -22
- package/runtime/arcane/components/file-manager.html +374 -79
- package/runtime/arcane/components/integration-settings.html +12 -5
- package/runtime/arcane/components/local-ai-status.html +48 -19
- package/runtime/arcane/components/markdown-document.html +161 -68
- package/runtime/arcane/components/markdown-editor.html +110 -33
- package/runtime/arcane/components/media-embed.html +8 -5
- package/runtime/arcane/components/modal.html +15 -5
- package/runtime/arcane/components/output-panel.html +28 -23
- package/runtime/arcane/components/preferences-form.html +22 -4
- package/runtime/arcane/components/record-timeline.html +18 -2
- package/runtime/arcane/components/relationship-board.html +23 -3
- package/runtime/arcane/components/screen-capture.html +10 -4
- package/runtime/arcane/components/source-code-viewer.html +76 -9
- package/runtime/arcane/components/source-explanation.html +23 -3
- package/runtime/arcane/components/speech.html +462 -384
- package/runtime/arcane/components/summary-strip.html +22 -11
- package/runtime/arcane/components/table.html +39 -21
- package/runtime/arcane/components/task-progress.html +79 -21
- package/runtime/arcane/components/terminal-workspace.html +7 -4
- package/runtime/arcane/components/theme-editor.html +7 -3
- package/runtime/arcane/components/unified-inbox.html +9 -4
- package/runtime/arcane/components/voice-transcription.html +639 -98
- package/runtime/arcane/components/weather-widget.html +5 -3
- package/runtime/arcane/components/web-navigator.html +48 -8
- package/runtime/arcane/entities/Chat.js +1 -1
- package/runtime/arcane/entities/User.js +110 -23
- package/runtime/arcane/modules/AI.js +2109 -130
- package/runtime/arcane/modules/AIProviderRuntime.js +720 -13
- package/runtime/arcane/modules/AIRuntimeState.js +109 -52
- package/runtime/arcane/modules/ApiModelDatabase.js +390 -17
- package/runtime/arcane/modules/BrowserTestSuite.js +205 -28
- package/runtime/arcane/modules/CalculatorEngine.js +63 -3
- package/runtime/arcane/modules/CommunicationAppController.js +588 -28
- package/runtime/arcane/modules/CommunicationHub.js +590 -10
- package/runtime/arcane/modules/ComponentContracts.js +470 -0
- package/runtime/arcane/modules/ConversationTimebox.js +152 -33
- package/runtime/arcane/modules/DBLS.js +40 -7
- package/runtime/arcane/modules/DBOPFS.js +35 -11
- package/runtime/arcane/modules/DataMaintenance.js +12 -2
- package/runtime/arcane/modules/Errors.js +65 -7
- package/runtime/arcane/modules/HTMLImport.js +198 -14
- package/runtime/arcane/modules/LocalAIReadinessController.js +208 -29
- package/runtime/arcane/modules/Mail.js +738 -115
- package/runtime/arcane/modules/MailOutbox.mjs +1395 -0
- package/runtime/arcane/modules/MailTransport.mjs +197 -39
- package/runtime/arcane/modules/Ollama.js +36 -1
- package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +583 -7
- package/runtime/arcane/modules/PreferenceStore.js +367 -33
- package/runtime/arcane/modules/RecordReviewStore.js +322 -23
- package/runtime/arcane/modules/ScreenCapture.js +1397 -15
- package/runtime/arcane/modules/SpeechPlayback.js +438 -41
- package/runtime/arcane/modules/TerminalClient.js +277 -12
- package/runtime/arcane/modules/ThemeBootstrap.js +80 -6
- package/runtime/arcane/modules/ThemeManager.js +39 -7
- package/runtime/arcane/modules/TimeGuard.js +131 -20
- package/runtime/arcane/modules/WaitForComponent.js +386 -33
- package/schemas/arcane-lock.schema.json +2 -2
- package/src/cli/main.mjs +435 -9
- package/src/event-manager.mjs +1097 -1
- package/src/import-map.mjs +21 -3
- package/src/index.mjs +13 -0
- package/src/installed-sdk-runtime.mjs +112 -0
- package/src/mail-api.mjs +22 -0
- package/src/mail-credentials.mjs +667 -0
- package/src/mail-server.mjs +1769 -0
- package/src/mail.mjs +261 -0
- package/src/sdk-browser-runtime.mjs +85 -41
- package/src/testing-loader.mjs +7 -0
- package/src/toolchain.mjs +3 -0
- package/src/workspace.mjs +1 -1
|
@@ -1,31 +1,205 @@
|
|
|
1
|
+
export const COMPONENT_WAIT_ERROR_CODES=Object.freeze({
|
|
2
|
+
abortSignalInvalid:'ARCANE_COMPONENT_READINESS_ABORT_SIGNAL_INVALID',
|
|
3
|
+
elementRequired:'ARCANE_COMPONENT_READINESS_ELEMENT_REQUIRED',
|
|
4
|
+
errorEventReported:'ARCANE_COMPONENT_READINESS_ERROR_EVENT_REPORTED',
|
|
5
|
+
errorEventInspectionFailed:'ARCANE_COMPONENT_READINESS_ERROR_EVENT_INSPECTION_FAILED',
|
|
6
|
+
listenerCleanupFailed:'ARCANE_COMPONENT_READINESS_LISTENER_CLEANUP_FAILED',
|
|
7
|
+
listenerInstallationFailed:'ARCANE_COMPONENT_READINESS_LISTENER_INSTALLATION_FAILED',
|
|
8
|
+
listenerTargetInvalid:'ARCANE_COMPONENT_READINESS_LISTENER_TARGET_INVALID',
|
|
9
|
+
readinessEventRequired:'ARCANE_COMPONENT_READINESS_EVENT_REQUIRED',
|
|
10
|
+
stateInspectionFailed:'ARCANE_COMPONENT_READINESS_STATE_INSPECTION_FAILED',
|
|
11
|
+
timeoutInstallationFailed:'ARCANE_COMPONENT_READINESS_TIMEOUT_INSTALLATION_FAILED',
|
|
12
|
+
waitAborted:'ARCANE_COMPONENT_READINESS_WAIT_ABORTED',
|
|
13
|
+
waitOptionsInvalid:'ARCANE_COMPONENT_READINESS_WAIT_OPTIONS_INVALID',
|
|
14
|
+
waitTimedOut:'COMPONENT_READY_TIMEOUT'
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
export const COMPONENT_WAIT_REASONS=Object.freeze({
|
|
18
|
+
abortSignalInvalid:'component-readiness-abort-signal-invalid',
|
|
19
|
+
elementMissing:'component-readiness-element-missing',
|
|
20
|
+
errorEventReported:'component-readiness-error-event-reported',
|
|
21
|
+
errorEventInspectionFailed:'component-readiness-error-event-inspection-threw',
|
|
22
|
+
listenerCleanupFailed:'component-readiness-listener-cleanup-rejected',
|
|
23
|
+
listenerInstallationFailed:'component-readiness-listener-installation-rejected',
|
|
24
|
+
listenerTargetInvalid:'component-readiness-listener-target-invalid',
|
|
25
|
+
readinessEventMissing:'component-readiness-event-missing',
|
|
26
|
+
stateInspectionFailed:'component-readiness-state-inspection-threw',
|
|
27
|
+
timeoutInstallationFailed:'component-readiness-timeout-installation-rejected',
|
|
28
|
+
waitAborted:'component-readiness-wait-aborted',
|
|
29
|
+
waitOptionsInvalid:'component-readiness-wait-options-invalid',
|
|
30
|
+
waitTimedOut:'component-readiness-wait-timed-out'
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
function defineComponentWaitError(error,code,reason,cause){
|
|
34
|
+
const priorCode=typeof error?.code==='string'&&error.code
|
|
35
|
+
?error.code
|
|
36
|
+
:null;
|
|
37
|
+
try{
|
|
38
|
+
if(priorCode&&priorCode!==code&&!Object.hasOwn(error,'causeCode')){
|
|
39
|
+
Object.defineProperty(
|
|
40
|
+
error,
|
|
41
|
+
'causeCode',
|
|
42
|
+
{value:priorCode,enumerable:false,configurable:true,writable:true}
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
Object.defineProperty(
|
|
46
|
+
error,
|
|
47
|
+
'code',
|
|
48
|
+
{value:code,enumerable:false,configurable:true,writable:true}
|
|
49
|
+
);
|
|
50
|
+
Object.defineProperty(
|
|
51
|
+
error,
|
|
52
|
+
'reason',
|
|
53
|
+
{value:reason,enumerable:false,configurable:true,writable:true}
|
|
54
|
+
);
|
|
55
|
+
if(cause!==undefined&&cause!==error&&!('cause' in error)){
|
|
56
|
+
Object.defineProperty(
|
|
57
|
+
error,
|
|
58
|
+
'cause',
|
|
59
|
+
{value:cause,enumerable:false,configurable:true,writable:true}
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return error;
|
|
63
|
+
}catch{
|
|
64
|
+
const replacement=new Error(error?.message||'Component readiness wait failed.');
|
|
65
|
+
replacement.name=error?.name||'Error';
|
|
66
|
+
replacement.code=code;
|
|
67
|
+
replacement.reason=reason;
|
|
68
|
+
if(priorCode&&priorCode!==code){
|
|
69
|
+
replacement.causeCode=priorCode;
|
|
70
|
+
}
|
|
71
|
+
replacement.cause=cause===undefined?error:cause;
|
|
72
|
+
return replacement;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function componentWaitError(message,code,reason,ErrorClass=Error,cause){
|
|
77
|
+
return defineComponentWaitError(
|
|
78
|
+
new ErrorClass(message),
|
|
79
|
+
code,
|
|
80
|
+
reason,
|
|
81
|
+
cause
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function componentWaitAbortError(reason){
|
|
86
|
+
const ownsError=!(reason instanceof Error&&reason.name==='AbortError');
|
|
87
|
+
const error=ownsError
|
|
88
|
+
?new Error('Component readiness wait was aborted.')
|
|
89
|
+
:reason;
|
|
90
|
+
if(ownsError){
|
|
91
|
+
error.name='AbortError';
|
|
92
|
+
}
|
|
93
|
+
return defineComponentWaitError(
|
|
94
|
+
error,
|
|
95
|
+
COMPONENT_WAIT_ERROR_CODES.waitAborted,
|
|
96
|
+
COMPONENT_WAIT_REASONS.waitAborted,
|
|
97
|
+
reason
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
|
|
1
101
|
function waitForComponent(element,options={}){
|
|
102
|
+
if(!options||typeof options!=='object'||Array.isArray(options)){
|
|
103
|
+
return Promise.reject(
|
|
104
|
+
componentWaitError(
|
|
105
|
+
'Component readiness wait options must be an object.',
|
|
106
|
+
COMPONENT_WAIT_ERROR_CODES.waitOptionsInvalid,
|
|
107
|
+
COMPONENT_WAIT_REASONS.waitOptionsInvalid,
|
|
108
|
+
TypeError
|
|
109
|
+
)
|
|
110
|
+
);
|
|
111
|
+
}
|
|
2
112
|
const {
|
|
3
113
|
errorEvent='',
|
|
4
114
|
methods=[],
|
|
5
115
|
property='',
|
|
6
116
|
event='',
|
|
117
|
+
signal=null,
|
|
7
118
|
timeoutMs=0
|
|
8
119
|
}=options;
|
|
9
120
|
|
|
121
|
+
if(typeof errorEvent!=='string'
|
|
122
|
+
||!Array.isArray(methods)
|
|
123
|
+
||methods.some(function invalidComponentMethod(method){
|
|
124
|
+
return typeof method!=='string'||method.trim().length<1;
|
|
125
|
+
})
|
|
126
|
+
||typeof property!=='string'
|
|
127
|
+
||typeof event!=='string'){
|
|
128
|
+
return Promise.reject(
|
|
129
|
+
componentWaitError(
|
|
130
|
+
'Component readiness event, errorEvent, property, and methods options are invalid.',
|
|
131
|
+
COMPONENT_WAIT_ERROR_CODES.waitOptionsInvalid,
|
|
132
|
+
COMPONENT_WAIT_REASONS.waitOptionsInvalid,
|
|
133
|
+
TypeError
|
|
134
|
+
)
|
|
135
|
+
);
|
|
136
|
+
}
|
|
10
137
|
if(!Number.isFinite(timeoutMs)||timeoutMs<0||timeoutMs>60000){
|
|
11
|
-
return Promise.reject(
|
|
138
|
+
return Promise.reject(
|
|
139
|
+
componentWaitError(
|
|
140
|
+
'timeoutMs must be between 0 and 60000.',
|
|
141
|
+
COMPONENT_WAIT_ERROR_CODES.waitOptionsInvalid,
|
|
142
|
+
COMPONENT_WAIT_REASONS.waitOptionsInvalid,
|
|
143
|
+
RangeError
|
|
144
|
+
)
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
if(signal!==null
|
|
148
|
+
&&(
|
|
149
|
+
typeof signal!=='object'
|
|
150
|
+
||typeof signal.aborted!=='boolean'
|
|
151
|
+
||typeof signal.addEventListener!=='function'
|
|
152
|
+
||typeof signal.removeEventListener!=='function'
|
|
153
|
+
)){
|
|
154
|
+
return Promise.reject(
|
|
155
|
+
componentWaitError(
|
|
156
|
+
'signal must be an AbortSignal.',
|
|
157
|
+
COMPONENT_WAIT_ERROR_CODES.abortSignalInvalid,
|
|
158
|
+
COMPONENT_WAIT_REASONS.abortSignalInvalid,
|
|
159
|
+
TypeError
|
|
160
|
+
)
|
|
161
|
+
);
|
|
12
162
|
}
|
|
13
163
|
|
|
14
164
|
return new Promise(
|
|
15
165
|
function waitForComponentPromise(resolve,reject){
|
|
166
|
+
let abortListenerInstalled=false;
|
|
167
|
+
let errorListenerInstalled=false;
|
|
168
|
+
let eventListenerInstalled=false;
|
|
16
169
|
let timeout=null;
|
|
170
|
+
let settled=false;
|
|
17
171
|
|
|
18
172
|
function cleanup(){
|
|
19
|
-
|
|
20
|
-
|
|
173
|
+
let cleanupError=null;
|
|
174
|
+
if(eventListenerInstalled){
|
|
175
|
+
try{
|
|
176
|
+
element.removeEventListener(event,eventHandler);
|
|
177
|
+
}catch(error){
|
|
178
|
+
cleanupError=error;
|
|
179
|
+
}
|
|
180
|
+
eventListenerInstalled=false;
|
|
21
181
|
}
|
|
22
|
-
if(
|
|
23
|
-
|
|
182
|
+
if(errorListenerInstalled){
|
|
183
|
+
try{
|
|
184
|
+
element.removeEventListener(errorEvent,errorHandler);
|
|
185
|
+
}catch(error){
|
|
186
|
+
cleanupError??=error;
|
|
187
|
+
}
|
|
188
|
+
errorListenerInstalled=false;
|
|
24
189
|
}
|
|
25
190
|
if(timeout!==null){
|
|
26
191
|
clearTimeout(timeout);
|
|
27
192
|
timeout=null;
|
|
28
193
|
}
|
|
194
|
+
if(abortListenerInstalled){
|
|
195
|
+
try{
|
|
196
|
+
signal.removeEventListener('abort',abortWait);
|
|
197
|
+
}catch(error){
|
|
198
|
+
cleanupError??=error;
|
|
199
|
+
}
|
|
200
|
+
abortListenerInstalled=false;
|
|
201
|
+
}
|
|
202
|
+
return cleanupError;
|
|
29
203
|
}
|
|
30
204
|
|
|
31
205
|
function isReady(){
|
|
@@ -33,65 +207,244 @@ function waitForComponent(element,options={}){
|
|
|
33
207
|
return false;
|
|
34
208
|
}
|
|
35
209
|
|
|
36
|
-
return methods.every(
|
|
37
|
-
|
|
38
|
-
);
|
|
210
|
+
return methods.every(function componentMethodAvailable(method){
|
|
211
|
+
return typeof element[method]==='function';
|
|
212
|
+
});
|
|
39
213
|
}
|
|
40
214
|
|
|
41
215
|
function complete(){
|
|
42
|
-
|
|
216
|
+
if(settled){
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
settled=true;
|
|
220
|
+
const cleanupError=cleanup();
|
|
221
|
+
if(cleanupError){
|
|
222
|
+
reject(
|
|
223
|
+
componentWaitError(
|
|
224
|
+
'Component readiness listener cleanup failed.',
|
|
225
|
+
COMPONENT_WAIT_ERROR_CODES.listenerCleanupFailed,
|
|
226
|
+
COMPONENT_WAIT_REASONS.listenerCleanupFailed,
|
|
227
|
+
Error,
|
|
228
|
+
cleanupError
|
|
229
|
+
)
|
|
230
|
+
);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
43
233
|
resolve(element);
|
|
44
234
|
}
|
|
45
235
|
|
|
46
236
|
function fail(error){
|
|
47
|
-
|
|
237
|
+
if(settled){
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
settled=true;
|
|
241
|
+
const cleanupError=cleanup();
|
|
242
|
+
if(cleanupError){
|
|
243
|
+
try{
|
|
244
|
+
Object.defineProperty(
|
|
245
|
+
error,
|
|
246
|
+
'cleanupError',
|
|
247
|
+
{
|
|
248
|
+
value:cleanupError,
|
|
249
|
+
enumerable:false,
|
|
250
|
+
configurable:true,
|
|
251
|
+
writable:true
|
|
252
|
+
}
|
|
253
|
+
);
|
|
254
|
+
}catch{}
|
|
255
|
+
}
|
|
48
256
|
reject(error);
|
|
49
257
|
}
|
|
50
258
|
|
|
259
|
+
function abortWait(){
|
|
260
|
+
fail(componentWaitAbortError(signal?.reason));
|
|
261
|
+
}
|
|
262
|
+
|
|
51
263
|
function check(){
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
264
|
+
try{
|
|
265
|
+
if(isReady()){
|
|
266
|
+
complete();
|
|
267
|
+
return true;
|
|
268
|
+
}
|
|
269
|
+
return false;
|
|
270
|
+
}catch(error){
|
|
271
|
+
fail(
|
|
272
|
+
componentWaitError(
|
|
273
|
+
'Component readiness state inspection failed.',
|
|
274
|
+
COMPONENT_WAIT_ERROR_CODES.stateInspectionFailed,
|
|
275
|
+
COMPONENT_WAIT_REASONS.stateInspectionFailed,
|
|
276
|
+
Error,
|
|
277
|
+
error
|
|
278
|
+
)
|
|
279
|
+
);
|
|
280
|
+
return false;
|
|
55
281
|
}
|
|
56
|
-
return false;
|
|
57
282
|
}
|
|
58
283
|
|
|
59
284
|
function eventHandler(){
|
|
60
|
-
|
|
61
|
-
complete();
|
|
62
|
-
}
|
|
285
|
+
check();
|
|
63
286
|
}
|
|
64
287
|
|
|
65
288
|
function errorHandler(errorEventObject){
|
|
66
|
-
|
|
67
|
-
errorEventObject?.detail
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
289
|
+
try{
|
|
290
|
+
const detail=errorEventObject?.detail;
|
|
291
|
+
const error=new Error(
|
|
292
|
+
detail?.message||'The component reported a loading error.'
|
|
293
|
+
);
|
|
294
|
+
const componentCode=typeof detail?.code==='string'
|
|
295
|
+
&&detail.code.trim()
|
|
296
|
+
?detail.code
|
|
297
|
+
:null;
|
|
298
|
+
if(componentCode){
|
|
299
|
+
error.componentCode=componentCode;
|
|
300
|
+
}
|
|
301
|
+
error.compatibilityCode=componentCode||'COMPONENT_READY_FAILED';
|
|
302
|
+
fail(
|
|
303
|
+
defineComponentWaitError(
|
|
304
|
+
error,
|
|
305
|
+
COMPONENT_WAIT_ERROR_CODES.errorEventReported,
|
|
306
|
+
COMPONENT_WAIT_REASONS.errorEventReported,
|
|
307
|
+
detail?.error
|
|
308
|
+
)
|
|
309
|
+
);
|
|
310
|
+
}catch(error){
|
|
311
|
+
fail(
|
|
312
|
+
componentWaitError(
|
|
313
|
+
'Component readiness error-event inspection failed.',
|
|
314
|
+
COMPONENT_WAIT_ERROR_CODES.errorEventInspectionFailed,
|
|
315
|
+
COMPONENT_WAIT_REASONS.errorEventInspectionFailed,
|
|
316
|
+
Error,
|
|
317
|
+
error
|
|
318
|
+
)
|
|
319
|
+
);
|
|
320
|
+
}
|
|
72
321
|
}
|
|
73
322
|
|
|
74
323
|
if(!element){
|
|
75
|
-
fail(
|
|
324
|
+
fail(
|
|
325
|
+
componentWaitError(
|
|
326
|
+
'Component element is required.',
|
|
327
|
+
COMPONENT_WAIT_ERROR_CODES.elementRequired,
|
|
328
|
+
COMPONENT_WAIT_REASONS.elementMissing,
|
|
329
|
+
TypeError
|
|
330
|
+
)
|
|
331
|
+
);
|
|
332
|
+
return;
|
|
333
|
+
}
|
|
334
|
+
if((event||errorEvent)
|
|
335
|
+
&&(
|
|
336
|
+
typeof element.addEventListener!=='function'
|
|
337
|
+
||typeof element.removeEventListener!=='function'
|
|
338
|
+
)){
|
|
339
|
+
fail(
|
|
340
|
+
componentWaitError(
|
|
341
|
+
'The component readiness listener target must provide addEventListener() and removeEventListener().',
|
|
342
|
+
COMPONENT_WAIT_ERROR_CODES.listenerTargetInvalid,
|
|
343
|
+
COMPONENT_WAIT_REASONS.listenerTargetInvalid,
|
|
344
|
+
TypeError
|
|
345
|
+
)
|
|
346
|
+
);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
if(signal?.aborted){
|
|
350
|
+
abortWait();
|
|
76
351
|
return;
|
|
77
352
|
}
|
|
78
353
|
|
|
354
|
+
if(signal){
|
|
355
|
+
abortListenerInstalled=true;
|
|
356
|
+
try{
|
|
357
|
+
signal.addEventListener('abort',abortWait,{once:true});
|
|
358
|
+
}catch(error){
|
|
359
|
+
fail(
|
|
360
|
+
componentWaitError(
|
|
361
|
+
'Component readiness abort-listener installation failed.',
|
|
362
|
+
COMPONENT_WAIT_ERROR_CODES.listenerInstallationFailed,
|
|
363
|
+
COMPONENT_WAIT_REASONS.listenerInstallationFailed,
|
|
364
|
+
Error,
|
|
365
|
+
error
|
|
366
|
+
)
|
|
367
|
+
);
|
|
368
|
+
return;
|
|
369
|
+
}
|
|
370
|
+
if(settled){
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
|
|
79
375
|
if(event){
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
376
|
+
try{
|
|
377
|
+
element.addEventListener(event,eventHandler);
|
|
378
|
+
eventListenerInstalled=true;
|
|
379
|
+
}catch(error){
|
|
380
|
+
fail(
|
|
381
|
+
componentWaitError(
|
|
382
|
+
'Component readiness listener installation failed.',
|
|
383
|
+
COMPONENT_WAIT_ERROR_CODES.listenerInstallationFailed,
|
|
384
|
+
COMPONENT_WAIT_REASONS.listenerInstallationFailed,
|
|
385
|
+
Error,
|
|
386
|
+
error
|
|
387
|
+
)
|
|
388
|
+
);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
}else if(!check()){
|
|
392
|
+
if(settled){
|
|
393
|
+
return;
|
|
394
|
+
}
|
|
395
|
+
fail(
|
|
396
|
+
componentWaitError(
|
|
397
|
+
'A component readiness event is required.',
|
|
398
|
+
COMPONENT_WAIT_ERROR_CODES.readinessEventRequired,
|
|
399
|
+
COMPONENT_WAIT_REASONS.readinessEventMissing
|
|
400
|
+
)
|
|
401
|
+
);
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
404
|
+
if(settled){
|
|
83
405
|
return;
|
|
84
406
|
}
|
|
85
407
|
|
|
86
408
|
if(errorEvent){
|
|
87
|
-
|
|
409
|
+
try{
|
|
410
|
+
element.addEventListener(errorEvent,errorHandler);
|
|
411
|
+
errorListenerInstalled=true;
|
|
412
|
+
}catch(error){
|
|
413
|
+
fail(
|
|
414
|
+
componentWaitError(
|
|
415
|
+
'Component readiness error-listener installation failed.',
|
|
416
|
+
COMPONENT_WAIT_ERROR_CODES.listenerInstallationFailed,
|
|
417
|
+
COMPONENT_WAIT_REASONS.listenerInstallationFailed,
|
|
418
|
+
Error,
|
|
419
|
+
error
|
|
420
|
+
)
|
|
421
|
+
);
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
88
424
|
}
|
|
89
425
|
if(timeoutMs>0){
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
426
|
+
try{
|
|
427
|
+
timeout=setTimeout(function failComponentReadinessTimeout(){
|
|
428
|
+
fail(
|
|
429
|
+
componentWaitError(
|
|
430
|
+
`Component readiness timed out after ${timeoutMs} ms.`,
|
|
431
|
+
COMPONENT_WAIT_ERROR_CODES.waitTimedOut,
|
|
432
|
+
COMPONENT_WAIT_REASONS.waitTimedOut
|
|
433
|
+
)
|
|
434
|
+
);
|
|
435
|
+
},timeoutMs);
|
|
436
|
+
}catch(error){
|
|
437
|
+
fail(
|
|
438
|
+
componentWaitError(
|
|
439
|
+
'Component readiness timeout installation failed.',
|
|
440
|
+
COMPONENT_WAIT_ERROR_CODES.timeoutInstallationFailed,
|
|
441
|
+
COMPONENT_WAIT_REASONS.timeoutInstallationFailed,
|
|
442
|
+
Error,
|
|
443
|
+
error
|
|
444
|
+
)
|
|
445
|
+
);
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
95
448
|
}
|
|
96
449
|
|
|
97
450
|
check();
|
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
"const": "arcane-os"
|
|
29
29
|
},
|
|
30
30
|
"version": {
|
|
31
|
-
"const": "0.
|
|
31
|
+
"const": "0.3.0"
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
},
|
|
@@ -82,7 +82,7 @@
|
|
|
82
82
|
"const": "arcane-sdk-browser-runtime-v1"
|
|
83
83
|
},
|
|
84
84
|
"sdkVersion": {
|
|
85
|
-
"const": "0.
|
|
85
|
+
"const": "0.3.0"
|
|
86
86
|
},
|
|
87
87
|
"source": {
|
|
88
88
|
"type": "object",
|