transport.mjs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435
  1. import test from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import { createVideoApi } from '../../src/modules/cockpit/services/videoApi.js'
  4. const code = 'CAM/03 空格'
  5. const config = { dataSource: 'real', api: { baseUrl: 'http://fixture.invalid/api/cockpit/v1', token: 'never-send' } }
  6. const response = (data, status = 200) => Response.json({ code: 200, msg: '操作成功', data }, { status })
  7. test('prepare assigns an owned identity before any live request and later operations carry only its credential', async () => {
  8. const calls = []
  9. const api = createVideoApi({ config, fetchImpl: async (url, options) => {
  10. calls.push({ url: new URL(url), options, body: JSON.parse(options.body) })
  11. if (url.endsWith('/prepare')) return response({ deviceCode: code, deviceName: '摄像机03', sessionId: 'session-03', sessionToken: 'owner-03', mode: 'LIVE', status: 'PREPARED' }, 201)
  12. if (url.endsWith('/live')) return response({ deviceCode: code, sessionId: 'session-03', mode: 'LIVE', status: 'ACTIVE', media: { native: true, url: 'https://media.invalid/live.mp4' } })
  13. if (url.endsWith('/status')) return response({ sessionId: 'session-03', status: 'STOPPED' })
  14. return response({ sessionId: 'session-03', status: 'CLEANUP_PENDING', category: 'CLEANUP_UNCONFIRMED' }, 202)
  15. } })
  16. const identity = await api.prepare(code)
  17. assert.equal(calls.length, 1)
  18. assert.equal(calls[0].url.pathname, '/api/cockpit/v1/video/sessions/prepare')
  19. assert.deepEqual(calls[0].body, { deviceCode: code })
  20. assert.equal(identity.status, 'PREPARED')
  21. assert.equal(identity.media, undefined)
  22. const started = await api.start(identity)
  23. assert.equal(started.status, 'ACTIVE')
  24. assert.equal(started.sessionToken, undefined)
  25. assert.equal((await api.stop(identity)).status, 'CLEANUP_PENDING')
  26. assert.equal((await api.status(identity)).status, 'STOPPED')
  27. for (const call of calls) {
  28. assert.equal(call.options.headers.Authorization, undefined)
  29. assert.equal(call.options.credentials, 'omit')
  30. assert.equal(call.url.search, '')
  31. }
  32. for (const call of calls.slice(1)) assert.deepEqual(call.body, { sessionToken: 'owner-03' })
  33. })