From 58dff56f6c5d12be51e10a5c09e966b164ab61e0 Mon Sep 17 00:00:00 2001 From: Richard Rodger Date: Mon, 5 Feb 2024 22:12:16 +0000 Subject: [PATCH] v0.8.0 --- README.md | 1 + dist/bud-provider.d.ts | 31 +++- dist/bud-provider.js | 295 +++++++++++++++++++++---------- dist/bud-provider.js.map | 2 +- package.json | 5 +- src/bud-provider.ts | 360 ++++++++++++++++++++++++++++---------- test/bud-provider.test.js | 23 ++- 7 files changed, 525 insertions(+), 192 deletions(-) diff --git a/README.md b/README.md index ceb3547..e7c4b00 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ $ npm install @seneca/bud-provider @seneca/env * `url` : string * `fetch` : any * `debug` : boolean +* `print` : object * `retry` : object * `entity` : object * `wait` : object diff --git a/dist/bud-provider.d.ts b/dist/bud-provider.d.ts index 149dccb..ab8f123 100644 --- a/dist/bud-provider.d.ts +++ b/dist/bud-provider.d.ts @@ -2,6 +2,9 @@ type FullBudProviderOptions = { url: string; fetch: any; debug: boolean; + print: { + request: boolean; + }; entity: Record>; retry: { config: Record; @@ -22,6 +25,19 @@ type FullBudProviderOptions = { }; declare function BudProvider(this: any, options: FullBudProviderOptions): { exports: { + getTokens: () => Promise; getGateway: (spec: { redirect_url: string; clientid: string; @@ -31,10 +47,19 @@ declare function BudProvider(this: any, options: FullBudProviderOptions): { mode?: string; }) => Promise; sdk: () => null; - stats: () => any; + stats: () => { + refresh: number; + access: number; + loadrefresh: number; + loadaccess: number; + req: number; + res: number; + error: number; + notfound: number; + }; util: { - getTokenState: () => "active" | "start" | "refresh" | "init" | "request"; - setTokenState: (tokenStateIn: "active" | "start" | "refresh" | "init" | "request") => "active" | "start" | "refresh" | "init" | "request"; + getTokenState: () => "active" | "start" | "refresh" | "request" | "init"; + setTokenState: (tokenStateIn: "active" | "start" | "refresh" | "request" | "init") => "active" | "start" | "refresh" | "request" | "init"; getToken: (name: string) => any; setToken: (name: string, value: string) => void; }; diff --git a/dist/bud-provider.js b/dist/bud-provider.js index de51d8d..78ba9ae 100644 --- a/dist/bud-provider.js +++ b/dist/bud-provider.js @@ -13,6 +13,9 @@ const defaults = { fetch: ('undefined' === typeof fetch ? undefined : fetch), // TODO: Enable debug logging debug: false, + print: { + request: false, + }, // See @seneca/provider retry: { config: { @@ -22,15 +25,15 @@ const defaults = { entity: {}, wait: { refresh: { - max: 1111, - interval: 111, + max: 2222, + interval: 222, } }, limit: { retry: 111, // Global maximum number of retries. }, store: { - saveToken: async (_kind, val) => null, + saveToken: async (_kind, _val) => null, loadToken: async (_kind) => null, } }; @@ -61,16 +64,16 @@ function BudProvider(options) { // Shared config reference. const config = { headers: {}, - stats: { - refresh: 0, // count of refresh token fetches - access: 0, // count of access token fetches - loadrefresh: 0, // count of refresh token loads - loadaccess: 0, // count of access token loads - req: 0, // count of requests - res: 0, // count of non-error responses - error: 0, // error count, - notfound: 0, // count of not founds - } + }; + const statsCounters = { + refresh: 0, // count of refresh token fetches + access: 0, // count of access token fetches + loadrefresh: 0, // count of refresh token loads + loadaccess: 0, // count of access token loads + req: 0, // count of requests + res: 0, // count of non-error responses + error: 0, // error count, + notfound: 0, // count of not founds }; let refreshToken; let accessToken; @@ -89,6 +92,22 @@ function BudProvider(options) { } } }); + const budGet = async function (traceid, ...args) { + logreq(traceid, 'orig', 'GET', 0, args); + return get(...args); + }; + const budPost = async function (traceid, ...args) { + logreq(traceid, 'orig', 'POST', 0, args); + return post(...args); + }; + function logreq(traceid, phase, method, attempt, args) { + args[1] = (args[1] || {}); + args[1].headers = (args[1].headers || {}); + const tid = args[1].headers['X-SenecaBudProvider-TraceID'] = + (args[1].headers['X-SenecaBudProvider-TraceID'] || (traceid || seneca.util.Nid())); + options.print.request && + console.log('BUDREQ', method, seneca.id, tid, phase, attempt, tokenState, refreshToken && refreshToken.substring(0, 8), accessToken && accessToken.substring(0, 8), JSI(statsCounters), JSI(args[0]), JSI(args[1])); + } seneca.message('sys:provider,provider:bud,get:info', get_info); async function get_info(_msg) { return { @@ -101,7 +120,7 @@ function BudProvider(options) { }; } function stats() { - return config.stats; + return statsCounters; } function logstats(mark) { console.log('BUDSTATS', mark, JSON.stringify(stats()).replace(/"/g, '')); @@ -120,21 +139,22 @@ function BudProvider(options) { let q = { ...(msg.q || {}) }; let id = q.id; try { - config.stats.req++; - await waitForRefreshToken('customer.cmd.load'); - let json = await get(makeUrl('v1/customers', id, 'context')); + statsCounters.req++; + const traceid = 'T' + seneca.util.Nid(); + await waitForToken('customer.cmd.load', traceid); + let json = await budGet(traceid, makeUrl('v1/customers', id, 'context')); let entdata = json.data; entdata.id = id; - config.stats.res++; + statsCounters.res++; return entize(entdata); } catch (e) { let res = (_a = e.provider) === null || _a === void 0 ? void 0 : _a.response; if (404 === (res === null || res === void 0 ? void 0 : res.status)) { - config.stats.notfound++; + statsCounters.notfound++; return null; } - config.stats.error++; + statsCounters.error++; throw e; } finally { @@ -145,24 +165,25 @@ function BudProvider(options) { async function (entize, msg) { var _a, _b; try { - config.stats.req++; + statsCounters.req++; let body = { customer_context: { ...(((_b = (_a = options.entity) === null || _a === void 0 ? void 0 : _a.customer) === null || _b === void 0 ? void 0 : _b.save) || {}), ...(msg.ent.data$(false)), } }; - await waitForRefreshToken('customer.cmd.save'); - let json = await post(makeUrl('platform/v3/customers'), { + const traceid = 'T' + seneca.util.Nid(); + await waitForToken('customer.cmd.save', traceid); + let json = await budPost(traceid, makeUrl('platform/v3/customers'), { body }); let entdata = json.data; entdata.id = entdata.customer_id; - config.stats.res++; + statsCounters.res++; return entize(entdata); } catch (e) { - config.stats.error++; + statsCounters.error++; throw e; } finally { @@ -176,25 +197,27 @@ function BudProvider(options) { let id = q.id; let customerid = q.customerid; try { - config.stats.req++; + statsCounters.req++; let headers = CustomerHeadersIDOnlyShape({ 'X-Customer-Id': customerid }); - let json = await get(makeUrl('v1/open-banking/connect', id), { + const traceid = 'T' + seneca.util.Nid(); + await waitForToken('account.cmd.load', traceid); + let json = await budGet(traceid, makeUrl('v1/open-banking/connect', id), { headers }); let entdata = json.data; entdata.id = id; - config.stats.res++; + statsCounters.res++; return entize(entdata); } catch (e) { let res = (_a = e.provider) === null || _a === void 0 ? void 0 : _a.response; if (404 === (res === null || res === void 0 ? void 0 : res.status)) { - config.stats.notfound++; + statsCounters.notfound++; return null; } - config.stats.error++; + statsCounters.error++; throw e; } finally { @@ -209,27 +232,28 @@ function BudProvider(options) { let customerid = q.customerid; let customersecret = q.customersecret; try { - config.stats.req++; + statsCounters.req++; let headers = CustomerHeadersShape({ 'X-Customer-Id': customerid, 'X-Customer-Secret': customersecret, }); - await waitForRefreshToken('account.cmd.load'); - let json = await get(makeUrl('financial/v2/accounts/', id), { + const traceid = 'T' + seneca.util.Nid(); + await waitForToken('account.cmd.load', traceid); + let json = await budGet(traceid, makeUrl('financial/v2/accounts/', id), { headers }); let entdata = json.data; entdata.id = id; - config.stats.res++; + statsCounters.res++; return entize(entdata); } catch (e) { let res = (_a = e.provider) === null || _a === void 0 ? void 0 : _a.response; if (404 === (res === null || res === void 0 ? void 0 : res.status)) { - config.stats.notfound++; + statsCounters.notfound++; return null; } - config.stats.error++; + statsCounters.error++; throw e; } finally { @@ -245,13 +269,14 @@ function BudProvider(options) { delete q.customerid; delete q.customersecret; try { - config.stats.req++; + statsCounters.req++; let headers = CustomerHeadersShape({ 'X-Customer-Id': customerid, 'X-Customer-Secret': customersecret, }); - await waitForRefreshToken('account.cmd.list'); - let json = await get(makeUrl('financial/v2/accounts', q), { + const traceid = 'T' + seneca.util.Nid(); + await waitForToken('account.cmd.list', traceid); + let json = await budGet(traceid, makeUrl('financial/v2/accounts', q), { headers }); let listdata = json.data; @@ -260,16 +285,16 @@ function BudProvider(options) { ent.id = ent.account_id; return ent; }); - config.stats.res++; + statsCounters.res++; return list; } catch (e) { let res = (_a = e.provider) === null || _a === void 0 ? void 0 : _a.response; if (404 === (res === null || res === void 0 ? void 0 : res.status)) { - config.stats.notfound++; + statsCounters.notfound++; return null; } - config.stats.error++; + statsCounters.error++; throw e; } finally { @@ -285,7 +310,7 @@ function BudProvider(options) { delete q.customerid; delete q.customersecret; try { - config.stats.req++; + statsCounters.req++; let headers = CustomerHeadersShape({ 'X-Customer-Id': customerid, 'X-Customer-Secret': customersecret, @@ -295,12 +320,13 @@ function BudProvider(options) { let pI = 0; let nextPageToken = null; const maxPages = 1111; - await waitForRefreshToken('transaction.cmd.list'); + const traceid = 'T' + seneca.util.Nid(); + await waitForToken('transaction.cmd.list', traceid); while (paging && pI < maxPages) { if (nextPageToken) { q.page_token = nextPageToken; } - let json = await get(makeUrl('financial/v2/transactions', q), { + let json = await budGet(traceid, makeUrl('financial/v2/transactions', q), { headers }); listdata = listdata.concat(json.data); @@ -315,16 +341,16 @@ function BudProvider(options) { ent.id = ent.account_id; return ent; }); - config.stats.res++; + statsCounters.res++; return list; } catch (e) { let res = (_b = e.provider) === null || _b === void 0 ? void 0 : _b.response; if (404 === (res === null || res === void 0 ? void 0 : res.status)) { - config.stats.notfound++; + statsCounters.notfound++; return null; } - config.stats.error++; + statsCounters.error++; throw e; } finally { @@ -335,19 +361,20 @@ function BudProvider(options) { async function (entize, msg) { let q = { ...(msg.q || {}) }; try { - config.stats.req++; - await waitForRefreshToken('obp.cmd.list'); - let json = await get(makeUrl('v1/open-banking/providers'), q); + statsCounters.req++; + const traceid = 'T' + seneca.util.Nid(); + await waitForToken('obp.cmd.list', traceid); + let json = await budGet(traceid, makeUrl('v1/open-banking/providers'), q); let entlist = json.data; entlist = entlist.map((entdata) => { entdata.id = entdata.provider; return entize(entdata); }); - config.stats.res++; + statsCounters.res++; return entlist; } catch (e) { - config.stats.error++; + statsCounters.error++; throw e; } finally { @@ -362,7 +389,7 @@ function BudProvider(options) { }); async function getGateway(spec) { try { - config.stats.req++; + statsCounters.req++; let headers = CustomerHeadersGatewayShape({ 'X-Client-Id': spec.clientid, 'X-Customer-Id': spec.customerid, @@ -373,48 +400,128 @@ function BudProvider(options) { initial_screen: (spec.mode === 'reconnect') ? 'reconfirm_consent' : undefined, reconfirm_consent_redirect: (spec.mode === 'reconnect') ? true : undefined, }; - let res = post(makeUrl('v2/open-banking/authorisation-gateway-url'), { + const traceid = 'T' + seneca.util.Nid(); + let res = budPost(traceid, makeUrl('v2/open-banking/authorisation-gateway-url'), { headers, body, }); - config.stats.res++; + statsCounters.res++; return res; } catch (e) { - config.stats.error++; + statsCounters.error++; throw e; } finally { options.debug && logstats('getGateway'); } } - async function retryOn(attempt, _error, response) { - const mark = seneca.util.Nid(); - options.debug && console.log('BUDRETRY', mark, attempt, response.status, tokenState); - options.debug && logstats('retryOn ' + mark); + async function getTokens() { + const prev = { + refreshToken, + accessToken, + config: JSI(config), + }; + let refreshConfig = { + method: 'POST', + headers: { + Authorization: seneca.shared.headers.Authorization, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: 'grant_type=client_credentials' + }; + statsCounters.refresh++; + options.debug && console.log('BUD-GT-REFRESH', tokenState); + let refreshResult = await origFetcher(options.url + 'v1/oauth/token', refreshConfig); + options.debug && console.log('BUD-GT-REFRESH-RESULT', refreshResult.status); + if (200 !== refreshResult.status) { + throw new Error('bud-provider: refresh-token: status:' + refreshResult.status); + } + let refreshJSON = await refreshResult.json(); + // TODO: don't store here + refreshToken = refreshJSON.data.refresh_token; + await options.store.saveToken('refresh', refreshToken); + // Force accessToken request + accessToken = null; + if (null != refreshToken || isStart) { + tokenState = 'refresh'; + } + isStart = false; + options.debug && console.log('BUD-GT-REFRESH-DONE', tokenState, (refreshToken || '').substring(0, 22)); + let accessConfig = { + method: 'POST', + headers: { + Authorization: seneca.shared.headers.Authorization, + 'Content-Type': 'application/x-www-form-urlencoded', + 'X-Client-Id': seneca.shared.clientid + }, + body: `grant_type=refresh_token&refresh_token=${refreshToken}` + }; + statsCounters.access++; + options.debug && console.log('BUD-GT-ACCESS', tokenState); + let accessResult = await origFetcher(options.url + 'v1/oauth/token', accessConfig); + options.debug && console.log('BUD-GT-ACCESS-RESULT', accessResult.status); + if (401 === accessResult.status) { + refreshToken = null; + tokenState = 'start'; + return true; + } + else if (200 !== accessResult.status) { + throw new Error('bud-provider: access-token: status:' + accessResult.status); + } + let accessJSON = await accessResult.json(); + accessToken = accessJSON.data.access_token; + await options.store.saveToken('access', accessToken); + let authContent = 'Bearer ' + accessToken; + config.headers['Authorization'] = authContent; + config.headers['X-Client-Id'] = seneca.shared.clientid; + tokenState = 'active'; + options.debug && console.log('BUD-GT-ACCESS-DONE', tokenState, (refreshToken || '').substring(0, 22), (accessToken || '').substring(0, 22)); + const current = { + refreshToken, + accessToken, + config: JSI(config), + }; + return { + when: Date.now(), + prev, + current, + }; + } + async function retryOn(attempt, error, response, fetchspec) { + var _a, _b; + const traceid = (((_a = fetchspec === null || fetchspec === void 0 ? void 0 : fetchspec.options) === null || _a === void 0 ? void 0 : _a.headers) || {})['X-SenecaBudProvider-TraceID'] || + seneca.util.Nid(); + logreq(traceid, 'retry', (((_b = fetchspec === null || fetchspec === void 0 ? void 0 : fetchspec.options) === null || _b === void 0 ? void 0 : _b.method) || 'GET'), attempt, [fetchspec === null || fetchspec === void 0 ? void 0 : fetchspec.resource, fetchspec === null || fetchspec === void 0 ? void 0 : fetchspec.options]); + options.debug && + console.log('BUDRETRY', traceid, attempt, response === null || response === void 0 ? void 0 : response.status, tokenState, error === null || error === void 0 ? void 0 : error.message); + options.debug && logstats('retryOn ' + traceid); + if (error) { + throw error; + } if (options.limit.retry < retryCount && 4 <= attempt) { throw new Error('bud-provider: global retry limit reached: ' + retryCount); } if (5 <= attempt) { - options.debug && console.log('BUDRETRY-BAIL', mark, attempt, response.status, tokenState); + options.debug && console.log('BUDRETRY-BAIL', traceid, attempt, response.status, tokenState); return false; } if (500 <= response.status && attempt <= 3) { - options.debug && console.log('BUDRETRY-500', mark, attempt, response.status, tokenState); + options.debug && console.log('BUDRETRY-500', traceid, attempt, response.status, tokenState); return true; } if (401 === response.status) { - options.debug && console.log('BUDRETRY-401', mark, attempt, response.status, tokenState); + options.debug && console.log('BUDRETRY-401', traceid, attempt, response.status, tokenState); // Try to refresh the access token first. if ('active' === tokenState) { tokenState = 'refresh'; } try { - options.debug && console.log('BUDRETRY-TOKEN-STATE-TOP', mark, attempt, tokenState); + options.debug && console.log('BUDRETRY-TOKEN-STATE-TOP', traceid, attempt, tokenState); if ('active' !== tokenState && 'refresh' !== tokenState) { tokenState = 'request'; let lastRefreshToken = await options.store.loadToken('refresh'); - options.debug && console.log('BUDRETRY-LAST-REFRESH', mark, attempt, lastRefreshToken, refreshToken); + options.debug && console.log('BUDRETRY-LAST-REFRESH', traceid, attempt, lastRefreshToken, refreshToken); if ( // Very first time, try to load the current refreshtoken isStart @@ -423,8 +530,8 @@ function BudProvider(options) { // token out of date if same as last attempt lastRefreshToken != refreshToken)) { refreshToken = lastRefreshToken; - config.stats.loadrefresh++; - options.debug && console.log('BUDRETRY-USING-LAST-REFRESH', mark, attempt, tokenState); + statsCounters.loadrefresh++; + options.debug && console.log('BUDRETRY-USING-LAST-REFRESH', traceid, attempt, tokenState); } else { let refreshConfig = { @@ -435,10 +542,10 @@ function BudProvider(options) { }, body: 'grant_type=client_credentials' }; - config.stats.refresh++; - options.debug && console.log('BUDRETRY-REFRESH', mark, attempt, response.status, tokenState); + statsCounters.refresh++; + options.debug && console.log('BUDRETRY-REFRESH', traceid, attempt, response.status, tokenState); let refreshResult = await origFetcher(options.url + 'v1/oauth/token', refreshConfig); - options.debug && console.log('BUDRETRY-REFRESH-RESULT', mark, refreshResult.status); + options.debug && console.log('BUDRETRY-REFRESH-RESULT', traceid, refreshResult.status); if (200 !== refreshResult.status) { throw new Error('bud-provider: refresh-token: status:' + refreshResult.status); } @@ -453,17 +560,17 @@ function BudProvider(options) { tokenState = 'refresh'; } isStart = false; - options.debug && console.log('BUDRETRY-REFRESH-DONE', mark, tokenState, (refreshToken || '').substring(0, 22)); + options.debug && console.log('BUDRETRY-REFRESH-DONE', traceid, tokenState, (refreshToken || '').substring(0, 22)); } if ('refresh' === tokenState) { let lastAccessToken = await options.store.loadToken('access'); - options.debug && console.log('BUDRETRY-LAST-ACCESS', mark, attempt, lastAccessToken, accessToken); + options.debug && console.log('BUDRETRY-LAST-ACCESS', traceid, attempt, lastAccessToken, accessToken); if (null != lastAccessToken && '' != lastAccessToken && null != accessToken && '' != accessToken && lastAccessToken != accessToken) { accessToken = lastAccessToken; - config.stats.loadaccess++; - options.debug && console.log('BUDRETRY-USING-LAST-ACCESS', mark, attempt, tokenState); + statsCounters.loadaccess++; + options.debug && console.log('BUDRETRY-USING-LAST-ACCESS', traceid, attempt, tokenState); } else { let accessConfig = { @@ -475,10 +582,10 @@ function BudProvider(options) { }, body: `grant_type=refresh_token&refresh_token=${refreshToken}` }; - config.stats.access++; - options.debug && console.log('BUDRETRY-ACCESS', mark, attempt, response.status, tokenState); + statsCounters.access++; + options.debug && console.log('BUDRETRY-ACCESS', traceid, attempt, response.status, tokenState); let accessResult = await origFetcher(options.url + 'v1/oauth/token', accessConfig); - options.debug && console.log('BUDRETRY-ACCESS-RESULT', mark, accessResult.status); + options.debug && console.log('BUDRETRY-ACCESS-RESULT', traceid, accessResult.status); if (401 === accessResult.status) { refreshToken = null; tokenState = 'start'; @@ -499,7 +606,7 @@ function BudProvider(options) { currentConfig.headers['X-Client-Id'] = seneca.shared.clientid; config.headers['X-Client-Id'] = seneca.shared.clientid; tokenState = 'active'; - options.debug && console.log('BUDRETRY-ACCESS-DONE', mark, tokenState, (refreshToken || '').substring(0, 22), (accessToken || '').substring(0, 22)); + options.debug && console.log('BUDRETRY-ACCESS-DONE', traceid, tokenState, (refreshToken || '').substring(0, 22), (accessToken || '').substring(0, 22)); return true; } } @@ -521,32 +628,32 @@ function BudProvider(options) { Authorization: 'Basic ' + auth }); }); - async function waitForRefreshToken(_whence) { - const mark = Math.random(); + async function waitForToken(_whence, traceid) { const initialTokenState = tokenState; + let start = Date.now(), i = 0; if ('init' === tokenState) { tokenState = 'start'; - options.debug && console.log('BUDWRT-A', mark, initialTokenState, tokenState); - return; + options.debug && console.log('BUDWAIT-INIT', traceid, initialTokenState, tokenState); } - if ('active' !== tokenState) { - let start = Date.now(), i = 0; + else if ('active' !== tokenState) { for (; ('active' !== tokenState) && i < 1111 && ((Date.now() - start) < options.wait.refresh.max); i++) { + options.debug && + console.log('BUDWAIT-WAITING', traceid, initialTokenState, tokenState, i, Date.now() - start); await new Promise((r) => setTimeout(r, options.wait.refresh.interval)); } - options.debug && console.log('BUDWRT-B', mark, initialTokenState, tokenState); - } - else { - options.debug && console.log('BUDWRT-C', mark, initialTokenState, tokenState); + options.debug && + console.log('BUDWAIT-WAITED', traceid, initialTokenState, tokenState, i, Date.now() - start); } + options.debug && console.log('BUDWAIT-DONE', traceid, initialTokenState, tokenState, Date.now() - start); } return { exports: { + getTokens, getGateway, sdk: () => null, - stats: () => config.stats, + stats: () => statsCounters, util: { getTokenState: () => tokenState, setTokenState: (tokenStateIn) => tokenState = tokenStateIn, @@ -566,6 +673,14 @@ function BudProvider(options) { } }; } +function JSI(o) { + try { + return (JSON.stringify(o) || '').replace(/"/g, ''); + } + catch (e) { + return o + ' JSI:' + e.message; + } +} Object.assign(BudProvider, { defaults }); exports.default = BudProvider; if ('undefined' !== typeof module) { diff --git a/dist/bud-provider.js.map b/dist/bud-provider.js.map index 1ab76fb..3e9e365 100644 --- a/dist/bud-provider.js.map +++ b/dist/bud-provider.js.map @@ -1 +1 @@ -{"version":3,"file":"bud-provider.js","sourceRoot":"","sources":["../src/bud-provider.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"bud-provider.js","sourceRoot":"","sources":["../src/bud-provider.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index d3e8ec0..f23fa04 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@seneca/bud-provider", - "version": "0.7.0", + "version": "0.8.0", "main": "dist/bud-provider.js", "type": "commonjs", "types": "dist/bud-provider.d.ts", @@ -46,7 +46,7 @@ }, "peerDependencies": { "@seneca/env": ">=0.2", - "@seneca/provider": ">=2", + "@seneca/provider": ">=3", "seneca": ">=3", "seneca-entity": ">=25", "seneca-promisify": ">=3" @@ -56,7 +56,6 @@ "@seneca/env": "^0.2.0", "@seneca/evervault-provider": "^0.3.1", "@seneca/maintain": "^0.1.0", - "@seneca/provider": "^2.0.1", "@seneca/user": "^6.3.0", "@types/jest": "^29.5.12", "@types/node": "^20.11.16", diff --git a/src/bud-provider.ts b/src/bud-provider.ts index 53c01c0..92eb93c 100644 --- a/src/bud-provider.ts +++ b/src/bud-provider.ts @@ -8,6 +8,9 @@ type FullBudProviderOptions = { url: string fetch: any debug: boolean + print: { + request: boolean + } entity: Record> retry: { config: Record @@ -42,6 +45,10 @@ const defaults: BudProviderOptions = { // TODO: Enable debug logging debug: false, + print: { + request: false, + }, + // See @seneca/provider retry: { config: { @@ -53,8 +60,8 @@ const defaults: BudProviderOptions = { wait: { refresh: { - max: 1111, - interval: 111, + max: 2222, + interval: 222, } }, @@ -65,7 +72,7 @@ const defaults: BudProviderOptions = { store: { - saveToken: async (_kind: string, val: string) => null, + saveToken: async (_kind: string, _val: string) => null, loadToken: async (_kind: string) => null, } } @@ -107,18 +114,20 @@ function BudProvider(this: any, options: FullBudProviderOptions) { // Shared config reference. const config: any = { headers: {}, - stats: { - refresh: 0, // count of refresh token fetches - access: 0, // count of access token fetches - loadrefresh: 0, // count of refresh token loads - loadaccess: 0, // count of access token loads - req: 0, // count of requests - res: 0, // count of non-error responses - error: 0, // error count, - notfound: 0, // count of not founds - } } + const statsCounters = { + refresh: 0, // count of refresh token fetches + access: 0, // count of access token fetches + loadrefresh: 0, // count of refresh token loads + loadaccess: 0, // count of access token loads + req: 0, // count of requests + res: 0, // count of non-error responses + error: 0, // error count, + notfound: 0, // count of not founds + } + + let refreshToken: any let accessToken: any let tokenState: 'init' | 'start' | 'request' | 'refresh' | 'active' = 'init' @@ -147,6 +156,33 @@ function BudProvider(this: any, options: FullBudProviderOptions) { }) + const budGet = async function(traceid: string, ...args: any[]) { + logreq(traceid, 'orig', 'GET', 0, args) + return get(...args) + } + + const budPost = async function(traceid: string, ...args: any[]) { + logreq(traceid, 'orig', 'POST', 0, args) + return post(...args) + } + + + function logreq(traceid: string, phase: string, method: string, attempt: number, args: any[]) { + args[1] = (args[1] || {}) + args[1].headers = (args[1].headers || {}) + const tid = args[1].headers['X-SenecaBudProvider-TraceID'] = + (args[1].headers['X-SenecaBudProvider-TraceID'] || (traceid || seneca.util.Nid())) + options.print.request && + console.log('BUDREQ', method, seneca.id, tid, phase, attempt, tokenState, + refreshToken && refreshToken.substring(0, 8), + accessToken && accessToken.substring(0, 8), + JSI(statsCounters), + JSI(args[0]), + JSI(args[1]), + ) + } + + seneca.message('sys:provider,provider:bud,get:info', get_info) async function get_info(this: any, _msg: any) { @@ -162,7 +198,7 @@ function BudProvider(this: any, options: FullBudProviderOptions) { function stats() { - return config.stats + return statsCounters } function logstats(mark: string) { @@ -187,26 +223,27 @@ function BudProvider(this: any, options: FullBudProviderOptions) { let id = q.id try { - config.stats.req++ + statsCounters.req++ - await waitForRefreshToken('customer.cmd.load') + const traceid = 'T' + seneca.util.Nid() + await waitForToken('customer.cmd.load', traceid) - let json = await get(makeUrl('v1/customers', id, 'context')) + let json = await budGet(traceid, makeUrl('v1/customers', id, 'context')) let entdata = json.data entdata.id = id - config.stats.res++ + statsCounters.res++ return entize(entdata) } catch (e: any) { let res = e.provider?.response if (404 === res?.status) { - config.stats.notfound++ + statsCounters.notfound++ return null } - config.stats.error++ + statsCounters.error++ throw e } finally { @@ -218,7 +255,7 @@ function BudProvider(this: any, options: FullBudProviderOptions) { entity.customer.cmd.save.action = async function(this: any, entize: any, msg: any) { try { - config.stats.req++ + statsCounters.req++ let body = { customer_context: { ...(options.entity?.customer?.save || {}), @@ -226,20 +263,21 @@ function BudProvider(this: any, options: FullBudProviderOptions) { } } - await waitForRefreshToken('customer.cmd.save') + const traceid = 'T' + seneca.util.Nid() + await waitForToken('customer.cmd.save', traceid) - let json = await post(makeUrl('platform/v3/customers'), { + let json = await budPost(traceid, makeUrl('platform/v3/customers'), { body }) let entdata = json.data entdata.id = entdata.customer_id - config.stats.res++ + statsCounters.res++ return entize(entdata) } catch (e: any) { - config.stats.error++ + statsCounters.error++ throw e } finally { @@ -255,30 +293,33 @@ function BudProvider(this: any, options: FullBudProviderOptions) { let customerid = q.customerid try { - config.stats.req++ + statsCounters.req++ let headers = CustomerHeadersIDOnlyShape({ 'X-Customer-Id': customerid }) - let json = await get(makeUrl('v1/open-banking/connect', id), { + const traceid = 'T' + seneca.util.Nid() + await waitForToken('account.cmd.load', traceid) + + let json = await budGet(traceid, makeUrl('v1/open-banking/connect', id), { headers }) let entdata = json.data entdata.id = id - config.stats.res++ + statsCounters.res++ return entize(entdata) } catch (e: any) { let res = e.provider?.response if (404 === res?.status) { - config.stats.notfound++ + statsCounters.notfound++ return null } - config.stats.error++ + statsCounters.error++ throw e } finally { @@ -295,33 +336,34 @@ function BudProvider(this: any, options: FullBudProviderOptions) { let customersecret = q.customersecret try { - config.stats.req++ + statsCounters.req++ let headers = CustomerHeadersShape({ 'X-Customer-Id': customerid, 'X-Customer-Secret': customersecret, }) - await waitForRefreshToken('account.cmd.load') + const traceid = 'T' + seneca.util.Nid() + await waitForToken('account.cmd.load', traceid) - let json = await get(makeUrl('financial/v2/accounts/', id), { + let json = await budGet(traceid, makeUrl('financial/v2/accounts/', id), { headers }) let entdata = json.data entdata.id = id - config.stats.res++ + statsCounters.res++ return entize(entdata) } catch (e: any) { let res = e.provider?.response if (404 === res?.status) { - config.stats.notfound++ + statsCounters.notfound++ return null } - config.stats.error++ + statsCounters.error++ throw e } finally { @@ -340,15 +382,16 @@ function BudProvider(this: any, options: FullBudProviderOptions) { delete q.customersecret try { - config.stats.req++ + statsCounters.req++ let headers = CustomerHeadersShape({ 'X-Customer-Id': customerid, 'X-Customer-Secret': customersecret, }) - await waitForRefreshToken('account.cmd.list') + const traceid = 'T' + seneca.util.Nid() + await waitForToken('account.cmd.list', traceid) - let json = await get(makeUrl('financial/v2/accounts', q), { + let json = await budGet(traceid, makeUrl('financial/v2/accounts', q), { headers }) @@ -359,18 +402,18 @@ function BudProvider(this: any, options: FullBudProviderOptions) { return ent }) - config.stats.res++ + statsCounters.res++ return list } catch (e: any) { let res = e.provider?.response if (404 === res?.status) { - config.stats.notfound++ + statsCounters.notfound++ return null } - config.stats.error++ + statsCounters.error++ throw e } finally { @@ -390,7 +433,7 @@ function BudProvider(this: any, options: FullBudProviderOptions) { delete q.customersecret try { - config.stats.req++ + statsCounters.req++ let headers = CustomerHeadersShape({ 'X-Customer-Id': customerid, 'X-Customer-Secret': customersecret, @@ -402,14 +445,15 @@ function BudProvider(this: any, options: FullBudProviderOptions) { let nextPageToken: string | null | undefined = null const maxPages = 1111 - await waitForRefreshToken('transaction.cmd.list') + const traceid = 'T' + seneca.util.Nid() + await waitForToken('transaction.cmd.list', traceid) while (paging && pI < maxPages) { if (nextPageToken) { q.page_token = nextPageToken } - let json = await get(makeUrl('financial/v2/transactions', q), { + let json = await budGet(traceid, makeUrl('financial/v2/transactions', q), { headers }) @@ -430,18 +474,18 @@ function BudProvider(this: any, options: FullBudProviderOptions) { return ent }) - config.stats.res++ + statsCounters.res++ return list } catch (e: any) { let res = e.provider?.response if (404 === res?.status) { - config.stats.notfound++ + statsCounters.notfound++ return null } - config.stats.error++ + statsCounters.error++ throw e } finally { @@ -455,21 +499,23 @@ function BudProvider(this: any, options: FullBudProviderOptions) { let q = { ...(msg.q || {}) } try { - config.stats.req++ - await waitForRefreshToken('obp.cmd.list') + statsCounters.req++ - let json = await get(makeUrl('v1/open-banking/providers'), q) + const traceid = 'T' + seneca.util.Nid() + await waitForToken('obp.cmd.list', traceid) + + let json = await budGet(traceid, makeUrl('v1/open-banking/providers'), q) let entlist = json.data entlist = entlist.map((entdata: any) => { entdata.id = entdata.provider return entize(entdata) }) - config.stats.res++ + statsCounters.res++ return entlist } catch (e: any) { - config.stats.error++ + statsCounters.error++ throw e } finally { @@ -495,7 +541,7 @@ function BudProvider(this: any, options: FullBudProviderOptions) { mode?: string }) { try { - config.stats.req++ + statsCounters.req++ let headers = CustomerHeadersGatewayShape({ 'X-Client-Id': spec.clientid, 'X-Customer-Id': spec.customerid, @@ -507,16 +553,19 @@ function BudProvider(this: any, options: FullBudProviderOptions) { initial_screen: (spec.mode === 'reconnect') ? 'reconfirm_consent' : undefined, reconfirm_consent_redirect: (spec.mode === 'reconnect') ? true : undefined, } - let res = post(makeUrl('v2/open-banking/authorisation-gateway-url'), { + + const traceid = 'T' + seneca.util.Nid() + + let res = budPost(traceid, makeUrl('v2/open-banking/authorisation-gateway-url'), { headers, body, }) - config.stats.res++ + statsCounters.res++ return res } catch (e: any) { - config.stats.error++ + statsCounters.error++ throw e } finally { @@ -525,28 +574,144 @@ function BudProvider(this: any, options: FullBudProviderOptions) { } - async function retryOn(attempt: number, _error: any, response: any) { - const mark = seneca.util.Nid() + async function getTokens() { + const prev = { + refreshToken, + accessToken, + config: JSI(config), + } + + let refreshConfig = { + method: 'POST', + headers: { + Authorization: seneca.shared.headers.Authorization, + 'Content-Type': 'application/x-www-form-urlencoded' + }, + body: 'grant_type=client_credentials' + } + + statsCounters.refresh++ + options.debug && console.log('BUD-GT-REFRESH', tokenState) + + let refreshResult = + await origFetcher(options.url + 'v1/oauth/token', refreshConfig) + + options.debug && console.log('BUD-GT-REFRESH-RESULT', refreshResult.status) + + if (200 !== refreshResult.status) { + throw new Error('bud-provider: refresh-token: status:' + refreshResult.status) + } + + let refreshJSON = await refreshResult.json() + + // TODO: don't store here + refreshToken = refreshJSON.data.refresh_token + await options.store.saveToken('refresh', refreshToken) + + // Force accessToken request + accessToken = null + + if (null != refreshToken || isStart) { + tokenState = 'refresh' + } + + isStart = false + + options.debug && console.log('BUD-GT-REFRESH-DONE', tokenState, + (refreshToken || '').substring(0, 22)) + + let accessConfig = { + method: 'POST', + headers: { + Authorization: seneca.shared.headers.Authorization, + 'Content-Type': 'application/x-www-form-urlencoded', + 'X-Client-Id': seneca.shared.clientid + }, + body: `grant_type=refresh_token&refresh_token=${refreshToken}` + } + + statsCounters.access++ + options.debug && console.log('BUD-GT-ACCESS', tokenState) + + let accessResult = + await origFetcher(options.url + 'v1/oauth/token', accessConfig) + + options.debug && console.log('BUD-GT-ACCESS-RESULT', accessResult.status) + + if (401 === accessResult.status) { + refreshToken = null + tokenState = 'start' + return true + } + else if (200 !== accessResult.status) { + throw new Error('bud-provider: access-token: status:' + accessResult.status) + } + + let accessJSON = await accessResult.json() + accessToken = accessJSON.data.access_token + + await options.store.saveToken('access', accessToken) + + let authContent = 'Bearer ' + accessToken + + config.headers['Authorization'] = authContent + config.headers['X-Client-Id'] = seneca.shared.clientid + + tokenState = 'active' + + options.debug && console.log('BUD-GT-ACCESS-DONE', tokenState, + (refreshToken || '').substring(0, 22), + (accessToken || '').substring(0, 22), + ) + + const current = { + refreshToken, + accessToken, + config: JSI(config), + } + + return { + when: Date.now(), + prev, + current, + } + } + + + async function retryOn( + attempt: number, error: any, response: any, + fetchspec: { resource: any, options: any } + ) { + const traceid = (fetchspec?.options?.headers || {})['X-SenecaBudProvider-TraceID'] || + seneca.util.Nid() + + logreq(traceid, 'retry', (fetchspec?.options?.method || 'GET'), attempt, + [fetchspec?.resource, fetchspec?.options]) + + options.debug && + console.log('BUDRETRY', traceid, attempt, response?.status, tokenState, error?.message) + options.debug && logstats('retryOn ' + traceid) - options.debug && console.log('BUDRETRY', mark, attempt, response.status, tokenState) - options.debug && logstats('retryOn ' + mark) + if (error) { + throw error + } if (options.limit.retry < retryCount && 4 <= attempt) { throw new Error('bud-provider: global retry limit reached: ' + retryCount) } if (5 <= attempt) { - options.debug && console.log('BUDRETRY-BAIL', mark, attempt, response.status, tokenState) + options.debug && console.log('BUDRETRY-BAIL', traceid, attempt, response.status, tokenState) return false } if (500 <= response.status && attempt <= 3) { - options.debug && console.log('BUDRETRY-500', mark, attempt, response.status, tokenState) + options.debug && console.log('BUDRETRY-500', traceid, attempt, response.status, tokenState) return true } if (401 === response.status) { - options.debug && console.log('BUDRETRY-401', mark, attempt, response.status, tokenState) + options.debug && console.log('BUDRETRY-401', traceid, attempt, response.status, tokenState) // Try to refresh the access token first. if ('active' === tokenState) { @@ -554,13 +719,13 @@ function BudProvider(this: any, options: FullBudProviderOptions) { } try { - options.debug && console.log('BUDRETRY-TOKEN-STATE-TOP', mark, attempt, tokenState) + options.debug && console.log('BUDRETRY-TOKEN-STATE-TOP', traceid, attempt, tokenState) if ('active' !== (tokenState as any) && 'refresh' !== tokenState) { tokenState = 'request' let lastRefreshToken = await options.store.loadToken('refresh') - options.debug && console.log('BUDRETRY-LAST-REFRESH', mark, attempt, lastRefreshToken, refreshToken) + options.debug && console.log('BUDRETRY-LAST-REFRESH', traceid, attempt, lastRefreshToken, refreshToken) if ( // Very first time, try to load the current refreshtoken @@ -572,8 +737,8 @@ function BudProvider(this: any, options: FullBudProviderOptions) { lastRefreshToken != refreshToken )) { refreshToken = lastRefreshToken - config.stats.loadrefresh++ - options.debug && console.log('BUDRETRY-USING-LAST-REFRESH', mark, attempt, tokenState) + statsCounters.loadrefresh++ + options.debug && console.log('BUDRETRY-USING-LAST-REFRESH', traceid, attempt, tokenState) } else { @@ -586,13 +751,13 @@ function BudProvider(this: any, options: FullBudProviderOptions) { body: 'grant_type=client_credentials' } - config.stats.refresh++ - options.debug && console.log('BUDRETRY-REFRESH', mark, attempt, response.status, tokenState) + statsCounters.refresh++ + options.debug && console.log('BUDRETRY-REFRESH', traceid, attempt, response.status, tokenState) let refreshResult = await origFetcher(options.url + 'v1/oauth/token', refreshConfig) - options.debug && console.log('BUDRETRY-REFRESH-RESULT', mark, refreshResult.status) + options.debug && console.log('BUDRETRY-REFRESH-RESULT', traceid, refreshResult.status) if (200 !== refreshResult.status) { throw new Error('bud-provider: refresh-token: status:' + refreshResult.status) @@ -614,22 +779,22 @@ function BudProvider(this: any, options: FullBudProviderOptions) { isStart = false - options.debug && console.log('BUDRETRY-REFRESH-DONE', mark, tokenState, + options.debug && console.log('BUDRETRY-REFRESH-DONE', traceid, tokenState, (refreshToken || '').substring(0, 22)) } if ('refresh' === tokenState) { let lastAccessToken = await options.store.loadToken('access') - options.debug && console.log('BUDRETRY-LAST-ACCESS', mark, attempt, lastAccessToken, accessToken) + options.debug && console.log('BUDRETRY-LAST-ACCESS', traceid, attempt, lastAccessToken, accessToken) if ( null != lastAccessToken && '' != lastAccessToken && null != accessToken && '' != accessToken && lastAccessToken != accessToken) { accessToken = lastAccessToken - config.stats.loadaccess++ - options.debug && console.log('BUDRETRY-USING-LAST-ACCESS', mark, attempt, tokenState) + statsCounters.loadaccess++ + options.debug && console.log('BUDRETRY-USING-LAST-ACCESS', traceid, attempt, tokenState) } else { let accessConfig = { @@ -642,13 +807,13 @@ function BudProvider(this: any, options: FullBudProviderOptions) { body: `grant_type=refresh_token&refresh_token=${refreshToken}` } - config.stats.access++ - options.debug && console.log('BUDRETRY-ACCESS', mark, attempt, response.status, tokenState) + statsCounters.access++ + options.debug && console.log('BUDRETRY-ACCESS', traceid, attempt, response.status, tokenState) let accessResult = await origFetcher(options.url + 'v1/oauth/token', accessConfig) - options.debug && console.log('BUDRETRY-ACCESS-RESULT', mark, accessResult.status) + options.debug && console.log('BUDRETRY-ACCESS-RESULT', traceid, accessResult.status) if (401 === accessResult.status) { refreshToken = null @@ -678,7 +843,7 @@ function BudProvider(this: any, options: FullBudProviderOptions) { tokenState = 'active' - options.debug && console.log('BUDRETRY-ACCESS-DONE', mark, tokenState, + options.debug && console.log('BUDRETRY-ACCESS-DONE', traceid, tokenState, (refreshToken || '').substring(0, 22), (accessToken || '').substring(0, 22), ) @@ -716,41 +881,44 @@ function BudProvider(this: any, options: FullBudProviderOptions) { }) - async function waitForRefreshToken(_whence: string) { - const mark = Math.random() + async function waitForToken(_whence: string, traceid: string) { const initialTokenState = tokenState + let start = Date.now(), i = 0 if ('init' === tokenState) { tokenState = 'start' - options.debug && console.log('BUDWRT-A', mark, initialTokenState, tokenState) - return + options.debug && console.log('BUDWAIT-INIT', traceid, initialTokenState, tokenState) } - if ('active' !== tokenState) { - let start = Date.now(), i = 0 - + else if ('active' !== tokenState) { for ( ; ('active' !== (tokenState as string)) && i < 1111 && ((Date.now() - start) < options.wait.refresh.max); i++ ) { + options.debug && + console.log('BUDWAIT-WAITING', traceid, initialTokenState, tokenState, + i, Date.now() - start) await new Promise((r) => setTimeout(r, options.wait.refresh.interval)) } - options.debug && console.log('BUDWRT-B', mark, initialTokenState, tokenState) - } - else { - options.debug && console.log('BUDWRT-C', mark, initialTokenState, tokenState) + options.debug && + console.log('BUDWAIT-WAITED', traceid, initialTokenState, tokenState, + i, Date.now() - start) } + + options.debug && console.log('BUDWAIT-DONE', traceid, initialTokenState, tokenState, + Date.now() - start) } return { exports: { + getTokens, getGateway, sdk: () => null, - stats: () => config.stats, + stats: () => statsCounters, util: { getTokenState: () => tokenState, setTokenState: (tokenStateIn: typeof tokenState) => tokenState = tokenStateIn, @@ -764,7 +932,6 @@ function BudProvider(this: any, options: FullBudProviderOptions) { else if ('access' === name) { accessToken = value config.headers['Authorization'] = 'Bearer ' + value - } } } @@ -773,6 +940,15 @@ function BudProvider(this: any, options: FullBudProviderOptions) { } +function JSI(o: any) { + try { + return (JSON.stringify(o) || '').replace(/"/g, '') + } + catch (e: any) { + return o + ' JSI:' + e.message + } +} + Object.assign(BudProvider, { defaults }) diff --git a/test/bud-provider.test.js b/test/bud-provider.test.js index 8d9f61c..7dbfdef 100644 --- a/test/bud-provider.test.js +++ b/test/bud-provider.test.js @@ -38,16 +38,33 @@ describe('bud-provider', () => { }) + test('getTokens', async () => { + if (null == Config) return; + + const seneca = await makeSeneca({debug:true, print:{request:true}}) + const getTokens = seneca.export('BudProvider/getTokens') + + const tokens = await getTokens() + console.dir(tokens,{depth:null}) + + expect(tokens.when).toBeDefined() + }) + + test('obp-list', async () => { if (null == Config) return; - const seneca = await makeSeneca() + const seneca = await makeSeneca({debug:true, print:{request:true}}) + + seneca.entity("provider/bud/obp").list$() const list = await seneca.entity("provider/bud/obp").list$() // console.log(list) + await seneca.ready() + expect(list.length > 0).toBeTruthy() - }) + },11111) @@ -81,7 +98,7 @@ describe('bud-provider', () => { test('txdown', async () => { if (null == Config) return; - const seneca = await makeSeneca() + const seneca = await makeSeneca({print:{request:true}}) const budutil = seneca.export('BudProvider/util') const { setToken } = budutil