@ebowwa/sandbox 0.1.1
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/compilers/index.d.ts +24 -0
- package/dist/compilers/index.d.ts.map +1 -0
- package/dist/compilers/index.js +42 -0
- package/dist/compilers/index.js.map +1 -0
- package/dist/compilers/javascript.d.ts +117 -0
- package/dist/compilers/javascript.d.ts.map +1 -0
- package/dist/compilers/javascript.js +462 -0
- package/dist/compilers/javascript.js.map +1 -0
- package/dist/compilers/python.d.ts +140 -0
- package/dist/compilers/python.d.ts.map +1 -0
- package/dist/compilers/python.js +650 -0
- package/dist/compilers/python.js.map +1 -0
- package/dist/compilers/typescript.d.ts +99 -0
- package/dist/compilers/typescript.d.ts.map +1 -0
- package/dist/compilers/typescript.js +323 -0
- package/dist/compilers/typescript.js.map +1 -0
- package/dist/core/cell.d.ts +160 -0
- package/dist/core/cell.d.ts.map +1 -0
- package/dist/core/cell.js +319 -0
- package/dist/core/cell.js.map +1 -0
- package/dist/core/compiler.d.ts +126 -0
- package/dist/core/compiler.d.ts.map +1 -0
- package/dist/core/compiler.js +123 -0
- package/dist/core/compiler.js.map +1 -0
- package/dist/core/index.d.ts +19 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +14 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/limits.d.ts +173 -0
- package/dist/core/limits.d.ts.map +1 -0
- package/dist/core/limits.js +440 -0
- package/dist/core/limits.js.map +1 -0
- package/dist/core/permissions.d.ts +103 -0
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/core/permissions.js +341 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/runtime.d.ts +127 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +325 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/core/types.d.ts +380 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +67 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +145 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +279 -0
- package/dist/index.js.map +1 -0
- package/dist/multi/index.d.ts +9 -0
- package/dist/multi/index.d.ts.map +1 -0
- package/dist/multi/index.js +7 -0
- package/dist/multi/index.js.map +1 -0
- package/dist/multi/polyglot.d.ts +179 -0
- package/dist/multi/polyglot.d.ts.map +1 -0
- package/dist/multi/polyglot.js +319 -0
- package/dist/multi/polyglot.js.map +1 -0
- package/dist/runtimes/docker.d.ts +97 -0
- package/dist/runtimes/docker.d.ts.map +1 -0
- package/dist/runtimes/docker.js +368 -0
- package/dist/runtimes/docker.js.map +1 -0
- package/dist/runtimes/index.d.ts +11 -0
- package/dist/runtimes/index.d.ts.map +1 -0
- package/dist/runtimes/index.js +9 -0
- package/dist/runtimes/index.js.map +1 -0
- package/dist/runtimes/process.d.ts +47 -0
- package/dist/runtimes/process.d.ts.map +1 -0
- package/dist/runtimes/process.js +230 -0
- package/dist/runtimes/process.js.map +1 -0
- package/dist/session/index.d.ts +12 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +9 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/kernel.d.ts +199 -0
- package/dist/session/kernel.d.ts.map +1 -0
- package/dist/session/kernel.js +400 -0
- package/dist/session/kernel.js.map +1 -0
- package/dist/session/notebook.d.ts +168 -0
- package/dist/session/notebook.d.ts.map +1 -0
- package/dist/session/notebook.js +499 -0
- package/dist/session/notebook.js.map +1 -0
- package/dist/session/repl.d.ts +159 -0
- package/dist/session/repl.d.ts.map +1 -0
- package/dist/session/repl.js +409 -0
- package/dist/session/repl.js.map +1 -0
- package/package.json +142 -0
- package/src/compilers/index.ts +80 -0
- package/src/compilers/javascript.ts +571 -0
- package/src/compilers/python.ts +785 -0
- package/src/compilers/typescript.ts +442 -0
- package/src/core/cell.ts +439 -0
- package/src/core/compiler.ts +250 -0
- package/src/core/index.ts +123 -0
- package/src/core/limits.ts +508 -0
- package/src/core/permissions.ts +409 -0
- package/src/core/runtime.ts +499 -0
- package/src/core/types.ts +528 -0
- package/src/global.d.ts +59 -0
- package/src/index.ts +515 -0
- package/src/multi/index.ts +22 -0
- package/src/multi/polyglot.ts +461 -0
- package/src/runtimes/docker.ts +501 -0
- package/src/runtimes/index.ts +21 -0
- package/src/runtimes/process.ts +316 -0
- package/src/session/index.ts +41 -0
- package/src/session/kernel.ts +553 -0
- package/src/session/notebook.ts +635 -0
- package/src/session/repl.ts +521 -0
- package/src/wasm2wasm.d.ts +35 -0
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polyglot Primitive
|
|
3
|
+
*
|
|
4
|
+
* Execute code across multiple languages with shared state.
|
|
5
|
+
* Enables true multi-language programming with seamless data exchange.
|
|
6
|
+
*/
|
|
7
|
+
import { BaseKernel, KernelManager } from "../session/kernel.js";
|
|
8
|
+
import { CellRegistry } from "../core/cell.js";
|
|
9
|
+
import { v4 as uuid } from "uuid";
|
|
10
|
+
/**
|
|
11
|
+
* Built-in language bridges
|
|
12
|
+
*/
|
|
13
|
+
const BUILTIN_BRIDGES = {
|
|
14
|
+
// JSON is universal
|
|
15
|
+
"javascript:python": createJsonBridge("javascript", "python"),
|
|
16
|
+
"python:javascript": createJsonBridge("python", "javascript"),
|
|
17
|
+
"javascript:typescript": createJsonBridge("javascript", "typescript"),
|
|
18
|
+
"typescript:javascript": createJsonBridge("typescript", "javascript"),
|
|
19
|
+
"python:typescript": createJsonBridge("python", "typescript"),
|
|
20
|
+
"typescript:python": createJsonBridge("typescript", "python"),
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Create JSON-based language bridge
|
|
24
|
+
*/
|
|
25
|
+
function createJsonBridge(from, to) {
|
|
26
|
+
return {
|
|
27
|
+
from,
|
|
28
|
+
to,
|
|
29
|
+
serialize(value) {
|
|
30
|
+
return new TextEncoder().encode(JSON.stringify(value));
|
|
31
|
+
},
|
|
32
|
+
deserialize(bytes) {
|
|
33
|
+
return JSON.parse(new TextDecoder().decode(bytes));
|
|
34
|
+
},
|
|
35
|
+
canBridge(type) {
|
|
36
|
+
// JSON can bridge most primitive and composite types
|
|
37
|
+
return ["number", "string", "boolean", "object", "array"].includes(type);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Polyglot Session
|
|
43
|
+
*
|
|
44
|
+
* Manages multi-language execution with variable sharing.
|
|
45
|
+
*/
|
|
46
|
+
export class PolyglotSession {
|
|
47
|
+
kernelManager;
|
|
48
|
+
kernelFactory;
|
|
49
|
+
kernels = new Map();
|
|
50
|
+
bridges;
|
|
51
|
+
sharedState = new Map();
|
|
52
|
+
variableBindings = new Map();
|
|
53
|
+
permissions;
|
|
54
|
+
limits;
|
|
55
|
+
constructor(options = {}) {
|
|
56
|
+
this.kernelManager = options.kernelManager ?? new KernelManager();
|
|
57
|
+
this.kernelFactory = options.kernelFactory;
|
|
58
|
+
this.permissions = options.permissions ?? {};
|
|
59
|
+
this.limits = options.limits ?? {};
|
|
60
|
+
this.bridges = new Map(Object.entries(BUILTIN_BRIDGES));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Execute code in a language
|
|
64
|
+
*/
|
|
65
|
+
async execute(code, language, options) {
|
|
66
|
+
const kernel = await this.getKernel(language);
|
|
67
|
+
// Import variables from other languages
|
|
68
|
+
if (options?.imports) {
|
|
69
|
+
const importCode = await this.generateImportCode(language, options.imports);
|
|
70
|
+
code = importCode + "\n" + code;
|
|
71
|
+
}
|
|
72
|
+
const result = await kernel.execute(code);
|
|
73
|
+
// Capture exports to shared state
|
|
74
|
+
if (result.success && result.exports) {
|
|
75
|
+
for (const [name, value] of result.exports) {
|
|
76
|
+
this.sharedState.set(`${language}:${name}`, value);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Execute polyglot cell (multiple language variants)
|
|
83
|
+
*/
|
|
84
|
+
async executePolyglot(cell, preferredLanguage) {
|
|
85
|
+
// Try preferred language first
|
|
86
|
+
const langOrder = preferredLanguage
|
|
87
|
+
? [preferredLanguage, ...cell.variants.keys()].filter((v, i, a) => a.indexOf(v) === i)
|
|
88
|
+
: Array.from(cell.variants.keys());
|
|
89
|
+
for (const language of langOrder) {
|
|
90
|
+
const code = cell.variants.get(language);
|
|
91
|
+
if (!code)
|
|
92
|
+
continue;
|
|
93
|
+
try {
|
|
94
|
+
const kernel = await this.getKernel(language);
|
|
95
|
+
if (!kernel.isRunning()) {
|
|
96
|
+
await kernel.start();
|
|
97
|
+
}
|
|
98
|
+
const result = await kernel.execute(code);
|
|
99
|
+
return { language, result };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// Try next language
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
throw new Error("No available language for polyglot cell");
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Get or create kernel for language
|
|
110
|
+
*/
|
|
111
|
+
async getKernel(language) {
|
|
112
|
+
let kernel = this.kernels.get(language);
|
|
113
|
+
if (!kernel) {
|
|
114
|
+
if (this.kernelFactory) {
|
|
115
|
+
kernel = await this.kernelFactory(language);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
throw new Error(`No kernel available for language: ${language}`);
|
|
119
|
+
}
|
|
120
|
+
this.kernels.set(language, kernel);
|
|
121
|
+
}
|
|
122
|
+
return kernel;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Generate import code for a language
|
|
126
|
+
*/
|
|
127
|
+
async generateImportCode(targetLanguage, imports) {
|
|
128
|
+
const lines = [];
|
|
129
|
+
for (const [name, sourceLanguage] of imports) {
|
|
130
|
+
const value = this.sharedState.get(`${sourceLanguage}:${name}`);
|
|
131
|
+
if (value === undefined)
|
|
132
|
+
continue;
|
|
133
|
+
const bridge = this.getBridge(sourceLanguage, targetLanguage);
|
|
134
|
+
if (!bridge) {
|
|
135
|
+
throw new Error(`No bridge from ${sourceLanguage} to ${targetLanguage}`);
|
|
136
|
+
}
|
|
137
|
+
const serialized = bridge.serialize(value);
|
|
138
|
+
const deserialized = bridge.deserialize(serialized);
|
|
139
|
+
// Generate language-specific import
|
|
140
|
+
const importLine = this.generateVariableAssignment(targetLanguage, name, deserialized);
|
|
141
|
+
lines.push(importLine);
|
|
142
|
+
}
|
|
143
|
+
return lines.join("\n");
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Generate variable assignment in target language
|
|
147
|
+
*/
|
|
148
|
+
generateVariableAssignment(language, name, value) {
|
|
149
|
+
const json = JSON.stringify(value);
|
|
150
|
+
switch (language) {
|
|
151
|
+
case "javascript":
|
|
152
|
+
case "typescript":
|
|
153
|
+
return `const ${name} = ${json};`;
|
|
154
|
+
case "python":
|
|
155
|
+
return `${name} = ${json}`;
|
|
156
|
+
case "assemblyscript":
|
|
157
|
+
return `const ${name} = ${json};`;
|
|
158
|
+
case "json":
|
|
159
|
+
return json;
|
|
160
|
+
default:
|
|
161
|
+
return `// ${name} = ${json}`;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Get bridge between languages
|
|
166
|
+
*/
|
|
167
|
+
getBridge(from, to) {
|
|
168
|
+
return this.bridges.get(`${from}:${to}`);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Register custom bridge
|
|
172
|
+
*/
|
|
173
|
+
registerBridge(bridge) {
|
|
174
|
+
this.bridges.set(`${bridge.from}:${bridge.to}`, bridge);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Set shared variable
|
|
178
|
+
*/
|
|
179
|
+
setVariable(language, name, value) {
|
|
180
|
+
this.sharedState.set(`${language}:${name}`, value);
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Get shared variable
|
|
184
|
+
*/
|
|
185
|
+
getVariable(language, name) {
|
|
186
|
+
return this.sharedState.get(`${language}:${name}`);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Transfer variable between languages
|
|
190
|
+
*/
|
|
191
|
+
async transferVariable(fromLanguage, name, toLanguage) {
|
|
192
|
+
const value = this.sharedState.get(`${fromLanguage}:${name}`);
|
|
193
|
+
if (value === undefined) {
|
|
194
|
+
throw new Error(`Variable ${name} not found in ${fromLanguage}`);
|
|
195
|
+
}
|
|
196
|
+
const bridge = this.getBridge(fromLanguage, toLanguage);
|
|
197
|
+
if (!bridge) {
|
|
198
|
+
throw new Error(`No bridge from ${fromLanguage} to ${toLanguage}`);
|
|
199
|
+
}
|
|
200
|
+
const serialized = bridge.serialize(value);
|
|
201
|
+
const transferred = bridge.deserialize(serialized);
|
|
202
|
+
// Store in target language
|
|
203
|
+
this.sharedState.set(`${toLanguage}:${name}`, transferred);
|
|
204
|
+
return transferred;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Get all shared variables
|
|
208
|
+
*/
|
|
209
|
+
getSharedVariables() {
|
|
210
|
+
return new Map(this.sharedState);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Clear shared state
|
|
214
|
+
*/
|
|
215
|
+
clearState() {
|
|
216
|
+
this.sharedState.clear();
|
|
217
|
+
this.variableBindings.clear();
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Shutdown all kernels
|
|
221
|
+
*/
|
|
222
|
+
async shutdown() {
|
|
223
|
+
for (const kernel of this.kernels.values()) {
|
|
224
|
+
await kernel.shutdown();
|
|
225
|
+
}
|
|
226
|
+
this.kernels.clear();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Polyglot Notebook
|
|
231
|
+
*
|
|
232
|
+
* Notebook with multi-language cells and variable sharing.
|
|
233
|
+
*/
|
|
234
|
+
export class PolyglotNotebook {
|
|
235
|
+
cells = new Map();
|
|
236
|
+
session;
|
|
237
|
+
executionOrder = [];
|
|
238
|
+
constructor(options) {
|
|
239
|
+
this.session = new PolyglotSession(options);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Add polyglot cell
|
|
243
|
+
*/
|
|
244
|
+
addCell(variants, id) {
|
|
245
|
+
const cell = {
|
|
246
|
+
id: id ?? uuid(),
|
|
247
|
+
variants,
|
|
248
|
+
};
|
|
249
|
+
this.cells.set(cell.id, cell);
|
|
250
|
+
this.executionOrder.push(cell.id);
|
|
251
|
+
return cell;
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Add single-language cell
|
|
255
|
+
*/
|
|
256
|
+
addSingleCell(language, code, id) {
|
|
257
|
+
const variants = new Map();
|
|
258
|
+
variants.set(language, code);
|
|
259
|
+
return this.addCell(variants, id);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Execute all cells
|
|
263
|
+
*/
|
|
264
|
+
async runAll() {
|
|
265
|
+
const results = [];
|
|
266
|
+
for (const cellId of this.executionOrder) {
|
|
267
|
+
const cell = this.cells.get(cellId);
|
|
268
|
+
if (!cell)
|
|
269
|
+
continue;
|
|
270
|
+
const { language, result } = await this.session.executePolyglot(cell);
|
|
271
|
+
results.push({ cellId, language, result });
|
|
272
|
+
if (!result.success) {
|
|
273
|
+
break;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return results;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Execute single cell
|
|
280
|
+
*/
|
|
281
|
+
async runCell(cellId, preferredLanguage) {
|
|
282
|
+
const cell = this.cells.get(cellId);
|
|
283
|
+
if (!cell) {
|
|
284
|
+
throw new Error(`Cell not found: ${cellId}`);
|
|
285
|
+
}
|
|
286
|
+
return this.session.executePolyglot(cell, preferredLanguage);
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Get cell
|
|
290
|
+
*/
|
|
291
|
+
getCell(id) {
|
|
292
|
+
return this.cells.get(id);
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Get all cells
|
|
296
|
+
*/
|
|
297
|
+
getCells() {
|
|
298
|
+
return this.executionOrder.map(id => this.cells.get(id)).filter(Boolean);
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* Get session
|
|
302
|
+
*/
|
|
303
|
+
getSession() {
|
|
304
|
+
return this.session;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Create polyglot session
|
|
309
|
+
*/
|
|
310
|
+
export function createPolyglotSession(options) {
|
|
311
|
+
return new PolyglotSession(options);
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Create polyglot notebook
|
|
315
|
+
*/
|
|
316
|
+
export function createPolyglotNotebook(options) {
|
|
317
|
+
return new PolyglotNotebook(options);
|
|
318
|
+
}
|
|
319
|
+
//# sourceMappingURL=polyglot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polyglot.js","sourceRoot":"","sources":["../../src/multi/polyglot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker Runtime
|
|
3
|
+
*
|
|
4
|
+
* Runs code in Docker containers for maximum isolation.
|
|
5
|
+
* Provides full filesystem and network control with container-level security.
|
|
6
|
+
*
|
|
7
|
+
* Isolation level: 'container'
|
|
8
|
+
*/
|
|
9
|
+
import type { ExecutionResult } from "../core/types.js";
|
|
10
|
+
import type { IRuntime, RuntimeOptions, ExecutionRequest, RuntimeCapabilities } from "../core/runtime.js";
|
|
11
|
+
/** Docker runtime configuration */
|
|
12
|
+
export interface DockerRuntimeConfig {
|
|
13
|
+
/** Default Docker image to use */
|
|
14
|
+
defaultImage?: string;
|
|
15
|
+
/** Docker socket path */
|
|
16
|
+
dockerSocket?: string;
|
|
17
|
+
/** Network mode for containers */
|
|
18
|
+
networkMode?: "none" | "bridge" | "host";
|
|
19
|
+
/** Cleanup containers after execution */
|
|
20
|
+
autoCleanup?: boolean;
|
|
21
|
+
/** Memory limit for containers (bytes) */
|
|
22
|
+
defaultMemory?: number;
|
|
23
|
+
/** CPU limit (number of CPUs) */
|
|
24
|
+
cpuLimit?: number;
|
|
25
|
+
}
|
|
26
|
+
/** Container execution options */
|
|
27
|
+
export interface ContainerOptions {
|
|
28
|
+
/** Docker image to use */
|
|
29
|
+
image?: string;
|
|
30
|
+
/** Container name */
|
|
31
|
+
name?: string;
|
|
32
|
+
/** Environment variables */
|
|
33
|
+
env?: Record<string, string>;
|
|
34
|
+
/** Working directory in container */
|
|
35
|
+
workdir?: string;
|
|
36
|
+
/** Mount points */
|
|
37
|
+
mounts?: Array<{
|
|
38
|
+
source: string;
|
|
39
|
+
target: string;
|
|
40
|
+
readonly?: boolean;
|
|
41
|
+
}>;
|
|
42
|
+
/** Port mappings */
|
|
43
|
+
ports?: Array<{
|
|
44
|
+
hostPort: number;
|
|
45
|
+
containerPort: number;
|
|
46
|
+
protocol?: "tcp" | "udp";
|
|
47
|
+
}>;
|
|
48
|
+
/** Network mode */
|
|
49
|
+
network?: "none" | "bridge" | "host";
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Docker Runtime
|
|
53
|
+
*
|
|
54
|
+
* Executes code in isolated Docker containers with full resource control.
|
|
55
|
+
* Maximum isolation with configurable filesystem and network access.
|
|
56
|
+
*/
|
|
57
|
+
export declare class DockerRuntime implements IRuntime {
|
|
58
|
+
readonly name = "docker";
|
|
59
|
+
readonly capabilities: RuntimeCapabilities;
|
|
60
|
+
private executing;
|
|
61
|
+
private config;
|
|
62
|
+
private containers;
|
|
63
|
+
constructor(config?: DockerRuntimeConfig);
|
|
64
|
+
init(): Promise<void>;
|
|
65
|
+
isAvailable(): Promise<boolean>;
|
|
66
|
+
execute(request: ExecutionRequest, options: RuntimeOptions): Promise<ExecutionResult>;
|
|
67
|
+
terminate(): Promise<void>;
|
|
68
|
+
isExecuting(): boolean;
|
|
69
|
+
/**
|
|
70
|
+
* Check if Docker is available
|
|
71
|
+
*/
|
|
72
|
+
private checkDockerAvailable;
|
|
73
|
+
/**
|
|
74
|
+
* Pull Docker image if not present
|
|
75
|
+
*/
|
|
76
|
+
private pullImageIfNeeded;
|
|
77
|
+
/**
|
|
78
|
+
* Build container options from execution request
|
|
79
|
+
*/
|
|
80
|
+
private buildContainerOptions;
|
|
81
|
+
/**
|
|
82
|
+
* Create Docker container
|
|
83
|
+
*/
|
|
84
|
+
private createContainer;
|
|
85
|
+
/**
|
|
86
|
+
* Run code in container
|
|
87
|
+
*/
|
|
88
|
+
private runInContainer;
|
|
89
|
+
/**
|
|
90
|
+
* Remove container
|
|
91
|
+
*/
|
|
92
|
+
private removeContainer;
|
|
93
|
+
private createErrorResult;
|
|
94
|
+
private parseMemory;
|
|
95
|
+
private parseTimeout;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=docker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"docker.d.ts","sourceRoot":"","sources":["../../src/runtimes/docker.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH,OAAO,KAAK,EACV,eAAe,EAIhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EACV,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAE5B,mCAAmC;AACnC,MAAM,WAAW,mBAAmB;IAClC,kCAAkC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,yBAAyB;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzC,yCAAyC;IACzC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,0CAA0C;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,kCAAkC;AAClC,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qBAAqB;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,qCAAqC;IACrC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC,CAAC;IACH,oBAAoB;IACpB,KAAK,CAAC,EAAE,KAAK,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,KAAK,GAAG,KAAK,CAAC;KAC1B,CAAC,CAAC;IACH,mBAAmB;IACnB,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtC;AAED;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC5C,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAQxC;IAEF,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAgC;IAC9C,OAAO,CAAC,UAAU,CAA6B;gBAEnC,MAAM,GAAE,mBAAwB;IAWtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAI/B,OAAO,CACX,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,eAAe,CAAC;IA4FrB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAShC,WAAW,IAAI,OAAO;IAItB;;OAEG;YACW,oBAAoB;IAQlC;;OAEG;YACW,iBAAiB;IAoB/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAiC7B;;OAEG;YACW,eAAe;IA8E7B;;OAEG;YACW,cAAc;IAqE5B;;OAEG;YACW,eAAe;IAa7B,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,YAAY;CAWrB"}
|