@basthon/gui-base 0.50.2 → 0.50.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/main.d.ts +11 -1
- package/lib/main.js +58 -27
- package/package.json +5 -5
package/lib/main.d.ts
CHANGED
|
@@ -23,6 +23,7 @@ export declare class GUIBase {
|
|
|
23
23
|
private _maxCheckpoints;
|
|
24
24
|
protected _contentFilename: string;
|
|
25
25
|
protected _urlKey: string;
|
|
26
|
+
private _extensions;
|
|
26
27
|
private _console_error;
|
|
27
28
|
constructor(options: GUIOptions);
|
|
28
29
|
/**
|
|
@@ -91,7 +92,12 @@ export declare class GUIBase {
|
|
|
91
92
|
*/
|
|
92
93
|
loadFromQS(key: string): Promise<string | null>;
|
|
93
94
|
/**
|
|
94
|
-
*
|
|
95
|
+
* Load all URL requested (and registered) extensions
|
|
96
|
+
* (call submited callback).
|
|
97
|
+
*/
|
|
98
|
+
private _loadExtensions;
|
|
99
|
+
/**
|
|
100
|
+
* Setup the UI (typically connect events, load extensions etc..).
|
|
95
101
|
*/
|
|
96
102
|
protected setupUI(options: any): Promise<void>;
|
|
97
103
|
/**
|
|
@@ -153,6 +159,10 @@ export declare class GUIBase {
|
|
|
153
159
|
* Load modules submited via URL (module= parameter) (async).
|
|
154
160
|
*/
|
|
155
161
|
loadURLModules(): Promise<void>;
|
|
162
|
+
/**
|
|
163
|
+
* Register an extension and its callback.
|
|
164
|
+
*/
|
|
165
|
+
registerExtension(name: string, callback: (() => Promise<void>)): void;
|
|
156
166
|
/**
|
|
157
167
|
* Opening file: If it has ext as extension, loading it in
|
|
158
168
|
* the editor or put on (emulated) local filesystem
|
package/lib/main.js
CHANGED
|
@@ -10,6 +10,7 @@ export class GUIBase {
|
|
|
10
10
|
this._maxCheckpoints = 10;
|
|
11
11
|
this._contentFilename = "content.txt";
|
|
12
12
|
this._urlKey = "content";
|
|
13
|
+
this._extensions = new Map();
|
|
13
14
|
/* console errors redirected to notification system */
|
|
14
15
|
this._console_error = console.error;
|
|
15
16
|
this._language = options.language;
|
|
@@ -141,25 +142,44 @@ export class GUIBase {
|
|
|
141
142
|
return content;
|
|
142
143
|
}
|
|
143
144
|
/**
|
|
144
|
-
*
|
|
145
|
+
* Load all URL requested (and registered) extensions
|
|
146
|
+
* (call submited callback).
|
|
147
|
+
*/
|
|
148
|
+
async _loadExtensions() {
|
|
149
|
+
/* get requested extensions from URL */
|
|
150
|
+
const url = new URL(window.location.href);
|
|
151
|
+
const extensions = (url.searchParams.get("extensions") || "").split(',');
|
|
152
|
+
// call callbacks for requested extensions
|
|
153
|
+
const promises = [];
|
|
154
|
+
for (const ext of extensions) {
|
|
155
|
+
const callback = this._extensions.get(ext);
|
|
156
|
+
if (callback != null)
|
|
157
|
+
promises.push(callback());
|
|
158
|
+
else
|
|
159
|
+
console.error(`Extension '${ext}' not supported.`);
|
|
160
|
+
}
|
|
161
|
+
await Promise.all(promises);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Setup the UI (typically connect events, load extensions etc..).
|
|
145
165
|
*/
|
|
146
166
|
async setupUI(options) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
167
|
+
/* wait for kernel load */
|
|
168
|
+
const kernel = await this.kernelLoader.kernelAvailable();
|
|
169
|
+
// this is ugly but it seems complicated to make
|
|
170
|
+
// GUI available in websocket for the notebook
|
|
171
|
+
// so patch it!
|
|
172
|
+
const dispatchEvent = kernel.dispatchEvent.bind(this.kernel);
|
|
173
|
+
kernel.dispatchEvent = async (event, data) => {
|
|
174
|
+
if (event === "eval.request")
|
|
175
|
+
await this.backup(false);
|
|
176
|
+
dispatchEvent(event, data);
|
|
177
|
+
};
|
|
178
|
+
kernel.addEventListener("eval.finished", () => {
|
|
179
|
+
this.validateBackup();
|
|
180
|
+
});
|
|
181
|
+
kernel.addEventListener("eval.error", () => {
|
|
182
|
+
this.validateBackup();
|
|
163
183
|
});
|
|
164
184
|
}
|
|
165
185
|
/**
|
|
@@ -250,6 +270,7 @@ export class GUIBase {
|
|
|
250
270
|
window.addEventListener('error', onerror);
|
|
251
271
|
window.addEventListener("unhandledrejection", onerror);
|
|
252
272
|
console.error = (message) => onerror(new Error(message));
|
|
273
|
+
await this._loadExtensions();
|
|
253
274
|
await ((_a = this._checkpoints) === null || _a === void 0 ? void 0 : _a.ready());
|
|
254
275
|
await this.setupUI(options);
|
|
255
276
|
await this.loadInitialContent(options);
|
|
@@ -295,16 +316,20 @@ export class GUIBase {
|
|
|
295
316
|
for (let fileURL of url.searchParams.getAll(key)) {
|
|
296
317
|
fileURL = decodeURIComponent(fileURL);
|
|
297
318
|
const filename = fileURL.split('/').pop() || "";
|
|
298
|
-
promises.push(
|
|
299
|
-
if (!response.ok)
|
|
300
|
-
throw new Error(response.statusText);
|
|
301
|
-
return response.arrayBuffer();
|
|
302
|
-
}).then((data) => {
|
|
303
|
-
return put(filename, data);
|
|
304
|
-
}).catch((error) => {
|
|
319
|
+
promises.push((async () => {
|
|
305
320
|
var _a;
|
|
306
|
-
|
|
307
|
-
|
|
321
|
+
let data;
|
|
322
|
+
try {
|
|
323
|
+
const response = await fetch(fileURL);
|
|
324
|
+
if (!response.ok)
|
|
325
|
+
throw new Error(response.statusText);
|
|
326
|
+
data = await response.arrayBuffer();
|
|
327
|
+
await put(filename, data);
|
|
328
|
+
}
|
|
329
|
+
catch (error) {
|
|
330
|
+
throw new Error(`Impossible de charger le fichier ${filename} : ${(_a = error === null || error === void 0 ? void 0 : error.message) !== null && _a !== void 0 ? _a : error.toString()}`);
|
|
331
|
+
}
|
|
332
|
+
})());
|
|
308
333
|
}
|
|
309
334
|
await Promise.all(promises);
|
|
310
335
|
}
|
|
@@ -317,7 +342,7 @@ export class GUIBase {
|
|
|
317
342
|
reader.readAsArrayBuffer(file);
|
|
318
343
|
reader.onload = async (event) => {
|
|
319
344
|
var _a, _b, _c;
|
|
320
|
-
(_a = this.kernelSafe) === null || _a === void 0 ? void 0 : _a.putRessource(file.name, reader.result);
|
|
345
|
+
await ((_a = this.kernelSafe) === null || _a === void 0 ? void 0 : _a.putRessource(file.name, reader.result));
|
|
321
346
|
this.info(`Fichier utilisable depuis ${(_b = this.kernel) === null || _b === void 0 ? void 0 : _b.languageName()}`, `${file.name} est maintenant utilisable depuis ${(_c = this.kernel) === null || _c === void 0 ? void 0 : _c.languageName()}`);
|
|
322
347
|
resolve();
|
|
323
348
|
};
|
|
@@ -340,6 +365,12 @@ export class GUIBase {
|
|
|
340
365
|
return;
|
|
341
366
|
await this._loadFromURL('module', this.kernelSafe.putModule.bind(this.kernelSafe));
|
|
342
367
|
}
|
|
368
|
+
/**
|
|
369
|
+
* Register an extension and its callback.
|
|
370
|
+
*/
|
|
371
|
+
registerExtension(name, callback) {
|
|
372
|
+
this._extensions.set(name, callback);
|
|
373
|
+
}
|
|
343
374
|
/**
|
|
344
375
|
* Opening file: If it has ext as extension, loading it in
|
|
345
376
|
* the editor or put on (emulated) local filesystem
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@basthon/gui-base",
|
|
3
|
-
"version": "0.50.
|
|
3
|
+
"version": "0.50.4",
|
|
4
4
|
"description": "Basthon - Base GUI",
|
|
5
5
|
"homepage": "https://basthon.fr",
|
|
6
6
|
"bugs": {
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"clean": "rm -rf lib/"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@basthon/checkpoints": "0.50.
|
|
29
|
-
"@basthon/kernel-base": "0.50.
|
|
30
|
-
"@basthon/kernel-loader": "0.50.
|
|
28
|
+
"@basthon/checkpoints": "0.50.4",
|
|
29
|
+
"@basthon/kernel-base": "0.50.4",
|
|
30
|
+
"@basthon/kernel-loader": "0.50.4",
|
|
31
31
|
"js-base64": "^3.7.2",
|
|
32
32
|
"pako": "^2.0.4",
|
|
33
33
|
"promise-delegate": "^1.0.1"
|
|
@@ -41,5 +41,5 @@
|
|
|
41
41
|
"publishConfig": {
|
|
42
42
|
"access": "public"
|
|
43
43
|
},
|
|
44
|
-
"gitHead": "
|
|
44
|
+
"gitHead": "e5551d308c66dbc081600522fe2d68ee8d34884c"
|
|
45
45
|
}
|