@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 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
- * Setup the UI (typically connect events etc..).
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
- * Setup the UI (typically connect events etc..).
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
- 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
- });
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(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) => {
319
+ promises.push((async () => {
305
320
  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
- }));
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.2",
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.2",
29
- "@basthon/kernel-base": "0.50.2",
30
- "@basthon/kernel-loader": "0.50.2",
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": "d6a29ffb3b897481cee59cab8d73e8406fd42777"
44
+ "gitHead": "e5551d308c66dbc081600522fe2d68ee8d34884c"
45
45
  }