Skip to content

Commit

Permalink
split out log:added log:changed and command:update into separate meth…
Browse files Browse the repository at this point in the history
…ods (still broken)
  • Loading branch information
AtofStryker committed Jan 11, 2022
1 parent 36956e6 commit b6ca2f8
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 41 deletions.
83 changes: 44 additions & 39 deletions packages/driver/src/cy/multidomain/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,74 +91,79 @@ export function addCommands (Commands, Cypress: Cypress.Cypress, cy: Cypress.cy,
}

const updateCommand = (details) => {
if (details.logAdded) {
const attrs = details.logAdded

attrs.consoleProps = () => details.logAdded.consoleProps
attrs.renderProps = () => details.logAdded.renderProps

const log = Cypress.log(attrs)
if (details.end) {
const command = commands[details.id]

// if the log needs to stream updates, defer its result
if (!attrs.ended) {
logs[log.get('id')] = {
log,
deferred: createDeferred(),
}
if (command) {
delete commands[details.id]
command.deferred.resolve()
}

return
}
}

if (details.logChanged) {
const readableLog = logs[details.logChanged.id].log.get()
const onLogAdded = ({ logAdded }) => {
const attrs = logAdded

const diff = difference(details.logChanged, readableLog)
attrs.consoleProps = () => logAdded.consoleProps
attrs.renderProps = () => logAdded.renderProps

Object.keys(diff).forEach((key) => {
const logResults = details.logChanged[key]
const log = Cypress.log(attrs)

// TODO: whitelist params but try this first to see if problem resolves
// if its undefined or null, but is an object that is empty, skip it
if (logResults !== undefined && logResults !== null && !(_.isObject(logResults) && _.isEmpty(logResults))) {
logs[details.logChanged.id].log.set(key, logResults)
}
})
// if the log needs to stream updates, defer its result
if (!attrs.ended) {
logs[log.get('id')] = {
log,
deferred: createDeferred(),
}
}

const isEnded = logs[details.logChanged.id].log.get('ended')
return
}

if (isEnded) {
const log = logs[details.logChanged.id]
const onLogChanged = ({ logChanged }) => {
const readableLog = logs[logChanged.id].log.get()

delete logs[details.logChanged.id]
log.deferred.resolve()
const diff = difference(logChanged, readableLog)

Object.keys(diff).forEach((key) => {
const logResults = logChanged[key]

// TODO: whitelist params but try this first to see if problem resolves
// if its undefined or null, but is an object that is empty, skip it
if (logResults !== undefined && logResults !== null && !(_.isObject(logResults) && _.isEmpty(logResults))) {
logs[logChanged.id].log.set(key, logResults)
}
})

return
}
const isEnded = logs[logChanged.id].log.get('ended')

if (details.end) {
const command = commands[details.id]
if (isEnded) {
const log = logs[logChanged.id]

if (command) {
delete commands[details.id]
command.deferred.resolve()
}
delete logs[logChanged.id]
log.deferred.resolve()
}

return
}

communicator.on('command:enqueued', addCommand)
communicator.on('command:update', updateCommand)

communicator.on('log:added', onLogAdded)
communicator.on('log:changed', onLogChanged)

const cleanup = async () => {
communicator.off('command:enqueued', addCommand)
communicator.off('log:added', onLogAdded)

// don't allow for new commands to be enqueued, but wait for commands to update in the secondary domain
const pendingCommands = Object.keys(commands).map((command) => commands[command].deferred.promise)
const pendingLogs = Object.keys(logs).filter((log) => logs[log]?.deferred).map((log) => logs[log].deferred.promise)

return Promise.all(pendingCommands.concat(pendingLogs)).then(() => {
communicator.off('command:update', updateCommand)
communicator.off('log:changed', onLogChanged)
})
}

Expand Down
4 changes: 2 additions & 2 deletions packages/driver/src/multidomain/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,13 @@ const onCommandEnd = (command) => {
}

const onLogAdded = (attrs) => {
specBridgeCommunicator.toPrimary('command:update', {
specBridgeCommunicator.toPrimary('log:added', {
logAdded: $Log.toSerializedJSON(attrs),
})
}

const onLogChanged = (attrs) => {
specBridgeCommunicator.toPrimary('command:update', {
specBridgeCommunicator.toPrimary('log:changed', {
logChanged: $Log.toSerializedJSON(attrs),
})
}
Expand Down

0 comments on commit b6ca2f8

Please sign in to comment.