# Bridge SDK

## Components

Bridge SDK provides two main components:

- Server
- Processor

### Server

Server implements two-phase protocol for the ledger. Incoming requests are persisted in the bridge database as entries, intents and commands. When processing is requred, job is created which will be assigned to an available processor for processing.

Server provides proxy to the ledger in order for 3rd party system to be able to communicate with the ledger. Proxy will establish secure communication when calling the ledger and sign payload with the bridge key when needed.

Effects can also be registered in the server. Effects are used to extend the ledger core functionalities by observing and reacting on events raised when a change occurs with ledger data.

Exposed two-phase commit endpoints:

| Method | Path                          | Description                   |
| ------ | ----------------------------- | ----------------------------- |
| POST   | `/v2/credits`                 | _prepares credit transaction_ |
| POST   | `/v2/credits/<handle>/abort`  | _aborts credit transaction_   |
| POST   | `/v2/credits/<handle>/commit` | _commits credit transaction_  |
| POST   | `/v2/debits`                  | _prepares debit transaction_  |
| POST   | `/v2/debits/<handle>/abort`   | _aborts debit transaction_    |
| POST   | `/v2/debits/<handle>/commit`  | _commits debit transaction_   |
| PUT    | `/v2/intents/<handle>`        | _updates intent record_       |

Exposed job endpoints:

| Method | Path                         | Description                              |
| ------ | ---------------------------- | ---------------------------------------- |
| POST   | `/v2/jobs/<handle>/continue` | _schedules suspended job for processing_ |

Exposed proxy endpoints:

| Method | Path                                  | Description             |
| ------ | ------------------------------------- | ----------------------- |
| POST   | `/v2/proxy/intents`                   | _create an intent_      |
| GET    |  `/v2/proxy/intents`                  |  *fetch intents*        |
| GET    | `/v2/proxy/intents/<handle>`          | _fetch an intent_       |
| POST   | `/v2/proxy/signers`                   | _create a signer_       |
| PUT    | `/v2/proxy/signers/<handle>`          | _update a signer_       |
| GET    |  `/v2/proxy/signers`                  | _fetch signers_         |
| GET    | `/v2/proxy/signers/<handle>`          | _fetch a signer_        |
| POST   | `/v2/proxy/wallets`                   | _create a wallet_       |
| PUT    | `/v2/proxy/wallets/<handle>`          | _update a wallet_       |
| GET    |  `/v2/proxy/wallets`                  | _fetch wallets_         |
| GET    | `/v2/proxy/wallets/<handle>`          | _fetch a wallet_        |
| GET    | `/v2/proxy/wallets/<handle>/balances` | _fetch wallet balances_ |

Exposed effects endpoints:
| Method | Path | Description |
| ------ | ------------------------------------- | ------------------------------- |
| POST | `/v2/effects/<handle>` | _executes a registered effect_ |

### Processor

Processor listens for pending jobs in the system and executes them. Each processor must have unique handle in the system which is used for job balancing across processors. Processing of a job can be suspended for predefined time (e.g. 5 minutes, waiting for banking core) or indefinitely which requires manual job continuation.

## Running unit tests

Run `nx test bridge-sdk` to execute the unit tests via [Jest](https://jestjs.io).

## Running lint

Run `nx lint bridge-sdk` to execute the lint via [ESLint](https://eslint.org/).
