@nahisaho/katashiro-sandbox 0.4.0

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.
@@ -0,0 +1,557 @@
1
+ "use strict";
2
+ /**
3
+ * KATASHIRO Sandbox - Docker Executor Implementation
4
+ *
5
+ * @fileoverview REQ-007: Dockerベースのコード実行サンドボックス
6
+ * @module @nahisaho/katashiro-sandbox
7
+ * @since 0.4.0
8
+ */
9
+ var __importDefault = (this && this.__importDefault) || function (mod) {
10
+ return (mod && mod.__esModule) ? mod : { "default": mod };
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.DockerExecutor = exports.SandboxError = void 0;
14
+ const events_1 = require("events");
15
+ const dockerode_1 = __importDefault(require("dockerode"));
16
+ const katashiro_core_1 = require("@nahisaho/katashiro-core");
17
+ const types_1 = require("./types");
18
+ // =============================================================================
19
+ // エラークラス
20
+ // =============================================================================
21
+ /**
22
+ * サンドボックスエラー
23
+ */
24
+ class SandboxError extends Error {
25
+ code;
26
+ details;
27
+ constructor(message, code, details) {
28
+ super(message);
29
+ this.code = code;
30
+ this.details = details;
31
+ this.name = 'SandboxError';
32
+ }
33
+ }
34
+ exports.SandboxError = SandboxError;
35
+ // =============================================================================
36
+ // Docker Executor
37
+ // =============================================================================
38
+ /**
39
+ * Docker Executor
40
+ *
41
+ * EARS Requirements:
42
+ * - Ubiquitous: The Sandbox shall execute code in an isolated Docker/VM environment
43
+ * - Ubiquitous: The Sandbox shall support bash, Python, and JavaScript/TypeScript execution
44
+ * - Event-Driven: When execution time exceeds timeout, the Sandbox shall terminate
45
+ * - State-Driven: While code is executing, the Sandbox shall enforce CPU and memory limits
46
+ * - Unwanted: If code attempts to access host system, the Sandbox shall block the access
47
+ */
48
+ class DockerExecutor extends events_1.EventEmitter {
49
+ docker;
50
+ config;
51
+ dockerConfig;
52
+ securityPolicy;
53
+ activeContainers = new Map();
54
+ constructor(config = {}, dockerConfig = {}, securityPolicy = {}) {
55
+ super();
56
+ this.config = { ...types_1.DEFAULT_SANDBOX_CONFIG, ...config };
57
+ this.dockerConfig = { ...types_1.DEFAULT_DOCKER_CONFIG, ...dockerConfig };
58
+ this.securityPolicy = { ...types_1.DEFAULT_SECURITY_POLICY, ...securityPolicy };
59
+ // Docker クライアント初期化
60
+ this.docker = new dockerode_1.default({
61
+ socketPath: this.dockerConfig.socketPath,
62
+ host: this.dockerConfig.host,
63
+ });
64
+ }
65
+ /**
66
+ * 型安全なイベントリスナー登録
67
+ */
68
+ on(event, listener) {
69
+ return super.on(event, listener);
70
+ }
71
+ /**
72
+ * イベント発火
73
+ */
74
+ emitEvent(type, data) {
75
+ const event = {
76
+ type,
77
+ timestamp: new Date().toISOString(),
78
+ ...data,
79
+ };
80
+ this.emit(type, event);
81
+ }
82
+ /**
83
+ * コードを実行
84
+ *
85
+ * @param code 実行するコード
86
+ * @param language プログラミング言語
87
+ * @param options 追加オプション
88
+ */
89
+ async execute(code, language, options = {}) {
90
+ const requestId = (0, katashiro_core_1.generateId)();
91
+ const timeout = options.timeout ?? this.config.timeout;
92
+ const startTime = Date.now();
93
+ // リクエスト作成
94
+ const request = {
95
+ id: requestId,
96
+ code,
97
+ language,
98
+ stdin: options.stdin,
99
+ env: options.env,
100
+ timeout,
101
+ createdAt: new Date().toISOString(),
102
+ };
103
+ this.emitEvent('execution:start', { requestId });
104
+ let container;
105
+ try {
106
+ // コンテナ作成
107
+ container = await this.createContainer(request);
108
+ this.activeContainers.set(requestId, container);
109
+ this.emitEvent('container:create', {
110
+ requestId,
111
+ containerId: container.id,
112
+ });
113
+ // コンテナ起動
114
+ await container.start();
115
+ this.emitEvent('container:start', {
116
+ requestId,
117
+ containerId: container.id,
118
+ });
119
+ // タイムアウト設定
120
+ const timeoutPromise = new Promise((_, reject) => {
121
+ setTimeout(() => {
122
+ reject(new SandboxError('Execution timeout', 'TIMEOUT', { timeout }));
123
+ }, timeout * 1000);
124
+ });
125
+ // 実行結果待機(タイムアウト付き)
126
+ const resultPromise = this.waitForCompletion(container, request);
127
+ const result = await Promise.race([resultPromise, timeoutPromise]);
128
+ const duration = Date.now() - startTime;
129
+ // 出力ファイル取得
130
+ const files = await this.extractOutputFiles(container);
131
+ const executionResult = {
132
+ requestId,
133
+ status: result.exitCode === 0 ? 'completed' : 'failed',
134
+ exitCode: result.exitCode,
135
+ stdout: result.stdout,
136
+ stderr: result.stderr,
137
+ duration,
138
+ files,
139
+ completedAt: new Date().toISOString(),
140
+ };
141
+ this.emitEvent('execution:complete', { requestId, data: executionResult });
142
+ return (0, katashiro_core_1.ok)(executionResult);
143
+ }
144
+ catch (error) {
145
+ const duration = Date.now() - startTime;
146
+ const execError = this.parseError(error);
147
+ const executionResult = {
148
+ requestId,
149
+ status: execError.code === 'TIMEOUT' ? 'timeout' : 'failed',
150
+ exitCode: -1,
151
+ stdout: '',
152
+ stderr: execError.message,
153
+ duration,
154
+ files: [],
155
+ error: execError,
156
+ completedAt: new Date().toISOString(),
157
+ };
158
+ if (execError.code === 'TIMEOUT') {
159
+ this.emitEvent('execution:timeout', { requestId, data: executionResult });
160
+ }
161
+ else {
162
+ this.emitEvent('execution:error', { requestId, data: executionResult });
163
+ }
164
+ return (0, katashiro_core_1.err)(new SandboxError(execError.message, execError.code, { requestId }));
165
+ }
166
+ finally {
167
+ // クリーンアップ
168
+ if (container) {
169
+ await this.cleanupContainer(container, requestId);
170
+ }
171
+ this.activeContainers.delete(requestId);
172
+ }
173
+ }
174
+ /**
175
+ * コンテナを作成
176
+ */
177
+ async createContainer(request) {
178
+ const image = this.dockerConfig.images[request.language];
179
+ const containerName = `${this.dockerConfig.containerPrefix}${request.id}`;
180
+ // コード実行用のコマンドを生成
181
+ const { cmd, entrypoint } = this.buildCommand(request);
182
+ // セキュリティオプション
183
+ const securityOpts = ['no-new-privileges'];
184
+ // Ulimit設定
185
+ const ulimits = [
186
+ { Name: 'nproc', Soft: this.securityPolicy.maxProcesses, Hard: this.securityPolicy.maxProcesses },
187
+ { Name: 'nofile', Soft: this.securityPolicy.maxOpenFiles, Hard: this.securityPolicy.maxOpenFiles },
188
+ ];
189
+ // コンテナ作成
190
+ const container = await this.docker.createContainer({
191
+ Image: image,
192
+ name: containerName,
193
+ Cmd: cmd,
194
+ Entrypoint: entrypoint,
195
+ Env: this.buildEnv(request.env),
196
+ WorkingDir: this.config.workingDir,
197
+ NetworkDisabled: !this.config.networkEnabled,
198
+ AttachStdout: true,
199
+ AttachStderr: true,
200
+ AttachStdin: !!request.stdin,
201
+ OpenStdin: !!request.stdin,
202
+ Tty: false,
203
+ HostConfig: {
204
+ AutoRemove: false, // 結果取得後に手動削除
205
+ Memory: this.config.memoryLimit,
206
+ MemorySwap: this.config.memoryLimit, // スワップ無効化
207
+ CpuPeriod: 100000,
208
+ CpuQuota: Math.floor(this.config.cpuLimit * 100000),
209
+ ReadonlyRootfs: false, // /workspaceへの書き込みを許可するため
210
+ SecurityOpt: securityOpts,
211
+ Ulimits: ulimits,
212
+ Tmpfs: {
213
+ '/tmp': `size=${this.config.tmpfsSize}`,
214
+ },
215
+ // CapDropでケーパビリティを削除
216
+ CapDrop: ['ALL'],
217
+ CapAdd: ['CHOWN', 'SETUID', 'SETGID'],
218
+ },
219
+ });
220
+ // コードをコンテナにコピー
221
+ await this.copyCodeToContainer(container, request);
222
+ return container;
223
+ }
224
+ /**
225
+ * 実行コマンドを構築
226
+ */
227
+ buildCommand(request) {
228
+ const codeFile = this.getCodeFileName(request.language);
229
+ switch (request.language) {
230
+ case 'bash':
231
+ return {
232
+ cmd: ['/bin/sh', `${this.config.workingDir}/${codeFile}`],
233
+ };
234
+ case 'python':
235
+ return {
236
+ cmd: ['python3', `${this.config.workingDir}/${codeFile}`],
237
+ };
238
+ case 'javascript':
239
+ return {
240
+ cmd: ['node', `${this.config.workingDir}/${codeFile}`],
241
+ };
242
+ case 'typescript':
243
+ // TypeScriptはts-nodeまたはtsxで実行
244
+ return {
245
+ cmd: ['npx', 'tsx', `${this.config.workingDir}/${codeFile}`],
246
+ };
247
+ default:
248
+ throw new SandboxError(`Unsupported language: ${request.language}`, 'UNSUPPORTED_LANGUAGE');
249
+ }
250
+ }
251
+ /**
252
+ * 言語に対応するファイル名を取得
253
+ */
254
+ getCodeFileName(language) {
255
+ const extensions = {
256
+ bash: 'script.sh',
257
+ python: 'script.py',
258
+ javascript: 'script.js',
259
+ typescript: 'script.ts',
260
+ };
261
+ return extensions[language];
262
+ }
263
+ /**
264
+ * 環境変数を構築
265
+ */
266
+ buildEnv(env) {
267
+ const baseEnv = ['PATH=/usr/local/bin:/usr/bin:/bin'];
268
+ if (!env)
269
+ return baseEnv;
270
+ return [
271
+ ...baseEnv,
272
+ ...Object.entries(env).map(([key, value]) => `${key}=${value}`),
273
+ ];
274
+ }
275
+ /**
276
+ * コードをコンテナにコピー
277
+ */
278
+ async copyCodeToContainer(container, request) {
279
+ const codeFile = this.getCodeFileName(request.language);
280
+ // tarアーカイブを作成
281
+ const tar = await this.createTarArchive(codeFile, request.code);
282
+ // コンテナにコピー
283
+ await container.putArchive(tar, { path: this.config.workingDir });
284
+ }
285
+ /**
286
+ * tarアーカイブを作成(簡易版)
287
+ */
288
+ async createTarArchive(filename, content) {
289
+ // tarヘッダを構築(512バイトブロック)
290
+ const contentBuffer = Buffer.from(content, 'utf-8');
291
+ const header = Buffer.alloc(512);
292
+ // ファイル名(最大100文字)
293
+ header.write(filename, 0, 100, 'utf-8');
294
+ // ファイルモード(8進数文字列)
295
+ header.write('0000755', 100, 7, 'utf-8');
296
+ header.write('\0', 107);
297
+ // UID
298
+ header.write('0000000', 108, 7, 'utf-8');
299
+ header.write('\0', 115);
300
+ // GID
301
+ header.write('0000000', 116, 7, 'utf-8');
302
+ header.write('\0', 123);
303
+ // サイズ(8進数文字列)
304
+ const sizeStr = contentBuffer.length.toString(8).padStart(11, '0');
305
+ header.write(sizeStr, 124, 11, 'utf-8');
306
+ header.write('\0', 135);
307
+ // 変更時刻
308
+ const mtime = Math.floor(Date.now() / 1000).toString(8).padStart(11, '0');
309
+ header.write(mtime, 136, 11, 'utf-8');
310
+ header.write('\0', 147);
311
+ // チェックサム用スペース
312
+ header.fill(' ', 148, 156);
313
+ // タイプフラグ(0 = 通常ファイル)
314
+ header.write('0', 156, 1, 'utf-8');
315
+ // リンク名(空)
316
+ // UStar indicator
317
+ header.write('ustar', 257, 5, 'utf-8');
318
+ header.write('00', 263, 2, 'utf-8');
319
+ // チェックサム計算
320
+ let checksum = 0;
321
+ for (let i = 0; i < 512; i++) {
322
+ checksum += header[i] ?? 0;
323
+ }
324
+ const checksumStr = checksum.toString(8).padStart(6, '0');
325
+ header.write(checksumStr, 148, 6, 'utf-8');
326
+ header.write('\0 ', 154, 2);
327
+ // コンテンツをパディング
328
+ const padding = 512 - (contentBuffer.length % 512);
329
+ const paddedContent = padding === 512
330
+ ? contentBuffer
331
+ : Buffer.concat([contentBuffer, Buffer.alloc(padding)]);
332
+ // 終端ブロック(2つの空ブロック)
333
+ const endBlock = Buffer.alloc(1024);
334
+ return Buffer.concat([header, paddedContent, endBlock]);
335
+ }
336
+ /**
337
+ * コンテナの完了を待機
338
+ */
339
+ async waitForCompletion(container, request) {
340
+ // stdin送信(あれば)
341
+ if (request.stdin) {
342
+ const stream = await container.attach({
343
+ stream: true,
344
+ stdin: true,
345
+ hijack: true,
346
+ });
347
+ stream.write(request.stdin);
348
+ stream.end();
349
+ }
350
+ // 完了待機
351
+ const waitResult = await container.wait();
352
+ // ログ取得
353
+ const logs = await container.logs({
354
+ stdout: true,
355
+ stderr: true,
356
+ follow: false,
357
+ });
358
+ // ログをパース(Docker multiplexed stream format)
359
+ const { stdout, stderr } = this.parseLogs(logs);
360
+ return {
361
+ exitCode: waitResult.StatusCode,
362
+ stdout,
363
+ stderr,
364
+ };
365
+ }
366
+ /**
367
+ * Dockerログをパース
368
+ */
369
+ parseLogs(logs) {
370
+ if (Buffer.isBuffer(logs)) {
371
+ // Docker multiplexed stream format
372
+ let stdout = '';
373
+ let stderr = '';
374
+ let offset = 0;
375
+ while (offset < logs.length) {
376
+ if (offset + 8 > logs.length)
377
+ break;
378
+ const streamType = logs[offset];
379
+ const size = logs.readUInt32BE(offset + 4);
380
+ offset += 8;
381
+ if (offset + size > logs.length)
382
+ break;
383
+ const chunk = logs.slice(offset, offset + size).toString('utf-8');
384
+ offset += size;
385
+ if (streamType === 1) {
386
+ stdout += chunk;
387
+ }
388
+ else if (streamType === 2) {
389
+ stderr += chunk;
390
+ }
391
+ }
392
+ return { stdout, stderr };
393
+ }
394
+ // ストリームの場合(未実装)
395
+ return { stdout: '', stderr: '' };
396
+ }
397
+ /**
398
+ * 出力ファイルを抽出
399
+ */
400
+ async extractOutputFiles(_container) {
401
+ // 現時点では出力ファイルの抽出は未実装
402
+ // 将来的にはworkspace内の新規・更新ファイルを検出して返す
403
+ return [];
404
+ }
405
+ /**
406
+ * コンテナをクリーンアップ
407
+ */
408
+ async cleanupContainer(container, requestId) {
409
+ try {
410
+ // 実行中なら停止
411
+ const info = await container.inspect();
412
+ if (info.State.Running) {
413
+ await container.stop({ t: 1 });
414
+ }
415
+ // コンテナ削除
416
+ await container.remove({ force: true });
417
+ this.emitEvent('container:stop', {
418
+ requestId,
419
+ containerId: container.id,
420
+ });
421
+ }
422
+ catch {
423
+ // クリーンアップエラーは無視
424
+ }
425
+ }
426
+ /**
427
+ * エラーをパース
428
+ */
429
+ parseError(error) {
430
+ if (error instanceof SandboxError) {
431
+ return {
432
+ code: error.code,
433
+ message: error.message,
434
+ };
435
+ }
436
+ if (error instanceof Error) {
437
+ return {
438
+ code: 'EXECUTION_ERROR',
439
+ message: error.message,
440
+ stack: error.stack,
441
+ };
442
+ }
443
+ return {
444
+ code: 'UNKNOWN_ERROR',
445
+ message: String(error),
446
+ };
447
+ }
448
+ /**
449
+ * アクティブなコンテナ数を取得
450
+ */
451
+ getActiveContainerCount() {
452
+ return this.activeContainers.size;
453
+ }
454
+ /**
455
+ * 指定した実行をキャンセル
456
+ */
457
+ async cancel(requestId) {
458
+ const container = this.activeContainers.get(requestId);
459
+ if (!container)
460
+ return false;
461
+ try {
462
+ await container.stop({ t: 1 });
463
+ await container.remove({ force: true });
464
+ this.activeContainers.delete(requestId);
465
+ return true;
466
+ }
467
+ catch {
468
+ return false;
469
+ }
470
+ }
471
+ /**
472
+ * 全アクティブコンテナをクリーンアップ
473
+ */
474
+ async cleanup() {
475
+ const promises = Array.from(this.activeContainers.entries()).map(async ([requestId, container]) => {
476
+ await this.cleanupContainer(container, requestId);
477
+ this.activeContainers.delete(requestId);
478
+ });
479
+ await Promise.all(promises);
480
+ }
481
+ /**
482
+ * コンテナ情報を取得
483
+ */
484
+ async getContainerInfo(requestId) {
485
+ const container = this.activeContainers.get(requestId);
486
+ if (!container)
487
+ return null;
488
+ try {
489
+ const info = await container.inspect();
490
+ return {
491
+ id: info.Id,
492
+ name: info.Name,
493
+ image: info.Config.Image,
494
+ status: info.State.Status,
495
+ createdAt: info.Created,
496
+ startedAt: info.State.StartedAt,
497
+ finishedAt: info.State.FinishedAt || undefined,
498
+ };
499
+ }
500
+ catch {
501
+ return null;
502
+ }
503
+ }
504
+ /**
505
+ * リソース使用量を取得
506
+ */
507
+ async getResourceStats(requestId) {
508
+ const container = this.activeContainers.get(requestId);
509
+ if (!container)
510
+ return null;
511
+ try {
512
+ const stats = await container.stats({ stream: false });
513
+ const statsData = stats;
514
+ // CPU使用率計算
515
+ const cpuDelta = statsData.cpu_stats.cpu_usage.total_usage -
516
+ statsData.precpu_stats.cpu_usage.total_usage;
517
+ const systemDelta = statsData.cpu_stats.system_cpu_usage -
518
+ statsData.precpu_stats.system_cpu_usage;
519
+ const cpuPercent = systemDelta > 0 ? (cpuDelta / systemDelta) * 100 : 0;
520
+ // ネットワーク統計
521
+ let networkTx = 0;
522
+ let networkRx = 0;
523
+ if (statsData.networks) {
524
+ for (const net of Object.values(statsData.networks)) {
525
+ networkTx += net.tx_bytes;
526
+ networkRx += net.rx_bytes;
527
+ }
528
+ }
529
+ // ディスクIO統計
530
+ let diskRead = 0;
531
+ let diskWrite = 0;
532
+ const ioStats = statsData.blkio_stats.io_service_bytes_recursive;
533
+ if (ioStats) {
534
+ for (const io of ioStats) {
535
+ if (io.op === 'read')
536
+ diskRead += io.value;
537
+ if (io.op === 'write')
538
+ diskWrite += io.value;
539
+ }
540
+ }
541
+ return {
542
+ memoryUsage: statsData.memory_stats.usage,
543
+ memoryLimit: statsData.memory_stats.limit,
544
+ cpuPercent,
545
+ networkTx,
546
+ networkRx,
547
+ diskRead,
548
+ diskWrite,
549
+ };
550
+ }
551
+ catch {
552
+ return null;
553
+ }
554
+ }
555
+ }
556
+ exports.DockerExecutor = DockerExecutor;
557
+ //# sourceMappingURL=docker-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docker-executor.js","sourceRoot":"","sources":["../src/docker-executor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * KATASHIRO Sandbox Package
3
+ *
4
+ * @fileoverview REQ-007: コード実行サンドボックス
5
+ * @module @nahisaho/katashiro-sandbox
6
+ * @since 0.4.0
7
+ */
8
+ export type { SandboxRuntime, SupportedLanguage, ExecutionStatus, SandboxConfig, DockerConfig, ExecutionRequest, FileOutput, ExecutionResult, ExecutionError, SecurityPolicy, SandboxEventType, SandboxEvent, SandboxEventListener, ContainerInfo, ResourceStats, } from './types';
9
+ export { DEFAULT_SANDBOX_CONFIG, DEFAULT_DOCKER_CONFIG, DEFAULT_DOCKER_IMAGES, DEFAULT_SECURITY_POLICY, } from './types';
10
+ export { DockerExecutor, SandboxError } from './docker-executor';
11
+ export { LocalExecutor } from './local-executor';
12
+ export { SandboxFactory, type ISandbox, executeCode, executeBash, executePython, executeJavaScript, executeTypeScript, } from './sandbox';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,YAAY,EACV,cAAc,EACd,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,YAAY,EACZ,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,oBAAoB,EACpB,aAAa,EACb,aAAa,GACd,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EACL,cAAc,EACd,KAAK,QAAQ,EACb,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,WAAW,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ /**
3
+ * KATASHIRO Sandbox Package
4
+ *
5
+ * @fileoverview REQ-007: コード実行サンドボックス
6
+ * @module @nahisaho/katashiro-sandbox
7
+ * @since 0.4.0
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.executeTypeScript = exports.executeJavaScript = exports.executePython = exports.executeBash = exports.executeCode = exports.SandboxFactory = exports.LocalExecutor = exports.SandboxError = exports.DockerExecutor = exports.DEFAULT_SECURITY_POLICY = exports.DEFAULT_DOCKER_IMAGES = exports.DEFAULT_DOCKER_CONFIG = exports.DEFAULT_SANDBOX_CONFIG = void 0;
11
+ // 定数
12
+ var types_1 = require("./types");
13
+ Object.defineProperty(exports, "DEFAULT_SANDBOX_CONFIG", { enumerable: true, get: function () { return types_1.DEFAULT_SANDBOX_CONFIG; } });
14
+ Object.defineProperty(exports, "DEFAULT_DOCKER_CONFIG", { enumerable: true, get: function () { return types_1.DEFAULT_DOCKER_CONFIG; } });
15
+ Object.defineProperty(exports, "DEFAULT_DOCKER_IMAGES", { enumerable: true, get: function () { return types_1.DEFAULT_DOCKER_IMAGES; } });
16
+ Object.defineProperty(exports, "DEFAULT_SECURITY_POLICY", { enumerable: true, get: function () { return types_1.DEFAULT_SECURITY_POLICY; } });
17
+ // Docker Executor
18
+ var docker_executor_1 = require("./docker-executor");
19
+ Object.defineProperty(exports, "DockerExecutor", { enumerable: true, get: function () { return docker_executor_1.DockerExecutor; } });
20
+ Object.defineProperty(exports, "SandboxError", { enumerable: true, get: function () { return docker_executor_1.SandboxError; } });
21
+ // Local Executor
22
+ var local_executor_1 = require("./local-executor");
23
+ Object.defineProperty(exports, "LocalExecutor", { enumerable: true, get: function () { return local_executor_1.LocalExecutor; } });
24
+ // Sandbox Factory & Interface
25
+ var sandbox_1 = require("./sandbox");
26
+ Object.defineProperty(exports, "SandboxFactory", { enumerable: true, get: function () { return sandbox_1.SandboxFactory; } });
27
+ Object.defineProperty(exports, "executeCode", { enumerable: true, get: function () { return sandbox_1.executeCode; } });
28
+ Object.defineProperty(exports, "executeBash", { enumerable: true, get: function () { return sandbox_1.executeBash; } });
29
+ Object.defineProperty(exports, "executePython", { enumerable: true, get: function () { return sandbox_1.executePython; } });
30
+ Object.defineProperty(exports, "executeJavaScript", { enumerable: true, get: function () { return sandbox_1.executeJavaScript; } });
31
+ Object.defineProperty(exports, "executeTypeScript", { enumerable: true, get: function () { return sandbox_1.executeTypeScript; } });
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;AAqBH,KAAK;AACL,iCAKiB;AAJf,+GAAA,sBAAsB,OAAA;AACtB,8GAAA,qBAAqB,OAAA;AACrB,8GAAA,qBAAqB,OAAA;AACrB,gHAAA,uBAAuB,OAAA;AAGzB,kBAAkB;AAClB,qDAAiE;AAAxD,iHAAA,cAAc,OAAA;AAAE,+GAAA,YAAY,OAAA;AAErC,iBAAiB;AACjB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,8BAA8B;AAC9B,qCAQmB;AAPjB,yGAAA,cAAc,OAAA;AAEd,sGAAA,WAAW,OAAA;AACX,sGAAA,WAAW,OAAA;AACX,wGAAA,aAAa,OAAA;AACb,4GAAA,iBAAiB,OAAA;AACjB,4GAAA,iBAAiB,OAAA"}