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

feat(open-payments): adding open-payments package #669

Merged
merged 18 commits into from
Oct 24, 2022
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
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
24 changes: 24 additions & 0 deletions packages/open-payments/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"name": "open-payments",
"description": "",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"files": [
"dist/**/*"
],
"scripts": {
"build": "pnpm clean && tsc --build tsconfig.json",
"clean": "rm -fr dist/",
"prepack": "pnpm build",
"generate:types": "npx ts-node scripts/generate-types.ts"
},
"devDependencies": {
"@types/node": "^18.7.12",
"openapi-typescript": "^4.5.0",
Copy link
Contributor Author

@mkurapov mkurapov Oct 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wrested quite a bit with this, but I wasn't able to use the newest version of this library. Using the programmatic way of generating types via openapiTS anything above v5 does not work and result in ERR_REQUIRE_ESM errors. Versions 5 and above do not support backwards compatibility with CommonJS, especially given the fact that having type: module in package.json breaks using this package as a workspace in the /backend project.

one two three are the related issues in the openapi-typescript repo.

"ts-node": "^10.7.0",
"typescript": "^4.3.0"
},
"dependencies": {
"axios": "^1.1.2"
}
}
19 changes: 19 additions & 0 deletions packages/open-payments/scripts/generate-types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import fs from 'fs'
import openapiTS from 'openapi-typescript'
import config from '../src/config'
;(async () => {
try {
const output = await openapiTS(config.OPEN_PAYMENTS_OPEN_API_URL)
const fileName = 'src/generated/types.ts'

fs.writeFile(fileName, output, (error) => {
if (error) {
console.log(`Error when writing types to ${fileName}`, { error })
}
})
} catch (error) {
console.log('Error when generating types', {
error
})
}
})()
57 changes: 57 additions & 0 deletions packages/open-payments/src/client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
import { ILPStreamConnection, IncomingPayment } from './types'
import axios, { AxiosInstance } from 'axios'
import config from './config'

interface CreateOpenPaymentClientArgs {
timeout?: number
}

interface GetArgs {
url: string
accessToken: string
}

export interface OpenPaymentsClient {
incomingPayment: {
get(args: GetArgs): Promise<IncomingPayment>
}
ilpStreamConnection: {
get(args: GetArgs): Promise<ILPStreamConnection>
}
}

const get = async <T>(axios: AxiosInstance, args: GetArgs): Promise<T> => {
const { url, accessToken } = args

const { data } = await axios.get(url, {
headers: accessToken
? {
Authorization: `GNAP ${accessToken}`,
Signature: 'TODO',
'Signature-Input': 'TODO'
}
: {}
})

return data
}

export const createClient = (
args?: CreateOpenPaymentClientArgs
): OpenPaymentsClient => {
const defaultTimeout = config.DEFAULT_REQUEST_TIMEOUT || 3_000
const axiosInstance = axios.create({
timeout: args.timeout ?? defaultTimeout
})

axiosInstance.defaults.headers.common['Content-Type'] = 'application/json'

return {
incomingPayment: {
get: (args: GetArgs) => get<IncomingPayment>(axios, args)
},
ilpStreamConnection: {
get: (args: GetArgs) => get<ILPStreamConnection>(axios, args)
}
}
}
5 changes: 5 additions & 0 deletions packages/open-payments/src/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export default {
OPEN_PAYMENTS_OPEN_API_URL:
Copy link
Contributor Author

@mkurapov mkurapov Oct 14, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

want to make sure the same URL is used for type generation and (soon to be added) open API response validation

'https://raw.githubusercontent.com/interledger/open-payments/main/open-api-spec.yaml',
mkurapov marked this conversation as resolved.
Show resolved Hide resolved
DEFAULT_REQUEST_TIMEOUT: 3_000
}
Loading