From 8cf54d32fc7fef5378938c60926c7545996fdf53 Mon Sep 17 00:00:00 2001 From: Vijay Date: Fri, 1 Sep 2023 20:26:24 +0530 Subject: [PATCH 01/21] feat: added seq diagrams for binning fulfil and prepare --- .../seq-position-1.3.1-prepare-batch.plantuml | 271 ++++++++++++++++++ ...-position-1.3.2-fulfil-v1.1-batch.plantuml | 133 +++++++++ .../sequence/seq-position-binning.plantuml | 98 +++++++ 3 files changed, 502 insertions(+) create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.plantuml create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml new file mode 100644 index 000000000..49e771f98 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml @@ -0,0 +1,271 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Miguel de Barros + * Vijay Kumar Guthi + -------------- + ******'/ + +@startuml +' declate title +title 1.3.1. Position Prepare Facade + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Prepare Facade" as FACADE_POSITION_PREPARE +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +database "Central Store" as DB + +box "Central Service" #LightYellow + participant FACADE_POSITION_PREPARE + participant DB + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate FACADE_POSITION_PREPARE +group Prepare Position Batch Processing + ' DB Trans: This is where 1st DB Transaction would start in 2 DB transacation future model for horizontal scaling + FACADE_POSITION_PREPARE -> FACADE_POSITION_PREPARE: Loop through batch and build list of transferIds and calculate sumTransfersInBatch,\nchecking all in Batch are for the correct Paricipant and Currency\nError code: 2001, 3100 + FACADE_POSITION_PREPARE -> DB: Retrieve current state of all transfers in array from DB with select whereIn\n(FYI: The two DB transaction model needs to add a mini-state step here (RECEIVED_PREPARE => RECEIVDED_PREPARE_PROCESSING) so that the transfers are left alone if processing has started) + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> FACADE_POSITION_PREPARE: Return current state of all selected transfers from DB + deactivate DB + FACADE_POSITION_PREPARE <-> FACADE_POSITION_PREPARE: Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole. + + note right of FACADE_POSITION_PREPARE #lightgray + List of transfers used during processing + **reservedTransfers** is list of transfers to be processed in the batch + **abortedTransfers** is the list of transfers in the incorrect state going into the process. Currently the transferStateChange is set to ABORTED - this should only be done if not already in a final state (idempotency) + **processedTransfers** is the list of transfers that have gone through the position management algorithm. Both successful and failed trasnfers appear here as the order and "running position" against each is necessary for reconciliation + + Scalar intermidate values used in the algorithm + **transferAmount** = payload.amount.amount + **sumTransfersInBatch** = SUM amount against each Transfer in batch + **currentPosition** = participantPosition.value + **reservedPosition** = participantPosition.{original}reservedValue + **effectivePosition** = currentPosition + reservedPosition + **heldPosition** = effectivePosition + sumTransfersInBatch + **availablePosition** = //if settlement model delay is IMMEDIATE then:// settlementBalance + participantLimit(NetDebitCap) - effectivePosition, //otherwise:// participantLimit(NetDebitCap) - effectivePosition + **sumReserved** = SUM of transfers that have met rule criteria and processed + end note + note over FACADE_POSITION_PREPARE,DB + Going to reserve the sum of the valid transfers in the batch against the Participants Positon in the Currency of this batch + and calculate the available position for the Participant to use + end note + FACADE_POSITION_PREPARE -> DB: Select effectivePosition FOR UPDATE from DB for Payer + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> FACADE_POSITION_PREPARE: Return effectivePosition (currentPosition and reservedPosition) from DB for Payer + deactivate DB + FACADE_POSITION_PREPARE -> FACADE_POSITION_PREPARE: Increment reservedValue to heldPosition\n(reservedValue = reservedPosition + sumTransfersInBatch) + FACADE_POSITION_PREPARE -> DB: Persist reservedValue + activate DB + hnote over DB #lightyellow + UPDATE **participantPosition** + SET reservedValue += sumTransfersInBatch + end note + deactivate DB + ' DB Trans: This is where 1st DB Transaction would end in 2 DB transacation future model for horizontal scaling + + + FACADE_POSITION_PREPARE -> DB: Request position limits for Payer Participant + activate DB + hnote over DB #lightyellow + FROM **participantLimit** + WHERE participantLimit.limitTypeId = 'NET-DEBIT-CAP' + AND participantLimit.participantId = payload.payerFsp + AND participantLimit.currencyId = payload.amount.currency + end note + DB --> FACADE_POSITION_PREPARE: Return position limits + deactivate DB + FACADE_POSITION_PREPARE <-> FACADE_POSITION_PREPARE: **availablePosition** = //if settlement model delay is IMMEDIATE then://\n settlementBalance + participantLimit(NetDebitCap) - effectivePosition\n //otherwise://\n participantLimit(NetDebitCap) - effectivePosition\n(same as = (settlementBalance?) + netDebitCap - currentPosition - reservedPosition) + note over FACADE_POSITION_PREPARE,DB + For each transfer in the batch, validate the availablility of position to meet the transfer amount + this will be as per the position algorithm documented below + end note + FACADE_POSITION_PREPARE <-> FACADE_POSITION_PREPARE: Validate availablePosition for each tranfser (see algorithm below)\nError code: 4001 + note right of FACADE_POSITION_PREPARE #lightgray + 01: sumReserved = 0 // Record the sum of the transfers we allow to progress to RESERVED + 02: sumProcessed =0 // Record the sum of the transfers already processed in this batch + 03: processedTransfers = {} // The list of processed transfers - so that we can store the additional information around the decision. Most importantly the "running" position + 04: foreach transfer in reservedTransfers + 05: sumProcessed += transfer.amount // the total processed so far **(NEED TO UPDATE IN CODE)** + 06: if availablePosition >= transfer.amount + 07: transfer.state = "RESERVED" + 08: availablePosition -= preparedTransfer.amount + 09: sumRESERVED += preparedTransfer.amount + 10: else + 11: preparedTransfer.state = "ABORTED" + 12: preparedTransfer.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + 13: end if + 14: runningPosition = currentPosition + sumReserved // the initial value of the Participants position plus the total value that has been accepted in the batch so far + 15: runningReservedValue = sumTransfersInBatch - sumProcessed + reservedPosition **(NEED TO UPDATE IN CODE)** // the running down of the total reserved value at the begining of the batch. + 16: Add transfer to the processedTransfer list recording the transfer state and running position and reserved values { transferState, transfer, rawMessage, transferAmount, runningPosition, runningReservedValue } + 16: end foreach + end note + note over FACADE_POSITION_PREPARE,DB + Once the outcome for all transfers is known,update the Participant's position and remove the reserved amount associated with the batch + (If there are any alarm limits, process those returning limits in which the threshold has been breached) + Do a bulk insert of the trasnferStateChanges associated with processing, using the result to complete the participantPositionChange and bulk insert of these to persist the running position + end note + FACADE_POSITION_PREPARE->FACADE_POSITION_PREPARE: Assess any limit thresholds on the final position\nadding to alarm list if triggered + + ' DB Trans: This is where 2nd DB Transaction would start in 2 DB transacation future model for horizontal scaling + FACADE_POSITION_PREPARE->DB: Persist latest position **value** and **reservedValue** to DB for Payer + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value += sumRESERVED, + reservedValue -= sumTransfersInBatch + end note + activate DB + deactivate DB + + FACADE_POSITION_PREPARE -> DB: Bulk persist transferStateChange for all processedTransfers + hnote over DB #lightyellow + batch INSERT **transferStateChange** + select for update from transfer table where transferId in ([transferBatch.transferId,...]) + build list of transferStateChanges from transferBatch + + end note + activate DB + deactivate DB + + FACADE_POSITION_PREPARE->FACADE_POSITION_PREPARE: Populate batchParticipantPositionChange from the resultant transferStateChange and the earlier processedTransfer list + + note right of FACADE_POSITION_PREPARE #lightgray + Effectively: + SET transferStateChangeId = processedTransfer.transferStateChangeId, + participantPositionId = preparedTransfer.participantPositionId, + value = preparedTransfer.positionValue, + reservedValue = preparedTransfer.positionReservedValue + end note + FACADE_POSITION_PREPARE -> DB: Bulk persist the participant position change for all processedTransfers + hnote over DB #lightyellow + batch INSERT **participantPositionChange** + end note + activate DB + deactivate DB + ' DB Trans: This is where 2nd DB Transaction would end in 2 DB transacation future model for horizontal scaling + + deactivate FACADE_POSITION_PREPARE + alt Calculate & Validate Latest Position Prepare (success) + note right of FACADE_POSITION_PREPARE #yellow + Message: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FACADE_POSITION_PREPARE -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + else Calculate & Validate Latest Position Prepare (failure) + note right of FACADE_POSITION_PREPARE #red: Validation failure! + + group Persist Transfer State (with transferState='ABORTED' on position check fail) + FACADE_POSITION_PREPARE -> DB: Request to persist transfer\nError code: 2003 + activate DB + note right of FACADE_POSITION_PREPARE #lightgray + transferStateChange.state = "ABORTED", + transferStateChange.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + end note + hnote over DB #lightyellow + transferStateChange + end note + DB --> FACADE_POSITION_PREPARE: Return success + deactivate DB + end + + note right of FACADE_POSITION_PREPARE #yellow + Message: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: prepare, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + FACADE_POSITION_PREPARE -> TOPIC_NOTIFICATIONS: Publish Notification (failure) event for Payer\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + deactivate FACADE_POSITION_PREPARE + end +end + +@enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.plantuml new file mode 100644 index 000000000..49e4aba2b --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.plantuml @@ -0,0 +1,133 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Miguel de Barros + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title 1.3.2. Position Fulfil Facade v1.1 + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Fulfil Facade" as FACADE_POSITION_FULFIL +database "Central Store" as DB +collections "Notifications-Topic" as TOPIC_NOTIFICATIONS + +box "Central Service" #LightYellow + participant FACADE_POSITION_FULFIL + participant DB + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate FACADE_POSITION_FULFIL +group Fulfil Position Batch Processing + FACADE_POSITION_FULFIL -> FACADE_POSITION_FULFIL: Loop through batch and build list of transferIds \n and calculate sumTransfersInBatch (from payload.amount.amount) + FACADE_POSITION_FULFIL -> DB: Retrieve current state of all transfers in array from DB with select whereIn\nError code: 2003 + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> FACADE_POSITION_FULFIL: Return current state of transfer from DB + deactivate DB + FACADE_POSITION_FULFIL <-> FACADE_POSITION_FULFIL: Validate current state (transferState is 'RECEIVED-FULFIL')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole + group Persist Position change and Transfer State (with transferState='COMMITTED' on position check pass) + FACADE_POSITION_FULFIL -> DB: Select participantPosition.value FOR UPDATE from DB for Payee + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> FACADE_POSITION_FULFIL: Return participantPosition.value from DB for Payee + deactivate DB + FACADE_POSITION_FULFIL <-> FACADE_POSITION_FULFIL: **latestPosition** = participantPosition.value - sumTransfersInBatch + FACADE_POSITION_FULFIL->DB: Persist latestPosition to DB for Payee + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + FACADE_POSITION_FULFIL -> FACADE_POSITION_FULFIL: Add transfer to the processedTransfer list recording \n the transfer state values + FACADE_POSITION_FULFIL -> DB: Bulk Persist transfer state for all transfers in batch + hnote over DB #lightyellow + batch INSERT **transferStateChange** transferStateId = 'COMMITTED' + + select from transferStateChange table where transferId in ([transferBatch.transferId,...]) + build list of transferStateChanges from transferBatch + end note + FACADE_POSITION_FULFIL -> DB: Bulk Persist participant position change for all transfers in batch + hnote over DB #lightyellow + INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition (???), + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + end + + note right of FACADE_POSITION_FULFIL #yellow + Message: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: commit || reserve, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note + FACADE_POSITION_FULFIL -> TOPIC_NOTIFICATIONS: Publish Transfer event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS +end +deactivate FACADE_POSITION_FULFIL +@enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml new file mode 100644 index 000000000..fbe120dfa --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml @@ -0,0 +1,98 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Vijay Kumar Guthi + + -------------- + ******'/ + +@startuml +' declate title +title 1.3.0. Position Messages Binning + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Handler" as POS_HANDLER + +entity "Bin Processor" as BIN_PROCESSOR +entity "Prepare Facade" as FACADE_PREPARE +entity "Prepare Fulfil Facade" as FACADE_FULFIL +entity "Prepare Abort Facade" as FACADE_ABORT +entity "Prepare Timeout Facade" as FACADE_TIMEOUT +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +' database "Central Store" as DB + +box "Central Service" #LightYellow + participant POS_HANDLER + participant BIN_PROCESSOR + participant FACADE_FULFIL + participant FACADE_ABORT + participant FACADE_TIMEOUT + participant FACADE_PREPARE + ' participant DB + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate POS_HANDLER +group Position Handler Consume + POS_HANDLER -> POS_HANDLER: Consumes messages from the Position topic \nand stores them in memory + group DB TRANSACTION + POS_HANDLER -> POS_HANDLER: Iterate though messages and bin them by accountID and action \n (References to the messagses to be stored in bins, no duplication of messages) + POS_HANDLER -> BIN_PROCESSOR: Process Bin for accountID + BIN_PROCESSOR -> BIN_PROCESSOR: For each bin, iterate through the batches based on the action + + BIN_PROCESSOR -> BIN_PROCESSOR: Audit + + BIN_PROCESSOR -> FACADE_FULFIL: Process Fulfil Batch + activate FACADE_FULFIL + FACADE_FULFIL --> BIN_PROCESSOR: Result + deactivate FACADE_FULFIL + + BIN_PROCESSOR -> FACADE_ABORT: Process Abort Batch + activate FACADE_ABORT + FACADE_ABORT --> BIN_PROCESSOR: Result + deactivate FACADE_ABORT + + BIN_PROCESSOR -> FACADE_TIMEOUT: Process Timeout Batch + activate FACADE_TIMEOUT + FACADE_TIMEOUT --> BIN_PROCESSOR: Result + deactivate FACADE_TIMEOUT + + BIN_PROCESSOR -> FACADE_PREPARE: Process Prepare Batch + activate FACADE_PREPARE + FACADE_PREPARE --> BIN_PROCESSOR: Result + deactivate FACADE_PREPARE + + ' BIN_PROCESSOR -> TOPIC_NOTIFICATIONS: Publish Notification events ??? + BIN_PROCESSOR --> POS_HANDLER: Return + POS_HANDLER -> POS_HANDLER: Commit Kafka Offset + end +end +deactivate POS_HANDLER +@enduml From b5a0d2ef65c92e73c5833c6b92396002aebc4581 Mon Sep 17 00:00:00 2001 From: Vijay Date: Fri, 1 Sep 2023 20:26:52 +0530 Subject: [PATCH 02/21] feat: added seq diagram for abort with partial changes --- .../seq-position-1.3.3-abort-batch.plantuml | 301 ++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml new file mode 100644 index 000000000..8361abbb8 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml @@ -0,0 +1,301 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + * Sam Kummary + * Vijay Kumar + ------------- + ******'/ + +@startuml +' declate title +title 1.3.3. Position Abort Facade + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Abort Facade" as FACADE_POSITION_ABORT +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +database "Central Store" as DB + +box "Central Service" #LightYellow + participant FACADE_POSITION_ABORT + participant DB + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate FACADE_POSITION_ABORT +group Abort Position Batch Processing + opt type == 'position' && action == 'timeout-reserved' + FACADE_POSITION_ABORT -> DB: Retrieve current state of transfer from DB + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> FACADE_POSITION_ABORT: Return current state of transfer from DB + deactivate DB + FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: Validate current state (transferStateChange.transferStateId == 'RESERVED_TIMEOUT')\nError code: 2001 + + group Persist Position change and Transfer state + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: **transferStateId** = 'EXPIRED_RESERVED' + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request to persist latest position and state to DB\nError code: 2003 + group DB TRANSACTION IMPLEMENTATION + activate FACADE_POSITION_ABORT + FACADE_POSITION_ABORT -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> FACADE_POSITION_ABORT: Return participantPosition + deactivate DB + FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: **latestPosition** = participantPosition - payload.amount.amount + FACADE_POSITION_ABORT->DB: Persist latestPosition to DB for Payer + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + FACADE_POSITION_ABORT -> DB: Persist participant position change and state change + hnote over DB #lightyellow + INSERT **transferStateChange** + VALUES (transferStateId) + + INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + end + FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return success + deactivate FACADE_POSITION_ABORT + end + note right of FACADE_POSITION_ABORT #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + FACADE_POSITION_ABORT -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + opt type == 'position' && (action IN ['reject', 'abort']) + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request current state of transfer from DB\nError code: 2003 + activate FACADE_POSITION_ABORT + FACADE_POSITION_ABORT -> DB: Retrieve current state of transfer from DB + activate DB + hnote over DB #lightyellow + transferStateChange + end note + DB --> FACADE_POSITION_ABORT: Return current state of transfer from DB + deactivate DB + FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return current state of transfer from DB + deactivate FACADE_POSITION_ABORT + FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR'])\nError code: 2001 + + group Persist Position change and Transfer state + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: **transferStateId** = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request to persist latest position and state to DB\nError code: 2003 + group Refer to DB TRANSACTION IMPLEMENTATION above + activate FACADE_POSITION_ABORT + FACADE_POSITION_ABORT -> DB: Persist to database + activate DB + deactivate DB + hnote over DB #lightyellow + participantPosition + transferStateChange + participantPositionChange + end note + end + FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return success + deactivate FACADE_POSITION_ABORT + end + alt action == 'reject' + note right of FACADE_POSITION_ABORT #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: reject, + createdAt: , + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + end note + else action == 'abort' + note right of FACADE_POSITION_ABORT #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + end + FACADE_POSITION_ABORT -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end + + ' TODO: We do not see how this scenario will be triggered + opt type == 'position' && action == 'fail' (Unable to currently trigger this scenario) + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request current state of transfer from DB\nError code: 2003 + activate FACADE_POSITION_ABORT + FACADE_POSITION_ABORT -> DB: Retrieve current state of transfer from DB + activate DB + hnote over DB #lightyellow + transferStateChange + end note + DB --> FACADE_POSITION_ABORT: Return current state of transfer from DB + deactivate DB + FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return current state of transfer from DB + deactivate FACADE_POSITION_ABORT + FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: Validate current state (transferStateChange.transferStateId == 'FAILED') + + group Persist Position change and Transfer state + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: **transferStateId** = 'FAILED' + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request to persist latest position and state to DB\nError code: 2003 + group Refer to DB TRANSACTION IMPLEMENTATION above + activate FACADE_POSITION_ABORT + FACADE_POSITION_ABORT -> DB: Persist to database + activate DB + deactivate DB + hnote over DB #lightyellow + participantPosition + transferStateChange + participantPositionChange + end note + end + FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return success + deactivate FACADE_POSITION_ABORT + end + note right of FACADE_POSITION_ABORT #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfer failed", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + FACADE_POSITION_ABORT -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end +end +deactivate FACADE_POSITION_ABORT +@enduml From c9ca8a5e2e6067d45d9e6a23afe2aa5e9b46031f Mon Sep 17 00:00:00 2001 From: Kevin Leyow Date: Fri, 1 Sep 2023 12:40:25 -0500 Subject: [PATCH 03/21] chore: render diagrams for ease of view --- .../seq-position-1.3.1-prepare-batch.svg | 371 ++++++++++++++ .../seq-position-1.3.2-fulfil-v1.1-batch.svg | 174 +++++++ .../seq-position-1.3.3-abort-batch.svg | 462 ++++++++++++++++++ .../sequence/seq-position-binning.svg | 155 ++++++ 4 files changed, 1162 insertions(+) create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.svg create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.svg create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.svg create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.svg new file mode 100644 index 000000000..3b8d4251e --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.svg @@ -0,0 +1,371 @@ + + + + + + + + + + + + 1.3.1. Position Prepare Facade + + Central Service + + + + + + + + + + + + + + + + + + + Position Prepare Facade + + + Position Prepare Facade + + + Central Store + + + Central Store + + + + + Notification-Topic + + + Notification-Topic + + + + + + + + + + + + + + Prepare Position Batch Processing + + + + + 1 + Loop through batch and build list of transferIds and calculate sumTransfersInBatch, + checking all in Batch are for the correct Paricipant and Currency + Error code: + 2001, 3100 + + + 2 + Retrieve current state of all transfers in array from DB with select whereIn + (FYI: The two DB transaction model needs to add a mini-state step here (RECEIVED_PREPARE => RECEIVDED_PREPARE_PROCESSING) so that the transfers are left alone if processing has started) + + transferStateChange + transferParticipant + + + 3 + Return current state of all selected transfers from DB + + + + + 4 + Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole. + + + List of transfers used during processing + reservedTransfers + is list of transfers to be processed in the batch + abortedTransfers + is the list of transfers in the incorrect state going into the process. Currently the transferStateChange is set to ABORTED - this should only be done if not already in a final state (idempotency) + processedTransfers + is the list of transfers that have gone through the position management algorithm. Both successful and failed trasnfers appear here as the order and "running position" against each is necessary for reconciliation + + Scalar intermidate values used in the algorithm + transferAmount + = payload.amount.amount + sumTransfersInBatch + = SUM amount against each Transfer in batch + currentPosition + = participantPosition.value + reservedPosition + = participantPosition.{original}reservedValue + effectivePosition + = currentPosition + reservedPosition + heldPosition + = effectivePosition + sumTransfersInBatch + availablePosition + = + if settlement model delay is IMMEDIATE then: + settlementBalance + participantLimit(NetDebitCap) - effectivePosition, + otherwise: + participantLimit(NetDebitCap) - effectivePosition + sumReserved + = SUM of transfers that have met rule criteria and processed + + + Going to reserve the sum of the valid transfers in the batch against the Participants Positon in the Currency of this batch + and calculate the available position for the Participant to use + + + 5 + Select effectivePosition FOR UPDATE from DB for Payer + + participantPosition + + + 6 + Return effectivePosition (currentPosition and reservedPosition) from DB for Payer + + + + + 7 + Increment reservedValue to heldPosition + (reservedValue = reservedPosition + sumTransfersInBatch) + + + 8 + Persist reservedValue + + UPDATE + participantPosition + SET reservedValue += sumTransfersInBatch + + + 9 + Request position limits for Payer Participant + + FROM + participantLimit + WHERE participantLimit.limitTypeId = 'NET-DEBIT-CAP' + AND participantLimit.participantId = payload.payerFsp + AND participantLimit.currencyId = payload.amount.currency + + + 10 + Return position limits + + + + + 11 + availablePosition + = + if settlement model delay is IMMEDIATE then: + settlementBalance + participantLimit(NetDebitCap) - effectivePosition + + otherwise: + participantLimit(NetDebitCap) - effectivePosition + (same as = (settlementBalance?) + netDebitCap - currentPosition - reservedPosition) + + + For each transfer in the batch, validate the availablility of position to meet the transfer amount + this will be as per the position algorithm documented below + + + + + 12 + Validate availablePosition for each tranfser (see algorithm below) + Error code: + 4001 + + + 01: sumReserved = 0 // Record the sum of the transfers we allow to progress to RESERVED + 02: sumProcessed =0 // Record the sum of the transfers already processed in this batch + 03: processedTransfers = {} // The list of processed transfers - so that we can store the additional information around the decision. Most importantly the "running" position + 04: foreach transfer in reservedTransfers + 05: sumProcessed += transfer.amount // the total processed so far + (NEED TO UPDATE IN CODE) + 06: if availablePosition >= transfer.amount + 07: transfer.state = "RESERVED" + 08: availablePosition -= preparedTransfer.amount + 09: sumRESERVED += preparedTransfer.amount + 10: else + 11: preparedTransfer.state = "ABORTED" + 12: preparedTransfer.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + 13: end if + 14: runningPosition = currentPosition + sumReserved // the initial value of the Participants position plus the total value that has been accepted in the batch so far + 15: runningReservedValue = sumTransfersInBatch - sumProcessed + reservedPosition + (NEED TO UPDATE IN CODE) + // the running down of the total reserved value at the begining of the batch. + 16: Add transfer to the processedTransfer list recording the transfer state and running position and reserved values { transferState, transfer, rawMessage, transferAmount, runningPosition, runningReservedValue } + 16: end foreach + + + Once the outcome for all transfers is known,update the Participant's position and remove the reserved amount associated with the batch + (If there are any alarm limits, process those returning limits in which the threshold has been breached) + Do a bulk insert of the trasnferStateChanges associated with processing, using the result to complete the participantPositionChange and bulk insert of these to persist the running position + + + + + 13 + Assess any limit thresholds on the final position + adding to alarm list if triggered + + + 14 + Persist latest position + value + and + reservedValue + to DB for Payer + + UPDATE + participantPosition + SET value += sumRESERVED, + reservedValue -= sumTransfersInBatch + + + 15 + Bulk persist transferStateChange for all processedTransfers + + batch INSERT + transferStateChange + select for update from transfer table where transferId in ([transferBatch.transferId,...]) + build list of transferStateChanges from transferBatch + + + + + + 16 + Populate batchParticipantPositionChange from the resultant transferStateChange and the earlier processedTransfer list + + + Effectively: + SET transferStateChangeId = processedTransfer.transferStateChangeId, + participantPositionId = preparedTransfer.participantPositionId, + value = preparedTransfer.positionValue, + reservedValue = preparedTransfer.positionReservedValue + + + 17 + Bulk persist the participant position change for all processedTransfers + + batch INSERT + participantPositionChange + + + alt + [Calculate & Validate Latest Position Prepare (success)] + + + Message: + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 18 + Publish Notification event + Error code: + 2003 + + [Calculate & Validate Latest Position Prepare (failure)] + + + Validation failure! + + + Persist Transfer State (with transferState='ABORTED' on position check fail) + + + 19 + Request to persist transfer + Error code: + 2003 + + + transferStateChange.state = "ABORTED", + transferStateChange.reason = "Net Debit Cap exceeded by this request at this time, please try again later" + + transferStateChange + + + 20 + Return success + + + Message: + { + id: <transferMessage.transferId> + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 21 + Publish Notification (failure) event for Payer + Error code: + 2003 + + diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.svg new file mode 100644 index 000000000..1e11c0c47 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.svg @@ -0,0 +1,174 @@ + + + + + + + + + + + + 1.3.2. Position Fulfil Facade v1.1 + + Central Service + + + + + + + + + + + + Position Fulfil Facade + + + Position Fulfil Facade + + + Central Store + + + Central Store + + + + + Notifications-Topic + + + Notifications-Topic + + + + + + + + + Fulfil Position Batch Processing + + + + + 1 + Loop through batch and build list of transferIds + and calculate sumTransfersInBatch (from payload.amount.amount) + + + 2 + Retrieve current state of all transfers in array from DB with select whereIn + Error code: + 2003 + + transferStateChange + transferParticipant + + + 3 + Return current state of transfer from DB + + + + + 4 + Validate current state (transferState is 'RECEIVED-FULFIL') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole + + + Persist Position change and Transfer State (with transferState='COMMITTED' on position check pass) + + + 5 + Select participantPosition.value FOR UPDATE from DB for Payee + + participantPosition + + + 6 + Return participantPosition.value from DB for Payee + + + + + 7 + latestPosition + = participantPosition.value - sumTransfersInBatch + + + 8 + Persist latestPosition to DB for Payee + + UPDATE + participantPosition + SET value = latestPosition + + + + + 9 + Add transfer to the processedTransfer list recording + the transfer state values + + + 10 + Bulk Persist transfer state for all transfers in batch + + batch INSERT + transferStateChange + transferStateId = 'COMMITTED' + + select from transferStateChange table where transferId in ([transferBatch.transferId,...]) + build list of transferStateChanges from transferBatch + + + 11 + Bulk Persist participant position change for all transfers in batch + + INSERT + participantPositionChange + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition (???), + reservedValue = participantPosition.reservedValue + createdDate = new Date() + + + Message: + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: commit || reserve, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + 12 + Publish Transfer event + Error code: + 2003 + + diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.svg new file mode 100644 index 000000000..21c55e18a --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.svg @@ -0,0 +1,462 @@ + + + + + + + + + + + + 1.3.3. Position Abort Facade + + Central Service + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Position Abort Facade + + + Position Abort Facade + + + Central Store + + + Central Store + + + + + Notification-Topic + + + Notification-Topic + + + + + + + + + + + + + + + + + + + + Abort Position Batch Processing + + + opt + [type == 'position' && action == 'timeout-reserved'] + + + 1 + Retrieve current state of transfer from DB + + transferStateChange + transferParticipant + + + 2 + Return current state of transfer from DB + + + + + 3 + Validate current state (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') + Error code: + 2001 + + + Persist Position change and Transfer state + + + + + 4 + transferStateId + = 'EXPIRED_RESERVED' + + + + + 5 + Request to persist latest position and state to DB + Error code: + 2003 + + + DB TRANSACTION IMPLEMENTATION + + + 6 + Select participantPosition.value FOR UPDATE for payerCurrencyId + + participantPosition + + + 7 + Return participantPosition + + + + + 8 + latestPosition + = participantPosition - payload.amount.amount + + + 9 + Persist latestPosition to DB for Payer + + UPDATE + participantPosition + SET value = latestPosition + + + 10 + Persist participant position change and state change + + INSERT + transferStateChange + + VALUES (transferStateId) + + INSERT + participantPositionChange + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + + + + + 11 + Return success + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 12 + Publish Notification event + Error code: + 2003 + + + opt + [type == 'position' && (action IN ['reject', 'abort'])] + + + + + 13 + Request current state of transfer from DB + Error code: + 2003 + + + 14 + Retrieve current state of transfer from DB + + transferStateChange + + + 15 + Return current state of transfer from DB + + + + + 16 + Return current state of transfer from DB + + + + + 17 + Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) + Error code: + 2001 + + + Persist Position change and Transfer state + + + + + 18 + transferStateId + = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + + + + + 19 + Request to persist latest position and state to DB + Error code: + 2003 + + + Refer to + DB TRANSACTION IMPLEMENTATION + above + + + 20 + Persist to database + + participantPosition + transferStateChange + participantPositionChange + + + + + 21 + Return success + + + alt + [action == 'reject'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + + [action == 'abort'] + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <payload.errorInformation.errorCode || 5000> + description: <payload.errorInformation.errorDescription> + } + } + } + } + + + 22 + Publish Notification event + Error code: + 2003 + + + opt + [type == 'position' && action == 'fail' (Unable to currently trigger this scenario)] + + + + + 23 + Request current state of transfer from DB + Error code: + 2003 + + + 24 + Retrieve current state of transfer from DB + + transferStateChange + + + 25 + Return current state of transfer from DB + + + + + 26 + Return current state of transfer from DB + + + + + 27 + Validate current state (transferStateChange.transferStateId == 'FAILED') + + + Persist Position change and Transfer state + + + + + 28 + transferStateId + = 'FAILED' + + + + + 29 + Request to persist latest position and state to DB + Error code: + 2003 + + + Refer to + DB TRANSACTION IMPLEMENTATION + above + + + 30 + Persist to database + + participantPosition + transferStateChange + participantPositionChange + + + + + 31 + Return success + + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfer failed", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + 32 + Publish Notification event + Error code: + 2003 + + diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg new file mode 100644 index 000000000..4955304d2 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg @@ -0,0 +1,155 @@ + + + + + + + + + + + + 1.3.0. Position Messages Binning + + Central Service + + + + + + + + + + + + + + + Position Handler + + + Position Handler + + + Bin Processor + + + Bin Processor + + + Prepare Fulfil Facade + + + Prepare Fulfil Facade + + + Prepare Abort Facade + + + Prepare Abort Facade + + + Prepare Timeout Facade + + + Prepare Timeout Facade + + + Prepare Facade + + + Prepare Facade + + + + + Notification-Topic + + + Notification-Topic + + + + + + + + Position Handler Consume + + + + + 1 + Consumes messages from the Position topic + and stores them in memory + + + DB TRANSACTION + + + + + 2 + Iterate though messages and bin them by accountID and action + (References to the messagses to be stored in bins, no duplication of messages) + + + 3 + Process Bin for accountID + + + + + 4 + For each bin, iterate through the batches based on the action + + + + + 5 + Audit + + + 6 + Process Fulfil Batch + + + 7 + Result + + + 8 + Process Abort Batch + + + 9 + Result + + + 10 + Process Timeout Batch + + + 11 + Result + + + 12 + Process Prepare Batch + + + 13 + Result + + + 14 + Return + + + + + 15 + Commit Kafka Offset + + From 3abb86f9f10dce8862ef5db53ce7657f89baff54 Mon Sep 17 00:00:00 2001 From: Vijay Date: Mon, 4 Sep 2023 16:43:21 +0530 Subject: [PATCH 04/21] fix: refactored abort action messages --- .../seq-position-1.3.3-abort-batch.plantuml | 245 ++++-------------- .../seq-position-1.3.3-fail-batch.plantuml | 138 ++++++++++ ...tion-1.3.3-timeout-reserved-batch.plantuml | 134 ++++++++++ 3 files changed, 323 insertions(+), 194 deletions(-) create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-fail-batch.plantuml create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-batch.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml index 8361abbb8..4e54640fb 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml @@ -52,55 +52,49 @@ end box ' start flow activate FACADE_POSITION_ABORT group Abort Position Batch Processing - opt type == 'position' && action == 'timeout-reserved' - FACADE_POSITION_ABORT -> DB: Retrieve current state of transfer from DB + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Loop through batch and build list of transferIds \n and calculate sumTransfersInBatch (from payload.amount.amount) + FACADE_POSITION_ABORT -> DB: Retrieve current state of all transfers in array from DB with select whereIn\nError code: 2003 + activate DB + hnote over DB #lightyellow + transferStateChange + end note + DB --> FACADE_POSITION_ABORT: Return current state of transfers from DB + deactivate DB + FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR'])\nError code: 2001 + + group Persist Position change and Transfer state + FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: **transferStateId** = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + FACADE_POSITION_ABORT -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId activate DB hnote over DB #lightyellow - transferStateChange - transferParticipant + participantPosition end note - DB --> FACADE_POSITION_ABORT: Return current state of transfer from DB + DB --> FACADE_POSITION_ABORT: Return participantPosition deactivate DB - FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: Validate current state (transferStateChange.transferStateId == 'RESERVED_TIMEOUT')\nError code: 2001 - - group Persist Position change and Transfer state - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: **transferStateId** = 'EXPIRED_RESERVED' - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request to persist latest position and state to DB\nError code: 2003 - group DB TRANSACTION IMPLEMENTATION - activate FACADE_POSITION_ABORT - FACADE_POSITION_ABORT -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId - activate DB - hnote over DB #lightyellow - participantPosition - end note - DB --> FACADE_POSITION_ABORT: Return participantPosition - deactivate DB - FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: **latestPosition** = participantPosition - payload.amount.amount - FACADE_POSITION_ABORT->DB: Persist latestPosition to DB for Payer - hnote over DB #lightyellow - UPDATE **participantPosition** - SET value = latestPosition - end note - activate DB - deactivate DB - FACADE_POSITION_ABORT -> DB: Persist participant position change and state change - hnote over DB #lightyellow - INSERT **transferStateChange** - VALUES (transferStateId) + FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: **latestPosition** = participantPosition - sumTransfersInBatch + FACADE_POSITION_ABORT->DB: Persist latestPosition to DB for Payer + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + FACADE_POSITION_ABORT -> DB: Persist participant position change and state change + hnote over DB #lightyellow + Bulk INSERT **transferStateChange** + VALUES (transferStateId) - INSERT **participantPositionChange** - SET participantPositionId = participantPosition.participantPositionId, - transferStateChangeId = transferStateChange.transferStateChangeId, - value = latestPosition, - reservedValue = participantPosition.reservedValue - createdDate = new Date() - end note - activate DB - deactivate DB - end - FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return success - deactivate FACADE_POSITION_ABORT - end + Bulk INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + end + alt action == 'reject' note right of FACADE_POSITION_ABORT #yellow Message: { id: @@ -109,157 +103,25 @@ group Abort Position Batch Processing type: application/json content: { headers: , - payload: { - "errorInformation": { - "errorCode": 3300, - "errorDescription": "Transfer expired", - "extensionList": - } - } + payload: }, metadata: { event: { id: , responseTo: , type: notification, - action: abort, + action: reject, createdAt: , state: { - status: 'error', - code: - description: + status: "success", + code: 0, + description: "action successful" } } } } end note - FACADE_POSITION_ABORT -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS - end - opt type == 'position' && (action IN ['reject', 'abort']) - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request current state of transfer from DB\nError code: 2003 - activate FACADE_POSITION_ABORT - FACADE_POSITION_ABORT -> DB: Retrieve current state of transfer from DB - activate DB - hnote over DB #lightyellow - transferStateChange - end note - DB --> FACADE_POSITION_ABORT: Return current state of transfer from DB - deactivate DB - FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return current state of transfer from DB - deactivate FACADE_POSITION_ABORT - FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR'])\nError code: 2001 - - group Persist Position change and Transfer state - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: **transferStateId** = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request to persist latest position and state to DB\nError code: 2003 - group Refer to DB TRANSACTION IMPLEMENTATION above - activate FACADE_POSITION_ABORT - FACADE_POSITION_ABORT -> DB: Persist to database - activate DB - deactivate DB - hnote over DB #lightyellow - participantPosition - transferStateChange - participantPositionChange - end note - end - FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return success - deactivate FACADE_POSITION_ABORT - end - alt action == 'reject' - note right of FACADE_POSITION_ABORT #yellow - Message: { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: - }, - metadata: { - event: { - id: , - responseTo: , - type: notification, - action: reject, - createdAt: , - state: { - status: "success", - code: 0, - description: "action successful" - } - } - } - } - end note - else action == 'abort' - note right of FACADE_POSITION_ABORT #yellow - Message: { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: - }, - metadata: { - event: { - id: , - responseTo: , - type: notification, - action: abort, - createdAt: , - state: { - status: 'error', - code: - description: - } - } - } - } - end note - end - FACADE_POSITION_ABORT -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS - end - - ' TODO: We do not see how this scenario will be triggered - opt type == 'position' && action == 'fail' (Unable to currently trigger this scenario) - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request current state of transfer from DB\nError code: 2003 - activate FACADE_POSITION_ABORT - FACADE_POSITION_ABORT -> DB: Retrieve current state of transfer from DB - activate DB - hnote over DB #lightyellow - transferStateChange - end note - DB --> FACADE_POSITION_ABORT: Return current state of transfer from DB - deactivate DB - FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return current state of transfer from DB - deactivate FACADE_POSITION_ABORT - FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: Validate current state (transferStateChange.transferStateId == 'FAILED') - - group Persist Position change and Transfer state - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: **transferStateId** = 'FAILED' - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Request to persist latest position and state to DB\nError code: 2003 - group Refer to DB TRANSACTION IMPLEMENTATION above - activate FACADE_POSITION_ABORT - FACADE_POSITION_ABORT -> DB: Persist to database - activate DB - deactivate DB - hnote over DB #lightyellow - participantPosition - transferStateChange - participantPositionChange - end note - end - FACADE_POSITION_ABORT --> FACADE_POSITION_ABORT: Return success - deactivate FACADE_POSITION_ABORT - end + else action == 'abort' note right of FACADE_POSITION_ABORT #yellow Message: { id: @@ -268,13 +130,7 @@ group Abort Position Batch Processing type: application/json content: { headers: , - payload: { - "errorInformation": { - "errorCode": 3100, - "errorDescription": "Transfer failed", - "extensionList": - } - } + payload: }, metadata: { event: { @@ -285,17 +141,18 @@ group Abort Position Batch Processing createdAt: , state: { status: 'error', - code: - description: + code: + description: } } } } end note - FACADE_POSITION_ABORT -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS end + FACADE_POSITION_ABORT -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end deactivate FACADE_POSITION_ABORT @enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-fail-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-fail-batch.plantuml new file mode 100644 index 000000000..9f63449ba --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-fail-batch.plantuml @@ -0,0 +1,138 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + * Sam Kummary + * Vijay Kumar + ------------- + ******'/ + +@startuml +' declate title +title 1.3.3. Position Fail Facade + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Fail Facade" as FACADE_POSITION_FAIL +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +database "Central Store" as DB + +box "Central Service" #LightYellow + participant FACADE_POSITION_FAIL + participant DB + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate FACADE_POSITION_FAIL +group Fail Position Batch Processing + FACADE_POSITION_FAIL -> FACADE_POSITION_FAIL: Loop through batch and build list of transferIds \n and calculate sumTransfersInBatch (from payload.amount.amount) + + ' TODO: We do not see how this scenario will be triggered + opt type == 'position' && action == 'fail' (Unable to currently trigger this scenario) + FACADE_POSITION_FAIL -> DB: Retrieve current state of all transfers in array from DB with select whereIn\nError code: 2003 + activate DB + hnote over DB #lightyellow + transferStateChange + end note + DB --> FACADE_POSITION_FAIL: Return current state of transfers from DB + deactivate DB + FACADE_POSITION_FAIL <-> FACADE_POSITION_FAIL: Validate current state (transferStateChange.transferStateId == 'FAILED') + + group Persist Position change and Transfer state + FACADE_POSITION_FAIL -> FACADE_POSITION_FAIL: **transferStateId** = 'FAILED' + FACADE_POSITION_FAIL -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> FACADE_POSITION_FAIL: Return participantPosition + deactivate DB + FACADE_POSITION_FAIL <-> FACADE_POSITION_FAIL: **latestPosition** = participantPosition - sumTransfersInBatch + FACADE_POSITION_FAIL->DB: Persist latestPosition to DB for Payer + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + FACADE_POSITION_FAIL -> DB: Persist participant position change and state change + hnote over DB #lightyellow + Bulk INSERT **transferStateChange** + VALUES (transferStateId) + + Bulk INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + end + note right of FACADE_POSITION_FAIL #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3100, + "errorDescription": "Transfer failed", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + FACADE_POSITION_FAIL -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS + end +end +deactivate FACADE_POSITION_FAIL +@enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-batch.plantuml new file mode 100644 index 000000000..dd20c0c12 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-batch.plantuml @@ -0,0 +1,134 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Rajiv Mothilal + * Georgi Georgiev + * Sam Kummary + * Vijay Kumar + ------------- + ******'/ + +@startuml +' declate title +title 1.3.3. Position Timeout Reserved Facade + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Timeout Reserved Facade" as FACADE_POSITION_TIMEOUT_RESERVED +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +database "Central Store" as DB + +box "Central Service" #LightYellow + participant FACADE_POSITION_TIMEOUT_RESERVED + participant DB + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate FACADE_POSITION_TIMEOUT_RESERVED +group Timeout Reserved Position Batch Processing + FACADE_POSITION_TIMEOUT_RESERVED -> FACADE_POSITION_TIMEOUT_RESERVED: Loop through batch and build list of transferIds \n and calculate sumTransfersInBatch (from payload.amount.amount) + FACADE_POSITION_TIMEOUT_RESERVED -> DB: Retrieve current state of all transfers in array from DB with select whereIn + activate DB + hnote over DB #lightyellow + transferStateChange + transferParticipant + end note + DB --> FACADE_POSITION_TIMEOUT_RESERVED: Return current state of transfers from DB + deactivate DB + FACADE_POSITION_TIMEOUT_RESERVED <-> FACADE_POSITION_TIMEOUT_RESERVED: Validate current state of all transfers (transferStateChange.transferStateId == 'RESERVED_TIMEOUT')\nError code: 2001 + group Persist Position change and Transfer state + FACADE_POSITION_TIMEOUT_RESERVED -> FACADE_POSITION_TIMEOUT_RESERVED: **transferStateId** = 'EXPIRED_RESERVED' + FACADE_POSITION_TIMEOUT_RESERVED -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId + activate DB + hnote over DB #lightyellow + participantPosition + end note + DB --> FACADE_POSITION_TIMEOUT_RESERVED: Return participantPosition + deactivate DB + FACADE_POSITION_TIMEOUT_RESERVED <-> FACADE_POSITION_TIMEOUT_RESERVED: **latestPosition** = participantPosition - sumTransfersInBatch + FACADE_POSITION_TIMEOUT_RESERVED->DB: Persist latestPosition to DB for Payer + hnote over DB #lightyellow + UPDATE **participantPosition** + SET value = latestPosition + end note + activate DB + deactivate DB + FACADE_POSITION_TIMEOUT_RESERVED -> DB: Persist participant position change and state change + hnote over DB #lightyellow + Bulk INSERT **transferStateChange** + VALUES (transferStateId) + + Bulk INSERT **participantPositionChange** + SET participantPositionId = participantPosition.participantPositionId, + transferStateChangeId = transferStateChange.transferStateChangeId, + value = latestPosition, + reservedValue = participantPosition.reservedValue + createdDate = new Date() + end note + activate DB + deactivate DB + end + note right of FACADE_POSITION_TIMEOUT_RESERVED #yellow + Message: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note + FACADE_POSITION_TIMEOUT_RESERVED -> TOPIC_NOTIFICATIONS: Publish Notification events\nError code: 2003 + activate TOPIC_NOTIFICATIONS + deactivate TOPIC_NOTIFICATIONS +end +deactivate FACADE_POSITION_TIMEOUT_RESERVED +@enduml From 315f68f683d4fcbeb50794da077f3dc5730ce561 Mon Sep 17 00:00:00 2001 From: Vijay Date: Mon, 4 Sep 2023 20:55:17 +0530 Subject: [PATCH 05/21] feat: updated binning sequence diagram --- .../seq-position-1.3.1-prepare-batch.plantuml | 1 + .../sequence/seq-position-binning.plantuml | 83 ++++++++++++------- 2 files changed, 56 insertions(+), 28 deletions(-) diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml index 49e771f98..445c04c5f 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml @@ -62,6 +62,7 @@ group Prepare Position Batch Processing end note DB --> FACADE_POSITION_PREPARE: Return current state of all selected transfers from DB deactivate DB + FACADE_POSITION_PREPARE <-> FACADE_POSITION_PREPARE: Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole. note right of FACADE_POSITION_PREPARE #lightgray diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml index fbe120dfa..58593ab5b 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml @@ -39,11 +39,11 @@ autonumber ' declare actors control "Position Handler" as POS_HANDLER -entity "Bin Processor" as BIN_PROCESSOR +entity "Domain Bin Processor" as BIN_PROCESSOR entity "Prepare Facade" as FACADE_PREPARE -entity "Prepare Fulfil Facade" as FACADE_FULFIL -entity "Prepare Abort Facade" as FACADE_ABORT -entity "Prepare Timeout Facade" as FACADE_TIMEOUT +entity "Fulfil Facade" as FACADE_FULFIL +entity "Abort Facade" as FACADE_ABORT +entity "Timeout Facade" as FACADE_TIMEOUT collections "Notification-Topic" as TOPIC_NOTIFICATIONS ' database "Central Store" as DB @@ -62,36 +62,63 @@ end box activate POS_HANDLER group Position Handler Consume POS_HANDLER -> POS_HANDLER: Consumes messages from the Position topic \nand stores them in memory + loop for each message in the list + POS_HANDLER -> POS_HANDLER: Assign message to account-bin by accountID and child action-bin by event-action\n (References to the messagses to be stored in bins, no duplication of messages) + POS_HANDLER -> POS_HANDLER: Audit message + end group DB TRANSACTION - POS_HANDLER -> POS_HANDLER: Iterate though messages and bin them by accountID and action \n (References to the messagses to be stored in bins, no duplication of messages) - POS_HANDLER -> BIN_PROCESSOR: Process Bin for accountID - BIN_PROCESSOR -> BIN_PROCESSOR: For each bin, iterate through the batches based on the action - - BIN_PROCESSOR -> BIN_PROCESSOR: Audit + POS_HANDLER -> BIN_PROCESSOR: Call Bin Processor with the list of account-bins - BIN_PROCESSOR -> FACADE_FULFIL: Process Fulfil Batch - activate FACADE_FULFIL - FACADE_FULFIL --> BIN_PROCESSOR: Result - deactivate FACADE_FULFIL + note right of BIN_PROCESSOR #orange + **TODO**: Further future enhancements + 1. Pre fetch all transferStateChanges for all the transferIds in the account-bin + 2. Pre fetch position and settlement account balances for the account-bin + 3. Aquire lock on position + 4. Modify facade functions to return resultant changes in position and transferStateChanges + which will then be accumulated after processing each action-bin + 5. Apply the accumulated changes to the position and transferStateChanges + end note + loop for each account-bin in the list + note right of BIN_PROCESSOR #lightblue + **Note**: Order of processing for various actions + 1. Fulfil - Work in progress is first priority + 2. Abort & Timeout - Freeing funds for future transfers is priority before tackling new requests + 3. Prepare - Processing new requests is last priority + end note - BIN_PROCESSOR -> FACADE_ABORT: Process Abort Batch - activate FACADE_ABORT - FACADE_ABORT --> BIN_PROCESSOR: Result - deactivate FACADE_ABORT + BIN_PROCESSOR -> FACADE_FULFIL: Process Fulfil Batch + activate FACADE_FULFIL + FACADE_FULFIL --> BIN_PROCESSOR: Result + deactivate FACADE_FULFIL - BIN_PROCESSOR -> FACADE_TIMEOUT: Process Timeout Batch - activate FACADE_TIMEOUT - FACADE_TIMEOUT --> BIN_PROCESSOR: Result - deactivate FACADE_TIMEOUT + BIN_PROCESSOR -> FACADE_ABORT: Process Abort Batch + activate FACADE_ABORT + FACADE_ABORT --> BIN_PROCESSOR: Result + deactivate FACADE_ABORT - BIN_PROCESSOR -> FACADE_PREPARE: Process Prepare Batch - activate FACADE_PREPARE - FACADE_PREPARE --> BIN_PROCESSOR: Result - deactivate FACADE_PREPARE + BIN_PROCESSOR -> FACADE_TIMEOUT: Process Timeout Batch + activate FACADE_TIMEOUT + FACADE_TIMEOUT --> BIN_PROCESSOR: Result + deactivate FACADE_TIMEOUT - ' BIN_PROCESSOR -> TOPIC_NOTIFICATIONS: Publish Notification events ??? - BIN_PROCESSOR --> POS_HANDLER: Return - POS_HANDLER -> POS_HANDLER: Commit Kafka Offset + BIN_PROCESSOR -> FACADE_PREPARE: Process Prepare Batch + activate FACADE_PREPARE + FACADE_PREPARE --> BIN_PROCESSOR: Result + deactivate FACADE_PREPARE + end + + BIN_PROCESSOR --> POS_HANDLER: Return bins with results + alt return is true + POS_HANDLER -> POS_HANDLER: Commit Kafka Offset + POS_HANDLER -> POS_HANDLER: Commit DB Transaction + loop for each result in the account-bin + POS_HANDLER -> POS_HANDLER: Produce notification message + POS_HANDLER -> POS_HANDLER: Audit notification + end + else return is false or unhandled exception + POS_HANDLER -> POS_HANDLER: Rollback DB Transaction + POS_HANDLER -> POS_HANDLER: Audit error + end end end deactivate POS_HANDLER From 6f058886a57514ddbbdbe8626d965272ff293a92 Mon Sep 17 00:00:00 2001 From: Vijay Date: Mon, 4 Sep 2023 21:36:48 +0530 Subject: [PATCH 06/21] feat: added rev2 of binning diagram --- .../seq-position-binning-rev2.plantuml | 141 ++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning-rev2.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning-rev2.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning-rev2.plantuml new file mode 100644 index 000000000..376e4ea9f --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning-rev2.plantuml @@ -0,0 +1,141 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Vijay Kumar Guthi + + -------------- + ******'/ + +@startuml +' declate title +title 1.3.0. Position Messages Binning + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Handler" as POS_HANDLER + +entity "Domain Bin Processor" as BIN_PROCESSOR +entity "Prepare Domain" as DOMAIN_PREPARE +entity "Fulfil Domain" as DOMAIN_FULFIL +entity "Abort Domain" as DOMAIN_ABORT +entity "Timeout Domain" as DOMAIN_TIMEOUT +entity "Transfer Facade" as FACADE_TRANSFER +entity "Account Facade" as FACADE_ACCOUNT +collections "Notification-Topic" as TOPIC_NOTIFICATIONS +' database "Central Store" as DB + +box "Central Service" #LightYellow + participant POS_HANDLER + participant BIN_PROCESSOR + participant DOMAIN_FULFIL + participant DOMAIN_ABORT + participant DOMAIN_TIMEOUT + participant DOMAIN_PREPARE + participant FACADE_TRANSFER + participant FACADE_ACCOUNT + ' participant DB + participant TOPIC_NOTIFICATIONS +end box + +' start flow +activate POS_HANDLER +group Position Handler Consume + POS_HANDLER -> POS_HANDLER: Consumes messages from the Position topic \nand stores them in memory + loop for each message in the list + POS_HANDLER -> POS_HANDLER: Assign message to account-bin by accountID and child action-bin by event-action\n (References to the messagses to be stored in bins, no duplication of messages) + POS_HANDLER -> POS_HANDLER: Audit message + end + group DB TRANSACTION + POS_HANDLER -> BIN_PROCESSOR: Call Bin Processor with the list of account-bins + + BIN_PROCESSOR -> FACADE_TRANSFER: Pre fetch all transferStateChanges for all the transferIds in the account-bin + BIN_PROCESSOR -> FACADE_ACCOUNT: Pre fetch all position and settlement account balances for the account-bin\nAquire lock on position + + loop for each account-bin in the list + note right of BIN_PROCESSOR #lightblue + **Note**: Order of processing for various actions + 1. Fulfil - Work in progress is first priority + 2. Abort & Timeout - Freeing funds for future transfers is priority before tackling new requests + 3. Prepare - Processing new requests is last priority + end note + + BIN_PROCESSOR -> DOMAIN_FULFIL: Process Fulfil Bin + note right of BIN_PROCESSOR + Input: Bin, Pre-fetched account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + end note + activate DOMAIN_FULFIL + DOMAIN_FULFIL --> BIN_PROCESSOR: Result + deactivate DOMAIN_FULFIL + + BIN_PROCESSOR -> DOMAIN_ABORT: Process Abort Bin + note right of BIN_PROCESSOR + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + end note + activate DOMAIN_ABORT + DOMAIN_ABORT --> BIN_PROCESSOR: Result + deactivate DOMAIN_ABORT + + BIN_PROCESSOR -> DOMAIN_TIMEOUT: Process Timeout Bin + note right of BIN_PROCESSOR + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + end note + activate DOMAIN_TIMEOUT + DOMAIN_TIMEOUT --> BIN_PROCESSOR: Result + deactivate DOMAIN_TIMEOUT + + BIN_PROCESSOR -> DOMAIN_PREPARE: Process Prepare Batch + note right of BIN_PROCESSOR + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + end note + activate DOMAIN_PREPARE + DOMAIN_PREPARE --> BIN_PROCESSOR: Result + deactivate DOMAIN_PREPARE + BIN_PROCESSOR -> FACADE_TRANSFER: Insert accumulated transferStateChanges + BIN_PROCESSOR -> FACADE_ACCOUNT: Update accumulated position + end + + BIN_PROCESSOR --> POS_HANDLER: Return bins with results + alt return is true + POS_HANDLER -> POS_HANDLER: Commit Kafka Offset + POS_HANDLER -> POS_HANDLER: Commit DB Transaction + loop for each result in the account-bin + POS_HANDLER -> POS_HANDLER: Produce notification message + POS_HANDLER -> POS_HANDLER: Audit notification + end + else return is false or unhandled exception + POS_HANDLER -> POS_HANDLER: Rollback DB Transaction + POS_HANDLER -> POS_HANDLER: Audit error + end + end +end +deactivate POS_HANDLER +@enduml From dd6d24f6759a5a3231417c554cd0ed345f04efe1 Mon Sep 17 00:00:00 2001 From: Vijay Date: Tue, 5 Sep 2023 20:06:25 +0530 Subject: [PATCH 07/21] feat: changes in binning seq --- .../seq-position-binning-rev2.plantuml | 141 ------- .../sequence/seq-position-binning.plantuml | 82 ++-- .../sequence/seq-position-binning.svg | 397 +++++++++++------- 3 files changed, 294 insertions(+), 326 deletions(-) delete mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning-rev2.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning-rev2.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning-rev2.plantuml deleted file mode 100644 index 376e4ea9f..000000000 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning-rev2.plantuml +++ /dev/null @@ -1,141 +0,0 @@ -/'***** - License - -------------- - Copyright © 2017 Bill & Melinda Gates Foundation - The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - Contributors - -------------- - This is the official list of the Mojaloop project contributors for this file. - Names of the original copyright holders (individuals or organizations) - should be listed with a '*' in the first column. People who have - contributed from an organization can be listed under the organization - that actually holds the copyright for their contributions (see the - Gates Foundation organization for an example). Those individuals should have - their names indented and be marked with a '-'. Email address can be added - optionally within square brackets . - * Gates Foundation - - Name Surname - - * Vijay Kumar Guthi - - -------------- - ******'/ - -@startuml -' declate title -title 1.3.0. Position Messages Binning - -autonumber - -' Actor Keys: -' boundary - APIs/Interfaces, etc -' collections - Kafka Topics -' control - Kafka Consumers -' entity - Database Access Objects -' database - Database Persistence Store - -' declare actors -control "Position Handler" as POS_HANDLER - -entity "Domain Bin Processor" as BIN_PROCESSOR -entity "Prepare Domain" as DOMAIN_PREPARE -entity "Fulfil Domain" as DOMAIN_FULFIL -entity "Abort Domain" as DOMAIN_ABORT -entity "Timeout Domain" as DOMAIN_TIMEOUT -entity "Transfer Facade" as FACADE_TRANSFER -entity "Account Facade" as FACADE_ACCOUNT -collections "Notification-Topic" as TOPIC_NOTIFICATIONS -' database "Central Store" as DB - -box "Central Service" #LightYellow - participant POS_HANDLER - participant BIN_PROCESSOR - participant DOMAIN_FULFIL - participant DOMAIN_ABORT - participant DOMAIN_TIMEOUT - participant DOMAIN_PREPARE - participant FACADE_TRANSFER - participant FACADE_ACCOUNT - ' participant DB - participant TOPIC_NOTIFICATIONS -end box - -' start flow -activate POS_HANDLER -group Position Handler Consume - POS_HANDLER -> POS_HANDLER: Consumes messages from the Position topic \nand stores them in memory - loop for each message in the list - POS_HANDLER -> POS_HANDLER: Assign message to account-bin by accountID and child action-bin by event-action\n (References to the messagses to be stored in bins, no duplication of messages) - POS_HANDLER -> POS_HANDLER: Audit message - end - group DB TRANSACTION - POS_HANDLER -> BIN_PROCESSOR: Call Bin Processor with the list of account-bins - - BIN_PROCESSOR -> FACADE_TRANSFER: Pre fetch all transferStateChanges for all the transferIds in the account-bin - BIN_PROCESSOR -> FACADE_ACCOUNT: Pre fetch all position and settlement account balances for the account-bin\nAquire lock on position - - loop for each account-bin in the list - note right of BIN_PROCESSOR #lightblue - **Note**: Order of processing for various actions - 1. Fulfil - Work in progress is first priority - 2. Abort & Timeout - Freeing funds for future transfers is priority before tackling new requests - 3. Prepare - Processing new requests is last priority - end note - - BIN_PROCESSOR -> DOMAIN_FULFIL: Process Fulfil Bin - note right of BIN_PROCESSOR - Input: Bin, Pre-fetched account balances and transferStateChanges - Output: Accumulated changes in position and transferStateChanges - end note - activate DOMAIN_FULFIL - DOMAIN_FULFIL --> BIN_PROCESSOR: Result - deactivate DOMAIN_FULFIL - - BIN_PROCESSOR -> DOMAIN_ABORT: Process Abort Bin - note right of BIN_PROCESSOR - Input: Bin, previously accumulated account balances and transferStateChanges - Output: Accumulated changes in position and transferStateChanges - end note - activate DOMAIN_ABORT - DOMAIN_ABORT --> BIN_PROCESSOR: Result - deactivate DOMAIN_ABORT - - BIN_PROCESSOR -> DOMAIN_TIMEOUT: Process Timeout Bin - note right of BIN_PROCESSOR - Input: Bin, previously accumulated account balances and transferStateChanges - Output: Accumulated changes in position and transferStateChanges - end note - activate DOMAIN_TIMEOUT - DOMAIN_TIMEOUT --> BIN_PROCESSOR: Result - deactivate DOMAIN_TIMEOUT - - BIN_PROCESSOR -> DOMAIN_PREPARE: Process Prepare Batch - note right of BIN_PROCESSOR - Input: Bin, previously accumulated account balances and transferStateChanges - Output: Accumulated changes in position and transferStateChanges - end note - activate DOMAIN_PREPARE - DOMAIN_PREPARE --> BIN_PROCESSOR: Result - deactivate DOMAIN_PREPARE - BIN_PROCESSOR -> FACADE_TRANSFER: Insert accumulated transferStateChanges - BIN_PROCESSOR -> FACADE_ACCOUNT: Update accumulated position - end - - BIN_PROCESSOR --> POS_HANDLER: Return bins with results - alt return is true - POS_HANDLER -> POS_HANDLER: Commit Kafka Offset - POS_HANDLER -> POS_HANDLER: Commit DB Transaction - loop for each result in the account-bin - POS_HANDLER -> POS_HANDLER: Produce notification message - POS_HANDLER -> POS_HANDLER: Audit notification - end - else return is false or unhandled exception - POS_HANDLER -> POS_HANDLER: Rollback DB Transaction - POS_HANDLER -> POS_HANDLER: Audit error - end - end -end -deactivate POS_HANDLER -@enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml index 58593ab5b..376e4ea9f 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml @@ -40,20 +40,24 @@ autonumber control "Position Handler" as POS_HANDLER entity "Domain Bin Processor" as BIN_PROCESSOR -entity "Prepare Facade" as FACADE_PREPARE -entity "Fulfil Facade" as FACADE_FULFIL -entity "Abort Facade" as FACADE_ABORT -entity "Timeout Facade" as FACADE_TIMEOUT +entity "Prepare Domain" as DOMAIN_PREPARE +entity "Fulfil Domain" as DOMAIN_FULFIL +entity "Abort Domain" as DOMAIN_ABORT +entity "Timeout Domain" as DOMAIN_TIMEOUT +entity "Transfer Facade" as FACADE_TRANSFER +entity "Account Facade" as FACADE_ACCOUNT collections "Notification-Topic" as TOPIC_NOTIFICATIONS ' database "Central Store" as DB box "Central Service" #LightYellow participant POS_HANDLER participant BIN_PROCESSOR - participant FACADE_FULFIL - participant FACADE_ABORT - participant FACADE_TIMEOUT - participant FACADE_PREPARE + participant DOMAIN_FULFIL + participant DOMAIN_ABORT + participant DOMAIN_TIMEOUT + participant DOMAIN_PREPARE + participant FACADE_TRANSFER + participant FACADE_ACCOUNT ' participant DB participant TOPIC_NOTIFICATIONS end box @@ -68,16 +72,10 @@ group Position Handler Consume end group DB TRANSACTION POS_HANDLER -> BIN_PROCESSOR: Call Bin Processor with the list of account-bins + + BIN_PROCESSOR -> FACADE_TRANSFER: Pre fetch all transferStateChanges for all the transferIds in the account-bin + BIN_PROCESSOR -> FACADE_ACCOUNT: Pre fetch all position and settlement account balances for the account-bin\nAquire lock on position - note right of BIN_PROCESSOR #orange - **TODO**: Further future enhancements - 1. Pre fetch all transferStateChanges for all the transferIds in the account-bin - 2. Pre fetch position and settlement account balances for the account-bin - 3. Aquire lock on position - 4. Modify facade functions to return resultant changes in position and transferStateChanges - which will then be accumulated after processing each action-bin - 5. Apply the accumulated changes to the position and transferStateChanges - end note loop for each account-bin in the list note right of BIN_PROCESSOR #lightblue **Note**: Order of processing for various actions @@ -86,25 +84,43 @@ group Position Handler Consume 3. Prepare - Processing new requests is last priority end note - BIN_PROCESSOR -> FACADE_FULFIL: Process Fulfil Batch - activate FACADE_FULFIL - FACADE_FULFIL --> BIN_PROCESSOR: Result - deactivate FACADE_FULFIL + BIN_PROCESSOR -> DOMAIN_FULFIL: Process Fulfil Bin + note right of BIN_PROCESSOR + Input: Bin, Pre-fetched account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + end note + activate DOMAIN_FULFIL + DOMAIN_FULFIL --> BIN_PROCESSOR: Result + deactivate DOMAIN_FULFIL - BIN_PROCESSOR -> FACADE_ABORT: Process Abort Batch - activate FACADE_ABORT - FACADE_ABORT --> BIN_PROCESSOR: Result - deactivate FACADE_ABORT + BIN_PROCESSOR -> DOMAIN_ABORT: Process Abort Bin + note right of BIN_PROCESSOR + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + end note + activate DOMAIN_ABORT + DOMAIN_ABORT --> BIN_PROCESSOR: Result + deactivate DOMAIN_ABORT - BIN_PROCESSOR -> FACADE_TIMEOUT: Process Timeout Batch - activate FACADE_TIMEOUT - FACADE_TIMEOUT --> BIN_PROCESSOR: Result - deactivate FACADE_TIMEOUT + BIN_PROCESSOR -> DOMAIN_TIMEOUT: Process Timeout Bin + note right of BIN_PROCESSOR + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + end note + activate DOMAIN_TIMEOUT + DOMAIN_TIMEOUT --> BIN_PROCESSOR: Result + deactivate DOMAIN_TIMEOUT - BIN_PROCESSOR -> FACADE_PREPARE: Process Prepare Batch - activate FACADE_PREPARE - FACADE_PREPARE --> BIN_PROCESSOR: Result - deactivate FACADE_PREPARE + BIN_PROCESSOR -> DOMAIN_PREPARE: Process Prepare Batch + note right of BIN_PROCESSOR + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + end note + activate DOMAIN_PREPARE + DOMAIN_PREPARE --> BIN_PROCESSOR: Result + deactivate DOMAIN_PREPARE + BIN_PROCESSOR -> FACADE_TRANSFER: Insert accumulated transferStateChanges + BIN_PROCESSOR -> FACADE_ACCOUNT: Update accumulated position end BIN_PROCESSOR --> POS_HANDLER: Return bins with results diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg index 4955304d2..70a515932 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg @@ -1,155 +1,248 @@ - - - - - - - - - - + + + - 1.3.0. Position Messages Binning - - Central Service - - - - - - - - - - - - - - - Position Handler - - - Position Handler - - - Bin Processor - - - Bin Processor - - - Prepare Fulfil Facade - - - Prepare Fulfil Facade - - - Prepare Abort Facade - - - Prepare Abort Facade - - - Prepare Timeout Facade - - - Prepare Timeout Facade - - - Prepare Facade - - - Prepare Facade - - - - - Notification-Topic - - - Notification-Topic - - - - - - - - Position Handler Consume - - - - - 1 - Consumes messages from the Position topic - and stores them in memory - - - DB TRANSACTION - - - - - 2 - Iterate though messages and bin them by accountID and action - (References to the messagses to be stored in bins, no duplication of messages) - - - 3 - Process Bin for accountID - - - - - 4 - For each bin, iterate through the batches based on the action - - - - - 5 - Audit - - - 6 - Process Fulfil Batch - - - 7 - Result - - - 8 - Process Abort Batch - - - 9 - Result - - - 10 - Process Timeout Batch - - - 11 - Result - - - 12 - Process Prepare Batch - - - 13 - Result - - - 14 - Return - - - - - 15 - Commit Kafka Offset + 1.3.0. Position Messages Binning + + Central Service + + + + + + + + + + + + + + + + + + + + + Position Handler + + + Position Handler + + + Domain Bin Processor + + + Domain Bin Processor + + + Fulfil Domain + + + Fulfil Domain + + + Abort Domain + + + Abort Domain + + + Timeout Domain + + + Timeout Domain + + + Prepare Domain + + + Prepare Domain + + + Transfer Facade + + + Transfer Facade + + + Account Facade + + + Account Facade + + + + + Notification-Topic + + + Notification-Topic + + + + + + + + Position Handler Consume + + + + + 1 + Consumes messages from the Position topic + and stores them in memory + + + loop + [for each message in the list] + + + + + 2 + Assign message to account-bin by accountID and child action-bin by event-action + (References to the messagses to be stored in bins, no duplication of messages) + + + + + 3 + Audit message + + + DB TRANSACTION + + + 4 + Call Bin Processor with the list of account-bins + + + 5 + Pre fetch all transferStateChanges for all the transferIds in the account-bin + + + 6 + Pre fetch all position and settlement account balances for the account-bin + Aquire lock on position + + + loop + [for each account-bin in the list] + + + Note + : Order of processing for various actions + 1. Fulfil - Work in progress is first priority + 2. Abort & Timeout - Freeing funds for future transfers is priority before tackling new requests + 3. Prepare - Processing new requests is last priority + + + 7 + Process Fulfil Bin + + + Input: Bin, Pre-fetched account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + + + 8 + Result + + + 9 + Process Abort Bin + + + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + + + 10 + Result + + + 11 + Process Timeout Bin + + + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + + + 12 + Result + + + 13 + Process Prepare Batch + + + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + + + 14 + Result + + + 15 + Insert accumulated transferStateChanges + + + 16 + Update accumulated position + + + 17 + Return bins with results + + + alt + [return is true] + + + + + 18 + Commit Kafka Offset + + + + + 19 + Commit DB Transaction + + + loop + [for each result in the account-bin] + + + + + 20 + Produce notification message + + + + + 21 + Audit notification + + [return is false or unhandled exception] + + + + + 22 + Rollback DB Transaction + + + + + 23 + Audit error From acd4ec78c4e4a7a83f8e32b7aacbfffdf3297c03 Mon Sep 17 00:00:00 2001 From: Vijay Date: Tue, 5 Sep 2023 22:58:52 +0530 Subject: [PATCH 08/21] feat: update seq diagrams --- ...-position-1.3.2-fulfil-v1.1-batch.plantuml | 133 ----- .../seq-position-1.3.2-fulfil-v1.1-batch.svg | 174 ------- ...position-1.3.2-fulfil-v1.1-domain.plantuml | 105 ++++ .../seq-position-1.3.2-fulfil-v1.1-domain.svg | 129 +++++ .../seq-position-1.3.3-abort-batch.svg | 462 ------------------ ... seq-position-1.3.3-abort-domain.plantuml} | 98 ++-- .../seq-position-1.3.3-abort-domain.svg | 169 +++++++ .../seq-position-1.3.3-fail-batch.plantuml | 138 ------ ...on-1.3.3-timeout-reserved-domain.plantuml} | 87 ++-- ...position-1.3.3-timeout-reserved-domain.svg | 134 +++++ scripts/_build_plantuml.sh | 2 +- 11 files changed, 611 insertions(+), 1020 deletions(-) delete mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.plantuml delete mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.svg create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.plantuml create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.svg delete mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.svg rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.3-abort-batch.plantuml => seq-position-1.3.3-abort-domain.plantuml} (58%) create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.svg delete mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-fail-batch.plantuml rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.3-timeout-reserved-batch.plantuml => seq-position-1.3.3-timeout-reserved-domain.plantuml} (51%) create mode 100644 docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.svg diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.plantuml deleted file mode 100644 index 49e4aba2b..000000000 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.plantuml +++ /dev/null @@ -1,133 +0,0 @@ -/'***** - License - -------------- - Copyright © 2017 Bill & Melinda Gates Foundation - The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - Contributors - -------------- - This is the official list of the Mojaloop project contributors for this file. - Names of the original copyright holders (individuals or organizations) - should be listed with a '*' in the first column. People who have - contributed from an organization can be listed under the organization - that actually holds the copyright for their contributions (see the - Gates Foundation organization for an example). Those individuals should have - their names indented and be marked with a '-'. Email address can be added - optionally within square brackets . - * Gates Foundation - - Name Surname - - * Georgi Georgiev - * Rajiv Mothilal - * Miguel de Barros - * Valentin Genev - -------------- - ******'/ - -@startuml -' declate title -title 1.3.2. Position Fulfil Facade v1.1 - -autonumber - -' Actor Keys: -' boundary - APIs/Interfaces, etc -' collections - Kafka Topics -' control - Kafka Consumers -' entity - Database Access Objects -' database - Database Persistence Store - -' declare actors -control "Position Fulfil Facade" as FACADE_POSITION_FULFIL -database "Central Store" as DB -collections "Notifications-Topic" as TOPIC_NOTIFICATIONS - -box "Central Service" #LightYellow - participant FACADE_POSITION_FULFIL - participant DB - participant TOPIC_NOTIFICATIONS -end box - -' start flow -activate FACADE_POSITION_FULFIL -group Fulfil Position Batch Processing - FACADE_POSITION_FULFIL -> FACADE_POSITION_FULFIL: Loop through batch and build list of transferIds \n and calculate sumTransfersInBatch (from payload.amount.amount) - FACADE_POSITION_FULFIL -> DB: Retrieve current state of all transfers in array from DB with select whereIn\nError code: 2003 - activate DB - hnote over DB #lightyellow - transferStateChange - transferParticipant - end note - DB --> FACADE_POSITION_FULFIL: Return current state of transfer from DB - deactivate DB - FACADE_POSITION_FULFIL <-> FACADE_POSITION_FULFIL: Validate current state (transferState is 'RECEIVED-FULFIL')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole - group Persist Position change and Transfer State (with transferState='COMMITTED' on position check pass) - FACADE_POSITION_FULFIL -> DB: Select participantPosition.value FOR UPDATE from DB for Payee - activate DB - hnote over DB #lightyellow - participantPosition - end note - DB --> FACADE_POSITION_FULFIL: Return participantPosition.value from DB for Payee - deactivate DB - FACADE_POSITION_FULFIL <-> FACADE_POSITION_FULFIL: **latestPosition** = participantPosition.value - sumTransfersInBatch - FACADE_POSITION_FULFIL->DB: Persist latestPosition to DB for Payee - hnote over DB #lightyellow - UPDATE **participantPosition** - SET value = latestPosition - end note - activate DB - deactivate DB - FACADE_POSITION_FULFIL -> FACADE_POSITION_FULFIL: Add transfer to the processedTransfer list recording \n the transfer state values - FACADE_POSITION_FULFIL -> DB: Bulk Persist transfer state for all transfers in batch - hnote over DB #lightyellow - batch INSERT **transferStateChange** transferStateId = 'COMMITTED' - - select from transferStateChange table where transferId in ([transferBatch.transferId,...]) - build list of transferStateChanges from transferBatch - end note - FACADE_POSITION_FULFIL -> DB: Bulk Persist participant position change for all transfers in batch - hnote over DB #lightyellow - INSERT **participantPositionChange** - SET participantPositionId = participantPosition.participantPositionId, - transferStateChangeId = transferStateChange.transferStateChangeId, - value = latestPosition (???), - reservedValue = participantPosition.reservedValue - createdDate = new Date() - end note - activate DB - deactivate DB - end - - note right of FACADE_POSITION_FULFIL #yellow - Message: - { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: - }, - metadata: { - event: { - id: , - responseTo: , - type: transfer, - action: commit || reserve, - createdAt: , - state: { - status: "success", - code: 0 - } - } - } - } - end note - FACADE_POSITION_FULFIL -> TOPIC_NOTIFICATIONS: Publish Transfer event\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS -end -deactivate FACADE_POSITION_FULFIL -@enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.svg deleted file mode 100644 index 1e11c0c47..000000000 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-batch.svg +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - 1.3.2. Position Fulfil Facade v1.1 - - Central Service - - - - - - - - - - - - Position Fulfil Facade - - - Position Fulfil Facade - - - Central Store - - - Central Store - - - - - Notifications-Topic - - - Notifications-Topic - - - - - - - - - Fulfil Position Batch Processing - - - - - 1 - Loop through batch and build list of transferIds - and calculate sumTransfersInBatch (from payload.amount.amount) - - - 2 - Retrieve current state of all transfers in array from DB with select whereIn - Error code: - 2003 - - transferStateChange - transferParticipant - - - 3 - Return current state of transfer from DB - - - - - 4 - Validate current state (transferState is 'RECEIVED-FULFIL') - Error code: - 2001 - against failing transfers - Batch is not rejected as a whole - - - Persist Position change and Transfer State (with transferState='COMMITTED' on position check pass) - - - 5 - Select participantPosition.value FOR UPDATE from DB for Payee - - participantPosition - - - 6 - Return participantPosition.value from DB for Payee - - - - - 7 - latestPosition - = participantPosition.value - sumTransfersInBatch - - - 8 - Persist latestPosition to DB for Payee - - UPDATE - participantPosition - SET value = latestPosition - - - - - 9 - Add transfer to the processedTransfer list recording - the transfer state values - - - 10 - Bulk Persist transfer state for all transfers in batch - - batch INSERT - transferStateChange - transferStateId = 'COMMITTED' - - select from transferStateChange table where transferId in ([transferBatch.transferId,...]) - build list of transferStateChanges from transferBatch - - - 11 - Bulk Persist participant position change for all transfers in batch - - INSERT - participantPositionChange - SET participantPositionId = participantPosition.participantPositionId, - transferStateChangeId = transferStateChange.transferStateChangeId, - value = latestPosition (???), - reservedValue = participantPosition.reservedValue - createdDate = new Date() - - - Message: - { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: transfer, - action: commit || reserve, - createdAt: <timestamp>, - state: { - status: "success", - code: 0 - } - } - } - } - - - 12 - Publish Transfer event - Error code: - 2003 - - diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.plantuml new file mode 100644 index 000000000..05ef3f914 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.plantuml @@ -0,0 +1,105 @@ +/'***** + License + -------------- + Copyright © 2017 Bill & Melinda Gates Foundation + The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + Contributors + -------------- + This is the official list of the Mojaloop project contributors for this file. + Names of the original copyright holders (individuals or organizations) + should be listed with a '*' in the first column. People who have + contributed from an organization can be listed under the organization + that actually holds the copyright for their contributions (see the + Gates Foundation organization for an example). Those individuals should have + their names indented and be marked with a '-'. Email address can be added + optionally within square brackets . + * Gates Foundation + - Name Surname + + * Georgi Georgiev + * Rajiv Mothilal + * Miguel de Barros + * Valentin Genev + -------------- + ******'/ + +@startuml +' declate title +title 1.3.2. Position Fulfil Domain v1.1 + +autonumber + +' Actor Keys: +' boundary - APIs/Interfaces, etc +' collections - Kafka Topics +' control - Kafka Consumers +' entity - Database Access Objects +' database - Database Persistence Store + +' declare actors +control "Position Fulfil Domain" as DOMAIN_POSITION_FULFIL + + +' start flow +activate DOMAIN_POSITION_FULFIL +rnote right of DOMAIN_POSITION_FULFIL #lightblue + INPUT: bin, accumulatedPosition, transferStateChanges +end note +group Fulfil Position Batch Processing + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: **runningPosition** = accumulatedPosition + loop for each message in the bin + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: Validate current state (transferState is 'RECEIVED-FULFIL')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: **runningPosition** = runningPosition - payload.amount.amount + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: transferStateChange should be populated and add to **transferStateChanges** + hnote right of DOMAIN_POSITION_FULFIL #lightyellow + **transferStateChange**: { + **transferStateId**: 'COMMITTED' + } + end note + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: participantPositionChange should be populated and add to **participantPositionChanges** + hnote right of DOMAIN_POSITION_FULFIL #lightyellow + **participantPositionChange**: { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + end note + end + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: Return the following + rnote right of DOMAIN_POSITION_FULFIL #lightblue + { + **accumulatedPosition**: runningPosition, + **transferStateChanges**, + **participantPositionChanges**, + + Message: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: commit || reserve, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + } + end note +end +deactivate DOMAIN_POSITION_FULFIL +@enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.svg new file mode 100644 index 000000000..258143307 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.svg @@ -0,0 +1,129 @@ + + + + + + + + + + + + 1.3.2. Position Fulfil Domain v1.1 + + + + + Position Fulfil Domain + + + Position Fulfil Domain + + + + + INPUT: bin, accumulatedPosition, transferStateChanges + + + Fulfil Position Batch Processing + + + + + 1 + runningPosition + = accumulatedPosition + + + loop + [for each message in the bin] + + + + + 2 + Validate current state (transferState is 'RECEIVED-FULFIL') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole + + + + + 3 + runningPosition + = runningPosition - payload.amount.amount + + + + + 4 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { + + transferStateId + : 'COMMITTED' + } + + + + + 5 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + + + + + 6 + Return the following + + { + + accumulatedPosition + : runningPosition, + + transferStateChanges + , + + participantPositionChanges + , + + Message: + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: commit || reserve, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.svg deleted file mode 100644 index 21c55e18a..000000000 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.svg +++ /dev/null @@ -1,462 +0,0 @@ - - - - - - - - - - - - 1.3.3. Position Abort Facade - - Central Service - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Position Abort Facade - - - Position Abort Facade - - - Central Store - - - Central Store - - - - - Notification-Topic - - - Notification-Topic - - - - - - - - - - - - - - - - - - - - Abort Position Batch Processing - - - opt - [type == 'position' && action == 'timeout-reserved'] - - - 1 - Retrieve current state of transfer from DB - - transferStateChange - transferParticipant - - - 2 - Return current state of transfer from DB - - - - - 3 - Validate current state (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') - Error code: - 2001 - - - Persist Position change and Transfer state - - - - - 4 - transferStateId - = 'EXPIRED_RESERVED' - - - - - 5 - Request to persist latest position and state to DB - Error code: - 2003 - - - DB TRANSACTION IMPLEMENTATION - - - 6 - Select participantPosition.value FOR UPDATE for payerCurrencyId - - participantPosition - - - 7 - Return participantPosition - - - - - 8 - latestPosition - = participantPosition - payload.amount.amount - - - 9 - Persist latestPosition to DB for Payer - - UPDATE - participantPosition - SET value = latestPosition - - - 10 - Persist participant position change and state change - - INSERT - transferStateChange - - VALUES (transferStateId) - - INSERT - participantPositionChange - SET participantPositionId = participantPosition.participantPositionId, - transferStateChangeId = transferStateChange.transferStateChangeId, - value = latestPosition, - reservedValue = participantPosition.reservedValue - createdDate = new Date() - - - - - 11 - Return success - - - Message: { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: { - "errorInformation": { - "errorCode": 3300, - "errorDescription": "Transfer expired", - "extensionList": <transferMessage.extensionList> - } - } - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: abort, - createdAt: <timestamp>, - state: { - status: 'error', - code: <errorInformation.errorCode> - description: <errorInformation.errorDescription> - } - } - } - } - - - 12 - Publish Notification event - Error code: - 2003 - - - opt - [type == 'position' && (action IN ['reject', 'abort'])] - - - - - 13 - Request current state of transfer from DB - Error code: - 2003 - - - 14 - Retrieve current state of transfer from DB - - transferStateChange - - - 15 - Return current state of transfer from DB - - - - - 16 - Return current state of transfer from DB - - - - - 17 - Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) - Error code: - 2001 - - - Persist Position change and Transfer state - - - - - 18 - transferStateId - = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) - - - - - 19 - Request to persist latest position and state to DB - Error code: - 2003 - - - Refer to - DB TRANSACTION IMPLEMENTATION - above - - - 20 - Persist to database - - participantPosition - transferStateChange - participantPositionChange - - - - - 21 - Return success - - - alt - [action == 'reject'] - - - Message: { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: reject, - createdAt: <timestamp>, - state: { - status: "success", - code: 0, - description: "action successful" - } - } - } - } - - [action == 'abort'] - - - Message: { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: abort, - createdAt: <timestamp>, - state: { - status: 'error', - code: <payload.errorInformation.errorCode || 5000> - description: <payload.errorInformation.errorDescription> - } - } - } - } - - - 22 - Publish Notification event - Error code: - 2003 - - - opt - [type == 'position' && action == 'fail' (Unable to currently trigger this scenario)] - - - - - 23 - Request current state of transfer from DB - Error code: - 2003 - - - 24 - Retrieve current state of transfer from DB - - transferStateChange - - - 25 - Return current state of transfer from DB - - - - - 26 - Return current state of transfer from DB - - - - - 27 - Validate current state (transferStateChange.transferStateId == 'FAILED') - - - Persist Position change and Transfer state - - - - - 28 - transferStateId - = 'FAILED' - - - - - 29 - Request to persist latest position and state to DB - Error code: - 2003 - - - Refer to - DB TRANSACTION IMPLEMENTATION - above - - - 30 - Persist to database - - participantPosition - transferStateChange - participantPositionChange - - - - - 31 - Return success - - - Message: { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: { - "errorInformation": { - "errorCode": 3100, - "errorDescription": "Transfer failed", - "extensionList": <transferMessage.extensionList> - } - } - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: abort, - createdAt: <timestamp>, - state: { - status: 'error', - code: <errorInformation.errorCode> - description: <errorInformation.errorDescription> - } - } - } - } - - - 32 - Publish Notification event - Error code: - 2003 - - diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.plantuml similarity index 58% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.plantuml index 4e54640fb..359686c06 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-batch.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.plantuml @@ -27,7 +27,7 @@ @startuml ' declate title -title 1.3.3. Position Abort Facade +title 1.3.3. Position Abort Domain autonumber @@ -39,63 +39,44 @@ autonumber ' database - Database Persistence Store ' declare actors -control "Position Abort Facade" as FACADE_POSITION_ABORT -collections "Notification-Topic" as TOPIC_NOTIFICATIONS -database "Central Store" as DB - -box "Central Service" #LightYellow - participant FACADE_POSITION_ABORT - participant DB - participant TOPIC_NOTIFICATIONS -end box +control "Position Abort Domain" as DOMAIN_POSITION_ABORT ' start flow -activate FACADE_POSITION_ABORT +activate DOMAIN_POSITION_ABORT +rnote right of DOMAIN_POSITION_ABORT #lightblue + INPUT: bin, accumulatedPosition, transferStateChanges +end note group Abort Position Batch Processing - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: Loop through batch and build list of transferIds \n and calculate sumTransfersInBatch (from payload.amount.amount) - FACADE_POSITION_ABORT -> DB: Retrieve current state of all transfers in array from DB with select whereIn\nError code: 2003 - activate DB - hnote over DB #lightyellow - transferStateChange - end note - DB --> FACADE_POSITION_ABORT: Return current state of transfers from DB - deactivate DB - FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR'])\nError code: 2001 - - group Persist Position change and Transfer state - FACADE_POSITION_ABORT -> FACADE_POSITION_ABORT: **transferStateId** = (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) - FACADE_POSITION_ABORT -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId - activate DB - hnote over DB #lightyellow - participantPosition - end note - DB --> FACADE_POSITION_ABORT: Return participantPosition - deactivate DB - FACADE_POSITION_ABORT <-> FACADE_POSITION_ABORT: **latestPosition** = participantPosition - sumTransfersInBatch - FACADE_POSITION_ABORT->DB: Persist latestPosition to DB for Payer - hnote over DB #lightyellow - UPDATE **participantPosition** - SET value = latestPosition + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: **runningPosition** = accumulatedPosition + loop for each message in the bin + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR'])\nError code: 2001 DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: **runningPosition** = runningPosition - payload.amount.amount + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: transferStateChange should be populated and add to **transferStateChanges** + hnote right of DOMAIN_POSITION_ABORT #lightyellow + **transferStateChange**: { + **transferStateId**: (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + } end note - activate DB - deactivate DB - FACADE_POSITION_ABORT -> DB: Persist participant position change and state change - hnote over DB #lightyellow - Bulk INSERT **transferStateChange** - VALUES (transferStateId) - - Bulk INSERT **participantPositionChange** - SET participantPositionId = participantPosition.participantPositionId, - transferStateChangeId = transferStateChange.transferStateChangeId, - value = latestPosition, - reservedValue = participantPosition.reservedValue - createdDate = new Date() + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: participantPositionChange should be populated and add to **participantPositionChanges** + hnote right of DOMAIN_POSITION_ABORT #lightyellow + **participantPositionChange**: { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } end note - activate DB - deactivate DB end + + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: Return the following + + alt action == 'reject' - note right of FACADE_POSITION_ABORT #yellow + rnote right of DOMAIN_POSITION_ABORT #lightblue + { + **accumulatedPosition**: runningPosition, + **transferStateChanges**, + **participantPositionChanges**, + Message: { id: from: , @@ -120,9 +101,15 @@ group Abort Position Batch Processing } } } + } end note else action == 'abort' - note right of FACADE_POSITION_ABORT #yellow + rnote right of DOMAIN_POSITION_ABORT #lightblue + { + **accumulatedPosition**: runningPosition, + **transferStateChanges**, + **participantPositionChanges**, + Message: { id: from: , @@ -147,12 +134,9 @@ group Abort Position Batch Processing } } } + } end note end - FACADE_POSITION_ABORT -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS - end -deactivate FACADE_POSITION_ABORT +deactivate DOMAIN_POSITION_ABORT @enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.svg new file mode 100644 index 000000000..bb76c1f73 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.svg @@ -0,0 +1,169 @@ + + + + + + + + + + + + 1.3.3. Position Abort Domain + + + + + + + Position Abort Domain + + + Position Abort Domain + + + + + INPUT: bin, accumulatedPosition, transferStateChanges + + + Abort Position Batch Processing + + + + + 1 + runningPosition + = accumulatedPosition + + + loop + [for each message in the bin] + + + + + 2 + Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) + Error code: + 2001 + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: + runningPosition + = runningPosition - payload.amount.amount + + + + + 3 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { + + transferStateId + : (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + } + + + + + 4 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + + + + + 5 + Return the following + + + alt + [action == 'reject'] + + { + + accumulatedPosition + : runningPosition, + + transferStateChanges + , + + participantPositionChanges + , + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + } + + [action == 'abort'] + + { + + accumulatedPosition + : runningPosition, + + transferStateChanges + , + + participantPositionChanges + , + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <payload.errorInformation.errorCode || 5000> + description: <payload.errorInformation.errorDescription> + } + } + } + } + } + + diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-fail-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-fail-batch.plantuml deleted file mode 100644 index 9f63449ba..000000000 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-fail-batch.plantuml +++ /dev/null @@ -1,138 +0,0 @@ -/'***** - License - -------------- - Copyright © 2017 Bill & Melinda Gates Foundation - The Mojaloop files are made available by the Bill & Melinda Gates Foundation under the Apache License, Version 2.0 (the "License") and you may not use these files except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, the Mojaloop files are distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - Contributors - -------------- - This is the official list of the Mojaloop project contributors for this file. - Names of the original copyright holders (individuals or organizations) - should be listed with a '*' in the first column. People who have - contributed from an organization can be listed under the organization - that actually holds the copyright for their contributions (see the - Gates Foundation organization for an example). Those individuals should have - their names indented and be marked with a '-'. Email address can be added - optionally within square brackets . - * Gates Foundation - - Name Surname - - * Rajiv Mothilal - * Georgi Georgiev - * Sam Kummary - * Vijay Kumar - ------------- - ******'/ - -@startuml -' declate title -title 1.3.3. Position Fail Facade - -autonumber - -' Actor Keys: -' boundary - APIs/Interfaces, etc -' collections - Kafka Topics -' control - Kafka Consumers -' entity - Database Access Objects -' database - Database Persistence Store - -' declare actors -control "Position Fail Facade" as FACADE_POSITION_FAIL -collections "Notification-Topic" as TOPIC_NOTIFICATIONS -database "Central Store" as DB - -box "Central Service" #LightYellow - participant FACADE_POSITION_FAIL - participant DB - participant TOPIC_NOTIFICATIONS -end box - -' start flow -activate FACADE_POSITION_FAIL -group Fail Position Batch Processing - FACADE_POSITION_FAIL -> FACADE_POSITION_FAIL: Loop through batch and build list of transferIds \n and calculate sumTransfersInBatch (from payload.amount.amount) - - ' TODO: We do not see how this scenario will be triggered - opt type == 'position' && action == 'fail' (Unable to currently trigger this scenario) - FACADE_POSITION_FAIL -> DB: Retrieve current state of all transfers in array from DB with select whereIn\nError code: 2003 - activate DB - hnote over DB #lightyellow - transferStateChange - end note - DB --> FACADE_POSITION_FAIL: Return current state of transfers from DB - deactivate DB - FACADE_POSITION_FAIL <-> FACADE_POSITION_FAIL: Validate current state (transferStateChange.transferStateId == 'FAILED') - - group Persist Position change and Transfer state - FACADE_POSITION_FAIL -> FACADE_POSITION_FAIL: **transferStateId** = 'FAILED' - FACADE_POSITION_FAIL -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId - activate DB - hnote over DB #lightyellow - participantPosition - end note - DB --> FACADE_POSITION_FAIL: Return participantPosition - deactivate DB - FACADE_POSITION_FAIL <-> FACADE_POSITION_FAIL: **latestPosition** = participantPosition - sumTransfersInBatch - FACADE_POSITION_FAIL->DB: Persist latestPosition to DB for Payer - hnote over DB #lightyellow - UPDATE **participantPosition** - SET value = latestPosition - end note - activate DB - deactivate DB - FACADE_POSITION_FAIL -> DB: Persist participant position change and state change - hnote over DB #lightyellow - Bulk INSERT **transferStateChange** - VALUES (transferStateId) - - Bulk INSERT **participantPositionChange** - SET participantPositionId = participantPosition.participantPositionId, - transferStateChangeId = transferStateChange.transferStateChangeId, - value = latestPosition, - reservedValue = participantPosition.reservedValue - createdDate = new Date() - end note - activate DB - deactivate DB - end - note right of FACADE_POSITION_FAIL #yellow - Message: { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: { - "errorInformation": { - "errorCode": 3100, - "errorDescription": "Transfer failed", - "extensionList": - } - } - }, - metadata: { - event: { - id: , - responseTo: , - type: notification, - action: abort, - createdAt: , - state: { - status: 'error', - code: - description: - } - } - } - } - end note - FACADE_POSITION_FAIL -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS - end -end -deactivate FACADE_POSITION_FAIL -@enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.plantuml similarity index 51% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-batch.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.plantuml index dd20c0c12..cc5a648f2 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-batch.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.plantuml @@ -27,7 +27,7 @@ @startuml ' declate title -title 1.3.3. Position Timeout Reserved Facade +title 1.3.3. Position Timeout Reserved Domain autonumber @@ -39,62 +39,41 @@ autonumber ' database - Database Persistence Store ' declare actors -control "Position Timeout Reserved Facade" as FACADE_POSITION_TIMEOUT_RESERVED -collections "Notification-Topic" as TOPIC_NOTIFICATIONS -database "Central Store" as DB - -box "Central Service" #LightYellow - participant FACADE_POSITION_TIMEOUT_RESERVED - participant DB - participant TOPIC_NOTIFICATIONS -end box +control "Position Timeout Reserved Domain" as DOMAIN_POSITION_TIMEOUT_RESERVED ' start flow -activate FACADE_POSITION_TIMEOUT_RESERVED +activate DOMAIN_POSITION_TIMEOUT_RESERVED +rnote right of DOMAIN_POSITION_TIMEOUT_RESERVED #lightblue + INPUT: bin, accumulatedPosition, transferStateChanges +end note group Timeout Reserved Position Batch Processing - FACADE_POSITION_TIMEOUT_RESERVED -> FACADE_POSITION_TIMEOUT_RESERVED: Loop through batch and build list of transferIds \n and calculate sumTransfersInBatch (from payload.amount.amount) - FACADE_POSITION_TIMEOUT_RESERVED -> DB: Retrieve current state of all transfers in array from DB with select whereIn - activate DB - hnote over DB #lightyellow - transferStateChange - transferParticipant - end note - DB --> FACADE_POSITION_TIMEOUT_RESERVED: Return current state of transfers from DB - deactivate DB - FACADE_POSITION_TIMEOUT_RESERVED <-> FACADE_POSITION_TIMEOUT_RESERVED: Validate current state of all transfers (transferStateChange.transferStateId == 'RESERVED_TIMEOUT')\nError code: 2001 - group Persist Position change and Transfer state - FACADE_POSITION_TIMEOUT_RESERVED -> FACADE_POSITION_TIMEOUT_RESERVED: **transferStateId** = 'EXPIRED_RESERVED' - FACADE_POSITION_TIMEOUT_RESERVED -> DB: Select participantPosition.value FOR UPDATE for payerCurrencyId - activate DB - hnote over DB #lightyellow - participantPosition - end note - DB --> FACADE_POSITION_TIMEOUT_RESERVED: Return participantPosition - deactivate DB - FACADE_POSITION_TIMEOUT_RESERVED <-> FACADE_POSITION_TIMEOUT_RESERVED: **latestPosition** = participantPosition - sumTransfersInBatch - FACADE_POSITION_TIMEOUT_RESERVED->DB: Persist latestPosition to DB for Payer - hnote over DB #lightyellow - UPDATE **participantPosition** - SET value = latestPosition + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: **runningPosition** = accumulatedPosition + loop for each message in the bin + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: Validate current state of transfer (transferStateChange.transferStateId == 'RESERVED_TIMEOUT')\nError code: 2001 + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: **runningPosition** = runningPosition - payload.amount.amount + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: transferStateChange should be populated and add to **transferStateChanges** + hnote right of DOMAIN_POSITION_TIMEOUT_RESERVED #lightyellow + **transferStateChange**: { + **transferStateId**: 'EXPIRED_RESERVED' + } end note - activate DB - deactivate DB - FACADE_POSITION_TIMEOUT_RESERVED -> DB: Persist participant position change and state change - hnote over DB #lightyellow - Bulk INSERT **transferStateChange** - VALUES (transferStateId) - - Bulk INSERT **participantPositionChange** - SET participantPositionId = participantPosition.participantPositionId, - transferStateChangeId = transferStateChange.transferStateChangeId, - value = latestPosition, - reservedValue = participantPosition.reservedValue - createdDate = new Date() + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: participantPositionChange should be populated and add to **participantPositionChanges** + hnote right of DOMAIN_POSITION_TIMEOUT_RESERVED #lightyellow + **participantPositionChange**: { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } end note - activate DB - deactivate DB end - note right of FACADE_POSITION_TIMEOUT_RESERVED #yellow + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: Return the following + rnote right of DOMAIN_POSITION_TIMEOUT_RESERVED #lightblue + { + **accumulatedPosition**: runningPosition, + **transferStateChanges**, + **participantPositionChanges**, + Message: { id: from: , @@ -125,10 +104,8 @@ group Timeout Reserved Position Batch Processing } } } + } end note - FACADE_POSITION_TIMEOUT_RESERVED -> TOPIC_NOTIFICATIONS: Publish Notification events\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS end -deactivate FACADE_POSITION_TIMEOUT_RESERVED +deactivate DOMAIN_POSITION_TIMEOUT_RESERVED @enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.svg new file mode 100644 index 000000000..69615f705 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.svg @@ -0,0 +1,134 @@ + + + + + + + + + + + + 1.3.3. Position Timeout Reserved Domain + + + + + Position Timeout Reserved Domain + + + Position Timeout Reserved Domain + + + + + INPUT: bin, accumulatedPosition, transferStateChanges + + + Timeout Reserved Position Batch Processing + + + + + 1 + runningPosition + = accumulatedPosition + + + loop + [for each message in the bin] + + + + + 2 + Validate current state of transfer (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') + Error code: + 2001 + + + + + 3 + runningPosition + = runningPosition - payload.amount.amount + + + + + 4 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { + + transferStateId + : 'EXPIRED_RESERVED' + } + + + + + 5 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + + + + + 6 + Return the following + + { + + accumulatedPosition + : runningPosition, + + transferStateChanges + , + + participantPositionChanges + , + + Message: { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + } + + diff --git a/scripts/_build_plantuml.sh b/scripts/_build_plantuml.sh index 3ab8f5199..a7ebe9670 100755 --- a/scripts/_build_plantuml.sh +++ b/scripts/_build_plantuml.sh @@ -38,7 +38,7 @@ docker run -d --rm \ plantuml/plantuml-server:jetty-v1.2020.21 # Wait for docker to be up -sleep 2 +sleep 10 echo "Searching for ${MODE} files matching pattern: ${PUML_MATCH}" From 4c4ada0f71ea97ae0157e3cf0d71d3ffd77b4227 Mon Sep 17 00:00:00 2001 From: Vijay Date: Tue, 5 Sep 2023 23:20:16 +0530 Subject: [PATCH 09/21] feat: restructured the files --- docs/.vuepress/config.js | 4 ++++ ... seq-position-1.3.4-abort-domain.plantuml} | 0 ...vg => seq-position-1.3.4-abort-domain.svg} | 0 ...ml => seq-position-1.3.4-binning.plantuml} | 0 ...ing.svg => seq-position-1.3.4-binning.svg} | 0 ...osition-1.3.4-fulfil-v1.1-domain.plantuml} | 0 ...seq-position-1.3.4-fulfil-v1.1-domain.svg} | 0 ...eq-position-1.3.4-prepare-domain.plantuml} | 0 ... => seq-position-1.3.4-prepare-domain.svg} | 0 ...on-1.3.4-timeout-reserved-domain.plantuml} | 0 ...osition-1.3.4-timeout-reserved-domain.svg} | 0 .../1.3.4-position-handler-consume-v2.md | 19 +++++++++++++++++++ 12 files changed, 23 insertions(+) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.3-abort-domain.plantuml => seq-position-1.3.4-abort-domain.plantuml} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.3-abort-domain.svg => seq-position-1.3.4-abort-domain.svg} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-binning.plantuml => seq-position-1.3.4-binning.plantuml} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-binning.svg => seq-position-1.3.4-binning.svg} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.2-fulfil-v1.1-domain.plantuml => seq-position-1.3.4-fulfil-v1.1-domain.plantuml} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.2-fulfil-v1.1-domain.svg => seq-position-1.3.4-fulfil-v1.1-domain.svg} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.1-prepare-batch.plantuml => seq-position-1.3.4-prepare-domain.plantuml} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.1-prepare-batch.svg => seq-position-1.3.4-prepare-domain.svg} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.3-timeout-reserved-domain.plantuml => seq-position-1.3.4-timeout-reserved-domain.plantuml} (100%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.3-timeout-reserved-domain.svg => seq-position-1.3.4-timeout-reserved-domain.svg} (100%) create mode 100644 docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-v2.md diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index da466436f..338efd43d 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -684,6 +684,10 @@ module.exports = { } ] }, + { + title: "Position Handler v2", + path: "central-ledger/transfers/1.3.4-position-handler-consume-v2" + }, ] }, { diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-abort-domain.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-binning.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.2-fulfil-v1.1-domain.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.1-prepare-batch.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg similarity index 100% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.3-timeout-reserved-domain.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg diff --git a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-v2.md b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-v2.md new file mode 100644 index 000000000..7752ca1fc --- /dev/null +++ b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-v2.md @@ -0,0 +1,19 @@ +# Position Handler Consume V2 (Batch / Bin support) + +Sequence design diagram for Position Handler Consume process. + + +## Overview +![seq-position-1.3.4-binning.svg](../assets/diagrams/sequence/seq-position-1.3.4-binning.svg) + +## Position-Prepare Domain +![seq-position-1.3.4-prepare-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg) + +## Position-Fulfil Domain +![seq-position-1.3.4-fulfil-v1.1-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg) + +## Position-Abort Domain +![seq-position-1.3.4-abort-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg) + +## Position-Timeout Domain +![seq-position-1.3.4-timeout-reserved-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg) \ No newline at end of file From d9625929f47dc97c546990229a6164b94925b730 Mon Sep 17 00:00:00 2001 From: Vijay Date: Wed, 6 Sep 2023 14:48:31 +0530 Subject: [PATCH 10/21] chore: some file name changes --- docs/.vuepress/config.js | 4 ++-- ...onsume-v2.md => 1.3.4-position-handler-consume-binning.md} | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) rename docs/technical/central-ledger/transfers/{1.3.4-position-handler-consume-v2.md => 1.3.4-position-handler-consume-binning.md} (85%) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 338efd43d..15c36e894 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -685,8 +685,8 @@ module.exports = { ] }, { - title: "Position Handler v2", - path: "central-ledger/transfers/1.3.4-position-handler-consume-v2" + title: "Position Handler Bin Support", + path: "central-ledger/transfers/1.3.4-position-handler-consume-binning" }, ] }, diff --git a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-v2.md b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md similarity index 85% rename from docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-v2.md rename to docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md index 7752ca1fc..e7ae50393 100644 --- a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-v2.md +++ b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md @@ -1,4 +1,4 @@ -# Position Handler Consume V2 (Batch / Bin support) +# Position Handler Consume (Batch / Bin support) Sequence design diagram for Position Handler Consume process. @@ -16,4 +16,4 @@ Sequence design diagram for Position Handler Consume process. ![seq-position-1.3.4-abort-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg) ## Position-Timeout Domain -![seq-position-1.3.4-timeout-reserved-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg) \ No newline at end of file +![seq-position-1.3.4-timeout-reserved-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg) From 4a8bfc1e564a088b9075172645fda1ae1a135437 Mon Sep 17 00:00:00 2001 From: Vijay Date: Wed, 6 Sep 2023 15:01:16 +0530 Subject: [PATCH 11/21] feat: added overview --- .../Transfers-Position-Binning.drawio.svg | 4 ++ .../1.3.4-position-handler-consume-binning.md | 56 +++++++++++++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) create mode 100644 docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg diff --git a/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg b/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg new file mode 100644 index 000000000..f4f64fed1 --- /dev/null +++ b/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg @@ -0,0 +1,4 @@ + + + +
Handler
Handler
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
Bin 1
Bin 1
Bin 2
Bin 2
Kafka Consumer
Kafka Consumer
1. Consumes n messages and store them in memory
1. Consumes n messages an...
2. Create bins based on accountID, action and batchSize
2. Create bins based on a...
Bin Processor
Bin Processor
4. Start TX
4. Start TX
5. Process each bin
5. Process ea...
3. Audit
3. Audit
6. Send Notifications
6. Send Notif...
7. Commit offset
7. Commit off...
Offset
Offset
8. End TX
8. End TX
1
1
1
1
Fulfil Bin
Fulfil Bin
Abort Bin
Abort Bin
Timeout Bin
Timeout Bin
Prepare Bin
Prepare Bin

(Messages in bins are not duplicated and stored as references to the existing objects in memory)

(Messages in bins are not duplicated and store...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md index e7ae50393..5cdacc747 100644 --- a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md +++ b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md @@ -4,16 +4,64 @@ Sequence design diagram for Position Handler Consume process. ## Overview +![Transfers-Position-Binning.drawio.svg](../assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg) + +### Algorithm +1. **Binning:** + - The initial batch size is determined by the `batchSize` configuration + - The consumed messages will be stored in memory + - Assign a batch of messages into bins based on the impacted position account ID (Prepare: Payer Position Account, Fulfil: Payee Position Account) and create sub-bins based on `action` + - Audit each message as it's assigned to a bin. + - Note: The messages in bins should be references to the message content in memory (No duplication of message content) + +2. **Handler:** + - Start Transaction (TX) on MySQL. + - For each bin: + - Call the Bin Processor with the bin and TX. + - Send and audit notifications based on the transfers result list from the Batch Processor (To Be Confirmed). Note: Batch messages can also be sent to Kafka. + - Commit the offset. + - End the TX (Commit TX to MySQL). Rollback is reserved for complete infrastructure failure only. + +3. **Bin Processor:** + - Input: Accepts a bin and TX to be processed + - Output: Provides a list of transfers in either a reserved or aborted state. + - Order: + - Fulfil + - Aborts and Timeouts + - Prepare +4. Supports single message processing as well. + +### Questions + +- **Message Replay Prevention:** How do we ensure that we do not replay messages? + +### Issues + +- **Locking Issue:** The above high-level algorithm might suffer from long "locks" on the position table when Kafka messages are not pre-partitioned correctly by the position account ID. This issue applies when processing mixed messages or when the number of partitions exceeds consumers. + +### Mitigation + +- Ensure a sufficient number of consumers, ideally more than partitions. +- Have enough partitions to ensure unique binning (no message key hash conflicts). +- Use the correct message key when producing position events by the position account ID and the scenario (Prepare: Payer Position Account, Fulfil: Payee Position Account). + +### Future Enhancements + +- **Enhanced Auditing:** Support batch events auditing (e.g., audits for ingress/egress, etc). +- Messages in each bin can be sorted from smallest to largest amount. + +## Sequence Diagrams +### Message Consumption and Binning ![seq-position-1.3.4-binning.svg](../assets/diagrams/sequence/seq-position-1.3.4-binning.svg) -## Position-Prepare Domain +### Position-Prepare Domain ![seq-position-1.3.4-prepare-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg) -## Position-Fulfil Domain +### Position-Fulfil Domain ![seq-position-1.3.4-fulfil-v1.1-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg) -## Position-Abort Domain +### Position-Abort Domain ![seq-position-1.3.4-abort-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg) -## Position-Timeout Domain +### Position-Timeout Domain ![seq-position-1.3.4-timeout-reserved-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg) From c1e1ea905c70633653e60dbe59ab385e0c6a2e36 Mon Sep 17 00:00:00 2001 From: Vijay Date: Wed, 6 Sep 2023 22:52:05 +0530 Subject: [PATCH 12/21] feat: updated seq diagrams --- .../seq-position-1.3.4-abort-domain.plantuml | 125 ++-- .../seq-position-1.3.4-abort-domain.svg | 324 +++++----- .../seq-position-1.3.4-binning.plantuml | 2 +- .../sequence/seq-position-1.3.4-binning.svg | 486 +++++++------- ...position-1.3.4-fulfil-v1.1-domain.plantuml | 53 +- .../seq-position-1.3.4-fulfil-v1.1-domain.svg | 256 ++++---- ...seq-position-1.3.4-prepare-domain.plantuml | 336 ++++------ .../seq-position-1.3.4-prepare-domain.svg | 598 +++++++----------- ...ion-1.3.4-timeout-reserved-domain.plantuml | 65 +- ...position-1.3.4-timeout-reserved-domain.svg | 267 ++++---- scripts/_build_plantuml.sh | 4 +- 11 files changed, 1144 insertions(+), 1372 deletions(-) diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml index 359686c06..d5fd8f511 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml @@ -65,78 +65,73 @@ group Abort Position Batch Processing createdDate = new Date() (Get time here or while executing the query in handler ???) } end note - end - - DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: Return the following - - - alt action == 'reject' - rnote right of DOMAIN_POSITION_ABORT #lightblue - { - **accumulatedPosition**: runningPosition, - **transferStateChanges**, - **participantPositionChanges**, - - Message: { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: - }, - metadata: { - event: { - id: , - responseTo: , - type: notification, - action: reject, - createdAt: , - state: { - status: "success", - code: 0, - description: "action successful" + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: resultMessage should be populated and add to **resultMessages** + alt action == 'reject' + rnote right of DOMAIN_POSITION_ABORT #yellow + **resultMessage**: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: reject, + createdAt: , + state: { + status: "success", + code: 0, + description: "action successful" + } } } } - } - } - end note - else action == 'abort' - rnote right of DOMAIN_POSITION_ABORT #lightblue - { - **accumulatedPosition**: runningPosition, - **transferStateChanges**, - **participantPositionChanges**, - - Message: { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: - }, - metadata: { - event: { - id: , - responseTo: , - type: notification, - action: abort, - createdAt: , - state: { - status: 'error', - code: - description: + end note + else action == 'abort' + rnote right of DOMAIN_POSITION_ABORT #yellow + **resultMessage**: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } } } } - } - } - end note + end note + end end + + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: Return the following + rnote right of DOMAIN_POSITION_ABORT #lightblue + { + **accumulatedPosition**: runningPosition, + **transferStateChanges**, + **participantPositionChanges**, + **resultMessages**, (The list of messages to be sent to the kafka topic) + } + end note end deactivate DOMAIN_POSITION_ABORT @enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg index bb76c1f73..e35373de8 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg @@ -1,169 +1,161 @@ - - - - - - - - - - + + + - 1.3.3. Position Abort Domain - - - - - - - Position Abort Domain - - - Position Abort Domain - - - - - INPUT: bin, accumulatedPosition, transferStateChanges - - - Abort Position Batch Processing - - - - - 1 - runningPosition - = accumulatedPosition - - - loop - [for each message in the bin] - - - - - 2 - Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) - Error code: - 2001 - DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: - runningPosition - = runningPosition - payload.amount.amount - - - - - 3 - transferStateChange should be populated and add to - transferStateChanges - - transferStateChange - : { - - transferStateId - : (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) - } - - - - - 4 - participantPositionChange should be populated and add to - participantPositionChanges - - participantPositionChange - : { - transferStateChangeId: We need this, may be need to update in the handler (???) - value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) - } - - - - - 5 - Return the following - - - alt - [action == 'reject'] - - { - - accumulatedPosition - : runningPosition, - - transferStateChanges - , - - participantPositionChanges - , - - Message: { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: reject, - createdAt: <timestamp>, - state: { - status: "success", - code: 0, - description: "action successful" - } - } - } - } - } - - [action == 'abort'] - - { - - accumulatedPosition - : runningPosition, - - transferStateChanges - , - - participantPositionChanges - , - - Message: { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: abort, - createdAt: <timestamp>, - state: { - status: 'error', - code: <payload.errorInformation.errorCode || 5000> - description: <payload.errorInformation.errorDescription> - } - } - } - } - } + 1.3.3. Position Abort Domain + + + + + + Position Abort Domain + + + Position Abort Domain + + + + + INPUT: bin, accumulatedPosition, transferStateChanges + + + Abort Position Batch Processing + + + + + 1 + runningPosition + = accumulatedPosition + + + loop + [for each message in the bin] + + + + + 2 + Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) + Error code: + 2001 + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: + runningPosition + = runningPosition - payload.amount.amount + + + + + 3 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + : (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + } + + + + + 4 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + + + + + 5 + resultMessage should be populated and add to + resultMessages + + + alt + [action == 'reject'] + + resultMessage + : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + + [action == 'abort'] + + resultMessage + : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <payload.errorInformation.errorCode || 5000> + description: <payload.errorInformation.errorDescription> + } + } + } + } + + + + + 6 + Return the following + + { +      + accumulatedPosition + : runningPosition, +      + transferStateChanges + , +      + participantPositionChanges + , +      + resultMessages + , (The list of messages to be sent to the kafka topic) + } diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml index 376e4ea9f..9c1809339 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml @@ -74,7 +74,7 @@ group Position Handler Consume POS_HANDLER -> BIN_PROCESSOR: Call Bin Processor with the list of account-bins BIN_PROCESSOR -> FACADE_TRANSFER: Pre fetch all transferStateChanges for all the transferIds in the account-bin - BIN_PROCESSOR -> FACADE_ACCOUNT: Pre fetch all position and settlement account balances for the account-bin\nAquire lock on position + BIN_PROCESSOR -> FACADE_ACCOUNT: Pre fetch all position and settlement account balances for the account-bin\nAcquire lock on position loop for each account-bin in the list note right of BIN_PROCESSOR #lightblue diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg index 70a515932..7360029e6 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg @@ -1,248 +1,248 @@ - + - 1.3.0. Position Messages Binning - - Central Service - - - - - - - - - - - - - - - - - - - - - Position Handler - - - Position Handler - - - Domain Bin Processor - - - Domain Bin Processor - - - Fulfil Domain - - - Fulfil Domain - - - Abort Domain - - - Abort Domain - - - Timeout Domain - - - Timeout Domain - - - Prepare Domain - - - Prepare Domain - - - Transfer Facade - - - Transfer Facade - - - Account Facade - - - Account Facade - - - - - Notification-Topic - - - Notification-Topic - - - - - - - - Position Handler Consume - - - - - 1 - Consumes messages from the Position topic - and stores them in memory - - - loop - [for each message in the list] - - - - - 2 - Assign message to account-bin by accountID and child action-bin by event-action - (References to the messagses to be stored in bins, no duplication of messages) - - - - - 3 - Audit message - - - DB TRANSACTION - - - 4 - Call Bin Processor with the list of account-bins - - - 5 - Pre fetch all transferStateChanges for all the transferIds in the account-bin - - - 6 - Pre fetch all position and settlement account balances for the account-bin - Aquire lock on position - - - loop - [for each account-bin in the list] - - - Note - : Order of processing for various actions - 1. Fulfil - Work in progress is first priority - 2. Abort & Timeout - Freeing funds for future transfers is priority before tackling new requests - 3. Prepare - Processing new requests is last priority - - - 7 - Process Fulfil Bin - - - Input: Bin, Pre-fetched account balances and transferStateChanges - Output: Accumulated changes in position and transferStateChanges - - - 8 - Result - - - 9 - Process Abort Bin - - - Input: Bin, previously accumulated account balances and transferStateChanges - Output: Accumulated changes in position and transferStateChanges - - - 10 - Result - - - 11 - Process Timeout Bin - - - Input: Bin, previously accumulated account balances and transferStateChanges - Output: Accumulated changes in position and transferStateChanges - - - 12 - Result - - - 13 - Process Prepare Batch - - - Input: Bin, previously accumulated account balances and transferStateChanges - Output: Accumulated changes in position and transferStateChanges - - - 14 - Result - - - 15 - Insert accumulated transferStateChanges - - - 16 - Update accumulated position - - - 17 - Return bins with results - - - alt - [return is true] - - - - - 18 - Commit Kafka Offset - - - - - 19 - Commit DB Transaction - - - loop - [for each result in the account-bin] - - - - - 20 - Produce notification message - - - - - 21 - Audit notification - - [return is false or unhandled exception] - - - - - 22 - Rollback DB Transaction - - - - - 23 - Audit error + 1.3.0. Position Messages Binning + + Central Service + + + + + + + + + + + + + + + + + + + + + Position Handler + + + Position Handler + + + Domain Bin Processor + + + Domain Bin Processor + + + Fulfil Domain + + + Fulfil Domain + + + Abort Domain + + + Abort Domain + + + Timeout Domain + + + Timeout Domain + + + Prepare Domain + + + Prepare Domain + + + Transfer Facade + + + Transfer Facade + + + Account Facade + + + Account Facade + + + + + Notification-Topic + + + Notification-Topic + + + + + + + + Position Handler Consume + + + + + 1 + Consumes messages from the Position topic + and stores them in memory + + + loop + [for each message in the list] + + + + + 2 + Assign message to account-bin by accountID and child action-bin by event-action + (References to the messagses to be stored in bins, no duplication of messages) + + + + + 3 + Audit message + + + DB TRANSACTION + + + 4 + Call Bin Processor with the list of account-bins + + + 5 + Pre fetch all transferStateChanges for all the transferIds in the account-bin + + + 6 + Pre fetch all position and settlement account balances for the account-bin + Acquire lock on position + + + loop + [for each account-bin in the list] + + + Note + : Order of processing for various actions + 1. Fulfil - Work in progress is first priority + 2. Abort & Timeout - Freeing funds for future transfers is priority before tackling new requests + 3. Prepare - Processing new requests is last priority + + + 7 + Process Fulfil Bin + + + Input: Bin, Pre-fetched account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + + + 8 + Result + + + 9 + Process Abort Bin + + + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + + + 10 + Result + + + 11 + Process Timeout Bin + + + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + + + 12 + Result + + + 13 + Process Prepare Batch + + + Input: Bin, previously accumulated account balances and transferStateChanges + Output: Accumulated changes in position and transferStateChanges + + + 14 + Result + + + 15 + Insert accumulated transferStateChanges + + + 16 + Update accumulated position + + + 17 + Return bins with results + + + alt + [return is true] + + + + + 18 + Commit Kafka Offset + + + + + 19 + Commit DB Transaction + + + loop + [for each result in the account-bin] + + + + + 20 + Produce notification message + + + + + 21 + Audit notification + + [return is false or unhandled exception] + + + + + 22 + Rollback DB Transaction + + + + + 23 + Audit error diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml index 05ef3f914..422b63ddf 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml @@ -67,6 +67,32 @@ group Fulfil Position Batch Processing createdDate = new Date() (Get time here or while executing the query in handler ???) } end note + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: resultMessage should be populated and add to **resultMessages** + rnote right of DOMAIN_POSITION_FULFIL #yellow + **resultMessage**: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: commit || reserve, + createdAt: , + state: { + status: "success", + code: 0 + } + } + } + end note end DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: Return the following rnote right of DOMAIN_POSITION_FULFIL #lightblue @@ -74,31 +100,8 @@ group Fulfil Position Batch Processing **accumulatedPosition**: runningPosition, **transferStateChanges**, **participantPositionChanges**, - - Message: - { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: - }, - metadata: { - event: { - id: , - responseTo: , - type: transfer, - action: commit || reserve, - createdAt: , - state: { - status: "success", - code: 0 - } - } - } - } + **resultMessages**, (The list of messages to be sent to the kafka topic) + } end note end deactivate DOMAIN_POSITION_FULFIL diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg index 258143307..046731962 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg @@ -1,129 +1,133 @@ - - - - - - - - - - + + + - 1.3.2. Position Fulfil Domain v1.1 - - - - - Position Fulfil Domain - - - Position Fulfil Domain - - - - - INPUT: bin, accumulatedPosition, transferStateChanges - - - Fulfil Position Batch Processing - - - - - 1 - runningPosition - = accumulatedPosition - - - loop - [for each message in the bin] - - - - - 2 - Validate current state (transferState is 'RECEIVED-FULFIL') - Error code: - 2001 - against failing transfers - Batch is not rejected as a whole - - - - - 3 - runningPosition - = runningPosition - payload.amount.amount - - - - - 4 - transferStateChange should be populated and add to - transferStateChanges - - transferStateChange - : { - - transferStateId - : 'COMMITTED' - } - - - - - 5 - participantPositionChange should be populated and add to - participantPositionChanges - - participantPositionChange - : { - transferStateChangeId: We need this, may be need to update in the handler (???) - value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) - } - - - - - 6 - Return the following - - { - - accumulatedPosition - : runningPosition, - - transferStateChanges - , - - participantPositionChanges - , - - Message: - { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: transfer, - action: commit || reserve, - createdAt: <timestamp>, - state: { - status: "success", - code: 0 - } - } - } - } + 1.3.2. Position Fulfil Domain v1.1 + + + + + Position Fulfil Domain + + + Position Fulfil Domain + + + + + INPUT: bin, accumulatedPosition, transferStateChanges + + + Fulfil Position Batch Processing + + + + + 1 + runningPosition + = accumulatedPosition + + + loop + [for each message in the bin] + + + + + 2 + Validate current state (transferState is 'RECEIVED-FULFIL') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole + + + + + 3 + runningPosition + = runningPosition - payload.amount.amount + + + + + 4 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + : 'COMMITTED' + } + + + + + 5 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + + + + + 6 + resultMessage should be populated and add to + resultMessages + + resultMessage + : + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: commit || reserve, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + + + + + 7 + Return the following + + { +      + accumulatedPosition + : runningPosition, +      + transferStateChanges + , +      + participantPositionChanges + , +      + resultMessages + , (The list of messages to be sent to the kafka topic) + } diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml index 445c04c5f..9cf33ac9b 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml @@ -27,7 +27,7 @@ @startuml ' declate title -title 1.3.1. Position Prepare Facade +title 1.3.1. Position Prepare Domain autonumber @@ -39,234 +39,142 @@ autonumber ' database - Database Persistence Store ' declare actors -control "Position Prepare Facade" as FACADE_POSITION_PREPARE -collections "Notification-Topic" as TOPIC_NOTIFICATIONS -database "Central Store" as DB - -box "Central Service" #LightYellow - participant FACADE_POSITION_PREPARE - participant DB - participant TOPIC_NOTIFICATIONS -end box +control "Position Prepare Domain" as DOMAIN_POSITION_PREPARE ' start flow -activate FACADE_POSITION_PREPARE +activate DOMAIN_POSITION_PREPARE +rnote right of DOMAIN_POSITION_PREPARE #lightblue + INPUT: + messages, + accumulatedPositionValue, + accumulatedPositionReservedValue, + settlementPositionValue, + participantLimitValue, + accumulatedTransferStateChanges +end note group Prepare Position Batch Processing - ' DB Trans: This is where 1st DB Transaction would start in 2 DB transacation future model for horizontal scaling - FACADE_POSITION_PREPARE -> FACADE_POSITION_PREPARE: Loop through batch and build list of transferIds and calculate sumTransfersInBatch,\nchecking all in Batch are for the correct Paricipant and Currency\nError code: 2001, 3100 - FACADE_POSITION_PREPARE -> DB: Retrieve current state of all transfers in array from DB with select whereIn\n(FYI: The two DB transaction model needs to add a mini-state step here (RECEIVED_PREPARE => RECEIVDED_PREPARE_PROCESSING) so that the transfers are left alone if processing has started) - activate DB - hnote over DB #lightyellow - transferStateChange - transferParticipant - end note - DB --> FACADE_POSITION_PREPARE: Return current state of all selected transfers from DB - deactivate DB - - FACADE_POSITION_PREPARE <-> FACADE_POSITION_PREPARE: Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole. - - note right of FACADE_POSITION_PREPARE #lightgray - List of transfers used during processing - **reservedTransfers** is list of transfers to be processed in the batch - **abortedTransfers** is the list of transfers in the incorrect state going into the process. Currently the transferStateChange is set to ABORTED - this should only be done if not already in a final state (idempotency) - **processedTransfers** is the list of transfers that have gone through the position management algorithm. Both successful and failed trasnfers appear here as the order and "running position" against each is necessary for reconciliation - - Scalar intermidate values used in the algorithm - **transferAmount** = payload.amount.amount - **sumTransfersInBatch** = SUM amount against each Transfer in batch - **currentPosition** = participantPosition.value - **reservedPosition** = participantPosition.{original}reservedValue - **effectivePosition** = currentPosition + reservedPosition - **heldPosition** = effectivePosition + sumTransfersInBatch - **availablePosition** = //if settlement model delay is IMMEDIATE then:// settlementBalance + participantLimit(NetDebitCap) - effectivePosition, //otherwise:// participantLimit(NetDebitCap) - effectivePosition - **sumReserved** = SUM of transfers that have met rule criteria and processed - end note - note over FACADE_POSITION_PREPARE,DB - Going to reserve the sum of the valid transfers in the batch against the Participants Positon in the Currency of this batch - and calculate the available position for the Participant to use - end note - FACADE_POSITION_PREPARE -> DB: Select effectivePosition FOR UPDATE from DB for Payer - activate DB - hnote over DB #lightyellow - participantPosition - end note - DB --> FACADE_POSITION_PREPARE: Return effectivePosition (currentPosition and reservedPosition) from DB for Payer - deactivate DB - FACADE_POSITION_PREPARE -> FACADE_POSITION_PREPARE: Increment reservedValue to heldPosition\n(reservedValue = reservedPosition + sumTransfersInBatch) - FACADE_POSITION_PREPARE -> DB: Persist reservedValue - activate DB - hnote over DB #lightyellow - UPDATE **participantPosition** - SET reservedValue += sumTransfersInBatch - end note - deactivate DB - ' DB Trans: This is where 1st DB Transaction would end in 2 DB transacation future model for horizontal scaling - - - FACADE_POSITION_PREPARE -> DB: Request position limits for Payer Participant - activate DB - hnote over DB #lightyellow - FROM **participantLimit** - WHERE participantLimit.limitTypeId = 'NET-DEBIT-CAP' - AND participantLimit.participantId = payload.payerFsp - AND participantLimit.currencyId = payload.amount.currency + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **effectivePosition** = accumulatedPosition + accumulatedPositionReservedValue + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **availablePosition** + note right of DOMAIN_POSITION_PREPARE #lightgray + **availablePosition** + if settlement model delay is IMMEDIATE + then: + settlementPositionValue + participantLimitValue - effectivePosition + otherwise: + participantLimitValue - effectivePosition end note - DB --> FACADE_POSITION_PREPARE: Return position limits - deactivate DB - FACADE_POSITION_PREPARE <-> FACADE_POSITION_PREPARE: **availablePosition** = //if settlement model delay is IMMEDIATE then://\n settlementBalance + participantLimit(NetDebitCap) - effectivePosition\n //otherwise://\n participantLimit(NetDebitCap) - effectivePosition\n(same as = (settlementBalance?) + netDebitCap - currentPosition - reservedPosition) - note over FACADE_POSITION_PREPARE,DB - For each transfer in the batch, validate the availablility of position to meet the transfer amount - this will be as per the position algorithm documented below - end note - FACADE_POSITION_PREPARE <-> FACADE_POSITION_PREPARE: Validate availablePosition for each tranfser (see algorithm below)\nError code: 4001 - note right of FACADE_POSITION_PREPARE #lightgray - 01: sumReserved = 0 // Record the sum of the transfers we allow to progress to RESERVED - 02: sumProcessed =0 // Record the sum of the transfers already processed in this batch - 03: processedTransfers = {} // The list of processed transfers - so that we can store the additional information around the decision. Most importantly the "running" position - 04: foreach transfer in reservedTransfers - 05: sumProcessed += transfer.amount // the total processed so far **(NEED TO UPDATE IN CODE)** - 06: if availablePosition >= transfer.amount - 07: transfer.state = "RESERVED" - 08: availablePosition -= preparedTransfer.amount - 09: sumRESERVED += preparedTransfer.amount - 10: else - 11: preparedTransfer.state = "ABORTED" - 12: preparedTransfer.reason = "Net Debit Cap exceeded by this request at this time, please try again later" - 13: end if - 14: runningPosition = currentPosition + sumReserved // the initial value of the Participants position plus the total value that has been accepted in the batch so far - 15: runningReservedValue = sumTransfersInBatch - sumProcessed + reservedPosition **(NEED TO UPDATE IN CODE)** // the running down of the total reserved value at the begining of the batch. - 16: Add transfer to the processedTransfer list recording the transfer state and running position and reserved values { transferState, transfer, rawMessage, transferAmount, runningPosition, runningReservedValue } - 16: end foreach - end note - note over FACADE_POSITION_PREPARE,DB - Once the outcome for all transfers is known,update the Participant's position and remove the reserved amount associated with the batch - (If there are any alarm limits, process those returning limits in which the threshold has been breached) - Do a bulk insert of the trasnferStateChanges associated with processing, using the result to complete the participantPositionChange and bulk insert of these to persist the running position - end note - FACADE_POSITION_PREPARE->FACADE_POSITION_PREPARE: Assess any limit thresholds on the final position\nadding to alarm list if triggered - - ' DB Trans: This is where 2nd DB Transaction would start in 2 DB transacation future model for horizontal scaling - FACADE_POSITION_PREPARE->DB: Persist latest position **value** and **reservedValue** to DB for Payer - hnote over DB #lightyellow - UPDATE **participantPosition** - SET value += sumRESERVED, - reservedValue -= sumTransfersInBatch - end note - activate DB - deactivate DB - - FACADE_POSITION_PREPARE -> DB: Bulk persist transferStateChange for all processedTransfers - hnote over DB #lightyellow - batch INSERT **transferStateChange** - select for update from transfer table where transferId in ([transferBatch.transferId,...]) - build list of transferStateChanges from transferBatch - - end note - activate DB - deactivate DB - - FACADE_POSITION_PREPARE->FACADE_POSITION_PREPARE: Populate batchParticipantPositionChange from the resultant transferStateChange and the earlier processedTransfer list - - note right of FACADE_POSITION_PREPARE #lightgray - Effectively: - SET transferStateChangeId = processedTransfer.transferStateChangeId, - participantPositionId = preparedTransfer.participantPositionId, - value = preparedTransfer.positionValue, - reservedValue = preparedTransfer.positionReservedValue - end note - FACADE_POSITION_PREPARE -> DB: Bulk persist the participant position change for all processedTransfers - hnote over DB #lightyellow - batch INSERT **participantPositionChange** - end note - activate DB - deactivate DB - ' DB Trans: This is where 2nd DB Transaction would end in 2 DB transacation future model for horizontal scaling - - deactivate FACADE_POSITION_PREPARE - alt Calculate & Validate Latest Position Prepare (success) - note right of FACADE_POSITION_PREPARE #yellow - Message: - { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: - }, - metadata: { - event: { - id: , - responseTo: , - type: transfer, - action: prepare, - createdAt: , - state: { - status: "success", - code: 0 + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **processedTransfers** = {} (The list of processed transfers - so that we can store the additional information around the decision.) + loop for each message in the bin + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole. + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: transferStateChange should be populated and add to **transferStateChanges**, build list of transferStateChanges from transferBatch + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Validate availablePosition for each tranfser (see algorithm below)\nError code: 4001 + + alt if availablePosition >= payload.amount.amount + note right of DOMAIN_POSITION_PREPARE #lightgray + transferStateId = **"RESERVED"** + availablePosition = availablePosition - preparedTransfer.amount + end note + note right of DOMAIN_POSITION_PREPARE #yellow + resultMessage: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: + }, + metadata: { + event: { + id: , + responseTo: , + type: transfer, + action: prepare, + createdAt: , + state: { + status: "success", + code: 0 + } } } } - } - end note - FACADE_POSITION_PREPARE -> TOPIC_NOTIFICATIONS: Publish Notification event\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS - else Calculate & Validate Latest Position Prepare (failure) - note right of FACADE_POSITION_PREPARE #red: Validation failure! - - group Persist Transfer State (with transferState='ABORTED' on position check fail) - FACADE_POSITION_PREPARE -> DB: Request to persist transfer\nError code: 2003 - activate DB - note right of FACADE_POSITION_PREPARE #lightgray - transferStateChange.state = "ABORTED", - transferStateChange.reason = "Net Debit Cap exceeded by this request at this time, please try again later" end note - hnote over DB #lightyellow - transferStateChange + else + note right of DOMAIN_POSITION_PREPARE #red: Validation failure! + note right of DOMAIN_POSITION_PREPARE #lightgray + transferStateId = **"ABORTED"** (This should only be done if not already in a final state (idempotency) ???) + reason = "Net Debit Cap exceeded by this request at this time, please try again later" end note - DB --> FACADE_POSITION_PREPARE: Return success - deactivate DB - end - - note right of FACADE_POSITION_PREPARE #yellow - Message: - { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: { - "errorInformation": { - "errorCode": 4001, - "errorDescription": "Payer FSP insufficient liquidity", - "extensionList": - } - }, - metadata: { - event: { - id: , - responseTo: , - type: notification, - action: prepare, - createdAt: , - state: { - status: 'error', - code: - description: + note right of DOMAIN_POSITION_PREPARE #yellow + resultMessage: + { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: prepare, + createdAt: , + state: { + status: 'error', + code: + description: + } } } } + end note + end + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: resultMessage should be added to **resultMessages** + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: transferStateChange should be populated and add to **transferStateChanges** + hnote right of DOMAIN_POSITION_PREPARE #lightyellow + **transferStateChange**: { + **transferStateId**, + reason + } + end note + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: participantPositionChange should be populated and add to **participantPositionChanges** + hnote right of DOMAIN_POSITION_PREPARE #lightyellow + **participantPositionChange**: { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = availablePosition, + reservedValue = accumulatedPositionReservedValue + createdDate = new Date() (Get time here or while executing the query in handler ???) } end note - FACADE_POSITION_PREPARE -> TOPIC_NOTIFICATIONS: Publish Notification (failure) event for Payer\nError code: 2003 - activate TOPIC_NOTIFICATIONS - deactivate TOPIC_NOTIFICATIONS - deactivate FACADE_POSITION_PREPARE + + DOMAIN_POSITION_PREPARE->DOMAIN_POSITION_PREPARE: Assess any limit thresholds on the position\nadding to alarm list if triggered (???) + note right of DOMAIN_POSITION_PREPARE + If there are any alarm limits, process those returning limits in which the threshold has been breached + end note + end + + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Return the following + rnote right of DOMAIN_POSITION_PREPARE #lightblue + { + **accumulatedPosition**: availablePosition, + **transferStateChanges**, + **participantPositionChanges**, + **resultMessages**, (The list of messages to be sent to the kafka topic) + } + end note + deactivate DOMAIN_POSITION_PREPARE + end @enduml diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg index 3b8d4251e..c02a9e762 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg @@ -1,371 +1,233 @@ - - - - - - - - - - + + + - 1.3.1. Position Prepare Facade - - Central Service - - - - - - - - - - - - - - - - - - - Position Prepare Facade - - - Position Prepare Facade - - - Central Store - - - Central Store - - - - - Notification-Topic - - - Notification-Topic - - - - - - - - - - - - - - Prepare Position Batch Processing - - - - - 1 - Loop through batch and build list of transferIds and calculate sumTransfersInBatch, - checking all in Batch are for the correct Paricipant and Currency - Error code: - 2001, 3100 - - - 2 - Retrieve current state of all transfers in array from DB with select whereIn - (FYI: The two DB transaction model needs to add a mini-state step here (RECEIVED_PREPARE => RECEIVDED_PREPARE_PROCESSING) so that the transfers are left alone if processing has started) - - transferStateChange - transferParticipant - - - 3 - Return current state of all selected transfers from DB - - - - - 4 - Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE') - Error code: - 2001 - against failing transfers - Batch is not rejected as a whole. - - - List of transfers used during processing - reservedTransfers - is list of transfers to be processed in the batch - abortedTransfers - is the list of transfers in the incorrect state going into the process. Currently the transferStateChange is set to ABORTED - this should only be done if not already in a final state (idempotency) - processedTransfers - is the list of transfers that have gone through the position management algorithm. Both successful and failed trasnfers appear here as the order and "running position" against each is necessary for reconciliation - - Scalar intermidate values used in the algorithm - transferAmount - = payload.amount.amount - sumTransfersInBatch - = SUM amount against each Transfer in batch - currentPosition - = participantPosition.value - reservedPosition - = participantPosition.{original}reservedValue - effectivePosition - = currentPosition + reservedPosition - heldPosition - = effectivePosition + sumTransfersInBatch - availablePosition - = - if settlement model delay is IMMEDIATE then: - settlementBalance + participantLimit(NetDebitCap) - effectivePosition, - otherwise: - participantLimit(NetDebitCap) - effectivePosition - sumReserved - = SUM of transfers that have met rule criteria and processed - - - Going to reserve the sum of the valid transfers in the batch against the Participants Positon in the Currency of this batch - and calculate the available position for the Participant to use - - - 5 - Select effectivePosition FOR UPDATE from DB for Payer - - participantPosition - - - 6 - Return effectivePosition (currentPosition and reservedPosition) from DB for Payer - - - - - 7 - Increment reservedValue to heldPosition - (reservedValue = reservedPosition + sumTransfersInBatch) - - - 8 - Persist reservedValue - - UPDATE - participantPosition - SET reservedValue += sumTransfersInBatch - - - 9 - Request position limits for Payer Participant - - FROM - participantLimit - WHERE participantLimit.limitTypeId = 'NET-DEBIT-CAP' - AND participantLimit.participantId = payload.payerFsp - AND participantLimit.currencyId = payload.amount.currency - - - 10 - Return position limits - - - - - 11 - availablePosition - = - if settlement model delay is IMMEDIATE then: - settlementBalance + participantLimit(NetDebitCap) - effectivePosition - - otherwise: - participantLimit(NetDebitCap) - effectivePosition - (same as = (settlementBalance?) + netDebitCap - currentPosition - reservedPosition) - - - For each transfer in the batch, validate the availablility of position to meet the transfer amount - this will be as per the position algorithm documented below - - - - - 12 - Validate availablePosition for each tranfser (see algorithm below) - Error code: - 4001 - - - 01: sumReserved = 0 // Record the sum of the transfers we allow to progress to RESERVED - 02: sumProcessed =0 // Record the sum of the transfers already processed in this batch - 03: processedTransfers = {} // The list of processed transfers - so that we can store the additional information around the decision. Most importantly the "running" position - 04: foreach transfer in reservedTransfers - 05: sumProcessed += transfer.amount // the total processed so far - (NEED TO UPDATE IN CODE) - 06: if availablePosition >= transfer.amount - 07: transfer.state = "RESERVED" - 08: availablePosition -= preparedTransfer.amount - 09: sumRESERVED += preparedTransfer.amount - 10: else - 11: preparedTransfer.state = "ABORTED" - 12: preparedTransfer.reason = "Net Debit Cap exceeded by this request at this time, please try again later" - 13: end if - 14: runningPosition = currentPosition + sumReserved // the initial value of the Participants position plus the total value that has been accepted in the batch so far - 15: runningReservedValue = sumTransfersInBatch - sumProcessed + reservedPosition - (NEED TO UPDATE IN CODE) - // the running down of the total reserved value at the begining of the batch. - 16: Add transfer to the processedTransfer list recording the transfer state and running position and reserved values { transferState, transfer, rawMessage, transferAmount, runningPosition, runningReservedValue } - 16: end foreach - - - Once the outcome for all transfers is known,update the Participant's position and remove the reserved amount associated with the batch - (If there are any alarm limits, process those returning limits in which the threshold has been breached) - Do a bulk insert of the trasnferStateChanges associated with processing, using the result to complete the participantPositionChange and bulk insert of these to persist the running position - - - - - 13 - Assess any limit thresholds on the final position - adding to alarm list if triggered - - - 14 - Persist latest position - value - and - reservedValue - to DB for Payer - - UPDATE - participantPosition - SET value += sumRESERVED, - reservedValue -= sumTransfersInBatch - - - 15 - Bulk persist transferStateChange for all processedTransfers - - batch INSERT - transferStateChange - select for update from transfer table where transferId in ([transferBatch.transferId,...]) - build list of transferStateChanges from transferBatch - - - - - - 16 - Populate batchParticipantPositionChange from the resultant transferStateChange and the earlier processedTransfer list - - - Effectively: - SET transferStateChangeId = processedTransfer.transferStateChangeId, - participantPositionId = preparedTransfer.participantPositionId, - value = preparedTransfer.positionValue, - reservedValue = preparedTransfer.positionReservedValue - - - 17 - Bulk persist the participant position change for all processedTransfers - - batch INSERT - participantPositionChange - - - alt - [Calculate & Validate Latest Position Prepare (success)] - - - Message: - { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: transfer, - action: prepare, - createdAt: <timestamp>, - state: { - status: "success", - code: 0 - } - } - } - } - - - 18 - Publish Notification event - Error code: - 2003 - - [Calculate & Validate Latest Position Prepare (failure)] - - - Validation failure! - - - Persist Transfer State (with transferState='ABORTED' on position check fail) - - - 19 - Request to persist transfer - Error code: - 2003 - - - transferStateChange.state = "ABORTED", - transferStateChange.reason = "Net Debit Cap exceeded by this request at this time, please try again later" - - transferStateChange - - - 20 - Return success - - - Message: - { - id: <transferMessage.transferId> - from: <ledgerName>, - to: <transferMessage.payerFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: { - "errorInformation": { - "errorCode": 4001, - "errorDescription": "Payer FSP insufficient liquidity", - "extensionList": <transferMessage.extensionList> - } - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: prepare, - createdAt: <timestamp>, - state: { - status: 'error', - code: <errorInformation.errorCode> - description: <errorInformation.errorDescription> - } - } - } - } - - - 21 - Publish Notification (failure) event for Payer - Error code: - 2003 + 1.3.1. Position Prepare Domain + + + + + + Position Prepare Domain + + + Position Prepare Domain + + + + + INPUT: + messages, + accumulatedPositionValue, + accumulatedPositionReservedValue, + settlementPositionValue, + participantLimitValue, + accumulatedTransferStateChanges + + + Prepare Position Batch Processing + + + + + 1 + effectivePosition + = accumulatedPosition + accumulatedPositionReservedValue + + + + + 2 + availablePosition + + + availablePosition + if settlement model delay is IMMEDIATE + then: + settlementPositionValue + participantLimitValue - effectivePosition + otherwise: + participantLimitValue - effectivePosition + + + + + 3 + processedTransfers + = {} (The list of processed transfers - so that we can store the additional information around the decision.) + + + loop + [for each message in the bin] + + + + + 4 + Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole. + + + + + 5 + transferStateChange should be populated and add to + transferStateChanges + , build list of transferStateChanges from transferBatch + + + + + 6 + Validate availablePosition for each tranfser (see algorithm below) + Error code: + 4001 + + + alt + [if availablePosition >= payload.amount.amount] + + + transferStateId = + "RESERVED" + availablePosition = availablePosition - preparedTransfer.amount + + + resultMessage: + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + + Validation failure! + + + transferStateId = + "ABORTED" + (This should only be done if not already in a final state (idempotency) ???) + reason = "Net Debit Cap exceeded by this request at this time, please try again later" + + + resultMessage: + { + id: <transferMessage.transferId> + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + + + 7 + resultMessage should be added to + resultMessages + + + + + 8 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + , + reason + } + + + + + 9 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = availablePosition, + reservedValue = accumulatedPositionReservedValue + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + + + + + 10 + Assess any limit thresholds on the position + adding to alarm list if triggered (???) + + + If there are any alarm limits, process those returning limits in which the threshold has been breached + + + + + 11 + Return the following + + { +      + accumulatedPosition + : availablePosition, +      + transferStateChanges + , +      + participantPositionChanges + , +      + resultMessages + , (The list of messages to be sent to the kafka topic) + } diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml index cc5a648f2..ff16668b7 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml @@ -66,6 +66,39 @@ group Timeout Reserved Position Batch Processing createdDate = new Date() (Get time here or while executing the query in handler ???) } end note + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: resultMessage should be populated and add to **resultMessages** + note right of DOMAIN_POSITION_TIMEOUT_RESERVED #yellow + **resultMessage**: { + id: + from: , + to: , + type: application/json + content: { + headers: , + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": + } + } + }, + metadata: { + event: { + id: , + responseTo: , + type: notification, + action: abort, + createdAt: , + state: { + status: 'error', + code: + description: + } + } + } + } + end note end DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: Return the following rnote right of DOMAIN_POSITION_TIMEOUT_RESERVED #lightblue @@ -73,37 +106,7 @@ group Timeout Reserved Position Batch Processing **accumulatedPosition**: runningPosition, **transferStateChanges**, **participantPositionChanges**, - - Message: { - id: - from: , - to: , - type: application/json - content: { - headers: , - payload: { - "errorInformation": { - "errorCode": 3300, - "errorDescription": "Transfer expired", - "extensionList": - } - } - }, - metadata: { - event: { - id: , - responseTo: , - type: notification, - action: abort, - createdAt: , - state: { - status: 'error', - code: - description: - } - } - } - } + **resultMessages**, (The list of messages to be sent to the kafka topic) } end note end diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg index 69615f705..7059491e5 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg @@ -1,134 +1,139 @@ - - - - - - - - - - + + + - 1.3.3. Position Timeout Reserved Domain - - - - - Position Timeout Reserved Domain - - - Position Timeout Reserved Domain - - - - - INPUT: bin, accumulatedPosition, transferStateChanges - - - Timeout Reserved Position Batch Processing - - - - - 1 - runningPosition - = accumulatedPosition - - - loop - [for each message in the bin] - - - - - 2 - Validate current state of transfer (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') - Error code: - 2001 - - - - - 3 - runningPosition - = runningPosition - payload.amount.amount - - - - - 4 - transferStateChange should be populated and add to - transferStateChanges - - transferStateChange - : { - - transferStateId - : 'EXPIRED_RESERVED' - } - - - - - 5 - participantPositionChange should be populated and add to - participantPositionChanges - - participantPositionChange - : { - transferStateChangeId: We need this, may be need to update in the handler (???) - value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) - } - - - - - 6 - Return the following - - { - - accumulatedPosition - : runningPosition, - - transferStateChanges - , - - participantPositionChanges - , - - Message: { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: { - "errorInformation": { - "errorCode": 3300, - "errorDescription": "Transfer expired", - "extensionList": <transferMessage.extensionList> - } - } - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: abort, - createdAt: <timestamp>, - state: { - status: 'error', - code: <errorInformation.errorCode> - description: <errorInformation.errorDescription> - } - } - } - } - } + 1.3.3. Position Timeout Reserved Domain + + + + + Position Timeout Reserved Domain + + + Position Timeout Reserved Domain + + + + + INPUT: bin, accumulatedPosition, transferStateChanges + + + Timeout Reserved Position Batch Processing + + + + + 1 + runningPosition + = accumulatedPosition + + + loop + [for each message in the bin] + + + + + 2 + Validate current state of transfer (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') + Error code: + 2001 + + + + + 3 + runningPosition + = runningPosition - payload.amount.amount + + + + + 4 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + : 'EXPIRED_RESERVED' + } + + + + + 5 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = runningPosition, + reservedValue = participantPosition.reservedValue (???) + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + + + + + 6 + resultMessage should be populated and add to + resultMessages + + + resultMessage + : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 3300, + "errorDescription": "Transfer expired", + "extensionList": <transferMessage.extensionList> + } + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + + + 7 + Return the following + + { +      + accumulatedPosition + : runningPosition, +      + transferStateChanges + , +      + participantPositionChanges + , +      + resultMessages + , (The list of messages to be sent to the kafka topic) + } diff --git a/scripts/_build_plantuml.sh b/scripts/_build_plantuml.sh index a7ebe9670..ae08ed0b0 100755 --- a/scripts/_build_plantuml.sh +++ b/scripts/_build_plantuml.sh @@ -35,10 +35,10 @@ function ctrl_c() { docker run -d --rm \ --name puml-local \ -p ${PUML_PORT}:8080 \ - plantuml/plantuml-server:jetty-v1.2020.21 + plantuml/plantuml-server:jetty-v1.2023.10 # Wait for docker to be up -sleep 10 +sleep 5 echo "Searching for ${MODE} files matching pattern: ${PUML_MATCH}" From cc84ec85764084da0ae180aa0c3f10f3bc6b71ab Mon Sep 17 00:00:00 2001 From: Vijay Date: Thu, 7 Sep 2023 12:22:14 +0530 Subject: [PATCH 13/21] chore: re-organised filenames and diagram numbers --- ... => seq-position-1.3.4.1-binning.plantuml} | 2 +- ...g.svg => seq-position-1.3.4.1-binning.svg} | 2 +- ...ition-1.3.4.2-fulfil-v1.1-domain.plantuml} | 2 +- ...q-position-1.3.4.2-fulfil-v1.1-domain.svg} | 2 +- ...eq-position-1.3.4.3-abort-domain.plantuml} | 2 +- ... => seq-position-1.3.4.3-abort-domain.svg} | 2 +- ...-1.3.4.4-timeout-reserved-domain.plantuml} | 2 +- ...ition-1.3.4.4-timeout-reserved-domain.svg} | 2 +- ...-position-1.3.4.5-prepare-domain.plantuml} | 12 +- ...> seq-position-1.3.4.5-prepare-domain.svg} | 424 +++++++++--------- .../1.3.4-position-handler-consume-binning.md | 14 +- 11 files changed, 231 insertions(+), 235 deletions(-) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-binning.plantuml => seq-position-1.3.4.1-binning.plantuml} (99%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-binning.svg => seq-position-1.3.4.1-binning.svg} (99%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-fulfil-v1.1-domain.plantuml => seq-position-1.3.4.2-fulfil-v1.1-domain.plantuml} (99%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-fulfil-v1.1-domain.svg => seq-position-1.3.4.2-fulfil-v1.1-domain.svg} (99%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-abort-domain.plantuml => seq-position-1.3.4.3-abort-domain.plantuml} (99%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-abort-domain.svg => seq-position-1.3.4.3-abort-domain.svg} (99%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-timeout-reserved-domain.plantuml => seq-position-1.3.4.4-timeout-reserved-domain.plantuml} (99%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-timeout-reserved-domain.svg => seq-position-1.3.4.4-timeout-reserved-domain.svg} (99%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-prepare-domain.plantuml => seq-position-1.3.4.5-prepare-domain.plantuml} (92%) rename docs/technical/central-ledger/assets/diagrams/sequence/{seq-position-1.3.4-prepare-domain.svg => seq-position-1.3.4.5-prepare-domain.svg} (55%) diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.plantuml similarity index 99% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.plantuml index 9c1809339..1f58c34eb 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.plantuml @@ -25,7 +25,7 @@ @startuml ' declate title -title 1.3.0. Position Messages Binning +title 1.3.4.1. Position Messages Binning autonumber diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.svg similarity index 99% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.svg index 7360029e6..f920aa389 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-binning.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.svg @@ -2,7 +2,7 @@ - 1.3.0. Position Messages Binning + 1.3.4.1. Position Messages Binning Central Service diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.plantuml similarity index 99% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.plantuml index 422b63ddf..37ebe6a5e 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.plantuml @@ -27,7 +27,7 @@ @startuml ' declate title -title 1.3.2. Position Fulfil Domain v1.1 +title 1.3.4.2. Position Fulfil Domain v1.1 autonumber diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.svg similarity index 99% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.svg index 046731962..642d6ab47 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.svg @@ -2,7 +2,7 @@ - 1.3.2. Position Fulfil Domain v1.1 + 1.3.4.2. Position Fulfil Domain v1.1 diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.plantuml similarity index 99% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.plantuml index d5fd8f511..9bee889a6 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.plantuml @@ -27,7 +27,7 @@ @startuml ' declate title -title 1.3.3. Position Abort Domain +title 1.3.4.3. Position Abort Domain autonumber diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.svg similarity index 99% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.svg index e35373de8..976c6ea1c 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.svg @@ -2,7 +2,7 @@ - 1.3.3. Position Abort Domain + 1.3.4.3. Position Abort Domain diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.plantuml similarity index 99% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.plantuml index ff16668b7..4b673c1f8 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.plantuml @@ -27,7 +27,7 @@ @startuml ' declate title -title 1.3.3. Position Timeout Reserved Domain +title 1.3.4.4. Position Timeout Reserved Domain autonumber diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.svg similarity index 99% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.svg index 7059491e5..547b5b561 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.svg @@ -2,7 +2,7 @@ - 1.3.3. Position Timeout Reserved Domain + 1.3.4.4. Position Timeout Reserved Domain diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml similarity index 92% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml index 9cf33ac9b..0a8f586ae 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml @@ -27,7 +27,7 @@ @startuml ' declate title -title 1.3.1. Position Prepare Domain +title 1.3.4.5. Position Prepare Domain autonumber @@ -53,8 +53,12 @@ rnote right of DOMAIN_POSITION_PREPARE #lightblue accumulatedTransferStateChanges end note group Prepare Position Batch Processing + note right of DOMAIN_POSITION_PREPARE #lightgray + **Note:** The **reservedValue** field in database was used in previous position-prepare batching algorithm. + That seems unneccesary here as we are doing only calculation and update the position in a database transaction. + end note DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **effectivePosition** = accumulatedPosition + accumulatedPositionReservedValue - DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **availablePosition** + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Calculate **availablePosition** note right of DOMAIN_POSITION_PREPARE #lightgray **availablePosition** if settlement model delay is IMMEDIATE @@ -63,11 +67,9 @@ group Prepare Position Batch Processing otherwise: participantLimitValue - effectivePosition end note - DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **processedTransfers** = {} (The list of processed transfers - so that we can store the additional information around the decision.) loop for each message in the bin DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole. - DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: transferStateChange should be populated and add to **transferStateChanges**, build list of transferStateChanges from transferBatch - DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Validate availablePosition for each tranfser (see algorithm below)\nError code: 4001 + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **Liquidity Check** - Validate availablePosition for each tranfser (see algorithm below)\nError code: 4001 alt if availablePosition >= payload.amount.amount note right of DOMAIN_POSITION_PREPARE #lightgray diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg similarity index 55% rename from docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg rename to docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg index c02a9e762..b141fc6b8 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg @@ -1,20 +1,20 @@ - + - 1.3.1. Position Prepare Domain - - - - - + 1.3.4.5. Position Prepare Domain + + + + + Position Prepare Domain - Position Prepare Domain - - - + Position Prepare Domain + + + INPUT: messages, @@ -24,210 +24,204 @@ participantLimitValue, accumulatedTransferStateChanges - + Prepare Position Batch Processing - - - - - 1 - effectivePosition - = accumulatedPosition + accumulatedPositionReservedValue - - - - - 2 - availablePosition - - - availablePosition - if settlement model delay is IMMEDIATE - then: - settlementPositionValue + participantLimitValue - effectivePosition - otherwise: - participantLimitValue - effectivePosition - - - - - 3 - processedTransfers - = {} (The list of processed transfers - so that we can store the additional information around the decision.) - - - loop - [for each message in the bin] - - - - - 4 - Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE') - Error code: - 2001 - against failing transfers - Batch is not rejected as a whole. - - - - - 5 - transferStateChange should be populated and add to - transferStateChanges - , build list of transferStateChanges from transferBatch - - - - - 6 - Validate availablePosition for each tranfser (see algorithm below) - Error code: - 4001 - - - alt - [if availablePosition >= payload.amount.amount] - - - transferStateId = - "RESERVED" - availablePosition = availablePosition - preparedTransfer.amount - - - resultMessage: - { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: transfer, - action: prepare, - createdAt: <timestamp>, - state: { - status: "success", - code: 0 - } - } - } - } - - - - Validation failure! - - - transferStateId = - "ABORTED" - (This should only be done if not already in a final state (idempotency) ???) - reason = "Net Debit Cap exceeded by this request at this time, please try again later" - - - resultMessage: - { - id: <transferMessage.transferId> - from: <ledgerName>, - to: <transferMessage.payerFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: { - "errorInformation": { - "errorCode": 4001, - "errorDescription": "Payer FSP insufficient liquidity", - "extensionList": <transferMessage.extensionList> - } - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: prepare, - createdAt: <timestamp>, - state: { - status: 'error', - code: <errorInformation.errorCode> - description: <errorInformation.errorDescription> - } - } - } - } - - - - - 7 - resultMessage should be added to - resultMessages - - - - - 8 - transferStateChange should be populated and add to - transferStateChanges - - transferStateChange - : { -      - transferStateId - , - reason - } - - - - - 9 - participantPositionChange should be populated and add to - participantPositionChanges - - participantPositionChange - : { - transferStateChangeId: We need this, may be need to update in the handler (???) - value = availablePosition, - reservedValue = accumulatedPositionReservedValue - createdDate = new Date() (Get time here or while executing the query in handler ???) - } - - - - - 10 - Assess any limit thresholds on the position - adding to alarm list if triggered (???) - - - If there are any alarm limits, process those returning limits in which the threshold has been breached - - - - - 11 - Return the following - - { -      - accumulatedPosition - : availablePosition, -      - transferStateChanges - , -      - participantPositionChanges - , -      - resultMessages - , (The list of messages to be sent to the kafka topic) - } + + + Note: + The + reservedValue + field in database was used in previous position-prepare batching algorithm. + That seems unneccesary here as we are doing only calculation and update the position in a database transaction. + + + + + 1 + effectivePosition + = accumulatedPosition + accumulatedPositionReservedValue + + + + + 2 + Calculate + availablePosition + + + availablePosition + if settlement model delay is IMMEDIATE + then: + settlementPositionValue + participantLimitValue - effectivePosition + otherwise: + participantLimitValue - effectivePosition + + + loop + [for each message in the bin] + + + + + 3 + Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole. + + + + + 4 + Liquidity Check + - Validate availablePosition for each tranfser (see algorithm below) + Error code: + 4001 + + + alt + [if availablePosition >= payload.amount.amount] + + + transferStateId = + "RESERVED" + availablePosition = availablePosition - preparedTransfer.amount + + + resultMessage: + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + + Validation failure! + + + transferStateId = + "ABORTED" + (This should only be done if not already in a final state (idempotency) ???) + reason = "Net Debit Cap exceeded by this request at this time, please try again later" + + + resultMessage: + { + id: <transferMessage.transferId> + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + + + 5 + resultMessage should be added to + resultMessages + + + + + 6 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + , + reason + } + + + + + 7 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: We need this, may be need to update in the handler (???) + value = availablePosition, + reservedValue = accumulatedPositionReservedValue + createdDate = new Date() (Get time here or while executing the query in handler ???) + } + + + + + 8 + Assess any limit thresholds on the position + adding to alarm list if triggered (???) + + + If there are any alarm limits, process those returning limits in which the threshold has been breached + + + + + 9 + Return the following + + { +      + accumulatedPosition + : availablePosition, +      + transferStateChanges + , +      + participantPositionChanges + , +      + resultMessages + , (The list of messages to be sent to the kafka topic) + } diff --git a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md index 5cdacc747..7be83664f 100644 --- a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md +++ b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md @@ -52,16 +52,16 @@ Sequence design diagram for Position Handler Consume process. ## Sequence Diagrams ### Message Consumption and Binning -![seq-position-1.3.4-binning.svg](../assets/diagrams/sequence/seq-position-1.3.4-binning.svg) - -### Position-Prepare Domain -![seq-position-1.3.4-prepare-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-prepare-domain.svg) +![seq-position-1.3.4.1-binning.svg](../assets/diagrams/sequence/seq-position-1.3.4.1-binning.svg) ### Position-Fulfil Domain -![seq-position-1.3.4-fulfil-v1.1-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-fulfil-v1.1-domain.svg) +![seq-position-1.3.4.2-fulfil-v1.1-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.svg) ### Position-Abort Domain -![seq-position-1.3.4-abort-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-abort-domain.svg) +![seq-position-1.3.4.3-abort-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.svg) ### Position-Timeout Domain -![seq-position-1.3.4-timeout-reserved-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4-timeout-reserved-domain.svg) +![seq-position-1.3.4.4-timeout-reserved-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.svg) + +### Position-Prepare Domain +![seq-position-1.3.4.5-prepare-domain.svg](../assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg) \ No newline at end of file From 971e84d0c0c3a3acb1d8385bb6b08fdad22b9d68 Mon Sep 17 00:00:00 2001 From: Vijay Date: Thu, 7 Sep 2023 22:15:29 +0530 Subject: [PATCH 14/21] feat: refined seq diagrams --- .../seq-position-1.3.4.1-binning.plantuml | 10 +- .../sequence/seq-position-1.3.4.1-binning.svg | 316 +++++++++--------- ...sition-1.3.4.2-fulfil-v1.1-domain.plantuml | 9 +- ...eq-position-1.3.4.2-fulfil-v1.1-domain.svg | 118 +++---- ...seq-position-1.3.4.3-abort-domain.plantuml | 8 +- .../seq-position-1.3.4.3-abort-domain.svg | 299 +++++++++-------- ...n-1.3.4.4-timeout-reserved-domain.plantuml | 9 +- ...sition-1.3.4.4-timeout-reserved-domain.svg | 106 +++--- ...q-position-1.3.4.5-prepare-domain.plantuml | 5 +- .../seq-position-1.3.4.5-prepare-domain.svg | 303 ++++++++--------- 10 files changed, 600 insertions(+), 583 deletions(-) diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.plantuml index 1f58c34eb..379a798b3 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.plantuml @@ -73,8 +73,8 @@ group Position Handler Consume group DB TRANSACTION POS_HANDLER -> BIN_PROCESSOR: Call Bin Processor with the list of account-bins - BIN_PROCESSOR -> FACADE_TRANSFER: Pre fetch all transferStateChanges for all the transferIds in the account-bin - BIN_PROCESSOR -> FACADE_ACCOUNT: Pre fetch all position and settlement account balances for the account-bin\nAcquire lock on position + BIN_PROCESSOR -> FACADE_TRANSFER: Pre Bulk fetch all transferStateChanges for all the transferIds in the account-bin + BIN_PROCESSOR -> FACADE_ACCOUNT: Pre Bulk fetch all position and settlement account balances for the account-bin\nAcquire lock on position loop for each account-bin in the list note right of BIN_PROCESSOR #lightblue @@ -119,8 +119,10 @@ group Position Handler Consume activate DOMAIN_PREPARE DOMAIN_PREPARE --> BIN_PROCESSOR: Result deactivate DOMAIN_PREPARE - BIN_PROCESSOR -> FACADE_TRANSFER: Insert accumulated transferStateChanges - BIN_PROCESSOR -> FACADE_ACCOUNT: Update accumulated position + BIN_PROCESSOR -> FACADE_TRANSFER: Bulk insert accumulated transferStateChanges + BIN_PROCESSOR -> FACADE_TRANSFER: Bulk get the transferStateChangeIds for transferids using select whereIn + BIN_PROCESSOR -> BIN_PROCESSOR: Mutate accumulated positionChanges with transferStateChangeIds + BIN_PROCESSOR -> FACADE_ACCOUNT: Bulk insert accumulated positionChanges end BIN_PROCESSOR --> POS_HANDLER: Return bins with results diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.svg index f920aa389..e0162e299 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.1-binning.svg @@ -1,91 +1,91 @@ - + - 1.3.4.1. Position Messages Binning - - Central Service - - - - - - + 1.3.4.1. Position Messages Binning + + Central Service + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + Position Handler - Position Handler - - + Position Handler + + Domain Bin Processor - Domain Bin Processor - - - Fulfil Domain - - - Fulfil Domain - - - Abort Domain - - - Abort Domain - - - Timeout Domain - - - Timeout Domain - - - Prepare Domain - - - Prepare Domain - - - Transfer Facade - - - Transfer Facade - - - Account Facade - - - Account Facade - - - - - Notification-Topic - - - Notification-Topic - - - - - + Domain Bin Processor + + + Fulfil Domain + + + Fulfil Domain + + + Abort Domain + + + Abort Domain + + + Timeout Domain + + + Timeout Domain + + + Prepare Domain + + + Prepare Domain + + + Transfer Facade + + + Transfer Facade + + + Account Facade + + + Account Facade + + + + + Notification-Topic + + + Notification-Topic + + + + + - + Position Handler Consume @@ -112,23 +112,23 @@ 3 Audit message - + DB TRANSACTION 4 Call Bin Processor with the list of account-bins - - + + 5 - Pre fetch all transferStateChanges for all the transferIds in the account-bin - - + Pre Bulk fetch all transferStateChanges for all the transferIds in the account-bin + + 6 - Pre fetch all position and settlement account balances for the account-bin + Pre Bulk fetch all position and settlement account balances for the account-bin Acquire lock on position - + loop [for each account-bin in the list] @@ -138,8 +138,8 @@ 1. Fulfil - Work in progress is first priority 2. Abort & Timeout - Freeing funds for future transfers is priority before tackling new requests 3. Prepare - Processing new requests is last priority - - + + 7 Process Fulfil Bin @@ -147,11 +147,11 @@ Input: Bin, Pre-fetched account balances and transferStateChanges Output: Accumulated changes in position and transferStateChanges - + 8 Result - - + + 9 Process Abort Bin @@ -159,11 +159,11 @@ Input: Bin, previously accumulated account balances and transferStateChanges Output: Accumulated changes in position and transferStateChanges - + 10 Result - - + + 11 Process Timeout Bin @@ -171,11 +171,11 @@ Input: Bin, previously accumulated account balances and transferStateChanges Output: Accumulated changes in position and transferStateChanges - + 12 Result - - + + 13 Process Prepare Batch @@ -183,66 +183,76 @@ Input: Bin, previously accumulated account balances and transferStateChanges Output: Accumulated changes in position and transferStateChanges - + 14 Result - - + + 15 - Insert accumulated transferStateChanges - - + Bulk insert accumulated transferStateChanges + + 16 - Update accumulated position - - - 17 - Return bins with results - - - alt - [return is true] - - - - - 18 - Commit Kafka Offset - - - - - 19 - Commit DB Transaction - - - loop - [for each result in the account-bin] - - - - - 20 - Produce notification message - - - - - 21 - Audit notification - - [return is false or unhandled exception] - - - - - 22 - Rollback DB Transaction - - - - - 23 - Audit error + Bulk get the transferStateChangeIds for transferids using select whereIn + + + + + 17 + Mutate accumulated positionChanges with transferStateChangeIds + + + 18 + Bulk insert accumulated positionChanges + + + 19 + Return bins with results + + + alt + [return is true] + + + + + 20 + Commit Kafka Offset + + + + + 21 + Commit DB Transaction + + + loop + [for each result in the account-bin] + + + + + 22 + Produce notification message + + + + + 23 + Audit notification + + [return is false or unhandled exception] + + + + + 24 + Rollback DB Transaction + + + + + 25 + Audit error diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.plantuml index 37ebe6a5e..1f9ea8dfa 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.plantuml @@ -48,10 +48,10 @@ rnote right of DOMAIN_POSITION_FULFIL #lightblue INPUT: bin, accumulatedPosition, transferStateChanges end note group Fulfil Position Batch Processing - DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: **runningPosition** = accumulatedPosition + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: **runningPosition** = accumulatedPosition\n(runningPosition is the current accumulated position of payee) loop for each message in the bin DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: Validate current state (transferState is 'RECEIVED-FULFIL')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole - DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: **runningPosition** = runningPosition - payload.amount.amount + DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: **runningPosition** = runningPosition + payload.amount.amount DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: transferStateChange should be populated and add to **transferStateChanges** hnote right of DOMAIN_POSITION_FULFIL #lightyellow **transferStateChange**: { @@ -61,10 +61,9 @@ group Fulfil Position Batch Processing DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: participantPositionChange should be populated and add to **participantPositionChanges** hnote right of DOMAIN_POSITION_FULFIL #lightyellow **participantPositionChange**: { - transferStateChangeId: We need this, may be need to update in the handler (???) + transferStateChangeId: null, // Need to update this in bin processor while executing queries value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) + reservedValue = participantPosition.reservedValue } end note DOMAIN_POSITION_FULFIL -> DOMAIN_POSITION_FULFIL: resultMessage should be populated and add to **resultMessages** diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.svg index 642d6ab47..aa1030199 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.2-fulfil-v1.1-domain.svg @@ -1,11 +1,11 @@ - + - 1.3.4.2. Position Fulfil Domain v1.1 + 1.3.4.2. Position Fulfil Domain v1.1 - - + + Position Fulfil Domain @@ -17,64 +17,64 @@ INPUT: bin, accumulatedPosition, transferStateChanges - + Fulfil Position Batch Processing - - - - - 1 + + + + + 1 runningPosition = accumulatedPosition - - - loop - [for each message in the bin] - - - - - 2 - Validate current state (transferState is 'RECEIVED-FULFIL') - Error code: - 2001 - against failing transfers - Batch is not rejected as a whole - - - - - 3 - runningPosition - = runningPosition - payload.amount.amount - - - - - 4 - transferStateChange should be populated and add to - transferStateChanges - - transferStateChange - : { -      - transferStateId - : 'COMMITTED' - } - - - - - 5 - participantPositionChange should be populated and add to - participantPositionChanges - - participantPositionChange - : { - transferStateChangeId: We need this, may be need to update in the handler (???) - value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) + (runningPosition is the current accumulated position of payee) + + + loop + [for each message in the bin] + + + + + 2 + Validate current state (transferState is 'RECEIVED-FULFIL') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole + + + + + 3 + runningPosition + = runningPosition + payload.amount.amount + + + + + 4 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + : 'COMMITTED' + } + + + + + 5 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: null, // Need to update this in bin processor while executing queries + value = runningPosition, + reservedValue = participantPosition.reservedValue } diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.plantuml index 9bee889a6..032e1cf3c 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.plantuml @@ -47,9 +47,10 @@ rnote right of DOMAIN_POSITION_ABORT #lightblue INPUT: bin, accumulatedPosition, transferStateChanges end note group Abort Position Batch Processing - DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: **runningPosition** = accumulatedPosition + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: **runningPosition** = accumulatedPosition \n(runningPosition is the current accumulated position of payer) loop for each message in the bin DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR'])\nError code: 2001 DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: **runningPosition** = runningPosition - payload.amount.amount + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: **runningPosition** = runningPosition + payload.amount.amount DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: transferStateChange should be populated and add to **transferStateChanges** hnote right of DOMAIN_POSITION_ABORT #lightyellow **transferStateChange**: { @@ -59,10 +60,9 @@ group Abort Position Batch Processing DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: participantPositionChange should be populated and add to **participantPositionChanges** hnote right of DOMAIN_POSITION_ABORT #lightyellow **participantPositionChange**: { - transferStateChangeId: We need this, may be need to update in the handler (???) + transferStateChangeId: null, // Need to update this in bin processor while executing queries value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) + reservedValue = participantPosition.reservedValue } end note DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: resultMessage should be populated and add to **resultMessages** diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.svg index 976c6ea1c..8c18d0f08 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.3-abort-domain.svg @@ -1,161 +1,168 @@ - + 1.3.4.3. Position Abort Domain - - - - - + + + + + Position Abort Domain - Position Abort Domain - - - + Position Abort Domain + + + INPUT: bin, accumulatedPosition, transferStateChanges - + Abort Position Batch Processing - - - - - 1 + + + + + 1 runningPosition = accumulatedPosition - - - loop - [for each message in the bin] - - - - - 2 - Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) - Error code: - 2001 - DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: - runningPosition - = runningPosition - payload.amount.amount - - - - - 3 - transferStateChange should be populated and add to - transferStateChanges - - transferStateChange - : { -      - transferStateId - : (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) - } - - - - - 4 - participantPositionChange should be populated and add to - participantPositionChanges - - participantPositionChange - : { - transferStateChangeId: We need this, may be need to update in the handler (???) - value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) - } - - - - - 5 - resultMessage should be populated and add to - resultMessages - - - alt - [action == 'reject'] - - resultMessage - : { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: reject, - createdAt: <timestamp>, - state: { - status: "success", - code: 0, - description: "action successful" - } - } - } - } - - [action == 'abort'] - - resultMessage - : { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: abort, - createdAt: <timestamp>, - state: { - status: 'error', - code: <payload.errorInformation.errorCode || 5000> - description: <payload.errorInformation.errorDescription> - } - } - } - } - - - - - 6 - Return the following - - { -      - accumulatedPosition - : runningPosition, -      - transferStateChanges - , -      - participantPositionChanges - , -      - resultMessages - , (The list of messages to be sent to the kafka topic) - } + (runningPosition is the current accumulated position of payer) + + + loop + [for each message in the bin] + + + + + 2 + Validate current state (transferStateChange.transferStateId IN ['RECEIVED_REJECT', 'RECEIVED_ERROR']) + Error code: + 2001 + DOMAIN_POSITION_ABORT -> DOMAIN_POSITION_ABORT: + runningPosition + = runningPosition - payload.amount.amount + + + + + 3 + runningPosition + = runningPosition + payload.amount.amount + + + + + 4 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + : (action == 'reject' ? 'ABORTED_REJECTED' : 'ABORTED_ERROR' ) + } + + + + + 5 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: null, // Need to update this in bin processor while executing queries + value = runningPosition, + reservedValue = participantPosition.reservedValue + } + + + + + 6 + resultMessage should be populated and add to + resultMessages + + + alt + [action == 'reject'] + + resultMessage + : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: reject, + createdAt: <timestamp>, + state: { + status: "success", + code: 0, + description: "action successful" + } + } + } + } + + [action == 'abort'] + + resultMessage + : { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: abort, + createdAt: <timestamp>, + state: { + status: 'error', + code: <payload.errorInformation.errorCode || 5000> + description: <payload.errorInformation.errorDescription> + } + } + } + } + + + + + 7 + Return the following + + { +      + accumulatedPosition + : runningPosition, +      + transferStateChanges + , +      + participantPositionChanges + , +      + resultMessages + , (The list of messages to be sent to the kafka topic) + } diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.plantuml index 4b673c1f8..d10f964f4 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.plantuml @@ -47,10 +47,10 @@ rnote right of DOMAIN_POSITION_TIMEOUT_RESERVED #lightblue INPUT: bin, accumulatedPosition, transferStateChanges end note group Timeout Reserved Position Batch Processing - DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: **runningPosition** = accumulatedPosition + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: **runningPosition** = accumulatedPosition \n(runningPosition is the current accumulated position of payer) loop for each message in the bin DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: Validate current state of transfer (transferStateChange.transferStateId == 'RESERVED_TIMEOUT')\nError code: 2001 - DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: **runningPosition** = runningPosition - payload.amount.amount + DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: **runningPosition** = runningPosition + payload.amount.amount DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: transferStateChange should be populated and add to **transferStateChanges** hnote right of DOMAIN_POSITION_TIMEOUT_RESERVED #lightyellow **transferStateChange**: { @@ -60,10 +60,9 @@ group Timeout Reserved Position Batch Processing DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: participantPositionChange should be populated and add to **participantPositionChanges** hnote right of DOMAIN_POSITION_TIMEOUT_RESERVED #lightyellow **participantPositionChange**: { - transferStateChangeId: We need this, may be need to update in the handler (???) + transferStateChangeId: null, // Need to update this in bin processor while executing queries value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) + reservedValue = participantPosition.reservedValue } end note DOMAIN_POSITION_TIMEOUT_RESERVED -> DOMAIN_POSITION_TIMEOUT_RESERVED: resultMessage should be populated and add to **resultMessages** diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.svg index 547b5b561..3586c2274 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.4-timeout-reserved-domain.svg @@ -5,7 +5,7 @@ 1.3.4.4. Position Timeout Reserved Domain - + Position Timeout Reserved Domain @@ -19,60 +19,60 @@ Timeout Reserved Position Batch Processing - - - - - 1 + + + + + 1 runningPosition = accumulatedPosition - - - loop - [for each message in the bin] - - - - - 2 - Validate current state of transfer (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') - Error code: - 2001 - - - - - 3 - runningPosition - = runningPosition - payload.amount.amount - - - - - 4 - transferStateChange should be populated and add to - transferStateChanges - - transferStateChange - : { -      - transferStateId - : 'EXPIRED_RESERVED' - } - - - - - 5 - participantPositionChange should be populated and add to - participantPositionChanges - - participantPositionChange - : { - transferStateChangeId: We need this, may be need to update in the handler (???) - value = runningPosition, - reservedValue = participantPosition.reservedValue (???) - createdDate = new Date() (Get time here or while executing the query in handler ???) + (runningPosition is the current accumulated position of payer) + + + loop + [for each message in the bin] + + + + + 2 + Validate current state of transfer (transferStateChange.transferStateId == 'RESERVED_TIMEOUT') + Error code: + 2001 + + + + + 3 + runningPosition + = runningPosition + payload.amount.amount + + + + + 4 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + : 'EXPIRED_RESERVED' + } + + + + + 5 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: null, // Need to update this in bin processor while executing queries + value = runningPosition, + reservedValue = participantPosition.reservedValue } diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml index 0a8f586ae..c3dd9285c 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml @@ -58,7 +58,7 @@ group Prepare Position Batch Processing That seems unneccesary here as we are doing only calculation and update the position in a database transaction. end note DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **effectivePosition** = accumulatedPosition + accumulatedPositionReservedValue - DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Calculate **availablePosition** + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Calculate **availablePosition** \n(availablePosition is the current accumulated position of payer) note right of DOMAIN_POSITION_PREPARE #lightgray **availablePosition** if settlement model delay is IMMEDIATE @@ -152,10 +152,9 @@ group Prepare Position Batch Processing DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: participantPositionChange should be populated and add to **participantPositionChanges** hnote right of DOMAIN_POSITION_PREPARE #lightyellow **participantPositionChange**: { - transferStateChangeId: We need this, may be need to update in the handler (???) + transferStateChangeId: null, // Need to update this in bin processor while executing queries value = availablePosition, reservedValue = accumulatedPositionReservedValue - createdDate = new Date() (Get time here or while executing the query in handler ???) } end note diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg index b141fc6b8..79dd8a641 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg @@ -5,8 +5,8 @@ 1.3.4.5. Position Prepare Domain - - + + Position Prepare Domain @@ -40,157 +40,158 @@ 1 effectivePosition = accumulatedPosition + accumulatedPositionReservedValue - - - - - 2 + + + + + 2 Calculate availablePosition - - - availablePosition - if settlement model delay is IMMEDIATE - then: - settlementPositionValue + participantLimitValue - effectivePosition - otherwise: - participantLimitValue - effectivePosition - - - loop - [for each message in the bin] - - - - - 3 - Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE') - Error code: - 2001 - against failing transfers - Batch is not rejected as a whole. - - - - - 4 - Liquidity Check - - Validate availablePosition for each tranfser (see algorithm below) - Error code: - 4001 - - - alt - [if availablePosition >= payload.amount.amount] - - - transferStateId = - "RESERVED" - availablePosition = availablePosition - preparedTransfer.amount - - - resultMessage: - { - id: <transferMessage.transferId> - from: <transferMessage.payerFsp>, - to: <transferMessage.payeeFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: <transferMessage> - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: transfer, - action: prepare, - createdAt: <timestamp>, - state: { - status: "success", - code: 0 - } - } - } - } - - - - Validation failure! - - - transferStateId = - "ABORTED" - (This should only be done if not already in a final state (idempotency) ???) - reason = "Net Debit Cap exceeded by this request at this time, please try again later" - - - resultMessage: - { - id: <transferMessage.transferId> - from: <ledgerName>, - to: <transferMessage.payerFsp>, - type: application/json - content: { - headers: <transferHeaders>, - payload: { - "errorInformation": { - "errorCode": 4001, - "errorDescription": "Payer FSP insufficient liquidity", - "extensionList": <transferMessage.extensionList> - } - }, - metadata: { - event: { - id: <uuid>, - responseTo: <previous.uuid>, - type: notification, - action: prepare, - createdAt: <timestamp>, - state: { - status: 'error', - code: <errorInformation.errorCode> - description: <errorInformation.errorDescription> - } - } - } - } - - - - - 5 - resultMessage should be added to - resultMessages - - - - - 6 - transferStateChange should be populated and add to - transferStateChanges - - transferStateChange - : { -      - transferStateId - , - reason - } - - - - - 7 - participantPositionChange should be populated and add to - participantPositionChanges - - participantPositionChange - : { - transferStateChangeId: We need this, may be need to update in the handler (???) - value = availablePosition, - reservedValue = accumulatedPositionReservedValue - createdDate = new Date() (Get time here or while executing the query in handler ???) +   + (availablePosition is the current accumulated position of payer) + + + availablePosition + if settlement model delay is IMMEDIATE + then: + settlementPositionValue + participantLimitValue - effectivePosition + otherwise: + participantLimitValue - effectivePosition + + + loop + [for each message in the bin] + + + + + 3 + Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE') + Error code: + 2001 + against failing transfers + Batch is not rejected as a whole. + + + + + 4 + Liquidity Check + - Validate availablePosition for each tranfser (see algorithm below) + Error code: + 4001 + + + alt + [if availablePosition >= payload.amount.amount] + + + transferStateId = + "RESERVED" + availablePosition = availablePosition - preparedTransfer.amount + + + resultMessage: + { + id: <transferMessage.transferId> + from: <transferMessage.payerFsp>, + to: <transferMessage.payeeFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: <transferMessage> + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: transfer, + action: prepare, + createdAt: <timestamp>, + state: { + status: "success", + code: 0 + } + } + } + } + + + + Validation failure! + + + transferStateId = + "ABORTED" + (This should only be done if not already in a final state (idempotency) ???) + reason = "Net Debit Cap exceeded by this request at this time, please try again later" + + + resultMessage: + { + id: <transferMessage.transferId> + from: <ledgerName>, + to: <transferMessage.payerFsp>, + type: application/json + content: { + headers: <transferHeaders>, + payload: { + "errorInformation": { + "errorCode": 4001, + "errorDescription": "Payer FSP insufficient liquidity", + "extensionList": <transferMessage.extensionList> + } + }, + metadata: { + event: { + id: <uuid>, + responseTo: <previous.uuid>, + type: notification, + action: prepare, + createdAt: <timestamp>, + state: { + status: 'error', + code: <errorInformation.errorCode> + description: <errorInformation.errorDescription> + } + } + } + } + + + + + 5 + resultMessage should be added to + resultMessages + + + + + 6 + transferStateChange should be populated and add to + transferStateChanges + + transferStateChange + : { +      + transferStateId + , + reason + } + + + + + 7 + participantPositionChange should be populated and add to + participantPositionChanges + + participantPositionChange + : { + transferStateChangeId: null, // Need to update this in bin processor while executing queries + value = availablePosition, + reservedValue = accumulatedPositionReservedValue } From 1b38ec0619e585bbe5a05b85ab80c9daf97ddfa5 Mon Sep 17 00:00:00 2001 From: vijayg10 <33152110+vijayg10@users.noreply.github.com> Date: Mon, 11 Sep 2023 20:09:28 +0530 Subject: [PATCH 15/21] Update docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml Co-authored-by: Miguel de Barros --- .../sequence/seq-position-1.3.4.5-prepare-domain.plantuml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml index c3dd9285c..636f0126c 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml @@ -106,7 +106,7 @@ group Prepare Position Batch Processing note right of DOMAIN_POSITION_PREPARE #red: Validation failure! note right of DOMAIN_POSITION_PREPARE #lightgray transferStateId = **"ABORTED"** (This should only be done if not already in a final state (idempotency) ???) - reason = "Net Debit Cap exceeded by this request at this time, please try again later" + reason = "4001 - Payer FSP insufficient liquidity" end note note right of DOMAIN_POSITION_PREPARE #yellow resultMessage: From 9af8f4f715a443496e275d89ac6aaeb252934fb0 Mon Sep 17 00:00:00 2001 From: vijayg10 <33152110+vijayg10@users.noreply.github.com> Date: Mon, 11 Sep 2023 20:09:36 +0530 Subject: [PATCH 16/21] Update docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml Co-authored-by: Miguel de Barros --- .../sequence/seq-position-1.3.4.5-prepare-domain.plantuml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml index 636f0126c..353e1704b 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml @@ -69,7 +69,7 @@ group Prepare Position Batch Processing end note loop for each message in the bin DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: Validate current state (transferStateChange.transferStateId == 'RECEIVED_PREPARE')\nError code: 2001 against failing transfers\nBatch is not rejected as a whole. - DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **Liquidity Check** - Validate availablePosition for each tranfser (see algorithm below)\nError code: 4001 + DOMAIN_POSITION_PREPARE -> DOMAIN_POSITION_PREPARE: **Liquidity Check** - Validate availablePosition for each transfer (see algorithm below)\nError code: 4001 alt if availablePosition >= payload.amount.amount note right of DOMAIN_POSITION_PREPARE #lightgray From 4318852766ef04ae4105c9810e1a19d0aed408e6 Mon Sep 17 00:00:00 2001 From: Vijay Date: Mon, 11 Sep 2023 20:13:07 +0530 Subject: [PATCH 17/21] fix: addressed PR comments --- docs/.vuepress/config.js | 2 +- ...q-position-1.3.4.5-prepare-domain.plantuml | 2 +- .../seq-position-1.3.4.5-prepare-domain.svg | 8 +- .../1.3.4-position-handler-consume-binning.md | 44 +- package-lock.json | 2648 ++++++++--------- package.json | 10 +- 6 files changed, 1207 insertions(+), 1507 deletions(-) diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js index 15c36e894..dae7116c8 100644 --- a/docs/.vuepress/config.js +++ b/docs/.vuepress/config.js @@ -685,7 +685,7 @@ module.exports = { ] }, { - title: "Position Handler Bin Support", + title: "Position Handler Batch Support", path: "central-ledger/transfers/1.3.4-position-handler-consume-binning" }, ] diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml index 353e1704b..1560865b4 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.plantuml @@ -120,7 +120,7 @@ group Prepare Position Batch Processing payload: { "errorInformation": { "errorCode": 4001, - "errorDescription": "Payer FSP insufficient liquidity", + "errorDescription": "Payer FSP insufficient liquidity", "extensionList": } }, diff --git a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg index 79dd8a641..825c8afec 100644 --- a/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg +++ b/docs/technical/central-ledger/assets/diagrams/sequence/seq-position-1.3.4.5-prepare-domain.svg @@ -77,7 +77,7 @@ 4 Liquidity Check - - Validate availablePosition for each tranfser (see algorithm below) + - Validate availablePosition for each transfer (see algorithm below) Error code: 4001 @@ -124,9 +124,9 @@ transferStateId = "ABORTED" (This should only be done if not already in a final state (idempotency) ???) - reason = "Net Debit Cap exceeded by this request at this time, please try again later" - - + reason = "4001 - Payer FSP insufficient liquidity" + + resultMessage: { id: <transferMessage.transferId> diff --git a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md index 7be83664f..c3cf600dd 100644 --- a/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md +++ b/docs/technical/central-ledger/transfers/1.3.4-position-handler-consume-binning.md @@ -7,29 +7,39 @@ Sequence design diagram for Position Handler Consume process. ![Transfers-Position-Binning.drawio.svg](../assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg) ### Algorithm -1. **Binning:** - - The initial batch size is determined by the `batchSize` configuration - - The consumed messages will be stored in memory - - Assign a batch of messages into bins based on the impacted position account ID (Prepare: Payer Position Account, Fulfil: Payee Position Account) and create sub-bins based on `action` - - Audit each message as it's assigned to a bin. - - Note: The messages in bins should be references to the message content in memory (No duplication of message content) - -2. **Handler:** - - Start Transaction (TX) on MySQL. - - For each bin: - - Call the Bin Processor with the bin and TX. - - Send and audit notifications based on the transfers result list from the Batch Processor (To Be Confirmed). Note: Batch messages can also be sent to Kafka. - - Commit the offset. - - End the TX (Commit TX to MySQL). Rollback is reserved for complete infrastructure failure only. + +This algorithm manages message batching, processing, and auditing through binning, utilizing MySQL transactions and supporting various transfer actions in a highly efficient manner. + +1. **Handler:** + + - **Binning:** + - The initial batch size is determined by the `batchSize` configuration. + - The messages consumed from Kafka are stored in memory. + - Messages are assigned to bins based on the impacted position `account ID` (Prepare: Payer Position Account, Fulfil: Payee Position Account), and sub-bins are created based on the `action`. + - Each message is audited as it's assigned to a bin. + - Note: Messages in bins are references to the message content in memory, avoiding duplication. + + - **Processing:** + - Begin a transaction (TX) on MySQL. + - For each bin: + - Call the Bin Processor with the bin and TX. + - After getting result, send and audit notifications based on the transfers result list from the Batch Processor. + - Commit the offset. + - End the TX (Commit TX to MySQL). Rollback is reserved for complete infrastructure failure only. 3. **Bin Processor:** - - Input: Accepts a bin and TX to be processed + - Input: Accepts a bin and TX for processing. - Output: Provides a list of transfers in either a reserved or aborted state. - - Order: + - Processing Order: - Fulfil - Aborts and Timeouts - Prepare -4. Supports single message processing as well. + - The Bin Processor calls the domain functions for above actions by passing the batch of messages. + - After getting result for each function call it accumulates the available position, position changes, transfer state changes and a list of notification messages to be sent + - Return the accumulated data to the handler for further processing + +4. Additionally, the system supports single message processing as well. + ### Questions diff --git a/package-lock.json b/package-lock.json index 0855c5fa0..4a524391e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,15 +9,15 @@ "version": "0.0.1", "license": "Apache-2.0", "devDependencies": { - "@vuepress/plugin-back-to-top": "^1.9.9", - "@vuepress/plugin-medium-zoom": "^1.9.9", + "@vuepress/plugin-back-to-top": "^1.9.10", + "@vuepress/plugin-medium-zoom": "^1.9.10", "got": "^13.0.0", "husky": "^8.0.3", - "markdownlint-cli": "^0.34.0", - "npm-check-updates": "^16.10.12", + "markdownlint-cli": "^0.36.0", + "npm-check-updates": "^16.13.3", "plantuml-encoder": "^1.4.0", "svgo": "^3.0.2", - "vuepress": "^1.9.9", + "vuepress": "^1.9.10", "vuepress-plugin-versioning": "git+https://github.com/mojaloop/vuepress-plugin-versioning.git#dcb14962a69b8e5aaf184d2d1a31ae4f43870bc1", "vuepress-theme-titanium": "^4.11.1" }, @@ -39,47 +39,95 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@babel/compat-data": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.3.tgz", - "integrity": "sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.1.tgz", - "integrity": "sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.17.tgz", + "integrity": "sha512-2EENLmhpwplDux5PSsZnSbnSkB3tZ6QTksgO25xwEL7pIDcNOMhF5v/s6RzwjMZzZzw9Ofc30gHv5ChCC8pifQ==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.0", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helpers": "^7.22.0", - "@babel/parser": "^7.22.0", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.22.17", + "@babel/helpers": "^7.22.15", + "@babel/parser": "^7.22.16", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.17", + "@babel/types": "^7.22.17", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -90,21 +138,21 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", - "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz", + "integrity": "sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.3", + "@babel/types": "^7.22.15", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -114,46 +162,43 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.3.tgz", - "integrity": "sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.22.3" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.1.tgz", - "integrity": "sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.0", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { @@ -166,9 +211,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -181,20 +226,20 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.1.tgz", - "integrity": "sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.22.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -204,23 +249,23 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.1.tgz", - "integrity": "sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -230,148 +275,137 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.0.tgz", - "integrity": "sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz", + "integrity": "sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", "debug": "^4.1.1", "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" - } - }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.1.tgz", - "integrity": "sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.3.tgz", - "integrity": "sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz", + "integrity": "sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.3" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.1.tgz", - "integrity": "sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.17.tgz", + "integrity": "sha512-XouDDhQESrLHTpnBtCKExJdyY4gJCdrvH2Pyv8r8kovX2U8G0dRUOT45T9XlbLtuu9CLXP15eusnkprhoPV5iQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.15" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.17.tgz", + "integrity": "sha512-bxH77R5gjH3Nkde6/LuncQoLaP16THYPscurp1S8z7S9ZgezCyV3G8Hc+TZiCmY8pz4fp8CvKSgtJMW0FkLAxA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.17" }, "engines": { "node": ">=6.9.0" @@ -381,122 +415,121 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.1.tgz", - "integrity": "sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz", + "integrity": "sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-member-expression-to-functions": "^7.22.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.0" + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.17.tgz", + "integrity": "sha512-nAhoheCMlrqU41tAojw9GpVEKDlTS8r3lzFmF0lP52LwblCPbuFSO7nGIZoIcoU5NIm1ABrna0cJExE4Ay6l2Q==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.17" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", - "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz", + "integrity": "sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==", "dev": true, "dependencies": { - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.3" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -551,9 +584,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", - "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -563,12 +596,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz", + "integrity": "sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -578,14 +611,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.3.tgz", - "integrity": "sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz", + "integrity": "sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-transform-optional-chaining": "^7.22.3" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -598,6 +631,7 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -611,16 +645,16 @@ } }, "node_modules/@babel/plugin-proposal-decorators": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.3.tgz", - "integrity": "sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.15.tgz", + "integrity": "sha512-kc0VvbbUyKelvzcKOSyQUSVVXS5pT3UhRB0e3c9An86MvLqs+gx0dN4asllrDluqSa3m9YyooXKGOFVomnyFkg==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-replace-supers": "^7.22.1", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/plugin-syntax-decorators": "^7.22.3" + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.10" }, "engines": { "node": ">=6.9.0" @@ -630,16 +664,10 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", - "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -647,22 +675,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -703,12 +715,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.3.tgz", - "integrity": "sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz", + "integrity": "sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -742,12 +754,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -757,12 +769,12 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.3.tgz", - "integrity": "sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -796,12 +808,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -929,12 +941,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -944,14 +956,14 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.3.tgz", - "integrity": "sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz", + "integrity": "sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-remap-async-to-generator": "^7.18.9", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.9", "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { @@ -962,14 +974,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -979,12 +991,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -994,12 +1006,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz", + "integrity": "sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1009,13 +1021,13 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.3.tgz", - "integrity": "sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1025,13 +1037,13 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.3.tgz", - "integrity": "sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz", + "integrity": "sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-class-static-block": "^7.14.5" }, "engines": { @@ -1042,19 +1054,19 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz", + "integrity": "sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1065,13 +1077,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1081,12 +1093,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz", + "integrity": "sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1096,13 +1108,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1112,12 +1124,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1127,12 +1139,12 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.22.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.1.tgz", - "integrity": "sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz", + "integrity": "sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { @@ -1143,13 +1155,13 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1159,12 +1171,12 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.3.tgz", - "integrity": "sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz", + "integrity": "sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { @@ -1175,12 +1187,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz", + "integrity": "sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1190,14 +1202,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1207,12 +1219,12 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.3.tgz", - "integrity": "sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz", + "integrity": "sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { @@ -1223,12 +1235,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1238,12 +1250,12 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.3.tgz", - "integrity": "sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz", + "integrity": "sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { @@ -1254,12 +1266,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1269,13 +1281,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1285,14 +1297,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz", + "integrity": "sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/helper-module-transforms": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1302,15 +1314,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.3.tgz", - "integrity": "sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz", + "integrity": "sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1320,13 +1332,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1336,13 +1348,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.3.tgz", - "integrity": "sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1352,12 +1364,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.3.tgz", - "integrity": "sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1367,12 +1379,12 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.3.tgz", - "integrity": "sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz", + "integrity": "sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" }, "engines": { @@ -1383,12 +1395,12 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.3.tgz", - "integrity": "sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz", + "integrity": "sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-numeric-separator": "^7.10.4" }, "engines": { @@ -1399,16 +1411,16 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.3.tgz", - "integrity": "sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz", + "integrity": "sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.22.3", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.22.3" + "@babel/plugin-transform-parameters": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1418,13 +1430,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1434,12 +1446,12 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.3.tgz", - "integrity": "sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz", + "integrity": "sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" }, "engines": { @@ -1450,13 +1462,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.3.tgz", - "integrity": "sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz", + "integrity": "sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { @@ -1467,12 +1479,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.3.tgz", - "integrity": "sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz", + "integrity": "sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1482,13 +1494,13 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.3.tgz", - "integrity": "sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", "dev": true, "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1498,14 +1510,14 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.3.tgz", - "integrity": "sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==", + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz", + "integrity": "sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.11", + "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { @@ -1516,12 +1528,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1531,13 +1543,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz", + "integrity": "sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1547,12 +1559,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1562,17 +1574,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.4.tgz", - "integrity": "sha512-Urkiz1m4zqiRo17klj+l3nXgiRTFQng91Bc1eiLF7BMQu1e7wE5Gcq9xSv062IF068NHjcutSbIMev60gXxAvA==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz", + "integrity": "sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1582,21 +1594,21 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1606,13 +1618,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1622,12 +1634,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1637,12 +1649,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1652,12 +1664,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1667,12 +1679,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "version": "7.22.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz", + "integrity": "sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1682,13 +1694,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.3.tgz", - "integrity": "sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1698,13 +1710,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1714,13 +1726,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.3.tgz", - "integrity": "sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1730,25 +1742,25 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.4.tgz", - "integrity": "sha512-c3lHOjbwBv0TkhYCr+XCR6wKcSZ1QbQTVdSkZUaVpLv8CVWotBMArWUi5UAJrcrQaEnleVkkvaV8F/pmc/STZQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.22.3", - "@babel/helper-compilation-targets": "^7.22.1", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.3", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.15.tgz", + "integrity": "sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.15", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.15", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.15", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-import-attributes": "^7.22.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1760,61 +1772,61 @@ "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-generator-functions": "^7.22.3", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-class-properties": "^7.22.3", - "@babel/plugin-transform-class-static-block": "^7.22.3", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-dynamic-import": "^7.22.1", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-export-namespace-from": "^7.22.3", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-json-strings": "^7.22.3", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-logical-assignment-operators": "^7.22.3", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.22.3", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.3", - "@babel/plugin-transform-new-target": "^7.22.3", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.3", - "@babel/plugin-transform-numeric-separator": "^7.22.3", - "@babel/plugin-transform-object-rest-spread": "^7.22.3", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-optional-catch-binding": "^7.22.3", - "@babel/plugin-transform-optional-chaining": "^7.22.3", - "@babel/plugin-transform-parameters": "^7.22.3", - "@babel/plugin-transform-private-methods": "^7.22.3", - "@babel/plugin-transform-private-property-in-object": "^7.22.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-property-regex": "^7.22.3", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/plugin-transform-unicode-sets-regex": "^7.22.3", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.22.4", - "babel-plugin-polyfill-corejs2": "^0.4.3", - "babel-plugin-polyfill-corejs3": "^0.8.1", - "babel-plugin-polyfill-regenerator": "^0.5.0", - "core-js-compat": "^3.30.2", - "semver": "^6.3.0" + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.15", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.15", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.11", + "@babel/plugin-transform-classes": "^7.22.15", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.15", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.11", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.11", + "@babel/plugin-transform-for-of": "^7.22.15", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.11", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.11", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.15", + "@babel/plugin-transform-modules-systemjs": "^7.22.11", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.11", + "@babel/plugin-transform-numeric-separator": "^7.22.11", + "@babel/plugin-transform-object-rest-spread": "^7.22.15", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.11", + "@babel/plugin-transform-optional-chaining": "^7.22.15", + "@babel/plugin-transform-parameters": "^7.22.15", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.11", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.10", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.10", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "@babel/types": "^7.22.15", + "babel-plugin-polyfill-corejs2": "^0.4.5", + "babel-plugin-polyfill-corejs3": "^0.8.3", + "babel-plugin-polyfill-regenerator": "^0.5.2", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1824,28 +1836,26 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/regjsgen": { @@ -1855,45 +1865,45 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", - "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", - "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.17.tgz", + "integrity": "sha512-xK4Uwm0JnAMvxYZxOVecss85WxTEIbTa7bnGyf/+EgCL5Zt3U7htUpEOWv9detPlamGKuRzCqw74xVglDWpPdg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1902,13 +1912,13 @@ } }, "node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "version": "7.22.17", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.17.tgz", + "integrity": "sha512-YSQPHLFtQNE5xN9tHuZnzu8vPr61wVTBZdfv1meex1NBosa4iT05k/Jw06ddJugi4bk7The/oSwQGFcksmEJQg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.15", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1925,12 +1935,6 @@ "node": ">=0.1.90" } }, - "node_modules/@gar/promisify": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", - "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", - "dev": true - }, "node_modules/@isaacs/cliui": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", @@ -1963,9 +1967,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1987,21 +1991,15 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@mrmlnc/readdir-enhanced": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", @@ -2063,9 +2061,9 @@ } }, "node_modules/@npmcli/git": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.0.4.tgz", - "integrity": "sha512-5yZghx+u5M47LghaybLCkdSyFzV/w4OuH12d96HO389Ik9CDsLaDZJVynSGGVJOLn6gy/k7Dz5XYcplM3uxXRg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-4.1.0.tgz", + "integrity": "sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==", "dev": true, "dependencies": { "@npmcli/promise-spawn": "^6.0.0", @@ -2112,77 +2110,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@npmcli/move-file": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", - "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", - "deprecated": "This functionality has been moved to @npmcli/fs", - "dev": true, - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/@npmcli/move-file/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@npmcli/move-file/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@npmcli/move-file/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@npmcli/move-file/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@npmcli/node-gyp": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz", @@ -2301,11 +2228,50 @@ "node": ">=12" } }, + "node_modules/@sigstore/bundle": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@sigstore/bundle/-/bundle-1.1.0.tgz", + "integrity": "sha512-PFutXEy0SmQxYI4texPw3dd2KewuNqv7OuK1ZFtY2fM754yhvG2KdgwIhRnoEE2uHdtdGNQ8s0lb94dW9sELog==", + "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/@sigstore/protobuf-specs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.1.0.tgz", - "integrity": "sha512-a31EnjuIDSX8IXBUib3cYLDRlPMU36AWX4xS8ysLaNu4ZzUesDiPt83pgrW2X1YLMe5L2HbDyaKK5BrL4cNKaQ==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.2.1.tgz", + "integrity": "sha512-XTWVxnWJu+c1oCshMLwnKvz8ZQJJDVOlciMfgpJBQbThVjKTCG8dwyhgLngBD2KN0ap9F/gOV8rFDEx8uh7R2A==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/sign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@sigstore/sign/-/sign-1.0.0.tgz", + "integrity": "sha512-INxFVNQteLtcfGmcoldzV6Je0sbbfh9I16DM4yJPw3j5+TFP8X6uIiA18mvpEa9yyeycAKgPmOA3X9hVdVTPUA==", + "dev": true, + "dependencies": { + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "make-fetch-happen": "^11.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/@sigstore/tuf": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@sigstore/tuf/-/tuf-1.0.3.tgz", + "integrity": "sha512-2bRovzs0nJZFlCN3rXirE4gwxCn97JNjMmwpecqlbgV9WcxX7WRuIrgzx/X7Ib7MYRbyUTpBYE0s2x6AmZXnlg==", "dev": true, + "dependencies": { + "@sigstore/protobuf-specs": "^0.2.0", + "tuf-js": "^1.1.7" + }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -2507,9 +2473,9 @@ "dev": true }, "node_modules/@types/q": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", - "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==", + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.6.tgz", + "integrity": "sha512-IKjZ8RjTSwD4/YG+2gtj7BPFRB/lNbWKTiSj3M7U/TD2B7HfYCxvp2Zz6xA2WIY7pAuL1QOUPw8gQRbUrrq4fQ==", "dev": true }, "node_modules/@types/qs": { @@ -2619,26 +2585,29 @@ "dev": true }, "node_modules/@vue/babel-helper-vue-transform-on": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.0.2.tgz", - "integrity": "sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA==", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==", "dev": true }, "node_modules/@vue/babel-plugin-jsx": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.1.tgz", - "integrity": "sha512-j2uVfZjnB5+zkcbc/zsOc0fSNGCMMjaEXP52wdwdIfn0qjFfEYpYZBFKFg+HHnQeJCVrjOeO0YxgaL7DMrym9w==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.0.0", - "@babel/plugin-syntax-jsx": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "@vue/babel-helper-vue-transform-on": "^1.0.2", - "camelcase": "^6.0.0", - "html-tags": "^3.1.0", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, "node_modules/@vue/babel-plugin-jsx/node_modules/camelcase": { @@ -2717,9 +2686,9 @@ } }, "node_modules/@vue/babel-preset-app/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -2868,9 +2837,9 @@ } }, "node_modules/@vue/compiler-sfc/node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", "dev": true, "funding": [ { @@ -2931,19 +2900,19 @@ "dev": true }, "node_modules/@vuepress/core": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.9.tgz", - "integrity": "sha512-Ekgu409ZSgvAV9n14F3DaEWtgkwrEicg1nWs0gbxGgUCdREeX/7rwxSfKwWwBjCwfCUKR2L3+6pXGjzxex0t+g==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/core/-/core-1.9.10.tgz", + "integrity": "sha512-H9ddo5fSinPb8QYl8OJFbZikMpOW84bm/U3Drzz8CnCXNtpda7CU2wX/XzOhe98G8jp45xhtZRkxOrqzBBAShA==", "dev": true, "dependencies": { "@babel/core": "^7.8.4", "@vue/babel-preset-app": "^4.1.2", - "@vuepress/markdown": "1.9.9", - "@vuepress/markdown-loader": "1.9.9", - "@vuepress/plugin-last-updated": "1.9.9", - "@vuepress/plugin-register-components": "1.9.9", - "@vuepress/shared-utils": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/markdown": "1.9.10", + "@vuepress/markdown-loader": "1.9.10", + "@vuepress/plugin-last-updated": "1.9.10", + "@vuepress/plugin-register-components": "1.9.10", + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10", "autoprefixer": "^9.5.1", "babel-loader": "^8.0.4", "bundle-require": "2.1.8", @@ -3039,9 +3008,9 @@ } }, "node_modules/@vuepress/core/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3087,12 +3056,12 @@ "dev": true }, "node_modules/@vuepress/markdown": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.9.tgz", - "integrity": "sha512-JzFdBdGe5aoiKSaEgF+h3JLDXNVfWPI5DJWXrIt7rhhkMJesF6HowIznPLdXqukzHfXHcPvo9oQ4o6eT0YmVGA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown/-/markdown-1.9.10.tgz", + "integrity": "sha512-sXTLjeZzH8SQuAL5AEH0hhsMljjNJbzWbBvzaj5yQCCdf+3sp/dJ0kwnBSnQjFPPnzPg5t3tLKGUYHyW0KiKzA==", "dev": true, "dependencies": { - "@vuepress/shared-utils": "1.9.9", + "@vuepress/shared-utils": "1.9.10", "markdown-it": "^8.4.1", "markdown-it-anchor": "^5.0.2", "markdown-it-chain": "^1.3.0", @@ -3102,12 +3071,12 @@ } }, "node_modules/@vuepress/markdown-loader": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.9.tgz", - "integrity": "sha512-nyY+sytuQaDLEIk6Yj9JFUfSQpe9/sz30xQFkGCYqi0lQTRGQM6IcRDgfcTS7b25A0qRlwpDGBfKQiGGMZKSfg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/markdown-loader/-/markdown-loader-1.9.10.tgz", + "integrity": "sha512-94BlwKc+lOaN/A5DkyA9KWHvMlMC1sWunAXE3Tv0WYzgYLDs9QqCsx7L5kLkpcOOVVm/8kBJumnXvVBwhqJddw==", "dev": true, "dependencies": { - "@vuepress/markdown": "1.9.9", + "@vuepress/markdown": "1.9.10", "loader-utils": "^1.1.0", "lru-cache": "^5.1.1" } @@ -3168,32 +3137,32 @@ } }, "node_modules/@vuepress/plugin-active-header-links": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.9.tgz", - "integrity": "sha512-lTnIhbuALjOjFts33jJD8r4ScNBxnZ6MtmePKEwvYlC3J9uvngs1Htpb1JzLEX9QCydt+bhLmZ92bTXn/PdTpg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-active-header-links/-/plugin-active-header-links-1.9.10.tgz", + "integrity": "sha512-2dRr3DE2UBFXhyMtLR3sGTdRyDM8YStuY6AOoQmoSgwy1IHt7PO7ypOuf1akF+1Nv8Q2aISU06q6TExZouu3Mw==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "lodash.debounce": "^4.0.8" } }, "node_modules/@vuepress/plugin-back-to-top": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.9.tgz", - "integrity": "sha512-8bNsdZ0Dr96OdcoJ67dxCx1ysXpeTHma8w+YSsqBJoWGEOucBr0nW9oaDH85yoOtpiriWBlhUO32/Q0ojJtMfA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-back-to-top/-/plugin-back-to-top-1.9.10.tgz", + "integrity": "sha512-iInIp66wu717CAnT2pyd9Bs/vAgrUBOBIQ7WMnfJo07cW/ZIothpyrSHnpCRSsfJ/jLivMPqW0pviqppt64BzQ==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "lodash.debounce": "^4.0.8" } }, "node_modules/@vuepress/plugin-last-updated": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.9.tgz", - "integrity": "sha512-MV4csmM0/lye83VtkOc+b8fs0roi7mvE7BmCCOE39Z6t8nv/ZmEPOwKeHD0+hXPT+ZfoATYvDcsYU7uxbdw0Pw==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-last-updated/-/plugin-last-updated-1.9.10.tgz", + "integrity": "sha512-YxzWGF/OfU6WsHSynZFn74NGGp7dY27Bjy9JyyFo8wF5+2V1gpyDjveHKHGKugS/pMXlxfjzhv9E2Wmy9R7Iog==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "cross-spawn": "^6.0.5" } }, @@ -3223,9 +3192,9 @@ } }, "node_modules/@vuepress/plugin-last-updated/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -3265,48 +3234,48 @@ } }, "node_modules/@vuepress/plugin-medium-zoom": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.9.tgz", - "integrity": "sha512-P8UfqUv0l28Td2COhvhVinBMiHyams8KKQVwnr6ZboFcRVG5xOsghtDbO++jn78rnszOz8OsLXilPMoiJ8iECQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-medium-zoom/-/plugin-medium-zoom-1.9.10.tgz", + "integrity": "sha512-/MsICWZ/mUTs+ZdqqA1AVtWAtNL5ksgnnGR2X24LnXaPJp+M1IB2ETcyNKh264YVODSrmVsS/Y+kbCRK0qKkdg==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "medium-zoom": "^1.0.4" } }, "node_modules/@vuepress/plugin-nprogress": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.9.tgz", - "integrity": "sha512-+3fLxjwTLH8MeU54E7i1ovRu9KzBom2lvSeUsu9B8PuLyrETAqW7Pe1H66awEEALEe0ZnnEU4d7SeVe9ljsLAQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-nprogress/-/plugin-nprogress-1.9.10.tgz", + "integrity": "sha512-I1kkm6yWUQd7vwiV3lEDVpVP0Lr04K0zlczU502lDUa1RufSZ7vt+mlF5fOM28GqT+pKTEToWmm+VNT/R3qvMQ==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9", + "@vuepress/types": "1.9.10", "nprogress": "^0.2.0" } }, "node_modules/@vuepress/plugin-register-components": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.9.tgz", - "integrity": "sha512-tddnAiSmJsIWWPzE7TcbGU8xzndXf4a8i4BfIev2QzSUnIOQFZDGXUAsCkw4/f9N9UFxQSObjFPzTeUUxb7EvA==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-register-components/-/plugin-register-components-1.9.10.tgz", + "integrity": "sha512-sgdJ5OydTPZAoTkselpvVP3Xsd6bfZ0FpaxOTinal0gJ99h49lvLu9bvzMx13rdGRFO/kRXn0qQQpwKTAfTPqA==", "dev": true, "dependencies": { - "@vuepress/shared-utils": "1.9.9", - "@vuepress/types": "1.9.9" + "@vuepress/shared-utils": "1.9.10", + "@vuepress/types": "1.9.10" } }, "node_modules/@vuepress/plugin-search": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.9.tgz", - "integrity": "sha512-W/FE+YHoXDD4qk2wu5yRMkti271TA4y+7UBMrmCavvVAGrLIRnaZfswRUgIiDlEthBc+Pn8/As/Dy1jFTLBa9A==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/plugin-search/-/plugin-search-1.9.10.tgz", + "integrity": "sha512-bn2XJikaRgQZXvu8upCjOWrxbLHIRTqnJ3w7G0mo6jCYWGVsHNo6XhVpqylpLR2PWnHT/ImO2bGo38/5Bag/tQ==", "dev": true, "dependencies": { - "@vuepress/types": "1.9.9" + "@vuepress/types": "1.9.10" } }, "node_modules/@vuepress/shared-utils": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.9.tgz", - "integrity": "sha512-qhk/7QF5LgMEXhEB1hlqreGFgkz4p2pmaBBNFxnAnYmSwmyO+u/oFOpZLI16QRx9Wg6ekR2ENmByQLxV7y4lJg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/shared-utils/-/shared-utils-1.9.10.tgz", + "integrity": "sha512-M9A3DocPih+V8dKK2Zg9FJQ/f3JZrYsdaM/vQ9F48l8bPlzxw5NvqXIYMK4kKcGEyerQNTWCudoCpLL5uiU0hg==", "dev": true, "dependencies": { "chalk": "^2.3.2", @@ -3671,15 +3640,15 @@ } }, "node_modules/@vuepress/theme-default": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.9.9.tgz", - "integrity": "sha512-de0FiOwM/h3rFTBSZK0NNBB117lA/e3IHusU7Xm2XeZRiZ/EE3yvbWclZnbbRNt3YjDMmrWXEW/kBTBxfiMuWQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/theme-default/-/theme-default-1.9.10.tgz", + "integrity": "sha512-XnXn9t+pYCIhWi3cZXJlighuy93FFm5yXdISAAlFlcNkshuGtqamkjacHV8q/QZMfOhSIs6wX7Hj88u2IsT5mw==", "dev": true, "dependencies": { - "@vuepress/plugin-active-header-links": "1.9.9", - "@vuepress/plugin-nprogress": "1.9.9", - "@vuepress/plugin-search": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/plugin-active-header-links": "1.9.10", + "@vuepress/plugin-nprogress": "1.9.10", + "@vuepress/plugin-search": "1.9.10", + "@vuepress/types": "1.9.10", "docsearch.js": "^2.5.2", "lodash": "^4.17.15", "stylus": "^0.54.8", @@ -3689,9 +3658,9 @@ } }, "node_modules/@vuepress/types": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.9.tgz", - "integrity": "sha512-ukGW49ILzLhIc7CltHMr+BeIjWKloJNN1mrvbDz3beycp9b9kgH+DXNdRIK9QCKr4fJsy7x08vNMwZr9Nq/PTQ==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/@vuepress/types/-/types-1.9.10.tgz", + "integrity": "sha512-TDNQn4og85onmBpLTTXXmncW3rUnYGr2MkuI8OIFJZetDNM49t1WbjNVlrT+kx7C6qXi6okDQgrHGYXajHZWfg==", "dev": true, "dependencies": { "@types/markdown-it": "^10.0.0", @@ -3930,13 +3899,11 @@ } }, "node_modules/agentkeepalive": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.3.0.tgz", - "integrity": "sha512-7Epl1Blf4Sy37j4v9f9FjICCh4+KAQOyXgHEwlyBiAQLbhKdq/i2QQU3amQalS/wPhdPzDXPL5DMR5bkn+YeWg==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", + "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", "dev": true, "dependencies": { - "debug": "^4.1.0", - "depd": "^2.0.0", "humanize-ms": "^1.2.1" }, "engines": { @@ -4289,14 +4256,14 @@ } }, "node_modules/array.prototype.reduce": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", - "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.6.tgz", + "integrity": "sha512-UW+Mz8LG/sPSU8jRDCjVr6J/ZKAGpHfwrZ6kWTG5qCxIEiXdVshqGnu5vEZA8S1y6X4aCSbQZ0/EEsfvEvBiSg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-array-method-boxes-properly": "^1.0.0", "is-string": "^1.0.7" }, @@ -4307,6 +4274,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/asn1": { "version": "0.2.6", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", @@ -4335,13 +4323,13 @@ "dev": true }, "node_modules/assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.1.tgz", + "integrity": "sha512-zzw1uCAgLbsKwBfFc8CX78DDg+xZeBksSO3vwVIDDN5i94eOrPsSSyiVhmsSABFDM/OcpE2aagCat9dnWQLG1A==", "dev": true, "dependencies": { - "object-assign": "^4.1.1", - "util": "0.10.3" + "object.assign": "^4.1.4", + "util": "^0.10.4" } }, "node_modules/assert-plus": { @@ -4354,18 +4342,18 @@ } }, "node_modules/assert/node_modules/inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", "dev": true }, "node_modules/assert/node_modules/util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", + "version": "0.10.4", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", + "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", "dev": true, "dependencies": { - "inherits": "2.0.1" + "inherits": "2.0.3" } }, "node_modules/assign-symbols": { @@ -4538,51 +4526,51 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.3.tgz", - "integrity": "sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==", + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz", + "integrity": "sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.4.0", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.1.tgz", - "integrity": "sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz", + "integrity": "sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0", - "core-js-compat": "^3.30.1" + "@babel/helper-define-polyfill-provider": "^0.4.2", + "core-js-compat": "^3.31.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.0.tgz", - "integrity": "sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz", + "integrity": "sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.4.0" + "@babel/helper-define-polyfill-provider": "^0.4.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { @@ -4914,9 +4902,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", "dev": true, "funding": [ { @@ -4933,9 +4921,9 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.11" }, "bin": { @@ -5029,16 +5017,16 @@ } }, "node_modules/cacache": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.3.tgz", - "integrity": "sha512-jAdjGxmPxZh0IipMdR7fK/4sDSrHMLUV0+GvVUsjwyGNKHsh79kW/otg+GkbXwl6Uzvy9wsvHOX4nUoWldeZMg==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^5.0.0", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", @@ -5051,15 +5039,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/cacache/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", @@ -5227,9 +5206,9 @@ } }, "node_modules/cache-loader/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -5349,9 +5328,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001495", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001495.tgz", - "integrity": "sha512-F6x5IEuigtUfU5ZMQK2jsy5JqUUlEFRVZq8bO2a+ysq5K7jD6PPc9YXZj78xDNS3uNchesp1Jw47YXEqr+Viyg==", + "version": "1.0.30001532", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz", + "integrity": "sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==", "dev": true, "funding": [ { @@ -5375,9 +5354,9 @@ "dev": true }, "node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -6238,6 +6217,7 @@ "version": "0.15.1", "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz", "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==", + "deprecated": "Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog", "dev": true, "dependencies": { "bluebird": "^3.1.1" @@ -6737,9 +6717,9 @@ } }, "node_modules/copy-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -6788,9 +6768,9 @@ "dev": true }, "node_modules/core-js": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.30.2.tgz", - "integrity": "sha512-uBJiDmwqsbJCWHAwjrx3cvjbMXP7xD72Dmsn5LOJpiRmE3WbBbN5rCqQ2Qh6Ek6/eOrjlWngEynBWo4VxerQhg==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz", + "integrity": "sha512-pxXSw1mYZPDGvTQqEc5vgIb83jGQKFGYWY76z4a7weZXUolw3G+OvpZqSRcfYOoOVUQJYEPsWeQK8pKEnUtWxQ==", "dev": true, "hasInstallScript": true, "funding": { @@ -6799,12 +6779,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "version": "3.32.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.2.tgz", + "integrity": "sha512-+GjlguTDINOijtVRUxrQOv3kfu9rl+qPNdX2LTbJ/ZyVTuxK+ksVSAGX1nHstu4hrv1En/uPTtWgq2gI5wt4AQ==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.21.10" }, "funding": { "type": "opencollective", @@ -7850,9 +7830,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.421", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.421.tgz", - "integrity": "sha512-wZOyn3s/aQOtLGAwXMZfteQPN68kgls2wDAnYOA8kCjBvKVrW5RwmWVspxJYTqrcN7Y263XJVsC66VCIGzDO3g==", + "version": "1.4.513", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz", + "integrity": "sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==", "dev": true }, "node_modules/elliptic": { @@ -8056,18 +8036,19 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -8087,14 +8068,18 @@ "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -8596,9 +8581,9 @@ } }, "node_modules/execa/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -8759,6 +8744,12 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "dev": true }, + "node_modules/exponential-backoff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", + "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "dev": true + }, "node_modules/express": { "version": "4.18.2", "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", @@ -9333,26 +9324,17 @@ } }, "node_modules/fs-minipass": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.2.tgz", - "integrity": "sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", + "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", "dev": true, "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/fs-minipass/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/fs-write-stream-atomic": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", @@ -9433,15 +9415,15 @@ "dev": true }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -9617,16 +9599,16 @@ } }, "node_modules/glob": { - "version": "10.2.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.2.6.tgz", - "integrity": "sha512-U/rnDpXJGF414QQQZv5uVsabTVxMSwzS5CH0p3DRCIV6ownl4f7PzGnkGmvlum2wB+9RlJWJZ6ACU1INnBqiPA==", + "version": "10.3.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.4.tgz", + "integrity": "sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.0.3", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2", - "path-scurry": "^1.7.0" + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" }, "bin": { "glob": "dist/cjs/src/bin.js" @@ -10914,9 +10896,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -11233,16 +11215,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -11743,222 +11721,40 @@ } }, "node_modules/make-fetch-happen": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", - "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", + "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", "dev": true, "dependencies": { "agentkeepalive": "^4.2.1", - "cacache": "^16.1.0", - "http-cache-semantics": "^4.1.0", + "cacache": "^17.0.0", + "http-cache-semantics": "^4.1.1", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.0", "is-lambda": "^1.0.1", "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^2.0.3", + "minipass": "^5.0.0", + "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "promise-retry": "^2.0.1", "socks-proxy-agent": "^7.0.0", - "ssri": "^9.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/@npmcli/fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", - "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", - "dev": true, - "dependencies": { - "@gar/promisify": "^1.1.3", - "semver": "^7.3.5" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/cacache": { - "version": "16.1.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", - "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^2.1.0", - "@npmcli/move-file": "^2.0.0", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "glob": "^8.0.1", - "infer-owner": "^1.0.4", - "lru-cache": "^7.7.1", - "minipass": "^3.1.6", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "mkdirp": "^1.0.4", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^9.0.0", - "tar": "^6.1.11", - "unique-filename": "^2.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/make-fetch-happen/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" + "ssri": "^10.0.0" }, "engines": { - "node": ">=10" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/make-fetch-happen/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, "engines": { "node": ">=8" } }, - "node_modules/make-fetch-happen/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/make-fetch-happen/node_modules/rimraf/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/make-fetch-happen/node_modules/ssri": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", - "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", - "dev": true, - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-filename": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", - "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", - "dev": true, - "dependencies": { - "unique-slug": "^3.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/unique-slug": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", - "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", - "dev": true, - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/map-cache": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", @@ -12058,48 +11854,57 @@ } }, "node_modules/markdownlint": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.28.2.tgz", - "integrity": "sha512-yYaQXoKKPV1zgrFsyAuZPEQoe+JrY9GDag9ObKpk09twx4OCU5lut+0/kZPrQ3W7w82SmgKhd7D8m34aG1unVw==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.30.0.tgz", + "integrity": "sha512-nInuFvI/rEzanAOArW5490Ez4EYpB5ODqVM0mcDYCPx9DKJWCQqCgejjiCvbSeE7sjbDscVtZmwr665qpF5xGA==", "dev": true, "dependencies": { "markdown-it": "13.0.1", - "markdownlint-micromark": "0.1.2" + "markdownlint-micromark": "0.1.7" }, "engines": { - "node": ">=14.18.0" + "node": ">=16" } }, "node_modules/markdownlint-cli": { - "version": "0.34.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.34.0.tgz", - "integrity": "sha512-4G9I++VBTZkaye6Yfc/7dU6HQHcyldZEVB+bYyQJLcpJOHKk/q5ZpGqK80oKMIdlxzsA3aWOJLZ4DkoaoUWXbQ==", + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.36.0.tgz", + "integrity": "sha512-h4WdqOam3+QOVOcJSOQuG8KvvN8dlS0OiJhbPwYWBk7VMZR40UtSSMIOpSP5B4EHPHg3W3ILSQUvqg1HNpTCxA==", "dev": true, "dependencies": { - "commander": "~10.0.1", + "commander": "~11.0.0", "get-stdin": "~9.0.0", - "glob": "~10.2.2", + "glob": "~10.3.4", "ignore": "~5.2.4", "js-yaml": "^4.1.0", "jsonc-parser": "~3.2.0", - "markdownlint": "~0.28.2", - "minimatch": "~9.0.0", - "run-con": "~1.2.11" + "markdownlint": "~0.30.0", + "minimatch": "~9.0.3", + "run-con": "~1.3.2" }, "bin": { "markdownlint": "markdownlint.js" }, "engines": { - "node": ">=14" + "node": ">=16" + } + }, + "node_modules/markdownlint-cli/node_modules/commander": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-11.0.0.tgz", + "integrity": "sha512-9HMlXtt/BNoYr8ooyjjNRdIilOTkVJXB+GhxMTtOKwk0R4j4lS4NpjuqmRxroBfnfTSHQIHQB7wryHhXarNjmQ==", + "dev": true, + "engines": { + "node": ">=16" } }, "node_modules/markdownlint-micromark": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.2.tgz", - "integrity": "sha512-jRxlQg8KpOfM2IbCL9RXM8ZiYWz2rv6DlZAnGv8ASJQpUh6byTBnEsbuMZ6T2/uIgntyf7SKg/mEaEBo1164fQ==", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/markdownlint-micromark/-/markdownlint-micromark-0.1.7.tgz", + "integrity": "sha512-BbRPTC72fl5vlSKv37v/xIENSRDYL/7X/XoFzZ740FGEbs9vZerLrIkFRY0rv7slQKxDczToYuMmqQFN61fi4Q==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=16" } }, "node_modules/md5.js": { @@ -12364,9 +12169,9 @@ "dev": true }, "node_modules/minimatch": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.1.tgz", - "integrity": "sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==", + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -12388,9 +12193,9 @@ } }, "node_modules/minipass": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.2.tgz", - "integrity": "sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", + "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -12421,34 +12226,22 @@ } }, "node_modules/minipass-fetch": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", - "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", + "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", "dev": true, "dependencies": { - "minipass": "^3.1.6", + "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" }, "optionalDependencies": { "encoding": "^0.1.13" } }, - "node_modules/minipass-fetch/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -12849,15 +12642,16 @@ } }, "node_modules/node-gyp": { - "version": "9.3.1", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.1.tgz", - "integrity": "sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.0.tgz", + "integrity": "sha512-dMXsYP6gc9rRbejLXmTbVRYjAHw7ppswsKyMxuxJxxOHzluIO1rGp9TOQgjFJ+2MCqcOcQTOPB/8Xwhr+7s4Eg==", "dev": true, "dependencies": { "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", "glob": "^7.1.4", "graceful-fs": "^4.2.6", - "make-fetch-happen": "^10.0.3", + "make-fetch-happen": "^11.0.3", "nopt": "^6.0.0", "npmlog": "^6.0.0", "rimraf": "^3.0.2", @@ -13012,9 +12806,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==", + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, "node_modules/nopt": { @@ -13102,39 +12896,40 @@ } }, "node_modules/npm-check-updates": { - "version": "16.10.12", - "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.10.12.tgz", - "integrity": "sha512-js/Gg9+5RTyOQZnmFcPswLxf4sK/H5AE/8bl4tkleLJTC1gXhQqqELUFwXqppNvx488aXxN52ZY9k9MSSvEW2A==", + "version": "16.13.3", + "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.13.3.tgz", + "integrity": "sha512-l3FQtm+ZtDwqtK2r27vCuNdtnoDsXzk8D2WczvrAJy2bGPZJvRmuUa/Q9Gv+AbZV0IHSNJD2oHtQqUeqQRhEsw==", "dev": true, "dependencies": { - "chalk": "^5.2.0", + "chalk": "^5.3.0", "cli-table3": "^0.6.3", - "commander": "^10.0.0", + "commander": "^10.0.1", "fast-memoize": "^2.5.2", "find-up": "5.0.0", "fp-and-or": "^0.1.3", "get-stdin": "^8.0.0", "globby": "^11.0.4", "hosted-git-info": "^5.1.0", - "ini": "^4.0.0", + "ini": "^4.1.1", "js-yaml": "^4.1.0", "json-parse-helpfulerror": "^1.0.3", "jsonlines": "^0.1.1", "lodash": "^4.17.21", - "minimatch": "^9.0.0", + "make-fetch-happen": "^11.1.1", + "minimatch": "^9.0.3", "p-map": "^4.0.0", - "pacote": "15.1.1", + "pacote": "15.2.0", "parse-github-url": "^1.0.2", "progress": "^2.0.3", "prompts-ncu": "^3.0.0", - "rc-config-loader": "^4.1.2", + "rc-config-loader": "^4.1.3", "remote-git-tags": "^3.0.0", - "rimraf": "^5.0.0", - "semver": "^7.4.0", + "rimraf": "^5.0.1", + "semver": "^7.5.4", "semver-utils": "^1.1.4", "source-map-support": "^0.5.21", "spawn-please": "^2.0.1", - "strip-json-comments": "^5.0.0", + "strip-json-comments": "^5.0.1", "untildify": "^4.0.0", "update-notifier": "^6.0.2" }, @@ -13159,9 +12954,9 @@ } }, "node_modules/npm-install-checks": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.1.1.tgz", - "integrity": "sha512-dH3GmQL4vsPtld59cOn8uY0iOqRmqKvV+DLGwNXV/Q7MDgD2QfOADWd/mFXcIE5LVhYYGjA3baz6W9JneqnuCw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.2.0.tgz", + "integrity": "sha512-744wat5wAAHsxa4590mWO0tJ8PKxR8ORZsH9wGpQc3nWTzozMAgBN/XyqYw7mg3yqLM8dLwEnwSfKMmXAjF69g==", "dev": true, "dependencies": { "semver": "^7.1.1" @@ -13219,9 +13014,9 @@ } }, "node_modules/npm-pick-manifest": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.1.tgz", - "integrity": "sha512-mRtvlBjTsJvfCCdmPtiu2bdlx8d/KXtF7yNXNWe7G0Z36qWA9Ny5zXsI2PfBZEv7SXgoxTmNaTzGSbbzDZChoA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-8.0.2.tgz", + "integrity": "sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==", "dev": true, "dependencies": { "npm-install-checks": "^6.0.0", @@ -13235,43 +13030,17 @@ }, "node_modules/npm-registry-fetch": { "version": "14.0.5", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", - "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", - "dev": true, - "dependencies": { - "make-fetch-happen": "^11.0.0", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.1.2", - "npm-package-arg": "^10.0.0", - "proc-log": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-14.0.5.tgz", + "integrity": "sha512-kIDMIo4aBm6xg7jOttupWZamsZRkAqMqwqqbVXnUqstY5+tapvv6bkH/qMR76jdgV+YljEUCyWx3hRYMrJiAgA==", "dev": true, "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", + "make-fetch-happen": "^11.0.0", "minipass": "^5.0.0", "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^10.0.0", + "proc-log": "^3.0.0" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -13286,23 +13055,6 @@ "node": ">=8" } }, - "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, "node_modules/npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -13531,15 +13283,15 @@ } }, "node_modules/object.getownpropertydescriptors": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", - "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.7.tgz", + "integrity": "sha512-PrJz0C2xJ58FNn11XV2lr4Jt5Gzl94qpy9Lu0JlfEj14z88sqbSBJCBEzdlNUCzY2gburhbrwOZ5BHCmuNUy0g==", "dev": true, "dependencies": { - "array.prototype.reduce": "^1.0.5", + "array.prototype.reduce": "^1.0.6", "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "safe-array-concat": "^1.0.0" }, "engines": { @@ -13562,14 +13314,14 @@ } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -13782,9 +13534,9 @@ } }, "node_modules/pacote": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.1.tgz", - "integrity": "sha512-eeqEe77QrA6auZxNHIp+1TzHQ0HBKf5V6c8zcaYZ134EJe1lCi+fjXATkNiEEfbG+e50nu02GLvUtmZcGOYabQ==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "dependencies": { "@npmcli/git": "^4.0.0", @@ -13793,7 +13545,7 @@ "@npmcli/run-script": "^6.0.0", "cacache": "^17.0.0", "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "npm-package-arg": "^10.0.0", "npm-packlist": "^7.0.0", "npm-pick-manifest": "^8.0.0", @@ -13802,7 +13554,7 @@ "promise-retry": "^2.0.1", "read-package-json": "^6.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", + "sigstore": "^1.3.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -13814,9 +13566,9 @@ } }, "node_modules/pacote/node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" @@ -13992,13 +13744,13 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.2.tgz", - "integrity": "sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.2" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -14008,9 +13760,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.2.tgz", - "integrity": "sha512-ERJq3FOzJTxBbFjZ7iDs+NiK4VI9Wz+RdrrAB8dio1oV+YvdPzUEE4QNiT2VD51DkIbCYRUUzCRkssXCHqSnKQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -15401,16 +15153,6 @@ "node": ">=0.10.0" } }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", @@ -15538,9 +15280,9 @@ } }, "node_modules/rc-config-loader": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.2.tgz", - "integrity": "sha512-qKTnVWFl9OQYKATPzdfaZIbTxcHziQl92zYSxYC6umhOqyAsoj8H8Gq/+aFjAso68sBdjTz3A7omqeAkkF1MWg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", + "integrity": "sha512-kD7FqML7l800i6pS6pvLyIE2ncbk9Du8Q0gp/4hMPhJU6ZxApkoLcGD8ZeqgiAlfwZ6BlETq6qqe+12DUL207w==", "dev": true, "dependencies": { "debug": "^4.3.4", @@ -15806,15 +15548,15 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -16147,12 +15889,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -16281,29 +16023,20 @@ } }, "node_modules/run-con": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.11.tgz", - "integrity": "sha512-NEMGsUT+cglWkzEr4IFK21P4Jca45HqiAbIIZIBdX5+UZTB24Mb/21iNGgz9xZa8tL6vbW7CXmq7MFN42+VjNQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.3.2.tgz", + "integrity": "sha512-CcfE+mYiTcKEzg0IqS08+efdnH0oJ3zV0wSUFBNrMHMuxCtXvBCLzCJHatwuXDcu/RlhjTziTo/a1ruQik6/Yg==", "dev": true, "dependencies": { "deep-extend": "^0.6.0", - "ini": "~3.0.0", - "minimist": "^1.2.6", + "ini": "~4.1.0", + "minimist": "^1.2.8", "strip-json-comments": "~3.1.1" }, "bin": { "run-con": "cli.js" } }, - "node_modules/run-con/node_modules/ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/run-con/node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -16355,13 +16088,13 @@ "dev": true }, "node_modules/safe-array-concat": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", - "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "has-symbols": "^1.0.3", "isarray": "^2.0.5" }, @@ -16474,9 +16207,9 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -16774,14 +16507,16 @@ } }, "node_modules/sigstore": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.5.2.tgz", - "integrity": "sha512-X95v6xAAooVpn7PaB94TDmFeSO5SBfCtB1R23fvzr36WTfjtkiiyOeei979nbTjc8nzh6FSLeltQZuODsm1EjQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/sigstore/-/sigstore-1.9.0.tgz", + "integrity": "sha512-0Zjz0oe37d08VeOtBIuB6cRriqXse2e8w+7yIy2XSXjshRKxbc2KkhXjL229jXSxEm7UbcjS76wcJDGQddVI9A==", "dev": true, "dependencies": { - "@sigstore/protobuf-specs": "^0.1.0", - "make-fetch-happen": "^11.0.1", - "tuf-js": "^1.1.3" + "@sigstore/bundle": "^1.1.0", + "@sigstore/protobuf-specs": "^0.2.0", + "@sigstore/sign": "^1.0.0", + "@sigstore/tuf": "^1.0.3", + "make-fetch-happen": "^11.0.1" }, "bin": { "sigstore": "bin/sigstore.js" @@ -16790,58 +16525,6 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sigstore/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/sigstore/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, "node_modules/simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", @@ -17359,26 +17042,17 @@ } }, "node_modules/ssri": { - "version": "10.0.4", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.4.tgz", - "integrity": "sha512-12+IR2CB2C28MMAw0Ncqwj5QbTcs0nGIhgJzYWzDkb21vWmfNI83KS4f3Ci6GI98WreIfG7o9UXp3C0qbpA8nQ==", + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", + "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", "dev": true, "dependencies": { - "minipass": "^5.0.0" + "minipass": "^7.0.3" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/ssri/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", @@ -17701,14 +17375,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -17718,28 +17392,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17801,9 +17475,9 @@ } }, "node_modules/strip-json-comments": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.0.tgz", - "integrity": "sha512-V1LGY4UUo0jgwC+ELQ2BNWfPa17TIuwBLg+j1AA/9RPzKINl1lhxVEu2r+ZTTO8aetIsUzE5Qj6LMSBkoGYKKw==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-5.0.1.tgz", + "integrity": "sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==", "dev": true, "engines": { "node": ">=14.16" @@ -18036,9 +17710,9 @@ } }, "node_modules/tar": { - "version": "6.1.15", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.15.tgz", - "integrity": "sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -18356,9 +18030,9 @@ } }, "node_modules/terser-webpack-plugin/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -18632,69 +18306,17 @@ "dev": true }, "node_modules/tuf-js": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.6.tgz", - "integrity": "sha512-CXwFVIsXGbVY4vFiWF7TJKWmlKJAT8TWkH4RmiohJRcDJInix++F0dznDmoVbtJNzZ8yLprKUG4YrDIhv3nBMg==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", "dev": true, "dependencies": { "@tufjs/models": "1.0.4", "debug": "^4.3.4", - "make-fetch-happen": "^11.1.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/make-fetch-happen": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-11.1.1.tgz", - "integrity": "sha512-rLWS7GCSTcEujjVBs2YqG7Y4643u8ucvCJeSRqiLYhesrDuzeuFIk37xREzAsfQaqzl8b9rNCE4m6J8tvX4Q8w==", - "dev": true, - "dependencies": { - "agentkeepalive": "^4.2.1", - "cacache": "^17.0.0", - "http-cache-semantics": "^4.1.1", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^7.7.1", - "minipass": "^5.0.0", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^7.0.0", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.3.tgz", - "integrity": "sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==", - "dev": true, - "dependencies": { - "minipass": "^5.0.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" + "make-fetch-happen": "^11.1.1" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" } }, "node_modules/tunnel-agent": { @@ -18740,6 +18362,57 @@ "node": ">= 0.6" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -19096,13 +18769,13 @@ "dev": true }, "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.2.tgz", + "integrity": "sha512-7yIgNnrST44S7PJ5+jXbdIupfU1nWUdQJBFBeJRclPXiWgCvrSq5Frw8lr/i//n5sqDfzoKmBymMS81l4U/7cg==", "dev": true, "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" + "punycode": "^1.4.1", + "qs": "^6.11.2" } }, "node_modules/url-loader": { @@ -19159,11 +18832,26 @@ } }, "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, + "node_modules/url/node_modules/qs": { + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", @@ -19307,9 +18995,9 @@ "dev": true }, "node_modules/vue-loader": { - "version": "15.10.1", - "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.1.tgz", - "integrity": "sha512-SaPHK1A01VrNthlix6h1hq4uJu7S/z0kdLUb6klubo738NeQoLbS6V9/d8Pv19tU0XdQKju3D1HSKuI8wJ5wMA==", + "version": "15.10.2", + "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.10.2.tgz", + "integrity": "sha512-ndeSe/8KQc/nlA7TJ+OBhv2qalmj1s+uBs7yHDRFaAXscFTApBzY9F1jES3bautmgWjDlDct0fw8rPuySDLwxw==", "dev": true, "dependencies": { "@vue/component-compiler-utils": "^3.1.0", @@ -19326,6 +19014,9 @@ "cache-loader": { "optional": true }, + "prettier": { + "optional": true + }, "vue-template-compiler": { "optional": true } @@ -19474,15 +19165,15 @@ "dev": true }, "node_modules/vuepress": { - "version": "1.9.9", - "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.9.9.tgz", - "integrity": "sha512-CU94W3EdWaCavGx2VSvQJMI/hyv+m/YMdrvJJw67EVfmmJJDb1iTGrilDgLd0qsyrXzBy0Ru9Qi6rkf4IwcOTg==", + "version": "1.9.10", + "resolved": "https://registry.npmjs.org/vuepress/-/vuepress-1.9.10.tgz", + "integrity": "sha512-UnGm9vjQvG918SZVNvgiUlNimLqawdYPq0aPRXDpEB1VksvqegVFy/GKdA8ShXJaEpOMPSt7YD4uK21jaMs3kA==", "dev": true, "hasInstallScript": true, "dependencies": { - "@vuepress/core": "1.9.9", - "@vuepress/theme-default": "1.9.9", - "@vuepress/types": "1.9.9", + "@vuepress/core": "1.9.10", + "@vuepress/theme-default": "1.9.10", + "@vuepress/types": "1.9.10", "cac": "^6.5.6", "envinfo": "^7.2.0", "opencollective-postinstall": "^2.0.2", @@ -20313,9 +20004,9 @@ } }, "node_modules/watchpack/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -20362,9 +20053,9 @@ } }, "node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", @@ -20672,9 +20363,9 @@ } }, "node_modules/webpack-dev-server/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -21085,17 +20776,16 @@ "dev": true }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" diff --git a/package.json b/package.json index b9280489d..259307e32 100644 --- a/package.json +++ b/package.json @@ -23,15 +23,15 @@ "prepare": "npx husky install" }, "devDependencies": { - "@vuepress/plugin-back-to-top": "^1.9.9", - "@vuepress/plugin-medium-zoom": "^1.9.9", + "@vuepress/plugin-back-to-top": "^1.9.10", + "@vuepress/plugin-medium-zoom": "^1.9.10", "got": "^13.0.0", "husky": "^8.0.3", - "markdownlint-cli": "^0.34.0", - "npm-check-updates": "^16.10.12", + "markdownlint-cli": "^0.36.0", + "npm-check-updates": "^16.13.3", "plantuml-encoder": "^1.4.0", "svgo": "^3.0.2", - "vuepress": "^1.9.9", + "vuepress": "^1.9.10", "vuepress-plugin-versioning": "git+https://github.com/mojaloop/vuepress-plugin-versioning.git#dcb14962a69b8e5aaf184d2d1a31ae4f43870bc1", "vuepress-theme-titanium": "^4.11.1" } From 1bf419590db7eda9d9859db8cf0c41885fe96a4b Mon Sep 17 00:00:00 2001 From: Vijay Date: Mon, 11 Sep 2023 20:28:42 +0530 Subject: [PATCH 18/21] fix: build issues --- .../assets/diagrams/transfer/1-1-discovery.puml | 6 +++--- .../assets/diagrams/transfer/1-2-1-agreement.puml | 4 ++-- .../assets/diagrams/transfer/1-2-2-authorization.puml | 6 +++--- .../diagrams/transfer/1-2-3-rejected-authorization.puml | 4 ++-- .../transfer/1-2-3-signed-authorization-fido.puml | 4 ++-- .../transfer/1-2-3-signed-authorization-generic.puml | 2 +- .../diagrams/transfer/1-2-4-verify-authorization.puml | 4 ++-- .../thirdparty/assets/diagrams/transfer/1-3-transfer.puml | 8 ++++---- .../assets/diagrams/transfer/3-2-1-bad-tx-request.puml | 4 ++-- .../assets/diagrams/transfer/3-3-1-bad-quote-request.puml | 8 ++++---- .../diagrams/transfer/3-3-2-bad-transfer-request.puml | 8 ++++---- .../transfer/3-4-1-bad-signed-challenge-self-hosted.puml | 4 ++-- .../transfer/3-4-2-bad-signed-challenge-auth-service.puml | 8 ++++---- .../assets/diagrams/transfer/3-6-tpr-timeout.puml | 2 +- .../assets/diagrams/transfer/get_transaction_request.puml | 4 ++-- .../assets/diagrams/transfer/1-1-discovery.puml | 6 +++--- .../assets/diagrams/transfer/1-2-1-agreement.puml | 4 ++-- .../assets/diagrams/transfer/1-2-2-authorization.puml | 6 +++--- .../diagrams/transfer/1-2-3-rejected-authorization.puml | 4 ++-- .../transfer/1-2-3-signed-authorization-fido.puml | 2 +- .../transfer/1-2-3-signed-authorization-generic.puml | 2 +- .../diagrams/transfer/1-2-4-verify-authorization.puml | 4 ++-- .../thirdparty/assets/diagrams/transfer/1-3-transfer.puml | 8 ++++---- .../assets/diagrams/transfer/3-2-1-bad-tx-request.puml | 4 ++-- .../assets/diagrams/transfer/3-3-1-bad-quote-request.puml | 8 ++++---- .../diagrams/transfer/3-3-2-bad-transfer-request.puml | 8 ++++---- .../transfer/3-4-1-bad-signed-challenge-self-hosted.puml | 4 ++-- .../transfer/3-4-2-bad-signed-challenge-auth-service.puml | 8 ++++---- .../assets/diagrams/transfer/3-6-tpr-timeout.puml | 2 +- .../assets/diagrams/transfer/get_transaction_request.puml | 4 ++-- 30 files changed, 75 insertions(+), 75 deletions(-) diff --git a/docs/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml b/docs/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml index 4cbf4dc6d..364953004 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml @@ -28,7 +28,7 @@ end box == Discovery (Lookup) == -rnote right of D1 #Light +rnote right of D1 #LightYellow **""GET /parties/MSISDN/+4412345678""** ""FSPIOP-Source: pispa"" end note @@ -37,7 +37,7 @@ S --> D1: ""202 Accepted"" ... ALS lookup flow not shown here ... -rnote over S #Light +rnote over S #LightYellow **""GET /parties/MSISDN/+4412345678""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspb"" @@ -45,7 +45,7 @@ end note S -> D3: ""GET /parties/MSISDN/+4412345678"" D3 --> S: ""202 Accepted"" -rnote left of D3 #Light +rnote left of D3 #LightYellow **""PUT /parties/MSISDN/+4412345678""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: pispa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml b/docs/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml index 21250e52b..acaa89d72 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml @@ -28,7 +28,7 @@ end box == Agreement Phase == -rnote right of D1 #Light +rnote right of D1 #LightYellow **""POST /thirdpartyRequests/transactions""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -68,7 +68,7 @@ D2 -> D2: Store a referece to the ""consentId"" with the ""transactionRequestId" D2 -> D2: Generate a unique transactionId for this transaction request:\n**""11111111-0000-0000-0000-000000000000""** -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml b/docs/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml index 798e8224b..7c85c7e6b 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml @@ -30,7 +30,7 @@ box "DFSP B" participant "DFSP B\n(Payee)" as D3 end box -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /quotes""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -76,7 +76,7 @@ S --> D2: ""202 Accepted"" S -> D3: ""POST /quotes"" D3 --> S: ""202 Accepted"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /quotes/22222222-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: dfspa"" @@ -111,7 +111,7 @@ end note D2 -> D2: Generate a UUID for the authorization Request:\n""33333333-0000-0000-0000-000000000000"" D2 -> D2: Derive the challenge based \non ""PUT /quotes/{ID}"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /thirdpartyRequests/authorizations""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: pispa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml b/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml index 01205b804..23efe5d8f 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml @@ -34,7 +34,7 @@ note right of D1 User rejects the terms of the transcationRequest end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -53,7 +53,7 @@ note over D2 User has rejected the transaction request. end note -rnote over D2 #Light +rnote over D2 #LightYellow **""PATCH /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: pispa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml b/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml index 90b1b7b83..e1875bcf6 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml @@ -10,7 +10,7 @@ skinparam SequenceLifeLineBorderColor Black skinparam ParticipantFontStyle Bold skinparam ParticipantFontSize 20 skinparam ParticipantBackgroundColor WhiteSmoke -skinparam ArrowColor Black +skinparam ArrowColor Black hide footbox @@ -35,7 +35,7 @@ note right of D1 the **""challenge""** string end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml b/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml index 28d5c723a..1e0c8070f 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml @@ -34,7 +34,7 @@ note right of D1 the Credential's privateKey to sign the challenge end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml b/docs/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml index 8bde91c2c..9b0560715 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml @@ -28,7 +28,7 @@ end box D2 -> D2: Generate a new ""verificationRequestId"", and associate \n it with the ""thirdpartyTransactionRequestId"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /thirdpartyRequests/verifications""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: central-auth"" @@ -59,7 +59,7 @@ AUTHS -> AUTHS: Lookup this consent based on consentId AUTHS -> AUTHS: Ensure the accountAddress matches what is in Consent AUTHS -> AUTHS: Check that the signed bytes match the \npublickey we have stored for the consent -rnote right of AUTHS #Light +rnote right of AUTHS #LightYellow **""PUT /thirdpartyRequests/verifications/44444444-0000-0000-0000-000000000000""** ""FSPIOP-Source: central-auth"" ""FSPIOP-Destination: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml b/docs/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml index 1af60155e..a4b092e4b 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml @@ -96,7 +96,7 @@ actor "<$actor>\nPayee" as CB D2 -> D2: Generate a new ""transferId"", and associate \n it with the ""transactionRequestId"" -rnote over D2 #Light +rnote over D2 #LightYellow **""POST /transfers""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -116,7 +116,7 @@ end note D2 -> S: ""POST /transfers"" S --> D2: ""202 Accepted"" -rnote over S #Light +rnote over S #LightYellow **""POST /transfers""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -136,7 +136,7 @@ end note S -> D3: ""POST /transfers"" D3 --> S: ""202 Accepted"" -rnote left of D3 #Light +rnote left of D3 #LightYellow **""PUT /transfers/55555555-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: dfspa"" @@ -155,7 +155,7 @@ D2 --> S: ""200 OK"" D2 -> D2: Look up ""transactionRequestId"" from the ""transferId"" -rnote over D2 #Light +rnote over D2 #LightYellow **""PATCH /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: pispa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml b/docs/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml index 1252be904..0f8b3ad33 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml @@ -29,7 +29,7 @@ end box == Agreement Phase == -rnote right of D1 #Light +rnote right of D1 #LightYellow **""POST /thirdpartyRequests/transactions""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -68,7 +68,7 @@ D2 --> S: ""202 Accepted"" D2 -> D2: DFSP finds something wrong with this transaction request. -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml b/docs/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml index b6ebf6ce3..c4f2de4a6 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml @@ -35,7 +35,7 @@ end box D2 -> D2: Generate a unique transactionId for this transaction request:\n**""11111111-0000-0000-0000-000000000000""** -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" @@ -50,7 +50,7 @@ S --> D2: ""200 OK"" S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" D1 --> S: ""200 OK"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /quotes""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -99,7 +99,7 @@ D3 --> S: ""202 Accepted"" D3 -> D3: Quote fails for some reason. -rnote left of D3 #Light +rnote left of D3 #LightYellow **""PUT /quotes/22222222-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: dfspa"" @@ -120,7 +120,7 @@ note left of D2 Quote failed, DFSP needs to inform PISP end note -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml b/docs/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml index 3a7f78799..e72546bc0 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml @@ -40,7 +40,7 @@ end box D2 -> D2: Generate a new ""transferId"", and associate \n it with the ""transactionRequestId"" -rnote over D2 #Light +rnote over D2 #LightYellow **""POST /transfers""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -60,7 +60,7 @@ end note D2 -> S: ""POST /transfers"" S --> D2: ""202 Accepted"" -rnote over S #Light +rnote over S #LightYellow **""POST /transfers""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -80,7 +80,7 @@ end note S -> D3: ""POST /transfers"" D3 --> S: ""202 Accepted"" -rnote left of D3 #Light +rnote left of D3 #LightYellow **""PUT /transfers/55555555-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: dfspa"" @@ -101,7 +101,7 @@ note left of D2 Transfer failed, DFSP needs to inform PISP end note -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml b/docs/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml index 5bc586ee2..a4de41e87 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml @@ -38,7 +38,7 @@ note right of D1 the **""challenge""** string end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -74,7 +74,7 @@ note over D2 end note -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml b/docs/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml index ce3645d30..6eecdf555 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml @@ -40,7 +40,7 @@ note right of D1 the **""challenge""** string end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations""** **"" /33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" @@ -74,7 +74,7 @@ D2 -> D2: Lookup ""consentId"" for this ""transactionRequestId"" D2 -> D2: Generate a new ""verificationRequestId"", and associate \n it with the ""thirdpartyTransactionRequestId"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /thirdpartyRequests/verifications""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: central-auth"" @@ -105,7 +105,7 @@ AUTHS -> AUTHS: Lookup this consent based on consentId AUTHS -> AUTHS: Ensure the accountAddress matches what is in Consent AUTHS -> AUTHS: Check that the signed bytes match the \npublickey we have stored for the consent -rnote right of AUTHS #Light +rnote right of AUTHS #LightYellow **""PUT /thirdpartyRequests/verifications""** **"" /44444444-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: central-auth"" @@ -128,7 +128,7 @@ note over D2 end note -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml b/docs/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml index dfcae6698..e2ca48302 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml @@ -27,7 +27,7 @@ box "DFSP A" end box -rnote right of D1 #Light +rnote right of D1 #LightYellow **""POST /thirdpartyRequests/transactions""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" diff --git a/docs/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml b/docs/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml index c8ca6b83b..d1559a24c 100644 --- a/docs/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml +++ b/docs/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml @@ -35,7 +35,7 @@ end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""GET /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -50,7 +50,7 @@ D2 --> S: ""202 Accepted"" D2 -> D2: DFSP looks up already created \nthirdparty transaction request D2 -> D2: DFSP ensures that the FSPIOP-Source (pisp)\nis the same as the original sender of \n""POST /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: pispa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml index 4cbf4dc6d..364953004 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-1-discovery.puml @@ -28,7 +28,7 @@ end box == Discovery (Lookup) == -rnote right of D1 #Light +rnote right of D1 #LightYellow **""GET /parties/MSISDN/+4412345678""** ""FSPIOP-Source: pispa"" end note @@ -37,7 +37,7 @@ S --> D1: ""202 Accepted"" ... ALS lookup flow not shown here ... -rnote over S #Light +rnote over S #LightYellow **""GET /parties/MSISDN/+4412345678""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspb"" @@ -45,7 +45,7 @@ end note S -> D3: ""GET /parties/MSISDN/+4412345678"" D3 --> S: ""202 Accepted"" -rnote left of D3 #Light +rnote left of D3 #LightYellow **""PUT /parties/MSISDN/+4412345678""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: pispa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml index 3d5aabd80..c8960853f 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-1-agreement.puml @@ -28,7 +28,7 @@ end box == Agreement Phase == -rnote right of D1 #Light +rnote right of D1 #LightYellow **""POST /thirdpartyRequests/transactions""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -68,7 +68,7 @@ D2 -> D2: Store a referece to the ""consentId"" with the ""transactionRequestId" D2 -> D2: Generate a unique transactionId for this transaction request:\n**""11111111-0000-0000-0000-000000000000""** -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml index 798e8224b..7c85c7e6b 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-2-authorization.puml @@ -30,7 +30,7 @@ box "DFSP B" participant "DFSP B\n(Payee)" as D3 end box -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /quotes""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -76,7 +76,7 @@ S --> D2: ""202 Accepted"" S -> D3: ""POST /quotes"" D3 --> S: ""202 Accepted"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /quotes/22222222-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: dfspa"" @@ -111,7 +111,7 @@ end note D2 -> D2: Generate a UUID for the authorization Request:\n""33333333-0000-0000-0000-000000000000"" D2 -> D2: Derive the challenge based \non ""PUT /quotes/{ID}"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /thirdpartyRequests/authorizations""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: pispa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml index 01205b804..23efe5d8f 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-rejected-authorization.puml @@ -34,7 +34,7 @@ note right of D1 User rejects the terms of the transcationRequest end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -53,7 +53,7 @@ note over D2 User has rejected the transaction request. end note -rnote over D2 #Light +rnote over D2 #LightYellow **""PATCH /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: pispa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml index 90b1b7b83..c4be8f187 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-fido.puml @@ -35,7 +35,7 @@ note right of D1 the **""challenge""** string end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml index 28d5c723a..1e0c8070f 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-3-signed-authorization-generic.puml @@ -34,7 +34,7 @@ note right of D1 the Credential's privateKey to sign the challenge end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml index 8bde91c2c..9b0560715 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-2-4-verify-authorization.puml @@ -28,7 +28,7 @@ end box D2 -> D2: Generate a new ""verificationRequestId"", and associate \n it with the ""thirdpartyTransactionRequestId"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /thirdpartyRequests/verifications""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: central-auth"" @@ -59,7 +59,7 @@ AUTHS -> AUTHS: Lookup this consent based on consentId AUTHS -> AUTHS: Ensure the accountAddress matches what is in Consent AUTHS -> AUTHS: Check that the signed bytes match the \npublickey we have stored for the consent -rnote right of AUTHS #Light +rnote right of AUTHS #LightYellow **""PUT /thirdpartyRequests/verifications/44444444-0000-0000-0000-000000000000""** ""FSPIOP-Source: central-auth"" ""FSPIOP-Destination: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml index 1af60155e..a4b092e4b 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/1-3-transfer.puml @@ -96,7 +96,7 @@ actor "<$actor>\nPayee" as CB D2 -> D2: Generate a new ""transferId"", and associate \n it with the ""transactionRequestId"" -rnote over D2 #Light +rnote over D2 #LightYellow **""POST /transfers""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -116,7 +116,7 @@ end note D2 -> S: ""POST /transfers"" S --> D2: ""202 Accepted"" -rnote over S #Light +rnote over S #LightYellow **""POST /transfers""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -136,7 +136,7 @@ end note S -> D3: ""POST /transfers"" D3 --> S: ""202 Accepted"" -rnote left of D3 #Light +rnote left of D3 #LightYellow **""PUT /transfers/55555555-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: dfspa"" @@ -155,7 +155,7 @@ D2 --> S: ""200 OK"" D2 -> D2: Look up ""transactionRequestId"" from the ""transferId"" -rnote over D2 #Light +rnote over D2 #LightYellow **""PATCH /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: pispa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml index 1252be904..0f8b3ad33 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-2-1-bad-tx-request.puml @@ -29,7 +29,7 @@ end box == Agreement Phase == -rnote right of D1 #Light +rnote right of D1 #LightYellow **""POST /thirdpartyRequests/transactions""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -68,7 +68,7 @@ D2 --> S: ""202 Accepted"" D2 -> D2: DFSP finds something wrong with this transaction request. -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml index b6ebf6ce3..c4f2de4a6 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-3-1-bad-quote-request.puml @@ -35,7 +35,7 @@ end box D2 -> D2: Generate a unique transactionId for this transaction request:\n**""11111111-0000-0000-0000-000000000000""** -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" @@ -50,7 +50,7 @@ S --> D2: ""200 OK"" S -> D1: ""PUT /thirdpartyRequests/transactions""\n"" /00000000-0000-0000-0000-000000000000"" D1 --> S: ""200 OK"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /quotes""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -99,7 +99,7 @@ D3 --> S: ""202 Accepted"" D3 -> D3: Quote fails for some reason. -rnote left of D3 #Light +rnote left of D3 #LightYellow **""PUT /quotes/22222222-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: dfspa"" @@ -120,7 +120,7 @@ note left of D2 Quote failed, DFSP needs to inform PISP end note -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml index 3a7f78799..e72546bc0 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-3-2-bad-transfer-request.puml @@ -40,7 +40,7 @@ end box D2 -> D2: Generate a new ""transferId"", and associate \n it with the ""transactionRequestId"" -rnote over D2 #Light +rnote over D2 #LightYellow **""POST /transfers""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -60,7 +60,7 @@ end note D2 -> S: ""POST /transfers"" S --> D2: ""202 Accepted"" -rnote over S #Light +rnote over S #LightYellow **""POST /transfers""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: dfspb"" @@ -80,7 +80,7 @@ end note S -> D3: ""POST /transfers"" D3 --> S: ""202 Accepted"" -rnote left of D3 #Light +rnote left of D3 #LightYellow **""PUT /transfers/55555555-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspb"" ""FSPIOP-Destination: dfspa"" @@ -101,7 +101,7 @@ note left of D2 Transfer failed, DFSP needs to inform PISP end note -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml index 5bc586ee2..a4de41e87 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-4-1-bad-signed-challenge-self-hosted.puml @@ -38,7 +38,7 @@ note right of D1 the **""challenge""** string end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations/33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -74,7 +74,7 @@ note over D2 end note -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml index ce3645d30..6eecdf555 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-4-2-bad-signed-challenge-auth-service.puml @@ -40,7 +40,7 @@ note right of D1 the **""challenge""** string end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""PUT /thirdpartyRequests/authorizations""** **"" /33333333-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" @@ -74,7 +74,7 @@ D2 -> D2: Lookup ""consentId"" for this ""transactionRequestId"" D2 -> D2: Generate a new ""verificationRequestId"", and associate \n it with the ""thirdpartyTransactionRequestId"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""POST /thirdpartyRequests/verifications""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: central-auth"" @@ -105,7 +105,7 @@ AUTHS -> AUTHS: Lookup this consent based on consentId AUTHS -> AUTHS: Ensure the accountAddress matches what is in Consent AUTHS -> AUTHS: Check that the signed bytes match the \npublickey we have stored for the consent -rnote right of AUTHS #Light +rnote right of AUTHS #LightYellow **""PUT /thirdpartyRequests/verifications""** **"" /44444444-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: central-auth"" @@ -128,7 +128,7 @@ note over D2 end note -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions""** **"" /00000000-0000-0000-0000-000000000000/error""** ""FSPIOP-Source: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml index dfcae6698..e2ca48302 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/3-6-tpr-timeout.puml @@ -27,7 +27,7 @@ box "DFSP A" end box -rnote right of D1 #Light +rnote right of D1 #LightYellow **""POST /thirdpartyRequests/transactions""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" diff --git a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml index c8ca6b83b..d1559a24c 100644 --- a/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml +++ b/website/versioned_docs/v1.0.1/api/thirdparty/assets/diagrams/transfer/get_transaction_request.puml @@ -35,7 +35,7 @@ end note -rnote right of D1 #Light +rnote right of D1 #LightYellow **""GET /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: pispa"" ""FSPIOP-Destination: dfspa"" @@ -50,7 +50,7 @@ D2 --> S: ""202 Accepted"" D2 -> D2: DFSP looks up already created \nthirdparty transaction request D2 -> D2: DFSP ensures that the FSPIOP-Source (pisp)\nis the same as the original sender of \n""POST /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000"" -rnote left of D2 #Light +rnote left of D2 #LightYellow **""PUT /thirdpartyRequests/transactions/00000000-0000-0000-0000-000000000000""** ""FSPIOP-Source: dfspa"" ""FSPIOP-Destination: pispa"" From cd2d40a00e03dde55063db5500d84207f285b298 Mon Sep 17 00:00:00 2001 From: Miguel de Barros Date: Tue, 12 Sep 2023 11:40:15 +0200 Subject: [PATCH 19/21] fixes for legacy-build issues --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 54d7a64c0..7bd52396d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -24,6 +24,7 @@ defaults_Dependencies: &defaults_Dependencies | make gcc g++ python3 libtool autoconf automake \ python3 \ py3-pip + pip3 install --upgrade pip pip3 install awscli From b63f4365a123e984c6191fec54bf3d007bc3de62 Mon Sep 17 00:00:00 2001 From: Vijay Date: Wed, 27 Sep 2023 17:49:43 +0530 Subject: [PATCH 20/21] fix: fixed design diagram for batching --- .../diagrams/architecture/Transfers-Position-Binning.drawio.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg b/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg index f4f64fed1..67a6fda2a 100644 --- a/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg +++ b/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg @@ -1,4 +1,4 @@ -
Handler
Handler
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
Bin 1
Bin 1
Bin 2
Bin 2
Kafka Consumer
Kafka Consumer
1. Consumes n messages and store them in memory
1. Consumes n messages an...
2. Create bins based on accountID, action and batchSize
2. Create bins based on a...
Bin Processor
Bin Processor
4. Start TX
4. Start TX
5. Process each bin
5. Process ea...
3. Audit
3. Audit
6. Send Notifications
6. Send Notif...
7. Commit offset
7. Commit off...
Offset
Offset
8. End TX
8. End TX
1
1
1
1
Fulfil Bin
Fulfil Bin
Abort Bin
Abort Bin
Timeout Bin
Timeout Bin
Prepare Bin
Prepare Bin

(Messages in bins are not duplicated and stored as references to the existing objects in memory)

(Messages in bins are not duplicated and store...
Text is not SVG - cannot display
\ No newline at end of file +
Handler
Handler
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
Bin 1
Bin 1
Bin 2
Bin 2
Kafka Consumer
Kafka Consumer
1. Consumes n messages and store them in memory based on batchSize
1. Consumes n messages an...
2. Create bins based on accountID, action
2. Create bins based on a...
Bin Processor
Bin Processor
4. Start TX
4. Start TX
5. Process each bin
5. Process ea...
3. Audit
3. Audit
8. Send Notifications
8. Send Notif...
6. Commit offset
6. Commit off...
7. End TX
7. End TX
1
1
1
1
Fulfil Bin
Fulfil Bin
Abort Bin
Abort Bin
Timeout Bin
Timeout Bin
Prepare Bin
Prepare Bin

(Messages in bins are not duplicated and stored as references to the existing objects in memory)

(Messages in bins are not duplicated and store...
Text is not SVG - cannot display
\ No newline at end of file From a44c197b78d9297d880c878c7ea231819be40a17 Mon Sep 17 00:00:00 2001 From: Vijay Date: Wed, 4 Oct 2023 14:07:29 +0530 Subject: [PATCH 21/21] fix: updated design diagram for batching --- .../diagrams/architecture/Transfers-Position-Binning.drawio.svg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg b/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg index 67a6fda2a..2f529c3b4 100644 --- a/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg +++ b/docs/technical/central-ledger/assets/diagrams/architecture/Transfers-Position-Binning.drawio.svg @@ -1,4 +1,4 @@ -
Handler
Handler
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
Bin 1
Bin 1
Bin 2
Bin 2
Kafka Consumer
Kafka Consumer
1. Consumes n messages and store them in memory based on batchSize
1. Consumes n messages an...
2. Create bins based on accountID, action
2. Create bins based on a...
Bin Processor
Bin Processor
4. Start TX
4. Start TX
5. Process each bin
5. Process ea...
3. Audit
3. Audit
8. Send Notifications
8. Send Notif...
6. Commit offset
6. Commit off...
7. End TX
7. End TX
1
1
1
1
Fulfil Bin
Fulfil Bin
Abort Bin
Abort Bin
Timeout Bin
Timeout Bin
Prepare Bin
Prepare Bin

(Messages in bins are not duplicated and stored as references to the existing objects in memory)

(Messages in bins are not duplicated and store...
Text is not SVG - cannot display
\ No newline at end of file +
Handler
Handler
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
2
2
2
2
2
Bin 1
Bin 1
Bin 2
Bin 2
Kafka Consumer
Kafka Consumer
1. Consumes n messages and store them in memory based on batchSize
1. Consumes n messages an...
2. Create bins based on accountID, action
2. Create bins based on a...
Bin Processor
Bin Processor
4. Start TX
4. Start TX
6. Process each bin
6. Process ea...
3. Audit
3. Audit
10. Send Notifications
10. Send Noti...
8. Commit offset
8. Commit off...
9. End TX
9. End TX
1
1
1
1
Fulfil Bin
Fulfil Bin
Abort Bin
Abort Bin
Timeout Bin
Timeout Bin
Prepare Bin
Prepare Bin

(Messages in bins are not duplicated and stored as references to the existing objects in memory)

(Messages in bins are not duplicated and store...
5. Bulk Query
5. Bulk Query
7. Bulk Inserts
7. Bulk Inser...
Text is not SVG - cannot display
\ No newline at end of file