Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: avoid 2 extra db requests #1054

Draft
wants to merge 72 commits into
base: main
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
0b62904
feat: added db migration scripts for fx
vijayg10 Nov 8, 2023
0062b7a
feat(3574): update prepare-handler to deal with FX transfers (#988)
geka-evk Nov 16, 2023
07f2888
feat(3574): added FX endpoints to seeds (#989)
geka-evk Nov 17, 2023
a70d482
feat: implement changes in position handler for FX (#986)
vijayg10 Nov 22, 2023
2dc6a1f
chore(snapshot): 17.4.0-snapshot.3
vijayg10 Nov 22, 2023
fbc3252
chore(snapshot): 17.4.0-snapshot.4
vijayg10 Nov 22, 2023
e9d0ba2
chore(snapshot): 17.4.0-snapshot.5
vijayg10 Nov 22, 2023
853c90a
chore(snapshot): 17.4.0-snapshot.6
vijayg10 Nov 22, 2023
745802f
chore(snapshot): 17.4.0-snapshot.7
vijayg10 Nov 22, 2023
55d56f5
chore(snapshot): 17.4.0-snapshot.8
vijayg10 Nov 22, 2023
7f5c80d
fix: positions
vijayg10 Nov 22, 2023
98f7fdc
fix: disable unit tests for snapshot
vijayg10 Nov 22, 2023
1fb4904
chore(snapshot): 17.4.0-snapshot.9
vijayg10 Nov 22, 2023
70d0732
chore: added docs
vijayg10 Nov 22, 2023
29136ea
chore: updated doc
vijayg10 Nov 23, 2023
a883a33
fix: normal fulfil
vijayg10 Nov 23, 2023
8be45cd
fix: normal flow
vijayg10 Nov 23, 2023
cbfe0dd
fix: updated fx diagram
vijayg10 Nov 28, 2023
c3e8af8
chore: dep update
vijayg10 Dec 4, 2023
a0e5ae6
chore(snapshot): 17.4.0-snapshot.10
vijayg10 Dec 4, 2023
77e7ff1
feat(mojaloop/#3689): fx quotes changes (#995)
oderayi Mar 8, 2024
224a3d3
chore(snapshot): 17.4.0-snapshot.12
oderayi Mar 8, 2024
c2b64c7
ci: disable unit tests and test coverage runs for snapshots
oderayi Mar 8, 2024
8155ba0
chore(snapshot): 17.4.0-snapshot.13
oderayi Mar 8, 2024
1dc7032
Merge branch main of https://github.com/mojaloop/central-ledger into …
vijayg10 Mar 13, 2024
831da00
Merge branch feat/fx-impl of https://github.com/mojaloop/central-ledg…
vijayg10 Mar 13, 2024
0979ae5
fix: manual changes from upstream commits
vijayg10 Mar 13, 2024
6df1384
chore(snapshot): 17.7.0-snapshot.0
vijayg10 Mar 13, 2024
5df3536
chore(mojaloop/#3820): fix current tests and merge in main (#1000)
kleyow Apr 2, 2024
b4ad846
test(mojaloop/#3819): harden fx prepare flow (#1002)
kleyow Apr 10, 2024
4218622
Merge branch 'main' into feat/fx-impl
geka-evk Apr 18, 2024
d917f00
test(mojaloop/#3819): prepare handler testing (#1004)
kleyow Apr 22, 2024
cf80376
chore: standardise position prepare handler (#1005)
vijayg10 Apr 23, 2024
46d7adb
feat(mojaloop/#3844): added corner cases impl. for FX; added unit-tes…
geka-evk Apr 23, 2024
ad4dd53
fix: removed fx position prepare integration tests in non batch mode …
vijayg10 Apr 24, 2024
82d2bd4
chore: fix int tests, lint and update deps (#1013)
kleyow Apr 26, 2024
05c4ce9
chore: removed unneeded kafkaHelper; excluded some files from test-co…
geka-evk Apr 27, 2024
afc4c5c
feat(mojaloop/#3844): added integration tests for fxFulfil flow (#1011)
geka-evk Apr 29, 2024
d1e1fcc
test: added transferFulfilReject.end() (#1027)
geka-evk Apr 30, 2024
cb9de40
feat: fx fulfil position batching (#1019)
vijayg10 May 1, 2024
13c95ae
chore(mojaloop/#3819): update functional tests and move fulfil int te…
kleyow May 2, 2024
7124fab
chore: add integration tests for pos fulfil fx (#1030)
vijayg10 May 3, 2024
5988eae
feat(mojaloop/#3818): added sequence and ER diagrams for transfer/fxT…
geka-evk May 7, 2024
3dba614
feat(mojaloop/#3903): update interal state on fx fulfil to RECEIVED_F…
kleyow May 10, 2024
031e16c
chore: update harness (#1031)
kleyow May 10, 2024
0b6606a
feat(mojaloop/#3904): add position event timeout reserved batch handl…
kleyow May 17, 2024
85c3499
Update README.md
vijayg10 May 27, 2024
8194902
feat: implemented timeout handler for fx (#1036)
vijayg10 May 28, 2024
f2e84ea
Merge branch main of https://github.com/mojaloop/central-ledger into …
vijayg10 May 28, 2024
1c76665
feat: enable sending events directly to Kafka (#1037)
kalinkrustev May 28, 2024
0eea335
chore(snapshot): 17.7.0-snapshot.3
kalinkrustev May 28, 2024
08c295d
feat(mojaloop/#3904): add position event fx timeout reserved batch ha…
kleyow May 31, 2024
88724f0
chore(snapshot): 17.7.0-snapshot.4
kleyow Jun 5, 2024
f71911d
audit fix and dep update
kleyow Jun 5, 2024
6d644f3
audit fix and dep update
kleyow Jun 5, 2024
7df16eb
chore(snapshot): 17.7.0-snapshot.5
kleyow Jun 5, 2024
97f5f70
image scan
kleyow Jun 5, 2024
08dd88b
chore(snapshot): 17.7.0-snapshot.6
kleyow Jun 5, 2024
e3caa32
image scan
kleyow Jun 5, 2024
e8f7816
chore(snapshot): 17.7.0-snapshot.7
kleyow Jun 5, 2024
3face13
node version
kleyow Jun 5, 2024
a653a02
chore(snapshot): 17.7.0-snapshot.8
kleyow Jun 5, 2024
7185622
revert pipeline changes to get working snapshot
kleyow Jun 7, 2024
42c84b3
chore(snapshot): 17.7.0-snapshot.9
kleyow Jun 7, 2024
5600fe1
fix typo
kleyow Jun 7, 2024
930ed0e
chore(snapshot): 17.7.0-snapshot.10
kleyow Jun 7, 2024
9498a49
fix command
kleyow Jun 7, 2024
77764c9
chore(snapshot): 17.7.0-snapshot.11
kleyow Jun 7, 2024
c484da7
fix: remove trx.rollback() (#1051)
kalinkrustev Jun 13, 2024
6736dee
fix: produce followup messages in parallel (#1052)
kalinkrustev Jun 13, 2024
ca5dca5
chore(snapshot): 17.7.0-snapshot.12
kalinkrustev Jun 13, 2024
d59b902
fix: avoid 2 extra db requests
kalinkrustev Jun 18, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 17 additions & 10 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ executors:
BASH_ENV: /etc/profile ## Ref: https://circleci.com/docs/env-vars/#alpine-linux
NVM_ARCH_UNOFFICIAL_OVERRIDE: x64-musl ## Ref: https://github.com/nvm-sh/nvm/issues/1102#issuecomment-550572252
docker:
- image: node:lts-alpine # Ref: https://hub.docker.com/_/node?tab=tags&page=1&name=alpine
- image: node:18.20.3-alpine3.19 # Ref: https://hub.docker.com/_/node/tags?name=18.20.3-alpine3.19

default-machine:
working_directory: *WORKING_DIR
Expand Down Expand Up @@ -309,8 +309,8 @@ jobs:
name: Build Docker local image
command: |
source ~/.profile
export DOCKER_NODE_VERSION="$NVMRC_VERSION-alpine"
echo "export DOCKER_NODE_VERSION=$NVMRC_VERSION-alpine" >> $BASH_ENV
export DOCKER_NODE_VERSION="$NVMRC_VERSION-alpine3.19"
echo "export DOCKER_NODE_VERSION=$NVMRC_VERSION-alpine3.19" >> $BASH_ENV
echo "Building Docker image: ${DOCKER_ORG:-mojaloop}/$CIRCLE_PROJECT_REPONAME:local --build-arg NODE_VERSION=$DOCKER_NODE_VERSION"
docker build -t ${DOCKER_ORG:-mojaloop}/$CIRCLE_PROJECT_REPONAME:local --build-arg NODE_VERSION=$DOCKER_NODE_VERSION .
- run:
Expand Down Expand Up @@ -494,14 +494,14 @@ jobs:
- run:
name: Pull base image locally
command: |
echo "Pulling docker image: node:$NVMRC_VERSION-alpine"
docker pull node:$NVMRC_VERSION-alpine
echo "Pulling docker image: node:$NVMRC_VERSION-alpine3.19"
docker pull node:$NVMRC_VERSION-alpine3.19
## Analyze the base and derived image
## Note: It seems images are scanned in parallel, so preloading the base image result doesn't give us any real performance gain
- anchore/analyze_local_image:
# Force the older version, version 0.7.0 was just published, and is broken
anchore_version: v0.6.1
image_name: "docker.io/node:$NVMRC_VERSION-alpine ${DOCKER_ORG:-mojaloop}/$CIRCLE_PROJECT_REPONAME:local"
image_name: "docker.io/node:$NVMRC_VERSION-alpine3.19 ${DOCKER_ORG:-mojaloop}/$CIRCLE_PROJECT_REPONAME:local"
policy_failure: false
timeout: '500'
# Note: if the generated policy is invalid, this will fallback to the default policy, which we don't want!
Expand All @@ -514,7 +514,7 @@ jobs:
aws s3 cp anchore-reports ${AWS_S3_DIR_ANCHORE_REPORTS}/latest/ --recursive
- run:
name: Evaluate failures
command: /tmp/ci-config/container-scanning/anchore-result-diff.js anchore-reports/node_${NVMRC_VERSION}-alpine-policy.json anchore-reports/${CIRCLE_PROJECT_REPONAME}*-policy.json
command: /tmp/ci-config/container-scanning/anchore-result-diff.js anchore-reports/node_${NVMRC_VERSION}-alpine3.19-policy.json anchore-reports/${CIRCLE_PROJECT_REPONAME}*-policy.json
- store_artifacts:
path: anchore-reports
- slack/notify:
Expand Down Expand Up @@ -848,7 +848,10 @@ workflows:
- setup
filters:
tags:
only: /.*/
# Re-enable as soon as test coverage is fixed for fx
# only: /.*/
# Remove as soon as test coverage is fixed for fx
ignore: /v[0-9]+(\.[0-9]+)*\-snapshot+((\.[0-9]+)?)/
branches:
ignore:
- /feature*/
Expand All @@ -859,7 +862,10 @@ workflows:
- setup
filters:
tags:
only: /.*/
# Re-enable as soon as test coverage is fixed for fx
# only: /.*/
# Remove as soon as test coverage is fixed for fx
ignore: /v[0-9]+(\.[0-9]+)*\-snapshot+((\.[0-9]+)?)/
branches:
ignore:
- /feature*/
Expand Down Expand Up @@ -1001,7 +1007,8 @@ workflows:
## Only do this check on PRs
# - test-dependencies
- test-lint
- test-unit
## TODO: re-enable these once we fix all the unit tests that are failing due to fx changes
# - test-unit
- test-coverage
- test-integration
- test-functional
Expand Down
3 changes: 2 additions & 1 deletion .ncurc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,6 @@ reject: [
"get-port",
# sinon v17.0.1 causes 58 tests to fail. This will need to be resolved in a future story.
# Issue is tracked here: https://github.com/mojaloop/project/issues/3616
"sinon"
"sinon",
"@mojaloop/central-services-shared"
]
2 changes: 1 addition & 1 deletion .nvmrc
Original file line number Diff line number Diff line change
@@ -1 +1 @@
18.17.1
18.20.3
13 changes: 12 additions & 1 deletion .nycrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,16 @@ exclude: [
"**/node_modules/**",
'**/migrations/**',
'**/ddl/**',
'**/bulk*/**'
'**/bulk*/**',
'src/shared/logger/**',
'src/shared/constants.js',
'src/domain/position/index.js',
'src/domain/position/binProcessor.js',
'src/handlers/positions/handler.js',
'src/handlers/transfers/createRemittanceEntity.js',
'src/handlers/transfers/FxFulfilService.js',
'src/models/position/batch.js',
'src/models/fxTransfer/**',
'src/shared/fspiopErrorFactory.js'
]
## todo: increase test coverage before merging feat/fx-impl to main branch
15 changes: 7 additions & 8 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@ ARG NODE_VERSION=lts-alpine

# NOTE: Ensure you set NODE_VERSION Build Argument as follows...
#
# export NODE_VERSION="$(cat .nvmrc)-alpine" \
# docker build \
# --build-arg NODE_VERSION=$NODE_VERSION \
# -t mojaloop/central-ledger:local \
# . \
# export NODE_VERSION="$(cat .nvmrc)-alpine"
# docker build \
# --build-arg NODE_VERSION=$NODE_VERSION \
# -t mojaloop/central-ledger:local \
# .
#

# Build Image
Expand All @@ -23,6 +23,7 @@ RUN apk add --no-cache -t build-dependencies make gcc g++ python3 libtool openss
COPY package.json package-lock.json* /opt/app/

RUN npm ci
RUN npm prune --omit=dev

FROM node:${NODE_VERSION}
WORKDIR /opt/app
Expand All @@ -32,7 +33,7 @@ RUN mkdir ./logs && touch ./logs/combined.log
RUN ln -sf /dev/stdout ./logs/combined.log

# Create a non-root user: ml-user
RUN adduser -D ml-user
RUN adduser -D ml-user
USER ml-user

COPY --chown=ml-user --from=builder /opt/app .
Expand All @@ -43,7 +44,5 @@ COPY migrations /opt/app/migrations
COPY seeds /opt/app/seeds
COPY test /opt/app/test

RUN npm prune --production

EXPOSE 3001
CMD ["npm", "run", "start"]
26 changes: 22 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -113,21 +113,27 @@ NOTE: Only POSITION.PREPARE and POSITION.COMMIT is supported at this time, with

Batch processing can be enabled in the transfer execution flow. Follow the steps below to enable batch processing for a more efficient transfer execution:

Note: The position messages with action 'FX_PREPARE', 'FX_COMMIT' and 'FX_TIMEOUT_RESERVED' are only supported in batch processing.

- **Step 1:** **Create a New Kafka Topic**

Create a new Kafka topic named `topic-transfer-position-batch` to handle batch processing events.
- **Step 2:** **Configure Action Type Mapping**

Point the prepare handler to the newly created topic for the action type `prepare` using the `KAFKA.EVENT_TYPE_ACTION_TOPIC_MAP` configuration as shown below:
Point the prepare handler to the newly created topic for the action types those are supported in batch processing using the `KAFKA.EVENT_TYPE_ACTION_TOPIC_MAP` configuration as shown below:
```
"KAFKA": {
"EVENT_TYPE_ACTION_TOPIC_MAP" : {
"POSITION":{
"PREPARE": "topic-transfer-position-batch",
"BULK_PREPARE": "topic-transfer-position",
"COMMIT": "topic-transfer-position-batch",
"FX_COMMIT": "topic-transfer-position-batch",
"BULK_COMMIT": "topic-transfer-position",
"RESERVE": "topic-transfer-position",
"FX_PREPARE": "topic-transfer-position-batch",
"TIMEOUT_RESERVED": "topic-transfer-position-batch",
"FX_TIMEOUT_RESERVED": "topic-transfer-position-batch"
}
}
}
Expand Down Expand Up @@ -243,12 +249,20 @@ npm run wait-4-docker
```
nvm use
npm run migrate
env "CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__PREPARE=topic-transfer-position-batch" npm start
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__PREPARE=topic-transfer-position-batch
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__COMMIT=topic-transfer-position-batch
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__RESERVE=topic-transfer-position-batch
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__TIMEOUT_RESERVED=topic-transfer-position-batch
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__FX_TIMEOUT_RESERVED=topic-transfer-position-batch
npm start
```
- Additionally, run position batch handler in a new terminal
```
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__PREPARE=topic-transfer-position-batch
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__FX_PREPARE=topic-transfer-position-batch
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__COMMIT=topic-transfer-position-batch
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__TIMEOUT_RESERVED=topic-transfer-position-batch
export CLEDG_KAFKA__EVENT_TYPE_ACTION_TOPIC_MAP__POSITION__FX_TIMEOUT_RESERVED=topic-transfer-position-batch
export CLEDG_HANDLERS__API__DISABLED=true
node src/handlers/index.js handler --positionbatch
```
Expand All @@ -263,7 +277,11 @@ It will handle docker start up, migration, service starting and testing. Be sure
If you want to run functional tests locally utilizing the [ml-core-test-harness](https://github.com/mojaloop/ml-core-test-harness), you can run the following commands:

```bash
docker build -t mojaloop/central-ledger:local .
export NODE_VERSION="$(cat .nvmrc)-alpine"
docker build \
--build-arg NODE_VERSION=$NODE_VERSION \
-t mojaloop/central-ledger:local \
.
```

```bash
Expand Down Expand Up @@ -380,4 +398,4 @@ push a release triggering another subsequent build that also publishes a docker
is a boon.

- It is unknown if a race condition might occur with multiple merges with main in
quick succession, but this is a suspected edge case.
quick succession, but this is a suspected edge case.
7 changes: 5 additions & 2 deletions audit-ci.jsonc
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
"GHSA-5854-jvxx-2cg9", // hapi-auth-basic>hapi>subtext
"GHSA-2mvq-xp48-4c77", // hapi-auth-basic>hapi>subtext
"GHSA-w5p7-h5w8-2hfq", // tap-spec>tap-out>trim
"GHSA-p9pc-299p-vxgp" // widdershins>yargs>yargs-parser
"GHSA-p9pc-299p-vxgp", // widdershins>yargs>yargs-parser
"GHSA-f5x3-32g6-xq36", // https://github.com/advisories/GHSA-f5x3-32g6-xq36
"GHSA-cgfm-xwp7-2cvr", // https://github.com/advisories/GHSA-cgfm-xwp7-2cvr
"GHSA-ghr5-ch3p-vcr6" // https://github.com/advisories/GHSA-ghr5-ch3p-vcr6
]
}
}
5 changes: 4 additions & 1 deletion config/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -88,10 +88,13 @@
"EVENT_TYPE_ACTION_TOPIC_MAP" : {
"POSITION":{
"PREPARE": null,
"FX_PREPARE": "topic-transfer-position-batch",
"BULK_PREPARE": null,
"COMMIT": null,
"BULK_COMMIT": null,
"RESERVE": null
"RESERVE": null,
"TIMEOUT_RESERVED": null,
"FX_TIMEOUT_RESERVED": "topic-transfer-position-batch"
}
},
"TOPIC_TEMPLATES": {
Expand Down
16 changes: 16 additions & 0 deletions docker/config-modifier/configs/central-ledger.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,15 @@ module.exports = {
DATABASE: 'mlos'
},
KAFKA: {
EVENT_TYPE_ACTION_TOPIC_MAP: {
POSITION: {
PREPARE: 'topic-transfer-position-batch',
BULK_PREPARE: null,
COMMIT: 'topic-transfer-position-batch',
BULK_COMMIT: null,
RESERVE: 'topic-transfer-position-batch'
}
},
CONSUMER: {
BULK: {
PREPARE: {
Expand Down Expand Up @@ -72,6 +81,13 @@ module.exports = {
'metadata.broker.list': 'kafka:29092'
}
}
},
POSITION_BATCH: {
config: {
rdkafkaConf: {
'metadata.broker.list': 'kafka:29092'
}
}
}
},
ADMIN: {
Expand Down
5 changes: 4 additions & 1 deletion docker/kafka/scripts/provision.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,11 @@ topics=(
"topic-bulk-prepare"
"topic-bulk-fulfil"
"topic-bulk-processing"
"topic-bulk-get",
"topic-bulk-get"
"topic-transfer-position-batch"
"topic-fx-quotes-post"
"topic-fx-quotes-put"
"topic-fx-quotes-get"
)

# Loop through the topics and create them using kafka-topics.sh
Expand Down
Binary file added documentation/db/erd-transfer-timeout.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
81 changes: 81 additions & 0 deletions documentation/db/erd-transfer-timeout.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Visualize on https://erd.surge.sh
# or https://quick-erd.surge.sh
#
# Relationship Types
# - - one to one
# -< - one to many
# >- - many to one
# >-< - many to many
# -0 - one to zero or one
# 0- - zero or one to one
# 0-0 - zero or one to zero or one
# -0< - one to zero or many
# >0- - zero or many to one
#
////////////////////////////////////

transfer
---------------------
transferId varchar(36) PK
amount decimal(18,4)
currencyId varchar(3) FK - currency.currencyId
ilpCondition varchar(256)
expirationDate datetime
createdDate datetime


transferStateChange__TSC
---------------------
transferStateChangeId bigint UN AI PK
transferId varchar(36) FK >- transfer.transferId
transferStateId varchar(50) FK - transferState.transferStateId
reason varchar(512)
createdDate datetime


transferTimeout__TT
---------------------
transferTimeoutId bigint UN AI PK
transferId varchar(36) UNIQUE FK - transfer.transferId
expirationDate datetime
createdDate datetime


transferError__TE
---------------------
transferId varchar(36) PK
transferStateChangeId bigint UN FK - transferStateChange.transferStateChangeId
errorCode int UN
errorDescription varchar(128)
createdDate datetime


segment
---------------------
segmentId int UN AI PK
segmentType varchar(50)
enumeration int
tableName varchar(50)
value bigint
changedDate datetime
# row example: 1, 'timeout', 0, 'transferStateChange', 255, '2024-04-24 18:07:15'


expiringTransfer
---------------------
expiringTransferId bigint UN AI PK
transferId varchar(36) UNIQUE FK - transfer.transferId
expirationDate datetime INDEX
createdDate datetime
# todo: clarify, how we use this table



# transfer (557, 340)
# segment (348, 608)
# expiringTransfer (1033, 574)
# view: (5, -16)
# zoom: 1.089
# transferStateChange__TSC (38, 236)
# transferTimeout__TT (974, 204)
# transferError__TE (518, 34)
Loading