@captor/swift-mock
v0.1.4
Published
SWIFT mock that emulates SWIFT network, parse and generate SWIFT ISO 15022 messages.
Downloads
62
Readme
This is a fork of https://github.com/APshenkin/swift-mock with a few patches. Use at own risk.
SWIFT Mock
JavaScript SWIFT mock that can emulate SWIFT network, parse and generate SWIFT ISO 15022 messages. Swift parser was taked from swift-parser, but it was refactored (moving to ES6 syntax, update API). Mock and message generator were created from scratch.
Features
- parse FIN MT message defined by the ISO 15022 standard
- generate FIN MT messages
- emulate SWIFT network
Limitations
- cannot parse field
77E
- message MT n98 Proprietary Message
Installation
$ npm install --save @captor/swift-mock
Usage
const Swift = require('@captor/swift-mock');
const swift = new Swift();
swift.on((msg) => {
return msg.block1.receivingLtId === 'RMSFGB2LAXXX' && msg.block2.msgType === '502'
}, (msg) => {
return [
{ block: 1, data: { ...msg.block1, sequenceNumber: 666666 } },
{ block: 2, data: { ...msg.block2 } },
{ block: 4, data: msg.extraBlocks.block4 },
{ block: 5, data: { ...msg.block5 } }]
})
swift.on((msg) => {
return msg.block1.receivingLtId === 'RMSFGB2LAXXX' && msg.block2.msgType === '509'
}, (msg) => {
return [
{ block: 1, data: { ...msg.block1, sequenceNumber: 300200 } },
{ block: 2, data: { ...msg.block2 } },
{ block: 4, data: msg.extraBlocks.block4 },
{ block: 5, data: { ...msg.block5 } },
{ block: 'S', data: { ...msg.blockS } }]
})
swift.run();
API
new SwiftParser([options])
Initializes a new instance of SWIFT Mock
using given metadata. If metadata
is omitted, the default metadata is used.
options Parameters
in
- folder, from where mock will take messages (default:./in
)out
- folder, where mock will store answers for messages (default:./out
)logLevel
- logging level (default: 0)fieldPatterns
- path to block 4 field patternssaveIncomingMessages
- save parsed incoming messages in memory (default:false
)delete
- delete incoming messages after reading (default:false
)elastic
- format log messages in Elastic format or not (default:false
)persistent
- indicates whether the process should continue to run as long as files are being watched. (default:true
)
swift.parse(swift)
Parses the swift
message. The line breaks of swift
must be in Unix format (\n
).
const Swift = require('./parser/swift');
const swift = new Swift();
const fs = require('fs');
const file = fs.readFileSync('./files/SWIFT_509.fin', { encoding: 'UTF-8' });
const ast = swift.parse(file)
swift.generate(data)
Generate swift message. data should be array of blocks. Blocks order will be the same as in array.
const Swift = require('./parser/swift');
const swift = new Swift();
const message = swift.generate([
{
block: 1, data: {
"applicationId": "F",
"serviceId": "21",
"receivingLtId": "RMSFGB2LAXXX",
"sessionNumber": "0094",
"sequenceNumber": "049783"
}
},
{
block: 2, data: {
"direction": "O",
"msgType": "509",
"inputTime": "1606",
"inputDate": "170725",
"bic": "SOPPLULXAXXX",
"sessionNumber": "5416",
"sequenceNumber": "290317",
"outputDate": "170725",
"outputTime": "1506",
"prio": "N"
}
},
{
block: 3, data: {
"108": "MF00000000000022"
}
},
{
block: 4, data: [
{
"type": "16",
"option": "R",
"fieldValue": "GENL",
"content": ":16R:GENL"
},
{
"type": "20",
"option": "C",
"fieldValue": ":SEME//MF00000000000022",
"content": ":20C::SEME//MF00000000000022"
},
{
"type": "16",
"option": "S",
"fieldValue": "SETDET",
"content": ":16S:SETDET"
}
]
},
{
block: 5, data: {
"MAC": "00000000",
"CHK": "11E37804E6A0"
}
},
{
block: 'S', data: {
"SAC": undefined,
"COP": "P"
}
}
]);
Below are rules how to build blocks.
Block 1
Data should be a object with required fields or string
let block = {
block: 1, data: {
"applicationId": "F",
"serviceId": "21",
"receivingLtId": "RMSFGB2LAXXX",
"sessionNumber": "0094",
"sequenceNumber": "049783"
}
}
or
let block = 'F21RMSFGB2LAXXX0094002855'
Block 2
Data should be a object with required fields or string
let block = {
block: 2, data: {
"direction": "O",
"msgType": "509",
"inputTime": "1606",
"inputDate": "170725",
"bic": "SOPPLULXAXXX",
"sessionNumber": "5416",
"sequenceNumber": "290317",
"outputDate": "170725",
"outputTime": "1506",
"prio": "N"
}
}
or
let block = 'I502SOPPLULXXXXXN'
Block 3
Data should be an object with depth === 1
let block = {
block: 3, data: {
"108": "MF00000000000022"
}
}
Block 4
Data should be an object with depth === 1 or should be an array of fields in valid format. There is two strategy to take values:
- content
- combine
content:
let block = {
block: 4, data: {
"177": "1707251406",
"451": "0"
}
}
or
//content strategy
let block = {
block: 4, data: [
{
"content": ":16R:GENL"
},
{
"content": ":20C::SEME//MF00000000000022"
},
{
"content": ":16S:SETDET"
}
]
}
or
//combine stategy
let block = {
block: 4, strategy: 'combine', data: [
{
"type": "16",
"option": "R",
"fieldValue": "GENL"
},
{
"type": "20",
"option": "C",
"fieldValue": ":SEME//MF00000000000022"
},
{
"type": "16",
"option": "S",
"fieldValue": "SETDET"
}
]
}
Block 5
Data should be an object with depth === 1
let block = {
block: 5, data: {
"MAC": "00000000",
"CHK": "577F2F5104EA"
}
}
Block S
Data should be an object with depth === 1
let block = {
block: 'S', data: {
"SAC": undefined,
"COP": "P"
}
}
Values that are undefined
will displays like this {SAC:}
swift.on(predicate, callback)
Create a listener that will check incoming messages by predicate function and do callback.
For swift.on
only first passed predicate will be applied
- predicate - function
- callback - function
swift.on((msg) => {
return msg.block1.receivingLtId === 'RMSFGB2LAXXX' && msg.block2.msgType === '509'
}, (msg) => {
return [
{ block: 1, data: { ...msg.block1, sequenceNumber: 300200 } },
{ block: 2, data: { ...msg.block2 } },
{ block: 4, data: msg.extraBlocks.block4 },
{ block: 5, data: { ...msg.block5 } },
{ block: 'S', data: { ...msg.blockS } }]
})
###swift.onEvery(predicate, callback)
Create a listener that will check incoming messages by predicate function and do callback.
For swift.onEvery
every passed predicate will be applied
- predicate - function
- callback - function
swift.on((msg) => {
return msg.block1.receivingLtId === 'RMSFGB2LAXXX' && msg.block2.msgType === '509'
}, (msg) => {
return [
{ block: 1, data: { ...msg.block1, sequenceNumber: 300200 } },
{ block: 2, data: { ...msg.block2 } },
{ block: 4, data: msg.extraBlocks.block4 },
{ block: 5, data: { ...msg.block5 } },
{ block: 'S', data: { ...msg.blockS } }]
})
swift.send(message, outPath)
Place swift message to outPath folder. Message could be a string or array of blocks.
- message - string or array of blocks
- filenamePrefix - outgoing filename prefix (default: '');
- outPath - output folder path (default:
this.outputFolder
);
swift.send([
{
block: 1, data: {
"applicationId": "F",
"serviceId": "21",
"receivingLtId": "RMSFGB2LAXXX",
"sessionNumber": "0094",
"sequenceNumber": "049783"
}
},
{
block: 2, data: {
"direction": "O",
"msgType": "509",
"inputTime": "1606",
"inputDate": "170725",
"bic": "SOPPLULXAXXX",
"sessionNumber": "5416",
"sequenceNumber": "290317",
"outputDate": "170725",
"outputTime": "1506",
"prio": "N"
}
}])
swift.run()
Start swift listener
swift.close()
Stop swift listener
swift.cleanMessages()
Clean saved incoming messages
swift.getMessages()
Get incoming messages
swift.cleanListeners()
Clean listeners
Current State
swift-mock is in its early days. Any feedback, issues, and pull requests are welcome.
License
MIT © Apshenkin