🏡 index : quine-global/webdriverio.git

import logger from '@wdio/logger'
import type { Capabilities, Services } from '@wdio/types'

import { setPort } from './client.js'
import { CUSTOM_CAP } from './constants.js'
import type { SharedStoreServiceCapabilities } from './types.js'

const log = logger('@wdio/shared-store-service')

let server: SharedStoreServer

export default class SharedStoreLauncher implements Services.HookFunctions {
    private _app?: PolkaInstance

    async onPrepare (_: never, capabilities: Capabilities.TestrunnerCapabilities) {
        /**
         * import during runtime to avoid unnecessary dependency loading
         */
        server = (await import('./server.js')) as SharedStoreServer
        const { port, app } = await server.startServer()
        this._app = app
        setPort(port)

        const capsList = Array.isArray(capabilities)
            ? capabilities
            : Object.values(capabilities).map((multiremoteOption) => multiremoteOption.capabilities)

        const caps: Partial<SharedStoreServiceCapabilities>[] = capsList.flatMap((c) => {
            const multiremote = c as Capabilities.RequestedMultiremoteCapabilities
            if (!multiremote.browserName && multiremote[Object.keys(multiremote)[0]].capabilities) {
                return Object.values(multiremote).map((options) =>
                    (options.capabilities as Capabilities.W3CCapabilities)?.alwaysMatch ||
                    (options.capabilities as WebdriverIO.Capabilities)
                )
            }

            const w3cCaps = c as Capabilities.W3CCapabilities
            return w3cCaps.alwaysMatch || c as WebdriverIO.Capabilities
        })
        caps.forEach((c) => { c[CUSTOM_CAP] = port })
        log.info(`Started shared server on port ${port}`)
    }

    async onComplete () {
        return new Promise<void>((resolve) => {
            if (this._app && this._app.server.close) {
                this._app.server.close(() => resolve())
            }
            return resolve()
        })
    }
}