@basthon/gui-base 0.50.1 → 0.50.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.
- package/lib/main.d.ts +7 -1
- package/lib/main.js +49 -27
- package/package.json +5 -5
package/lib/main.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export declare class GUIBase {
|
|
|
23
23
|
private _maxCheckpoints;
|
|
24
24
|
protected _contentFilename: string;
|
|
25
25
|
protected _urlKey: string;
|
|
26
|
+
private _extensions;
|
|
27
|
+
private _urlExtensions;
|
|
26
28
|
private _console_error;
|
|
27
29
|
constructor(options: GUIOptions);
|
|
28
30
|
/**
|
|
@@ -91,7 +93,7 @@ export declare class GUIBase {
|
|
|
91
93
|
*/
|
|
92
94
|
loadFromQS(key: string): Promise<string | null>;
|
|
93
95
|
/**
|
|
94
|
-
* Setup the UI (typically connect events etc..).
|
|
96
|
+
* Setup the UI (typically connect events, load extensions etc..).
|
|
95
97
|
*/
|
|
96
98
|
protected setupUI(options: any): Promise<void>;
|
|
97
99
|
/**
|
|
@@ -153,6 +155,10 @@ export declare class GUIBase {
|
|
|
153
155
|
* Load modules submited via URL (module= parameter) (async).
|
|
154
156
|
*/
|
|
155
157
|
loadURLModules(): Promise<void>;
|
|
158
|
+
/**
|
|
159
|
+
* Register an extension and its callback.
|
|
160
|
+
*/
|
|
161
|
+
registerExtension(name: string, callback: (() => void)): void;
|
|
156
162
|
/**
|
|
157
163
|
* Opening file: If it has ext as extension, loading it in
|
|
158
164
|
* 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;
|
|
@@ -19,6 +20,9 @@ export class GUIBase {
|
|
|
19
20
|
/* per language checkpoints */
|
|
20
21
|
if (!options.noCheckpointsInit)
|
|
21
22
|
this._checkpoints = new CheckpointsManager(`${options.uiName}.${options.language}`, this._maxCheckpoints);
|
|
23
|
+
/* get requested extensions from URL */
|
|
24
|
+
const url = new URL(window.location.href);
|
|
25
|
+
this._urlExtensions = (url.searchParams.get("extensions") || "").split(',');
|
|
22
26
|
}
|
|
23
27
|
/**
|
|
24
28
|
* Language getter.
|
|
@@ -141,25 +145,33 @@ export class GUIBase {
|
|
|
141
145
|
return content;
|
|
142
146
|
}
|
|
143
147
|
/**
|
|
144
|
-
* Setup the UI (typically connect events etc..).
|
|
148
|
+
* Setup the UI (typically connect events, load extensions etc..).
|
|
145
149
|
*/
|
|
146
150
|
async setupUI(options) {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
151
|
+
/* load extensions */
|
|
152
|
+
for (const ext of this._urlExtensions) {
|
|
153
|
+
const callback = this._extensions.get(ext);
|
|
154
|
+
if (callback != null)
|
|
155
|
+
callback();
|
|
156
|
+
else
|
|
157
|
+
console.error(`Extension '${ext}' not supported.`);
|
|
158
|
+
}
|
|
159
|
+
/* wait for kernel load */
|
|
160
|
+
const kernel = await this.kernelLoader.kernelAvailable();
|
|
161
|
+
// this is ugly but it seems complicated to make
|
|
162
|
+
// GUI available in websocket for the notebook
|
|
163
|
+
// so patch it!
|
|
164
|
+
const dispatchEvent = kernel.dispatchEvent.bind(this.kernel);
|
|
165
|
+
kernel.dispatchEvent = async (event, data) => {
|
|
166
|
+
if (event === "eval.request")
|
|
167
|
+
await this.backup(false);
|
|
168
|
+
dispatchEvent(event, data);
|
|
169
|
+
};
|
|
170
|
+
kernel.addEventListener("eval.finished", () => {
|
|
171
|
+
this.validateBackup();
|
|
172
|
+
});
|
|
173
|
+
kernel.addEventListener("eval.error", () => {
|
|
174
|
+
this.validateBackup();
|
|
163
175
|
});
|
|
164
176
|
}
|
|
165
177
|
/**
|
|
@@ -295,16 +307,20 @@ export class GUIBase {
|
|
|
295
307
|
for (let fileURL of url.searchParams.getAll(key)) {
|
|
296
308
|
fileURL = decodeURIComponent(fileURL);
|
|
297
309
|
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) => {
|
|
310
|
+
promises.push((async () => {
|
|
305
311
|
var _a;
|
|
306
|
-
|
|
307
|
-
|
|
312
|
+
let data;
|
|
313
|
+
try {
|
|
314
|
+
const response = await fetch(fileURL);
|
|
315
|
+
if (!response.ok)
|
|
316
|
+
throw new Error(response.statusText);
|
|
317
|
+
data = await response.arrayBuffer();
|
|
318
|
+
await put(filename, data);
|
|
319
|
+
}
|
|
320
|
+
catch (error) {
|
|
321
|
+
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()}`);
|
|
322
|
+
}
|
|
323
|
+
})());
|
|
308
324
|
}
|
|
309
325
|
await Promise.all(promises);
|
|
310
326
|
}
|
|
@@ -317,7 +333,7 @@ export class GUIBase {
|
|
|
317
333
|
reader.readAsArrayBuffer(file);
|
|
318
334
|
reader.onload = async (event) => {
|
|
319
335
|
var _a, _b, _c;
|
|
320
|
-
(_a = this.kernelSafe) === null || _a === void 0 ? void 0 : _a.putRessource(file.name, reader.result);
|
|
336
|
+
await ((_a = this.kernelSafe) === null || _a === void 0 ? void 0 : _a.putRessource(file.name, reader.result));
|
|
321
337
|
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
338
|
resolve();
|
|
323
339
|
};
|
|
@@ -340,6 +356,12 @@ export class GUIBase {
|
|
|
340
356
|
return;
|
|
341
357
|
await this._loadFromURL('module', this.kernelSafe.putModule.bind(this.kernelSafe));
|
|
342
358
|
}
|
|
359
|
+
/**
|
|
360
|
+
* Register an extension and its callback.
|
|
361
|
+
*/
|
|
362
|
+
registerExtension(name, callback) {
|
|
363
|
+
this._extensions.set(name, callback);
|
|
364
|
+
}
|
|
343
365
|
/**
|
|
344
366
|
* Opening file: If it has ext as extension, loading it in
|
|
345
367
|
* 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.3",
|
|
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.3",
|
|
29
|
+
"@basthon/kernel-base": "0.50.3",
|
|
30
|
+
"@basthon/kernel-loader": "0.50.3",
|
|
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": "9283011a642c404226f1c63f93fbed1cfc0aae8e"
|
|
45
45
|
}
|