- Add Vite as alternative build (vite.config.ts, scripts/vite-plugin-*)
- Add dab04af7 RSS fix (distRoot, ripgrep path, post-build)
- Pull in packages/builtin-tools/ (+354 files)
- Pull in packages/agent-tools/, mcp-client/, acp-link/, weixin/
- Copy defines.ts from upstream for Vite compatibility
- Update package.json with Vite scripts and deps
89 lines
2.8 KiB
TypeScript
89 lines
2.8 KiB
TypeScript
import { describe, expect, test } from 'bun:test'
|
|
import { randomBytes } from 'node:crypto'
|
|
import {
|
|
aesEcbPaddedSize,
|
|
buildCdnDownloadUrl,
|
|
buildCdnUploadUrl,
|
|
decryptAesEcb,
|
|
encryptAesEcb,
|
|
guessMediaType,
|
|
parseAesKey,
|
|
} from '../media.js'
|
|
import { UploadMediaType } from '../types.js'
|
|
|
|
describe('AES-128-ECB', () => {
|
|
test('encrypt then decrypt returns original data', () => {
|
|
const key = randomBytes(16)
|
|
const plaintext = Buffer.from('hello world test data!!')
|
|
const ciphertext = encryptAesEcb(plaintext, key)
|
|
expect(decryptAesEcb(ciphertext, key)).toEqual(plaintext)
|
|
})
|
|
|
|
test('different keys produce different ciphertext', () => {
|
|
const plaintext = Buffer.from('test data')
|
|
expect(encryptAesEcb(plaintext, randomBytes(16))).not.toEqual(
|
|
encryptAesEcb(plaintext, randomBytes(16)),
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('aesEcbPaddedSize', () => {
|
|
test('pads to next 16-byte boundary', () => {
|
|
expect(aesEcbPaddedSize(1)).toBe(16)
|
|
expect(aesEcbPaddedSize(16)).toBe(32)
|
|
expect(aesEcbPaddedSize(17)).toBe(32)
|
|
expect(aesEcbPaddedSize(32)).toBe(48)
|
|
})
|
|
})
|
|
|
|
describe('parseAesKey', () => {
|
|
test('parses 16 raw bytes from base64', () => {
|
|
const raw = randomBytes(16)
|
|
expect(parseAesKey(raw.toString('base64'))).toEqual(raw)
|
|
})
|
|
|
|
test('parses hex-encoded key from base64', () => {
|
|
const raw = randomBytes(16)
|
|
const b64 = Buffer.from(raw.toString('hex'), 'ascii').toString('base64')
|
|
expect(parseAesKey(b64)).toEqual(raw)
|
|
})
|
|
|
|
test('throws on invalid key length', () => {
|
|
expect(() => parseAesKey(Buffer.from('short').toString('base64'))).toThrow(
|
|
'Invalid aes_key',
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('CDN URL builders', () => {
|
|
test('buildCdnDownloadUrl encodes param', () => {
|
|
expect(buildCdnDownloadUrl('abc=123', 'https://cdn.example.com')).toBe(
|
|
'https://cdn.example.com/download?encrypted_query_param=abc%3D123',
|
|
)
|
|
})
|
|
|
|
test('buildCdnUploadUrl encodes params', () => {
|
|
expect(buildCdnUploadUrl('https://cdn.example.com', 'param1', 'key1')).toBe(
|
|
'https://cdn.example.com/upload?encrypted_query_param=param1&filekey=key1',
|
|
)
|
|
})
|
|
})
|
|
|
|
describe('guessMediaType', () => {
|
|
test('detects image extensions', () => {
|
|
expect(guessMediaType('photo.jpg')).toBe(UploadMediaType.IMAGE)
|
|
expect(guessMediaType('photo.png')).toBe(UploadMediaType.IMAGE)
|
|
expect(guessMediaType('photo.webp')).toBe(UploadMediaType.IMAGE)
|
|
})
|
|
|
|
test('detects video extensions', () => {
|
|
expect(guessMediaType('video.mp4')).toBe(UploadMediaType.VIDEO)
|
|
expect(guessMediaType('video.mov')).toBe(UploadMediaType.VIDEO)
|
|
})
|
|
|
|
test('defaults to FILE for unknown extensions', () => {
|
|
expect(guessMediaType('doc.pdf')).toBe(UploadMediaType.FILE)
|
|
expect(guessMediaType('archive.zip')).toBe(UploadMediaType.FILE)
|
|
})
|
|
})
|