91 lines
2.7 KiB
TypeScript
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
|
|
)
|
|
}
|
|
})
|
|
})
|