up
This commit is contained in:
@@ -43,7 +43,40 @@ app.whenReady().then(() => {
|
||||
screen.getAllDisplays = () => [...original(), targetDisplay]
|
||||
}
|
||||
})
|
||||
let offlinePackage
|
||||
const seeded = (async () => {
|
||||
const { PackageStore } = require(root + '/dist-electron/electron/package-store.js')
|
||||
const { buildScreenPackage } = require(root + '/dist-electron/electron/screen-package.js')
|
||||
const bytes = require('node:fs').readFileSync(root + '/fixtures/audio.wav')
|
||||
const pkg = buildScreenPackage('https://offline.invalid', 7, {
|
||||
game: {
|
||||
game: {
|
||||
ID: 7,
|
||||
name: 'Offline smoke',
|
||||
scenario: { story: { introduction: { audio: 'audio.wav' } } },
|
||||
},
|
||||
},
|
||||
plan: {},
|
||||
music: {},
|
||||
})
|
||||
const store = new PackageStore(require('node:path').join(app.getPath('userData'), 'packages'), {
|
||||
fetch: async () =>
|
||||
new Response(bytes, {
|
||||
headers: { 'Content-Type': 'audio/wav', 'Content-Length': String(bytes.length) },
|
||||
}),
|
||||
})
|
||||
await store.initialize()
|
||||
offlinePackage = await store.download(pkg)
|
||||
})()
|
||||
seeded.catch((error) => {
|
||||
console.error('PACKAGE_SEED_FAIL', error)
|
||||
app.exit(1)
|
||||
})
|
||||
// Регистрация протокола выполняется до ready; открытие хранилища ждёт seed.
|
||||
const whenReady = app.whenReady.bind(app)
|
||||
app.whenReady = () => whenReady().then(() => seeded)
|
||||
require(root + '/dist-electron/electron/main.js')
|
||||
app.whenReady = whenReady
|
||||
async function poll(check, label) {
|
||||
for (let i = 0; i < 150; i++) {
|
||||
const result = await check()
|
||||
@@ -67,6 +100,24 @@ app.whenReady().then(async () => {
|
||||
'control UI',
|
||||
)
|
||||
const evaluate = (s) => control.webContents.executeJavaScript(s)
|
||||
await seeded
|
||||
const asset = offlinePackage.files[0]
|
||||
const localURL = `screen-app://app/packages/${offlinePackage.key}/${asset.id}`
|
||||
const offline = await evaluate(`(async () => {
|
||||
const response = await fetch(${JSON.stringify(localURL)}, { headers: { Range: 'bytes=0-43' } })
|
||||
const size = (await response.arrayBuffer()).byteLength
|
||||
const audio = new Audio(${JSON.stringify(localURL)})
|
||||
await new Promise((resolve, reject) => { audio.onloadedmetadata = resolve; audio.onerror = () => reject(new Error('Offline audio failed')) })
|
||||
await audio.play()
|
||||
const playing = !audio.paused
|
||||
const duration = audio.duration
|
||||
audio.pause()
|
||||
return { status: response.status, size, duration, playing }
|
||||
})()`)
|
||||
assert.equal(offline.status, 206)
|
||||
assert.equal(offline.size, 44)
|
||||
assert.ok(offline.duration > 0)
|
||||
assert.equal(offline.playing, true)
|
||||
assert.equal(await evaluate('typeof window.require'), 'undefined')
|
||||
await evaluate(`window.screenBridge.show(${targetDisplay.id})`)
|
||||
const output = await poll(
|
||||
@@ -173,6 +224,7 @@ app.whenReady().then(async () => {
|
||||
'SCREEN_SMOKE_PASS',
|
||||
JSON.stringify({
|
||||
range,
|
||||
offlinePackage: offline,
|
||||
display: {
|
||||
id: targetDisplay.id,
|
||||
bounds: targetDisplay.bounds,
|
||||
|
||||
Reference in New Issue
Block a user