From 2964dd44272205dd9b835b839a809f33e6215de2 Mon Sep 17 00:00:00 2001 From: Johan Nyman Date: Fri, 5 Jul 2024 06:10:03 +0200 Subject: [PATCH] wip --- packages/connector/src/MosConnection.ts | 16 +- packages/connector/src/MosDevice.ts | 383 ++++---- packages/connector/src/__mocks__/testData.ts | 33 +- .../src/__tests__/MosConnection.spec.ts | 5 +- .../src/__tests__/Profile0-open-media.spec.ts | 6 +- .../connector/src/__tests__/Profile2.spec.ts | 2 +- .../connector/src/__tests__/Profile3.spec.ts | 4 +- .../Profile0-open-media.spec.ts.snap | 6 +- .../__snapshots__/Profile1.spec.ts.snap | 103 +-- .../__snapshots__/Profile2.spec.ts.snap | 847 +++++++++++++++--- .../__snapshots__/Profile3.spec.ts.snap | 188 ++-- .../__snapshots__/Profile4.spec.ts.snap | 116 +-- .../helper/src/__tests__/ParseError.spec.ts | 44 + .../src/__tests__/parsing/mosXml2Js.spec.ts | 2 +- packages/helper/src/mosModel/ParseError.ts | 82 ++ .../helper/src/mosModel/__tests__/lib.spec.ts | 79 +- .../mosModel/__tests__/parseMosTypes.spec.ts | 40 +- packages/helper/src/mosModel/index.ts | 3 +- packages/helper/src/mosModel/lib.ts | 124 ++- packages/helper/src/mosModel/parseMosTypes.ts | 98 +- .../src/mosModel/profile0/xmlConversion.ts | 225 ++--- .../src/mosModel/profile1/xmlConversion.ts | 467 +++++----- .../profile2/__tests__/xmlConversion.spec.ts | 2 +- .../src/mosModel/profile2/xmlConversion.ts | 310 ++++--- .../src/mosModel/profile3/xmlConversion.ts | 128 +-- .../src/mosModel/profile4/xmlConversion.ts | 41 +- packages/model/src/model.ts | 8 +- packages/model/src/mosTypes/mosTime.ts | 1 + packages/quick-mos/input/util.ts | 2 - 29 files changed, 2112 insertions(+), 1253 deletions(-) create mode 100644 packages/helper/src/__tests__/ParseError.spec.ts create mode 100644 packages/helper/src/mosModel/ParseError.ts diff --git a/packages/connector/src/MosConnection.ts b/packages/connector/src/MosConnection.ts index ce3e5c45..f2028ec6 100644 --- a/packages/connector/src/MosConnection.ts +++ b/packages/connector/src/MosConnection.ts @@ -514,15 +514,27 @@ export class MosConnection extends EventEmitter implements if (mosDevice) { mosDevice .routeData(parsed.mos, client.portDescription) + .catch((err) => { + if (MosModel.ParseError.isParseError(err)) { + // Try to add the main mos message key to the error: + const breadcrumbs = Object.keys(parsed.mos).filter( + (key) => + !['messageID', 'mosID', 'ncsID'].includes(key) && + typeof parsed.mos[key] === 'object' + ) + throw MosModel.ParseError.handleCaughtError(breadcrumbs.join('/'), err) + } else throw err + }) .then((message: MosModel.MosMessage) => { sendReply(message) }) - .catch((err: Error | MosModel.MosMessage) => { + .catch((err: Error | MosModel.MosMessage | MosModel.ParseError) => { // Something went wrong if (err instanceof MosModel.MosMessage) { sendReply(err) } else { - // Unknown / internal error + // Internal/parsing error + // Log error: this.emit('warning', `Error when handling incoming data: ${err} ${err?.stack}`) // reply with NACK: diff --git a/packages/connector/src/MosDevice.ts b/packages/connector/src/MosDevice.ts index 3f173949..ab493dd1 100644 --- a/packages/connector/src/MosDevice.ts +++ b/packages/connector/src/MosDevice.ts @@ -249,7 +249,6 @@ export class MosDevice implements IMOSDevice { this.debugTrace('parsedData', data) // this.debugTrace('keys', Object.keys(data)) } - this.mosTypes // Route and format data: // Profile 0: ------------------------------------------------------------------------------------------------- @@ -265,13 +264,13 @@ export class MosDevice implements IMOSDevice { if (data.mosReqObj && typeof this._callbackOnRequestMOSOBject === 'function') { const mosReqObj = ensureXMLObject(data.mosReqObj, this.strict) const mosObj = await this._callbackOnRequestMOSOBject( - this.parseMosTypes.string.createRequired(mosReqObj.objID) + this.parseMosTypes.string.createRequired(mosReqObj.objID, 'objID') ) if (!mosObj) return null return new MosModel.MosObj(mosObj, this.strict) } else if (data.mosReqAll && typeof this._callbackOnRequestAllMOSObjects === 'function') { const mosReqAll = ensureXMLObject(data.mosReqAll, this.strict) - const pause = this.parseMosTypes.number.createOptional(mosReqAll.pause) || 0 + const pause = this.parseMosTypes.number.createOptional(mosReqAll.pause, 'pause') || 0 const mosObjects = await this._callbackOnRequestAllMOSObjects() setImmediate(() => { @@ -319,17 +318,11 @@ export class MosDevice implements IMOSDevice { this.strict ) } else if (data.mosObj && typeof this._callbackOnMOSObjects === 'function') { - const mosObj = ensureXMLObject(data.mosObj, this.strict) - const obj = MosModel.XMLMosObject.fromXML(mosObj, this.strict) + const obj = MosModel.XMLMosObject.fromXML('mosObj', data.mosObj, this.strict) const resp = await this._callbackOnMOSObjects([obj]) return new MosModel.MOSAck(resp, this.strict) } else if (data.mosListAll && typeof this._callbackOnMOSObjects === 'function') { - const mosListAll = ensureXMLObject(data.mosListAll, this.strict) - const mosObjs = ensureArray(mosListAll.mosObj) - const objs = mosObjs.map((mosObj) => { - mosObj = ensureXMLObject(mosObj, this.strict) - return MosModel.XMLMosObject.fromXML(mosObj, this.strict) - }) + const objs = MosModel.XMLMosObjects.fromXML('mosListAll', data.mosListAll, this.strict) const resp = await this._callbackOnMOSObjects(objs) return new MosModel.MOSAck(resp, this.strict) } @@ -389,8 +382,8 @@ export class MosDevice implements IMOSDevice { // The spec says that there must be two storyID tags, so we'll throw an error here: return new MosModel.ROAck( { - ID: this.parseMosTypes.mosString128.createRequired(roStoryMove.roID), - Status: this.parseMosTypes.mosString128.createRequired( + ID: this.parseMosTypes.mosString128.createRequired(roStoryMove.roID, 'roID'), + Status: this.mosTypes.mosString128.create( `The second tag is missing in .` ), Stories: [], @@ -441,7 +434,7 @@ export class MosDevice implements IMOSDevice { Array.isArray(roStoryMoveMultiple.storyID) ? ensureSingularArray(roStoryMoveMultiple.storyID, this.strict) : [ensureSingular(roStoryMoveMultiple.storyID, this.strict)] - ).map((s) => this.parseMosTypes.string.createRequired(s)) + ).map((s) => this.parseMosTypes.string.createRequired(s, 'storyID')) { // From documentation: // Validation: Duplicate storyIDs are not permitted with in the storyID list. @@ -452,8 +445,8 @@ export class MosDevice implements IMOSDevice { if (uniqueStoryIds.has(storyId)) return new MosModel.ROAck( { - ID: this.parseMosTypes.mosString128.createRequired(roStoryMoveMultiple.roID), - Status: this.parseMosTypes.mosString128.createRequired( + ID: this.parseMosTypes.mosString128.createRequired(roStoryMoveMultiple.roID, 'roID'), + Status: this.mosTypes.mosString128.create( `Duplicate storyIDs are not permitted with in the storyID list.` ), Stories: [], @@ -543,7 +536,7 @@ export class MosDevice implements IMOSDevice { Array.isArray(roItemMoveMultiple.itemID) ? ensureSingularArray(roItemMoveMultiple.itemID, this.strict) : [ensureSingular(roItemMoveMultiple.itemID, this.strict)] - ).map((s) => this.parseMosTypes.string.createRequired(s)) + ).map((s) => this.parseMosTypes.string.createRequired(s, 'itemID')) // An additional validation checking the length of items can be added const l = items.length @@ -565,27 +558,22 @@ export class MosDevice implements IMOSDevice { } if (data.roCreate && typeof this._callbackOnCreateRunningOrder === 'function') { - const roCreate = ensureXMLObject(data.roCreate, this.strict) - const ro = MosModel.XMLRunningOrder.fromXML(roCreate, this.strict) - + const ro = MosModel.XMLRunningOrder.fromXML('roCreate', data.roCreate, this.strict) const resp = await this._callbackOnCreateRunningOrder(ro) return new MosModel.ROAck(resp, this.strict) } else if (data.roReplace && typeof this._callbackOnReplaceRunningOrder === 'function') { - const roReplace = ensureXMLObject(data.roReplace, this.strict) - const ro: IMOSRunningOrder = MosModel.XMLRunningOrder.fromXML(roReplace, this.strict) - + const ro: IMOSRunningOrder = MosModel.XMLRunningOrder.fromXML('roReplace', data.roReplace, this.strict) const resp = await this._callbackOnReplaceRunningOrder(ro) return new MosModel.ROAck(resp, this.strict) } else if (data.roDelete && typeof this._callbackOnDeleteRunningOrder === 'function') { const roDelete = ensureXMLObject(data.roDelete, this.strict) - // TODO: Change runningOrderId to RunningOrderID in interface? const resp = await this._callbackOnDeleteRunningOrder( - this.parseMosTypes.mosString128.createRequired(roDelete.roID) + this.parseMosTypes.mosString128.createRequired(roDelete.roID, 'roID') ) return new MosModel.ROAck(resp, this.strict) } else if (data.roReq && typeof this._callbackOnRequestRunningOrder === 'function') { const roReq = ensureXMLObject(data.roReq, this.strict) - const roId = this.parseMosTypes.mosString128.createRequired(roReq.roID) + const roId = this.parseMosTypes.mosString128.createRequired(roReq.roID, 'roID') const ro = await this._callbackOnRequestRunningOrder(roId) if (ro) { return new MosModel.ROList(ro, this.strict) @@ -601,8 +589,11 @@ export class MosDevice implements IMOSDevice { ) } } else if (data.roMetadataReplace && typeof this._callbackOnMetadataReplace === 'function') { - const roMetadataReplace = ensureXMLObject(data.roMetadataReplace, this.strict) - const ro: IMOSRunningOrderBase = MosModel.XMLRunningOrderBase.fromXML(roMetadataReplace, this.strict) + const ro: IMOSRunningOrderBase = MosModel.XMLRunningOrderBase.fromXML( + 'roMetadataReplace', + data.roMetadataReplace, + this.strict + ) const resp = await this._callbackOnMetadataReplace(ro) return new MosModel.ROAck(resp, this.strict) } else if ( @@ -611,12 +602,15 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnRunningOrderStatus === 'function' ) { const status: IMOSRunningOrderStatus = { - ID: this.parseMosTypes.mosString128.createRequired(data.roElementStat.roID), - Status: this.parseMosTypes.stringEnum.createRequired({ - value: data.roElementStat.status, - enum: IMOSObjectStatus, - }), - Time: this.parseMosTypes.mosTime.createRequired(data.roElementStat.time), + ID: this.parseMosTypes.mosString128.createRequired(data.roElementStat.roID, 'roID'), + Status: this.parseMosTypes.stringEnum.createRequired( + { + value: data.roElementStat.status, + enum: IMOSObjectStatus, + }, + 'status' + ), + Time: this.parseMosTypes.mosTime.createRequired(data.roElementStat.time, 'time'), } const resp = await this._callbackOnRunningOrderStatus(status) @@ -627,13 +621,16 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnStoryStatus === 'function' ) { const status: IMOSStoryStatus = { - RunningOrderId: this.parseMosTypes.mosString128.createRequired(data.roElementStat.roID), - ID: this.parseMosTypes.mosString128.createRequired(data.roElementStat.storyID), - Status: this.parseMosTypes.stringEnum.createRequired({ - value: data.roElementStat.status, - enum: IMOSObjectStatus, - }), - Time: this.parseMosTypes.mosTime.createRequired(data.roElementStat.time), + RunningOrderId: this.parseMosTypes.mosString128.createRequired(data.roElementStat.roID, 'roID'), + ID: this.parseMosTypes.mosString128.createRequired(data.roElementStat.storyID, 'storyID'), + Status: this.parseMosTypes.stringEnum.createRequired( + { + value: data.roElementStat.status, + enum: IMOSObjectStatus, + }, + 'status' + ), + Time: this.parseMosTypes.mosTime.createRequired(data.roElementStat.time, 'time'), } const resp = await this._callbackOnStoryStatus(status) @@ -644,16 +641,19 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnItemStatus === 'function' ) { const status: IMOSItemStatus = { - RunningOrderId: this.parseMosTypes.mosString128.createRequired(data.roElementStat.roID), - StoryId: this.parseMosTypes.mosString128.createRequired(data.roElementStat.storyID), - ID: this.parseMosTypes.mosString128.createRequired(data.roElementStat.itemID), - Status: this.parseMosTypes.stringEnum.createRequired({ - value: data.roElementStat.status, - enum: IMOSObjectStatus, - }), - Time: this.parseMosTypes.mosTime.createRequired(data.roElementStat.time), - ObjectId: this.parseMosTypes.mosString128.createOptional(data.roElementStat.objID), - Channel: this.parseMosTypes.mosString128.createOptional(data.roElementStat.itemChannel), + RunningOrderId: this.parseMosTypes.mosString128.createRequired(data.roElementStat.roID, 'roID'), + StoryId: this.parseMosTypes.mosString128.createRequired(data.roElementStat.storyID, 'storyID'), + ID: this.parseMosTypes.mosString128.createRequired(data.roElementStat.itemID, 'itemID'), + Status: this.parseMosTypes.stringEnum.createRequired( + { + value: data.roElementStat.status, + enum: IMOSObjectStatus, + }, + 'status' + ), + Time: this.parseMosTypes.mosTime.createRequired(data.roElementStat.time, 'time'), + ObjectId: this.parseMosTypes.mosString128.createOptional(data.roElementStat.objID, 'objID'), + Channel: this.parseMosTypes.mosString128.createOptional(data.roElementStat.itemChannel, 'itemChannel'), } const resp = await this._callbackOnItemStatus(status) @@ -661,11 +661,14 @@ export class MosDevice implements IMOSDevice { } else if (data.roReadyToAir && typeof this._callbackOnReadyToAir === 'function') { const roReadyToAir = ensureXMLObject(data.roReadyToAir, this.strict) const resp = await this._callbackOnReadyToAir({ - ID: this.parseMosTypes.mosString128.createRequired(roReadyToAir.roID), - Status: this.parseMosTypes.stringEnum.createRequired({ - value: roReadyToAir.roAir, - enum: IMOSObjectAirStatus, - }), + ID: this.parseMosTypes.mosString128.createRequired(roReadyToAir.roID, 'roID'), + Status: this.parseMosTypes.stringEnum.createRequired( + { + value: roReadyToAir.roAir, + enum: IMOSObjectAirStatus, + }, + 'roAir' + ), }) return new MosModel.ROAck(resp, this.strict) } else if ( @@ -677,12 +680,16 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnROInsertStories === 'function' ) { const action: IMOSStoryAction = { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), - StoryID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.storyID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), + StoryID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.storyID, + 'element_target.storyID' + ), } - const sourceStories = data.roElementAction.element_source.story + const stories: Array = MosModel.XMLROStories.fromXML( - Array.isArray(sourceStories) ? sourceStories : [sourceStories], + 'element_source.story', + data.roElementAction.element_source.story, this.strict ) const resp = await this._callbackOnROInsertStories(action, stories) @@ -697,12 +704,19 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnROInsertItems === 'function' ) { const action: IMOSItemAction = { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), - StoryID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.storyID), - ItemID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.itemID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), + StoryID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.storyID, + 'element_target.storyID' + ), + ItemID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.itemID, + 'element_target.itemID' + ), } const items: IMOSItem[] = MosModel.XMLMosItems.fromXML( - ensureArray(data.roElementAction.element_source.item), + 'element_source.item', + data.roElementAction.element_source.item, this.strict ) const resp = await this._callbackOnROInsertItems(action, items) @@ -717,12 +731,16 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnROReplaceStories === 'function' ) { const action: IMOSStoryAction = { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), - StoryID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.storyID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), + StoryID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.storyID, + 'element_target.storyID' + ), } - const sourceStories = data.roElementAction.element_source.story + const stories: Array = MosModel.XMLROStories.fromXML( - Array.isArray(sourceStories) ? sourceStories : [sourceStories], + 'element_source.story', + data.roElementAction.element_source.story, this.strict ) const resp = await this._callbackOnROReplaceStories(action, stories) @@ -736,12 +754,19 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnROReplaceItems === 'function' ) { const action: IMOSItemAction = { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), - StoryID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.storyID), - ItemID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.itemID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), + StoryID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.storyID, + 'element_target.storyID' + ), + ItemID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.itemID, + 'element_target.itemID' + ), } const items: IMOSItem[] = MosModel.XMLMosItems.fromXML( - ensureArray(data.roElementAction.element_source.item), + 'element_source.item', + data.roElementAction.element_source.item, this.strict ) const resp = await this._callbackOnROReplaceItems(action, items) @@ -756,10 +781,14 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnROMoveStories === 'function' ) { const action: IMOSStoryAction = { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), - StoryID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.storyID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), + StoryID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.storyID, + 'element_target.storyID' + ), } const storyIDs: Array = MosModel.XMLMosIDs.fromXML( + 'element_source.storyID', data.roElementAction.element_source.storyID, this.strict ) @@ -774,11 +803,18 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnROMoveItems === 'function' ) { const action: IMOSItemAction = { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), - StoryID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.storyID), - ItemID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.itemID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), + StoryID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.storyID, + 'element_target.storyID' + ), + ItemID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.itemID, + 'element_target.itemID' + ), } const itemIDs: Array = MosModel.XMLMosIDs.fromXML( + 'element_source.itemID', data.roElementAction.element_source.itemID, this.strict ) @@ -792,13 +828,14 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnRODeleteStories === 'function' ) { const stories: Array = MosModel.XMLMosIDs.fromXML( + 'element_source.storyID', data.roElementAction.element_source.storyID, this.strict ) const resp = await this._callbackOnRODeleteStories( { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), }, stories ) @@ -812,10 +849,14 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnRODeleteItems === 'function' ) { const action: IMOSStoryAction = { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), - StoryID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.element_target.storyID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), + StoryID: this.parseMosTypes.mosString128.createRequired( + data.roElementAction.element_target.storyID, + 'element_target.storyID' + ), } const items: Array = MosModel.XMLMosIDs.fromXML( + 'element_source.itemID', data.roElementAction.element_source.itemID, this.strict ) @@ -831,13 +872,14 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnROSwapStories === 'function' ) { const stories: Array = MosModel.XMLMosIDs.fromXML( + 'element_source.storyID', data.roElementAction.element_source.storyID, this.strict ) const resp = await this._callbackOnROSwapStories( { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), }, stories[0], stories[1] @@ -853,15 +895,17 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnROSwapItems === 'function' ) { const items: Array = MosModel.XMLMosIDs.fromXML( + 'element_source.itemID', data.roElementAction.element_source.itemID, this.strict ) const resp = await this._callbackOnROSwapItems( { - RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID), + RunningOrderID: this.parseMosTypes.mosString128.createRequired(data.roElementAction.roID, 'roID'), StoryID: this.parseMosTypes.mosString128.createRequired( - data.roElementAction.element_target.storyID + data.roElementAction.element_target.storyID, + 'element_target.storyID' ), }, items[0], @@ -873,14 +917,16 @@ export class MosDevice implements IMOSDevice { if (data.mosItemReplace && typeof this._callbackOnItemReplace === 'function') { const mosItemReplace = ensureXMLObject(data.mosItemReplace, this.strict) const resp = await this._callbackOnItemReplace( - this.parseMosTypes.mosString128.createRequired(mosItemReplace.ID), - this.parseMosTypes.mosString128.createRequired(mosItemReplace.itemID), - MosModel.XMLMosItem.fromXML(ensureXMLObject(mosItemReplace.item, this.strict), this.strict) + this.parseMosTypes.mosString128.createRequired(mosItemReplace.ID, 'ID'), + this.parseMosTypes.mosString128.createRequired(mosItemReplace.itemID, 'itemID'), + MosModel.XMLMosItem.fromXML('item', mosItemReplace.item, this.strict) ) return new MosModel.ROAck(resp, this.strict) } else if (data.mosObjCreate && typeof this._callbackOnObjectCreate === 'function') { const mosObjCreate = ensureXMLObject(data.mosObjCreate, this.strict) - const resp = await this._callbackOnObjectCreate(MosModel.XMLMosObject.fromXML(mosObjCreate, this.strict)) + const resp = await this._callbackOnObjectCreate( + MosModel.XMLMosObject.fromXML('mosObjCreate', mosObjCreate, this.strict) + ) const ack = new MosModel.MOSAck(resp, this.strict) return ack @@ -890,7 +936,7 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnRequestObjectActionNew === 'function' ) { const resp = await this._callbackOnRequestObjectActionNew( - MosModel.XMLMosObject.fromXML(data.mosReqObjAction, this.strict) + MosModel.XMLMosObject.fromXML('mosReqObjAction', data.mosReqObjAction, this.strict) ) return new MosModel.MOSAck(resp, this.strict) } else if ( @@ -899,8 +945,8 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnRequestObjectActionUpdate === 'function' ) { const resp = await this._callbackOnRequestObjectActionUpdate( - this.parseMosTypes.mosString128.createRequired(data.mosReqObjAction.objID), - MosModel.XMLMosObject.fromXML(data.mosReqObjAction, this.strict) + this.parseMosTypes.mosString128.createRequired(data.mosReqObjAction.objID, 'objID'), + MosModel.XMLMosObject.fromXML('mosReqObjAction', data.mosReqObjAction, this.strict) ) return new MosModel.MOSAck(resp, this.strict) } else if ( @@ -909,19 +955,18 @@ export class MosDevice implements IMOSDevice { typeof this._callbackOnRequestObjectActionDelete === 'function' ) { const resp = await this._callbackOnRequestObjectActionDelete( - this.parseMosTypes.mosString128.createRequired(data.mosReqObjAction.objID) + this.parseMosTypes.mosString128.createRequired(data.mosReqObjAction.objID, 'objID') ) return new MosModel.MOSAck(resp, this.strict) } else if (data.mosReqObjList && typeof this._callbackOnRequestObjectList === 'function') { - const mosReqObjList = ensureXMLObject(data.mosReqObjList, this.strict) const resp = await this._callbackOnRequestObjectList( - MosModel.XMLMosRequestObjectList.fromXML(mosReqObjList, this.strict) + MosModel.XMLMosRequestObjectList.fromXML('mosReqObjList', data.mosReqObjList, this.strict) ) return new MosModel.MosObjList(resp, this.strict) } else if (data.mosReqSearchableSchema && typeof this._callbackOnRequestSearchableSchema === 'function') { const mosReqSearchableSchema = ensureXMLObject(data.mosReqSearchableSchema, this.strict) const resp = await this._callbackOnRequestSearchableSchema( - this.parseMosTypes.string.createRequired(mosReqSearchableSchema.username) + this.parseMosTypes.string.createRequired(mosReqSearchableSchema.username, 'username') ) return new MosModel.MosListSearchableSchema(resp, this.strict) } @@ -932,8 +977,7 @@ export class MosDevice implements IMOSDevice { const roListAll = new MosModel.ROListAll(list, this.strict) return roListAll } else if (data.roStorySend && typeof this._callbackOnRunningOrderStory === 'function') { - const roStorySend = ensureXMLObject(data.roStorySend, this.strict) - const story = MosModel.XMLROFullStory.fromXML(roStorySend, this.strict) + const story = MosModel.XMLROFullStory.fromXML('roStorySend', data.roStorySend, this.strict) const resp = await this._callbackOnRunningOrderStory(story) return new MosModel.ROAck(resp, this.strict) @@ -947,11 +991,9 @@ export class MosDevice implements IMOSDevice { const keys = Object.keys(data).filter((key) => ['ncsID', 'mosID', 'messageID'].indexOf(key) === -1) return new MosModel.MOSAck( { - ID: this.parseMosTypes.mosString128.createRequired('0'), // TODO: Depends on type of message, needs logic + ID: this.mosTypes.mosString128.create('0'), // TODO: Depends on type of message, needs logic Revision: 0, - Description: this.parseMosTypes.mosString128.createRequired( - `Unsupported function: "${keys.join(', ')}"` - ), + Description: this.mosTypes.mosString128.create(`Unsupported function: "${keys.join(', ')}"`), Status: IMOSAckStatus.NACK, }, this.strict @@ -968,7 +1010,7 @@ export class MosDevice implements IMOSDevice { const reply = await this.executeCommand(message) return this.handleParseReply((strict) => - MosModel.XMLMosListMachInfo.fromXML(ensureXMLObject(reply.mos.listMachInfo, strict), strict) + MosModel.XMLMosListMachInfo.fromXML('listMachInfo', reply.mos.listMachInfo, strict) ) } @@ -1012,9 +1054,7 @@ export class MosDevice implements IMOSDevice { const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosAck.fromXML(ensureXMLObject(reply.mos.mosAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosAck.fromXML('mosAck', reply.mos.mosAck, strict)) } onRequestMOSObject(cb: (objId: string) => Promise): void { @@ -1029,9 +1069,7 @@ export class MosDevice implements IMOSDevice { if (reply.mos.roAck) { throw this.badRoAckReply(ensureXMLObject(reply.mos.roAck, this.strict)) } else if (reply.mos.mosObj) { - return this.handleParseReply((strict) => - MosModel.XMLMosObject.fromXML(ensureXMLObject(reply.mos.mosObj, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosObject.fromXML('mosObj', reply.mos.mosObj, strict)) } else { throw this.unknownReply(reply) } @@ -1054,9 +1092,7 @@ export class MosDevice implements IMOSDevice { const message = new MosModel.ReqMosObjAll(pause, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosAck.fromXML(ensureXMLObject(reply.mos.mosAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosAck.fromXML('mosAck', reply.mos.mosAck, strict)) // Then we'll be sent mosListAll or mosObj messages separately, // handled in the callback in this.onMOSObjects(cb) } @@ -1068,7 +1104,7 @@ export class MosDevice implements IMOSDevice { const message = new MosModel.MosListAll(objs, this.strict) const reply = await this.executeCommand(message) if (reply.mos) { - const ack: IMOSAck = MosModel.XMLMosAck.fromXML(ensureXMLObject(reply.mos.mosAck, this.strict), this.strict) + const ack: IMOSAck = MosModel.XMLMosAck.fromXML('mosAck', reply.mos.mosAck, this.strict) return ack } else { throw this.unknownReply(reply) @@ -1096,9 +1132,7 @@ export class MosDevice implements IMOSDevice { async sendCreateRunningOrder(ro: IMOSRunningOrder): Promise { const message = new MosModel.ROCreate(ro, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onReplaceRunningOrder(cb: (ro: IMOSRunningOrder) => Promise): void { @@ -1108,9 +1142,7 @@ export class MosDevice implements IMOSDevice { async sendReplaceRunningOrder(ro: IMOSRunningOrder): Promise { const message = new MosModel.ROReplace(ro, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onDeleteRunningOrder(cb: (runningOrderId: IMOSString128) => Promise): void { @@ -1120,9 +1152,7 @@ export class MosDevice implements IMOSDevice { async sendDeleteRunningOrder(runningOrderId: IMOSString128): Promise { const message = new MosModel.RODelete(runningOrderId, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onRequestRunningOrder(cb: (runningOrderId: IMOSString128) => Promise): void { @@ -1135,7 +1165,7 @@ export class MosDevice implements IMOSDevice { const reply = await this.executeCommand(message) if (reply.mos.roList) { return this.handleParseReply((strict) => - MosModel.XMLRunningOrder.fromXML(ensureXMLObject(reply.mos.roList, strict), strict) + MosModel.XMLRunningOrder.fromXML('roList', ensureXMLObject(reply.mos.roList, strict), strict) ) } else if (reply.mos.roAck) { throw this.badRoAckReply(ensureXMLObject(reply.mos.roAck, this.strict)) @@ -1156,9 +1186,7 @@ export class MosDevice implements IMOSDevice { async sendMetadataReplace(metadata: IMOSRunningOrderBase): Promise { const message = new MosModel.ROMetadataReplace(metadata, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onRunningOrderStatus(cb: (status: IMOSRunningOrderStatus) => Promise): void { @@ -1192,49 +1220,43 @@ export class MosDevice implements IMOSDevice { const message = new MosModel.ROElementStat( { type: MosModel.ROElementStatType.RO, - roId: this.parseMosTypes.mosString128.createRequired(status.ID), + roId: status.ID, status: status.Status, }, this.strict ) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } async sendStoryStatus(status: IMOSStoryStatus): Promise { const message = new MosModel.ROElementStat( { type: MosModel.ROElementStatType.STORY, - roId: this.parseMosTypes.mosString128.createRequired(status.RunningOrderId), - storyId: this.parseMosTypes.mosString128.createRequired(status.ID), + roId: status.RunningOrderId, + storyId: status.ID, status: status.Status, }, this.strict ) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } async sendItemStatus(status: IMOSItemStatus): Promise { const message = new MosModel.ROElementStat( { type: MosModel.ROElementStatType.ITEM, - roId: this.parseMosTypes.mosString128.createRequired(status.RunningOrderId), - storyId: this.parseMosTypes.mosString128.createRequired(status.StoryId), - itemId: this.parseMosTypes.mosString128.createRequired(status.ID), - objId: this.parseMosTypes.mosString128.createRequired(status.ObjectId), - itemChannel: this.parseMosTypes.mosString128.createRequired(status.Channel), + roId: status.RunningOrderId, + storyId: status.StoryId, + itemId: status.ID, + objId: status.ObjectId, + itemChannel: status.Channel, status: status.Status, }, this.strict ) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onReadyToAir(cb: (Action: IMOSROReadyToAir) => Promise): void { this.checkProfile('onReadyToAir', 'profile2') @@ -1250,9 +1272,7 @@ export class MosDevice implements IMOSDevice { ) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onROInsertStories(cb: (Action: IMOSStoryAction, Stories: Array) => Promise): void { this.checkProfile('onROInsertStories', 'profile2') @@ -1261,9 +1281,7 @@ export class MosDevice implements IMOSDevice { async sendROInsertStories(Action: IMOSStoryAction, Stories: Array): Promise { const message = new MosModel.ROInsertStories(Action, Stories, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onROInsertItems(cb: (Action: IMOSItemAction, Items: Array) => Promise): void { this.checkProfile('onROInsertItems', 'profile2') @@ -1272,9 +1290,7 @@ export class MosDevice implements IMOSDevice { async sendROInsertItems(Action: IMOSItemAction, Items: Array): Promise { const message = new MosModel.ROInsertItems(Action, Items, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onROReplaceStories(cb: (Action: IMOSStoryAction, Stories: Array) => Promise): void { this.checkProfile('onROReplaceStories', 'profile2') @@ -1283,9 +1299,7 @@ export class MosDevice implements IMOSDevice { async sendROReplaceStories(Action: IMOSStoryAction, Stories: Array): Promise { const message = new MosModel.ROReplaceStories(Action, Stories, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onROReplaceItems(cb: (Action: IMOSItemAction, Items: Array) => Promise): void { this.checkProfile('onROReplaceItems', 'profile2') @@ -1294,9 +1308,7 @@ export class MosDevice implements IMOSDevice { async sendROReplaceItems(Action: IMOSItemAction, Items: Array): Promise { const message = new MosModel.ROReplaceItems(Action, Items, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onROMoveStories(cb: (Action: IMOSStoryAction, Stories: Array) => Promise): void { this.checkProfile('onROMoveStories', 'profile2') @@ -1305,9 +1317,7 @@ export class MosDevice implements IMOSDevice { async sendROMoveStories(Action: IMOSStoryAction, Stories: Array): Promise { const message = new MosModel.ROMoveStories(Action, Stories, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onROMoveItems(cb: (Action: IMOSItemAction, Items: Array) => Promise): void { this.checkProfile('onROMoveItems', 'profile2') @@ -1316,9 +1326,7 @@ export class MosDevice implements IMOSDevice { async sendROMoveItems(Action: IMOSItemAction, Items: Array): Promise { const message = new MosModel.ROMoveItems(Action, Items, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onRODeleteStories(cb: (Action: IMOSROAction, Stories: Array) => Promise): void { this.checkProfile('onRODeleteStories', 'profile2') @@ -1327,9 +1335,7 @@ export class MosDevice implements IMOSDevice { async sendRODeleteStories(Action: IMOSROAction, Stories: Array): Promise { const message = new MosModel.RODeleteStories(Action, Stories, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onRODeleteItems(cb: (Action: IMOSStoryAction, Items: Array) => Promise): void { this.checkProfile('onRODeleteItems', 'profile2') @@ -1338,9 +1344,7 @@ export class MosDevice implements IMOSDevice { async sendRODeleteItems(Action: IMOSStoryAction, Items: Array): Promise { const message = new MosModel.RODeleteItems(Action, Items, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onROSwapStories( cb: (Action: IMOSROAction, StoryID0: IMOSString128, StoryID1: IMOSString128) => Promise @@ -1355,9 +1359,7 @@ export class MosDevice implements IMOSDevice { ): Promise { const message = new MosModel.ROSwapStories(Action, StoryID0, StoryID1, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onROSwapItems( cb: (Action: IMOSStoryAction, ItemID0: IMOSString128, ItemID1: IMOSString128) => Promise @@ -1368,9 +1370,7 @@ export class MosDevice implements IMOSDevice { async sendROSwapItems(Action: IMOSStoryAction, ItemID0: IMOSString128, ItemID1: IMOSString128): Promise { const message = new MosModel.ROSwapItems(Action, ItemID0, ItemID1, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } // ============================================================================================================ @@ -1384,9 +1384,7 @@ export class MosDevice implements IMOSDevice { async sendObjectCreate(object: IMOSObject): Promise { const message = new MosModel.MosObjCreate(object, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosAck.fromXML(ensureXMLObject(reply.mos.mosAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosAck.fromXML('mosAck', reply.mos.mosAck, strict)) } onItemReplace(cb: (roID: IMOSString128, storyID: IMOSString128, item: IMOSItem) => Promise): void { @@ -1397,9 +1395,7 @@ export class MosDevice implements IMOSDevice { async sendItemReplace(options: MosItemReplaceOptions): Promise { const message = new MosModel.MosItemReplace(options, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } onRequestSearchableSchema(cb: (username: string) => Promise): void { @@ -1412,7 +1408,7 @@ export class MosDevice implements IMOSDevice { const reply = await this.executeCommand(message) return this.handleParseReply((strict) => - XMLMosListSearchableSchema.fromXML(ensureXMLObject(reply.mos.mosListSearchableSchema, strict), strict) + XMLMosListSearchableSchema.fromXML('mosListSearchableSchema', reply.mos.mosListSearchableSchema, strict) ) } @@ -1425,9 +1421,7 @@ export class MosDevice implements IMOSDevice { const message = new MosModel.MosReqObjList(reqObjList, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - XMLMosObjectList.fromXML(ensureXMLObject(reply.mos.mosObjList, strict), strict) - ) + return this.handleParseReply((strict) => XMLMosObjectList.fromXML('mosObjList', reply.mos.mosObjList, strict)) } onRequestObjectActionNew(cb: (obj: IMOSObject) => Promise): void { @@ -1437,9 +1431,7 @@ export class MosDevice implements IMOSDevice { async sendRequestObjectActionNew(obj: IMOSObject): Promise { const message = new MosModel.MosReqObjActionNew({ object: obj }, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosAck.fromXML(ensureXMLObject(reply.mos.mosAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosAck.fromXML('mosAck', reply.mos.mosAck, strict)) } onRequestObjectActionUpdate(cb: (objId: IMOSString128, obj: IMOSObject) => Promise): void { @@ -1449,9 +1441,7 @@ export class MosDevice implements IMOSDevice { async sendRequestObjectActionUpdate(objId: IMOSString128, obj: IMOSObject): Promise { const message = new MosModel.MosReqObjActionUpdate({ object: obj, objectId: objId }, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosAck.fromXML(ensureXMLObject(reply.mos.mosAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosAck.fromXML('mosAck', reply.mos.mosAck, strict)) } onRequestObjectActionDelete(cb: (objId: IMOSString128) => Promise): void { this.checkProfile('onRequestObjectActionDelete', 'profile3') @@ -1460,9 +1450,7 @@ export class MosDevice implements IMOSDevice { async sendRequestObjectActionDelete(objId: IMOSString128): Promise { const message = new MosModel.MosReqObjActionDelete({ objectId: objId }, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosAck.fromXML(ensureXMLObject(reply.mos.mosAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosAck.fromXML('mosAck', reply.mos.mosAck, strict)) } // Deprecated methods: @@ -1519,7 +1507,7 @@ export class MosDevice implements IMOSDevice { return this.handleParseReply((strict) => { const roListAll = ensureXMLObject(reply.mos.roListAll, strict) return ensureArray(roListAll.ro).map((xmlRo) => - MosModel.XMLRunningOrderBase.fromXML(ensureXMLObject(xmlRo, strict), strict) + MosModel.XMLRunningOrderBase.fromXML('roListAll.ro', xmlRo, strict) ) }) } else throw new Error(`Unable to send message due to no current connection`) @@ -1531,9 +1519,7 @@ export class MosDevice implements IMOSDevice { async sendRunningOrderStory(story: IMOSROFullStory): Promise { const message = new MosModel.ROStory(story, this.strict) const reply = await this.executeCommand(message) - return this.handleParseReply((strict) => - MosModel.XMLMosROAck.fromXML(ensureXMLObject(reply.mos.roAck, strict), strict) - ) + return this.handleParseReply((strict) => MosModel.XMLMosROAck.fromXML('roAck', reply.mos.roAck, strict)) } // Deprecated methods: @@ -1645,7 +1631,6 @@ export class MosDevice implements IMOSDevice { private handleParseReply(fcn: (strict: boolean) => T): T { try { const returnValue = fcn(this.strict) - MosModel.omitUndefined(returnValue) return returnValue } catch (orgError) { let nonStrictReturnValue: any = undefined @@ -1666,7 +1651,7 @@ export class MosDevice implements IMOSDevice { } private badRoAckReply(xmlRoAck: AnyXMLObject) { try { - const roAck = MosModel.XMLMosROAck.fromXML(xmlRoAck, this.strict) + const roAck = MosModel.XMLMosROAck.fromXML('roAck', xmlRoAck, this.strict) return new Error( `Reply: ${this.mosTypes.mosString128.stringify( roAck.Status diff --git a/packages/connector/src/__mocks__/testData.ts b/packages/connector/src/__mocks__/testData.ts index ef69968b..45778545 100644 --- a/packages/connector/src/__mocks__/testData.ts +++ b/packages/connector/src/__mocks__/testData.ts @@ -23,6 +23,7 @@ import { IMOSScope, IMOSExternalMetaData, getMosTypes, + IMOSRequestObjectList, } from '@mos-connection/model' const mosTypes = getMosTypes(true) @@ -74,7 +75,7 @@ const xmlData = { reqObj: ` M000123 `, mosReqAll: ` 0 `, mosObj: ` M000123 Hotel Fire Hotel Fire vo :30 Show 7 VIDEO 59.94 1 1800 NEW READY\\server\\media\\clip392028cd2320s0d.mxfhttps://server/proxy/clipe.wmvhttps://server/proxy/clipe.xml Chris 2009-10-31T23:39:12 Chris 2009-10-31T23:39:12

Exterior footage of Baley Park Hotel on fire with natural sound. Trucks are visible for the first portion of the clip. CG locator at 0:04 and duration 0:05, Baley Park Hotel.

Cuts to view of fire personnel exiting hotel lobby and cleaning up after the fire is out.

Clip has been doubled for pad on voice over.

STORY https://MOSA4.com/mos/supported_schemas/MOSAXML2.08 SHOLMES 20010308142001 0 278 LJOHNSTON 0 SHOLMES
`, - mosListAll: `M000123HOTEL FIRE\\server\\media\\clip392028cd2320s0d.mxfhttps://server/proxy/clipe.wmvhttps://server/proxy/clipe.xml Chris 2009-10-31T23:39:12 Chris 2009-11-01T14:35:55

Exterior footage of Baley Park Hotel on fire with natural sound. Trucks are visible for the first portion of the clip. CG locator at 0:04 and duration 0:05, Baley Park Hotel.

Cuts to view of fire personnel exiting hotel lobby and cleaning up after the fire is out.

Clip has been doubled for pad on voice over.

M000224 COLSTAT MURDER:VO VIDEO 59.94 4 800 UPDATED READY\\server\\media\\clip392028cd2320s0d.mxfhttps://server/proxy/clipe.wmvhttps://server/proxy/clipe.xml Phil 2009-11-01T15:19:01 Chris 2009-11-01T15:21:15 VOICE OVER MATERIAL OF COLSTAT MURDER SITES SHOT ON 1-NOV. STORY https://MOSA4.com/mos/supported_schemas/MOSAXML2.08 SHOLMES 20010308142001 0 278 LJOHNSTON 0 SHOLMES
`, + mosListAll: `59.941234M000123HOTEL FIRE\\server\\media\\clip392028cd2320s0d.mxfhttps://server/proxy/clipe.wmvhttps://server/proxy/clipe.xml Chris 2009-10-31T23:39:12 Chris 2009-11-01T14:35:55

Exterior footage of Baley Park Hotel on fire with natural sound. Trucks are visible for the first portion of the clip. CG locator at 0:04 and duration 0:05, Baley Park Hotel.

Cuts to view of fire personnel exiting hotel lobby and cleaning up after the fire is out.

Clip has been doubled for pad on voice over.

M000224 COLSTAT MURDER:VO VIDEO 59.94 4 800 UPDATED READY\\server\\media\\clip392028cd2320s0d.mxfhttps://server/proxy/clipe.wmvhttps://server/proxy/clipe.xml Phil 2009-11-01T15:19:01 Chris 2009-11-01T15:21:15 VOICE OVER MATERIAL OF COLSTAT MURDER SITES SHOT ON 1-NOV. STORY https://MOSA4.com/mos/supported_schemas/MOSAXML2.08 SHOLMES 20010308142001 0 278 LJOHNSTON 0 SHOLMES
`, roCreate: `96857485 5PM RUNDOWN 2009-04-17T17:02:00 00:58:25 5983A501:0049B924:8390EF2B COLSTAT MURDER A5 0 COLSTAT MURDER:VO M000224 testmos.enps.com \\server\\media\\clip392028cd2320s0d.mxf https://server/proxy/clipe.wmvhttps://server/proxy/clipe.xml 645 310 CHAINED PLAYLIST https://MOSA4.com/mos/supported_schemas/MOSAXML2.08 SHOLMES 2 463 a b 3854737F:0003A34D:983A0B28 AIRLINE INSPECTIONS A6 0 M000133 testmos.enps.com 55 310 200 PLAYLIST https://MOSA4.com/mos/supported_schemas/MOSAXML2.08 SHOLMES 2 463 a b `, roCreate_simple_story: `968574855PM RUNDOWN2009-04-17T17:02:0000:58:253854737F:0003A34D:983A0B28`, @@ -631,17 +632,17 @@ const xmlApiData = { }), mosListAll: [ - { + literal({ ID: mosTypes.mosString128.create('M000123'), Slug: mosTypes.mosString128.create('HOTEL FIRE'), // MosAbstract: '' // Group?: ' - Type: undefined, - TimeBase: undefined, - Revision: undefined, - Duration: undefined, - Status: undefined, - AirStatus: undefined, + Type: IMOSObjectType.OTHER, + TimeBase: 59.94, + // Revision: undefined, + Duration: 1234, + // Status: undefined, + // AirStatus: undefined, Paths: [ literal({ Type: IMOSObjectPathType.PATH, @@ -664,7 +665,7 @@ const xmlApiData = { ChangedBy: mosTypes.mosString128.create('Chris'), Changed: mosTypes.mosTime.create('2009-11-01T14:35:55'), Description: {}, - }, + }), literal({ ID: mosTypes.mosString128.create('M000224'), Slug: mosTypes.mosString128.create('COLSTAT MURDER:VO'), @@ -910,7 +911,7 @@ const xmlApiData = { }), ], }), - roDelete: 49478285, + roDelete: mosTypes.mosString128.create('49478285'), roList: literal({ ID: mosTypes.mosString128.create('M000123'), Slug: mosTypes.mosString128.create('Hotel Fire'), @@ -2032,12 +2033,12 @@ const xmlApiData = { ], }), mosReqSearchableSchema: 'jbob', - mosReqObjList: { + mosReqObjList: literal({ username: 'jbob', - queryID: '123439392039393ade0393zdkdls', + queryID: mosTypes.mosString128.create('123439392039393ade0393zdkdls'), listReturnStart: 1, listReturnEnd: null, - generalSearch: 'man bites dog', + generalSearch: mosTypes.mosString128.create('man bites dog'), mosSchema: 'https://MOSA4.com/mos/supported_schemas/MOSAXML2.08', searchGroups: [ { @@ -2081,7 +2082,7 @@ const xmlApiData = { ], }, ], - }, + }), mosObjReqObjActionNew: literal({ Slug: mosTypes.mosString128.create('Hotel Fire'), Group: 'Show 7', @@ -2090,7 +2091,7 @@ const xmlApiData = { Duration: 1800, CreatedBy: mosTypes.mosString128.create('Chris'), }), - mosObjReqObjActionUpdateObjId: '1EFA3009233F8329C1', + mosObjReqObjActionUpdateObjId: mosTypes.mosString128.create('1EFA3009233F8329C1'), mosObjReqObjActionUpdate: literal({ Slug: mosTypes.mosString128.create('Hotel Fire'), Group: 'Show 7', @@ -2099,7 +2100,7 @@ const xmlApiData = { Duration: 1800, CreatedBy: mosTypes.mosString128.create('Chris'), }), - mosObjReqObjActionDeleteObjId: '1EFA3009233F8329C1', + mosObjReqObjActionDeleteObjId: mosTypes.mosString128.create('1EFA3009233F8329C1'), sendRunningOrderStory: literal({ ID: mosTypes.mosString128.create('5983A501:0049B924:8390EF1F'), RunningOrderId: mosTypes.mosString128.create('96857485'), diff --git a/packages/connector/src/__tests__/MosConnection.spec.ts b/packages/connector/src/__tests__/MosConnection.spec.ts index dfd19a67..8e110027 100644 --- a/packages/connector/src/__tests__/MosConnection.spec.ts +++ b/packages/connector/src/__tests__/MosConnection.spec.ts @@ -419,9 +419,8 @@ describe('MosDevice: General', () => { }) expect(errorReported).toHaveBeenCalledTimes(1) - expect(errorReported).nthCalledWith( - 1, - expect.stringContaining('primary: Heartbeat error on lower: Error: Sent command timed out after') + expect(`${errorReported.mock.calls[0][0]}`).toMatch( + /primary: Heartbeat error on lower: Sent command timed out after/ ) // Test proper dispose: diff --git a/packages/connector/src/__tests__/Profile0-open-media.spec.ts b/packages/connector/src/__tests__/Profile0-open-media.spec.ts index f56f723a..514fe6b7 100644 --- a/packages/connector/src/__tests__/Profile0-open-media.spec.ts +++ b/packages/connector/src/__tests__/Profile0-open-media.spec.ts @@ -123,7 +123,7 @@ describe('Profile 0 - Open Media (non strict)', () => { const replyMessage = { ...xmlApiData.machineInfoOpenMediaReply } replyMessage.time = returnedMachineInfo.time - replyMessage.opTime = returnedMachineInfo.opTime + delete replyMessage.opTime expect(returnedMachineInfo).toMatchObject(replyMessage) // expect(returnedMachineInfo.opTime).toBeUndefined() @@ -148,7 +148,7 @@ describe('Profile 0 - Open Media (non strict)', () => { const replyMessage = { ...xmlApiData.machineInfoOpenMediaReply } replyMessage.time = returnedMachineInfo.time - replyMessage.opTime = returnedMachineInfo.opTime + delete replyMessage.opTime expect(returnedMachineInfo).toMatchObject(replyMessage) // expect(returnedMachineInfo.opTime).toBeUndefined() @@ -191,7 +191,7 @@ describe('Profile 0 - Open Media (non strict)', () => { checkMessageSnapshot(msg) const replyMessage = { ...xmlApiData.machineInfoOpenMediaReply } - replyMessage.opTime = returnedMachineInfo.opTime + delete replyMessage.opTime replyMessage.time = returnedMachineInfo.time expect(returnedMachineInfo).toMatchObject(replyMessage) diff --git a/packages/connector/src/__tests__/Profile2.spec.ts b/packages/connector/src/__tests__/Profile2.spec.ts index 903fd430..26741b05 100644 --- a/packages/connector/src/__tests__/Profile2.spec.ts +++ b/packages/connector/src/__tests__/Profile2.spec.ts @@ -326,7 +326,7 @@ describe('Profile 2', () => { const messageId = await fakeIncomingMessage(serverSocketMockUpper, xmlData.roReq) expect(onRequestRunningOrder).toHaveBeenCalledTimes(1) - expect(onRequestRunningOrder.mock.calls[0][0]).toEqual(96857485) + expect(onRequestRunningOrder.mock.calls[0][0]).toEqual(mosTypes.mosString128.create('96857485')) expect(fixSnapshot(onRequestRunningOrder.mock.calls)).toMatchSnapshot() // Check reply to socket server: await serverSocketMockUpper.mockWaitForSentMessages() diff --git a/packages/connector/src/__tests__/Profile3.spec.ts b/packages/connector/src/__tests__/Profile3.spec.ts index 704de54d..96e577f5 100644 --- a/packages/connector/src/__tests__/Profile3.spec.ts +++ b/packages/connector/src/__tests__/Profile3.spec.ts @@ -329,7 +329,7 @@ describe('Profile 3', () => { test('onMosReqObjectActionUpdate', async () => { const messageId = await fakeIncomingMessage(serverSocketMockQuery, xmlData.mosReqObjActionUpdate) expect(onRequestObjectActionUpdate).toHaveBeenCalledTimes(1) - expect(onRequestObjectActionUpdate.mock.calls[0][0]).toBe(xmlApiData.mosObjReqObjActionUpdateObjId) + expect(onRequestObjectActionUpdate.mock.calls[0][0]).toMatchObject(xmlApiData.mosObjReqObjActionUpdateObjId) expect(onRequestObjectActionUpdate.mock.calls[0][1]).toMatchObject(xmlApiData.mosObjReqObjActionUpdate) expect(fixSnapshot(onRequestObjectActionUpdate.mock.calls)).toMatchSnapshot() await checkReplyToServer(serverSocketMockQuery, messageId, '') @@ -337,7 +337,7 @@ describe('Profile 3', () => { test('onMosReqObjectActionDelete', async () => { const messageId = await fakeIncomingMessage(serverSocketMockQuery, xmlData.mosReqObjActionDelete) expect(onRequestObjectActionDelete).toHaveBeenCalledTimes(1) - expect(onRequestObjectActionDelete.mock.calls[0][0]).toBe(xmlApiData.mosObjReqObjActionDeleteObjId) + expect(onRequestObjectActionDelete.mock.calls[0][0]).toMatchObject(xmlApiData.mosObjReqObjActionDeleteObjId) expect(fixSnapshot(onRequestObjectActionDelete.mock.calls)).toMatchSnapshot() await checkReplyToServer(serverSocketMockQuery, messageId, '') }) diff --git a/packages/connector/src/__tests__/__snapshots__/Profile0-open-media.spec.ts.snap b/packages/connector/src/__tests__/__snapshots__/Profile0-open-media.spec.ts.snap index 35f0dccb..bc353d5f 100644 --- a/packages/connector/src/__tests__/__snapshots__/Profile0-open-media.spec.ts.snap +++ b/packages/connector/src/__tests__/__snapshots__/Profile0-open-media.spec.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Profile 0 - non strict requestMachineInfo - empty