@basthon/gui-base 0.50.2 → 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 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
- this.kernelLoader.kernelAvailable().then((kernel) => {
148
- // this is ugly but it seems complicated to make
149
- // GUI available in websocket for the notebook
150
- // so patch it!
151
- const dispatchEvent = kernel.dispatchEvent.bind(this.kernel);
152
- kernel.dispatchEvent = async (event, data) => {
153
- if (event === "eval.request")
154
- await this.backup(false);
155
- dispatchEvent(event, data);
156
- };
157
- kernel.addEventListener("eval.finished", () => {
158
- this.validateBackup();
159
- });
160
- kernel.addEventListener("eval.error", () => {
161
- this.validateBackup();
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(fetch(fileURL).then((response) => {
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
- 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()}`);
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.2",
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.2",
29
- "@basthon/kernel-base": "0.50.2",
30
- "@basthon/kernel-loader": "0.50.2",
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": "d6a29ffb3b897481cee59cab8d73e8406fd42777"
44
+ "gitHead": "9283011a642c404226f1c63f93fbed1cfc0aae8e"
45
45
  }