@phpsandbox/sdk 0.0.30 → 0.0.33

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.
@@ -345,6 +345,8 @@ var PHPSandbox = (() => {
345
345
  Transport: () => Transport,
346
346
  createBeacon: () => createBeacon,
347
347
  isBeaconSupported: () => isBeaconSupported,
348
+ notebookBuiltinServices: () => notebookBuiltinServices,
349
+ notebookKnownServices: () => notebookKnownServices,
348
350
  once: () => once,
349
351
  timeout: () => timeout
350
352
  });
@@ -682,19 +684,30 @@ var PHPSandbox = (() => {
682
684
  },
683
685
  close: dispose
684
686
  });
687
+ let controller = null;
685
688
  const output = new ReadableStream({
686
- start: (controller) => {
689
+ start: (_controller) => {
690
+ controller = _controller;
687
691
  disposables.add(
688
692
  this.listen(`terminal.output.${id}`, (data) => {
689
- controller.enqueue(data.output);
693
+ controller?.enqueue(data.output);
690
694
  })
691
695
  );
692
696
  },
693
- cancel: dispose
697
+ cancel: () => {
698
+ controller = null;
699
+ dispose();
700
+ }
694
701
  });
695
702
  const exit = new Promise((resolve) => {
696
703
  disposables.add(
697
704
  this.listen(`terminal.close.${id}`, (data) => {
705
+ if (controller) {
706
+ try {
707
+ controller.close();
708
+ } catch {
709
+ }
710
+ }
698
711
  dispose();
699
712
  resolve(data.exitCode);
700
713
  })
@@ -1070,6 +1083,8 @@ var PHPSandbox = (() => {
1070
1083
  };
1071
1084
 
1072
1085
  // src/services.ts
1086
+ var notebookBuiltinServices = ["redis"];
1087
+ var notebookKnownServices = ["start", "nginx", ...notebookBuiltinServices];
1073
1088
  var Services = class {
1074
1089
  constructor(okra) {
1075
1090
  this.okra = okra;
@@ -1077,8 +1092,11 @@ var PHPSandbox = (() => {
1077
1092
  list() {
1078
1093
  return this.okra.invoke("service.list");
1079
1094
  }
1080
- run(name) {
1081
- return this.okra.invoke("service.run", { name });
1095
+ run(name, command) {
1096
+ return this.okra.invoke("service.run", {
1097
+ name,
1098
+ command
1099
+ });
1082
1100
  }
1083
1101
  stop(name) {
1084
1102
  return this.okra.invoke("service.stop", { name });
@@ -3220,7 +3238,7 @@ var PHPSandbox = (() => {
3220
3238
  this.connectionStats.connectionStartTime = Date.now();
3221
3239
  const startClosed = options.startClosed !== false;
3222
3240
  this.rws = new reconnecting_websocket_mjs_default(this.url.toString(), [], {
3223
- WebSocket: globalThis.WebSocket ?? browser_default,
3241
+ WebSocket: options.webSocket ?? globalThis.WebSocket ?? browser_default,
3224
3242
  connectionTimeout: options.connectionTimeout,
3225
3243
  maxReconnectionDelay: 2e3,
3226
3244
  minReconnectionDelay: 200,
@@ -3275,7 +3293,19 @@ var PHPSandbox = (() => {
3275
3293
  async registerWatchers() {
3276
3294
  const onMessage = (ev) => {
3277
3295
  if (!(ev.data instanceof Blob)) {
3278
- throw new Error("Unexpected message type: " + typeof ev.data);
3296
+ const error = new Error("Unexpected message type: " + typeof ev.data);
3297
+ this.connectionStats.totalErrors++;
3298
+ this.log("error", "Unexpected WebSocket message type", {
3299
+ error: error.message,
3300
+ messageType: typeof ev.data
3301
+ });
3302
+ this.eventEmitter.emit("transport.error", {
3303
+ type: "message_type_error",
3304
+ error,
3305
+ rawMessage: ev.data,
3306
+ timestamp: Date.now()
3307
+ });
3308
+ return;
3279
3309
  }
3280
3310
  ev.data.arrayBuffer().then((buffer) => {
3281
3311
  if (buffer.byteLength === 0) {
@@ -3283,7 +3313,19 @@ var PHPSandbox = (() => {
3283
3313
  return;
3284
3314
  }
3285
3315
  try {
3286
- this.handleRawMessage(decode(buffer));
3316
+ void this.handleRawMessage(decode(buffer)).catch((error) => {
3317
+ this.connectionStats.totalErrors++;
3318
+ this.log("error", "Failed to process WebSocket frame", {
3319
+ error: error instanceof Error ? error.message : String(error),
3320
+ byteLength: buffer.byteLength
3321
+ });
3322
+ this.eventEmitter.emit("transport.error", {
3323
+ type: "message_handle_error",
3324
+ error,
3325
+ rawMessage: buffer,
3326
+ timestamp: Date.now()
3327
+ });
3328
+ });
3287
3329
  } catch (error) {
3288
3330
  this.connectionStats.totalErrors++;
3289
3331
  this.log("error", "Failed to decode WebSocket frame", {
@@ -3307,6 +3349,10 @@ var PHPSandbox = (() => {
3307
3349
  });
3308
3350
  }
3309
3351
  async handleRawMessage(ev) {
3352
+ if (this.closed) {
3353
+ this.log("debug", "Ignoring message received after transport was closed");
3354
+ return;
3355
+ }
3310
3356
  if (typeof ev !== "object" || ev === null) {
3311
3357
  this.log("debug", "Received invalid message format", { ev });
3312
3358
  return;
@@ -4968,7 +5014,8 @@ var PHPSandbox = (() => {
4968
5014
  this.emitter = EventManager.createInstance();
4969
5015
  this.socket = new Transport(data.okraUrl, this.emitter, {
4970
5016
  debug: client.options.debug,
4971
- startClosed: client.options.startClosed
5017
+ startClosed: client.options.startClosed,
5018
+ webSocket: client.options.webSocket
4972
5019
  });
4973
5020
  this.watchConnection();
4974
5021
  __privateSet(this, _initPromise, __privateMethod(this, _NotebookInstance_instances, init_fn).call(this));
@@ -5136,6 +5183,8 @@ var PHPSandbox = (() => {
5136
5183
  reject(error);
5137
5184
  });
5138
5185
  }));
5186
+ void __privateGet(this, _initPromise).catch(() => {
5187
+ });
5139
5188
  return __privateGet(this, _initPromise);
5140
5189
  };
5141
5190
  var NotebookSecrets = class {