Files
2026-07-13 12:47:58 +08:00

91 lines
2.7 KiB
TypeScript

import { assert, describe, test } from 'vitest'
import { getSignature, InvalidArgumentError, Sandbox } from '../../src'
import { TEST_API_KEY } from '../setup'
function createSandbox(envdAccessToken?: string) {
return new Sandbox({
sandboxId: 'sandbox-id',
sandboxDomain: 'e2b.app',
envdVersion: '0.4.0',
envdAccessToken,
apiKey: TEST_API_KEY,
domain: 'e2b.app',
debug: false,
})
}
describe('sandbox file URLs', () => {
test('file URLs use direct sandbox host when envd API uses stable host', async () => {
const sandbox = createSandbox()
assert.equal(sandbox['envdApiUrl'], 'https://sandbox.e2b.app')
assert.equal(sandbox['envdDirectUrl'], 'https://49983-sandbox-id.e2b.app')
assert.equal(
await sandbox.downloadUrl('/tmp/a.txt'),
'https://49983-sandbox-id.e2b.app/files?path=%2Ftmp%2Fa.txt'
)
assert.equal(
await sandbox.uploadUrl('/tmp/a.txt'),
'https://49983-sandbox-id.e2b.app/files?path=%2Ftmp%2Fa.txt'
)
})
test('throws when signature expiration is used on unsecured sandbox', async () => {
const sandbox = createSandbox()
await Promise.all(
[
sandbox.downloadUrl('/tmp/a.txt', { useSignatureExpiration: 120 }),
sandbox.uploadUrl('/tmp/a.txt', { useSignatureExpiration: 120 }),
].map((promise) =>
promise.then(
() => assert.fail('expected InvalidArgumentError'),
(err) => {
assert.instanceOf(err, InvalidArgumentError)
assert.equal(
err.message,
'Signature expiration can be used only when sandbox is created as secured.'
)
}
)
)
)
})
test('zero signature expiration expires immediately', async () => {
const before = Math.floor(Date.now() / 1000)
const signature = await getSignature({
path: '/tmp/a.txt',
operation: 'read',
user: 'user',
envdAccessToken: 'access-token',
expirationInSeconds: 0,
})
const after = Math.floor(Date.now() / 1000)
assert.isNotNull(signature.expiration)
assert.isAtLeast(signature.expiration!, before)
assert.isAtMost(signature.expiration!, after)
})
test('zero signature expiration is included in URL', async () => {
const sandbox = createSandbox('access-token')
for (const url of [
await sandbox.downloadUrl('/tmp/a.txt', { useSignatureExpiration: 0 }),
await sandbox.uploadUrl('/tmp/a.txt', { useSignatureExpiration: 0 }),
]) {
const expiration = new URL(url).searchParams.get('signature_expiration')
assert.isNotNull(expiration)
assert.approximately(
parseInt(expiration!),
Math.floor(Date.now() / 1000),
5
)
}
})
})