@phpsandbox/sdk 0.0.27 → 0.0.28

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/dist/shell.d.ts CHANGED
@@ -1,14 +1,30 @@
1
- import { Action, NotebookInstance } from './index.js';
2
- export interface ShellEvents {
1
+ import { Action, Disposable, NotebookInstance } from './index.js';
2
+ import type { SpawnOptions } from './terminal.js';
3
+ export interface ShellEventData {
4
+ 'shell.output': {
5
+ output: string;
6
+ id: string;
7
+ };
8
+ }
9
+ type PrefixKey<K extends keyof ShellEventData> = `${K}.${string}`;
10
+ type ShellEventPattern = PrefixKey<keyof ShellEventData>;
11
+ export type ShellEvents = ShellEventData & {
12
+ [K in ShellEventPattern]: ShellEventData['shell.output'];
13
+ };
14
+ export interface ShellExecInput {
15
+ command: string | string[];
16
+ opts?: Omit<SpawnOptions, 'abortSignal'>;
3
17
  }
4
18
  export interface ShellActions {
5
- 'shell.exec': Action<{
6
- command: string | string;
7
- }, {
19
+ 'shell.exec': Action<ShellExecInput, {
8
20
  output: string;
9
21
  exitCode: number;
10
22
  }>;
11
23
  }
24
+ export interface ShellExecution {
25
+ output: ReadableStream<string>;
26
+ result: Promise<Result>;
27
+ }
12
28
  export declare class CommandError extends Error {
13
29
  output: string;
14
30
  exitCode: number;
@@ -23,7 +39,12 @@ declare class Result {
23
39
  export default class Shell {
24
40
  protected okra: NotebookInstance;
25
41
  constructor(okra: NotebookInstance);
26
- exec(command: string | string): Promise<Result>;
42
+ onOutput(id: string, handler: (data: ShellEvents['shell.output']) => void): void;
43
+ listen<T extends keyof ShellEvents>(event: T, handler: (data: ShellEvents[T]) => void): Disposable;
44
+ exec(command: string | string[], opts?: SpawnOptions): Promise<Result>;
45
+ exec(command: string, args: string[], opts?: SpawnOptions): Promise<Result>;
46
+ execStream(command: string | string[], opts?: SpawnOptions): ShellExecution;
47
+ execStream(command: string, args: string[], opts?: SpawnOptions): ShellExecution;
27
48
  }
28
49
  export {};
29
50
  //# sourceMappingURL=shell.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEtD,MAAM,WAAW,WAAW;CAAG;AAE/B,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;QAAE,OAAO,EAAE,MAAM,GAAC,MAAM,CAAA;KAAE,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxF;AAED,qBAAa,YAAa,SAAQ,KAAK;IAE5B,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,MAAM;gBADhB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;CAI1B;AAED,cAAM,MAAM;IAED,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,MAAM;gBADhB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;IAGlB,KAAK;CAOb;AAED,MAAM,CAAC,OAAO,OAAO,KAAK;IACZ,SAAS,CAAC,IAAI,EAAE,gBAAgB;gBAAtB,IAAI,EAAE,gBAAgB;IAE/B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAK3D"}
1
+ {"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGlD,MAAM,WAAW,cAAc;IAC7B,cAAc,EAAE;QACd,MAAM,EAAE,MAAM,CAAC;QACf,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAED,KAAK,SAAS,CAAC,CAAC,SAAS,MAAM,cAAc,IAAI,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;AAClE,KAAK,iBAAiB,GAAG,SAAS,CAAC,MAAM,cAAc,CAAC,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,cAAc,GAAG;KACxC,CAAC,IAAI,iBAAiB,GAAG,cAAc,CAAC,cAAc,CAAC;CACzD,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC3B,IAAI,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC,cAAc,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACzB;AAYD,qBAAa,YAAa,SAAQ,KAAK;IAE5B,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,MAAM;gBADhB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;CAI1B;AAED,cAAM,MAAM;IAED,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,MAAM;gBADhB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM;IAGlB,KAAK;CAOb;AAED,MAAM,CAAC,OAAO,OAAO,KAAK;IACZ,SAAS,CAAC,IAAI,EAAE,gBAAgB;gBAAtB,IAAI,EAAE,gBAAgB;IAErC,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,cAAc,CAAC,KAAK,IAAI,GAAG,IAAI;IAIhF,MAAM,CAAC,CAAC,SAAS,MAAM,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,UAAU;IAI5F,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IACtE,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAgBjF,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,cAAc;IAC3E,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,cAAc;CA0ExF"}
package/dist/shell.js CHANGED
@@ -1,3 +1,12 @@
1
+ import { nanoid } from 'nanoid';
2
+ function resolveExecInput(command, argsOrOpts = [], opts) {
3
+ const args = Array.isArray(argsOrOpts) ? argsOrOpts : [];
4
+ const resolvedOpts = Array.isArray(argsOrOpts) ? opts : argsOrOpts;
5
+ return {
6
+ command: Array.isArray(command) ? command : args.length > 0 ? [command, ...args] : command,
7
+ opts: resolvedOpts,
8
+ };
9
+ }
1
10
  export class CommandError extends Error {
2
11
  constructor(output, exitCode) {
3
12
  super(output);
@@ -21,9 +30,80 @@ export default class Shell {
21
30
  constructor(okra) {
22
31
  this.okra = okra;
23
32
  }
24
- async exec(command) {
25
- const result = await this.okra.invoke('shell.exec', { command });
33
+ onOutput(id, handler) {
34
+ this.okra.listen(`shell.output.${id}`, handler);
35
+ }
36
+ listen(event, handler) {
37
+ return this.okra.listen(event, handler);
38
+ }
39
+ async exec(command, argsOrOpts = [], opts) {
40
+ const input = resolveExecInput(command, argsOrOpts, opts);
41
+ const { abortSignal, ...payloadOpts } = input.opts ?? {};
42
+ const result = await this.okra.invoke('shell.exec', {
43
+ command: input.command,
44
+ opts: Object.keys(payloadOpts).length > 0 ? payloadOpts : undefined,
45
+ }, { abortSignal });
26
46
  return new Result(result.output, result.exitCode);
27
47
  }
48
+ execStream(command, argsOrOpts = [], opts) {
49
+ const input = resolveExecInput(command, argsOrOpts, opts);
50
+ const id = input.opts?.id || nanoid();
51
+ const disposables = new Set();
52
+ let controller = null;
53
+ let closed = false;
54
+ const dispose = () => {
55
+ for (const disposable of disposables) {
56
+ disposable.dispose();
57
+ }
58
+ disposables.clear();
59
+ };
60
+ const close = () => {
61
+ if (closed) {
62
+ return;
63
+ }
64
+ closed = true;
65
+ dispose();
66
+ if (controller) {
67
+ try {
68
+ controller.close();
69
+ }
70
+ catch {
71
+ // Ignore close errors after cancellation.
72
+ }
73
+ }
74
+ };
75
+ const fail = (error) => {
76
+ if (closed) {
77
+ return;
78
+ }
79
+ closed = true;
80
+ dispose();
81
+ if (controller) {
82
+ controller.error(error);
83
+ }
84
+ };
85
+ const output = new ReadableStream({
86
+ start: (_controller) => {
87
+ controller = _controller;
88
+ disposables.add(this.listen(`shell.output.${id}`, (data) => {
89
+ controller?.enqueue(data.output);
90
+ }));
91
+ },
92
+ cancel: () => {
93
+ closed = true;
94
+ dispose();
95
+ },
96
+ });
97
+ const result = this.exec(input.command, { ...input.opts, id })
98
+ .then((response) => {
99
+ close();
100
+ return response;
101
+ })
102
+ .catch((error) => {
103
+ fail(error);
104
+ throw error;
105
+ });
106
+ return { output, result };
107
+ }
28
108
  }
29
109
  //# sourceMappingURL=shell.js.map
package/dist/shell.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YACS,MAAc,EACd,QAAgB;QAEvB,KAAK,CAAC,MAAM,CAAC,CAAC;QAHP,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAQ;IAGzB,CAAC;CACF;AAED,MAAM,MAAM;IACV,YACS,MAAc,EACd,QAAgB;QADhB,WAAM,GAAN,MAAM,CAAQ;QACd,aAAQ,GAAR,QAAQ,CAAQ;IACtB,CAAC;IAEG,KAAK;QACV,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,MAAM,CAAC,OAAO,OAAO,KAAK;IACxB,YAAsB,IAAsB;QAAtB,SAAI,GAAJ,IAAI,CAAkB;IAAG,CAAC;IAEzC,KAAK,CAAC,IAAI,CAAC,OAAsB;QACtC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAEjE,OAAO,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;CACF"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@phpsandbox/sdk",
3
- "version": "0.0.27",
3
+ "version": "0.0.28",
4
4
  "description": "A comprehensive TypeScript SDK for interacting with cloud-based PHP development environments",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",