@soulcode/bexio-oauth 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -4
- package/dist/claims.d.ts +2 -2
- package/dist/claims.d.ts.map +1 -1
- package/dist/claims.js +3 -3
- package/dist/claims.js.map +1 -1
- package/dist/crypto.d.ts +2 -2
- package/dist/crypto.js +5 -5
- package/dist/crypto.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/grants.d.ts +20 -11
- package/dist/grants.d.ts.map +1 -1
- package/dist/grants.js +67 -39
- package/dist/grants.js.map +1 -1
- package/dist/idle-sweep.d.ts +1 -1
- package/dist/idle-sweep.d.ts.map +1 -1
- package/dist/idle-sweep.js +5 -5
- package/dist/idle-sweep.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/migrations.generated.d.ts.map +1 -1
- package/dist/migrations.generated.js +26 -10
- package/dist/migrations.generated.js.map +1 -1
- package/dist/refresh.d.ts +7 -7
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +38 -30
- package/dist/refresh.js.map +1 -1
- package/dist/store/memory.d.ts.map +1 -1
- package/dist/store/memory.js +82 -46
- package/dist/store/memory.js.map +1 -1
- package/dist/store/postgres.d.ts +3 -3
- package/dist/store/postgres.d.ts.map +1 -1
- package/dist/store/postgres.js +128 -59
- package/dist/store/postgres.js.map +1 -1
- package/dist/store/types.d.ts +61 -21
- package/dist/store/types.d.ts.map +1 -1
- package/dist/types.d.ts +24 -10
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/sql/0001_bexio_oauth.sql +48 -0
- package/sql/0001_bexio_grants.sql +0 -32
package/dist/refresh.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE7D,+DAA+D;AAC/D,eAAO,MAAM,cAAc,QAAS,CAAC;AAIrC,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,qBAAqB,GACpD,IAAI,CAAC,4BAA4B,CAAC;AAEpC,qFAAqF;AACrF,wBAAgB,WAAW,CACzB,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE,IAAI,GACR;IAAE,eAAe,EAAE,IAAI,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,CAajE;AAED,qEAAqE;AACrE,wBAAgB,OAAO,CAAC,UAAU,EAAE,gBAAgB,EAAE,GAAG,EAAE,IAAI,GAAG,OAAO,CAKxE;AAED,8DAA8D;AAC9D,wBAAgB,UAAU,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI;;;;EAMvD;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,aAAa,EAClB,UAAU,EAAE,gBAAgB,EAC5B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAoElC;AAID,mCAAmC;AACnC,wBAAsB,cAAc,CAClC,GAAG,EAAE,aAAa,EAClB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,WAAW,CAAC,CAqDtB"}
|
package/dist/refresh.js
CHANGED
|
@@ -22,9 +22,9 @@ export function tokenExpiry(tokens, now) {
|
|
|
22
22
|
};
|
|
23
23
|
}
|
|
24
24
|
/** True while the access token is valid for longer than the skew. */
|
|
25
|
-
export function isFresh(
|
|
26
|
-
return (
|
|
27
|
-
|
|
25
|
+
export function isFresh(connection, now) {
|
|
26
|
+
return (connection.accessExpiresAt !== null &&
|
|
27
|
+
connection.accessExpiresAt.getTime() - EXPIRY_SKEW_MS > now.getTime());
|
|
28
28
|
}
|
|
29
29
|
/** A new lock holder's token and lease, starting at `now`. */
|
|
30
30
|
export function lockWindow(ctx, now) {
|
|
@@ -35,25 +35,26 @@ export function lockWindow(ctx, now) {
|
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
/**
|
|
38
|
-
* Refreshes a
|
|
39
|
-
* is fenced by the token: if the lock was lost (expired and taken over,
|
|
40
|
-
* the
|
|
41
|
-
* returns `null`: the caller re-reads the
|
|
38
|
+
* Refreshes a connection whose lock the caller holds (`lockToken`). Every
|
|
39
|
+
* write is fenced by the token: if the lock was lost (expired and taken over,
|
|
40
|
+
* or the connection was reconnected meanwhile), the write changes nothing and
|
|
41
|
+
* this returns `null`: the caller re-reads the connection.
|
|
42
42
|
*/
|
|
43
|
-
export async function refreshLocked(ctx,
|
|
43
|
+
export async function refreshLocked(ctx, connection, lockToken) {
|
|
44
44
|
const { store, cipher, clock } = ctx;
|
|
45
|
-
if (!
|
|
46
|
-
await store.markReauthRequired(
|
|
47
|
-
|
|
45
|
+
if (!connection.refreshToken) {
|
|
46
|
+
if (!(await store.markReauthRequired(connection.id, lockToken, clock())))
|
|
47
|
+
return null;
|
|
48
|
+
throw new BexioOAuthError("reauth_required", "connection has no refresh token; reconnect required");
|
|
48
49
|
}
|
|
49
50
|
let refreshToken;
|
|
50
51
|
try {
|
|
51
|
-
refreshToken = await decryptFor(cipher,
|
|
52
|
+
refreshToken = await decryptFor(cipher, connection, connection.refreshToken);
|
|
52
53
|
}
|
|
53
54
|
catch (error) {
|
|
54
55
|
// Usually a keyring mistake (a key removed too early): don't burn the
|
|
55
|
-
//
|
|
56
|
-
await store.releaseRefreshLock(
|
|
56
|
+
// connection, so restoring the key fixes it.
|
|
57
|
+
await store.releaseRefreshLock(connection.id, lockToken);
|
|
57
58
|
throw error;
|
|
58
59
|
}
|
|
59
60
|
let tokens;
|
|
@@ -63,10 +64,15 @@ export async function refreshLocked(ctx, record, lockToken) {
|
|
|
63
64
|
catch (error) {
|
|
64
65
|
if (error instanceof oidc.ResponseBodyError &&
|
|
65
66
|
error.error === "invalid_grant") {
|
|
66
|
-
|
|
67
|
+
// A reconnect during the refresh restarts the chain at Bexio, which
|
|
68
|
+
// rejects this (older) refresh token. If the reconnect's write already
|
|
69
|
+
// landed, it cleared our lock: nothing is marked and the caller reads
|
|
70
|
+
// the new tokens. If it lands later, it revives the connection then.
|
|
71
|
+
if (!(await store.markReauthRequired(connection.id, lockToken, clock())))
|
|
72
|
+
return null;
|
|
67
73
|
throw new BexioOAuthError("reauth_required", "Bexio rejected the refresh token; reconnect required", { cause: describe(error) });
|
|
68
74
|
}
|
|
69
|
-
await store.releaseRefreshLock(
|
|
75
|
+
await store.releaseRefreshLock(connection.id, lockToken);
|
|
70
76
|
if (isBexioOAuthError(error))
|
|
71
77
|
throw error;
|
|
72
78
|
throw new BexioOAuthError("idp_error", "token refresh failed", {
|
|
@@ -74,10 +80,10 @@ export async function refreshLocked(ctx, record, lockToken) {
|
|
|
74
80
|
});
|
|
75
81
|
}
|
|
76
82
|
const now = clock();
|
|
77
|
-
const binding = bindingOf(
|
|
83
|
+
const binding = bindingOf(connection);
|
|
78
84
|
// null: lock lost while refreshing (someone reconnected, or our lock
|
|
79
85
|
// expired and another caller took over). Their write wins.
|
|
80
|
-
return store.saveRefreshed(
|
|
86
|
+
return store.saveRefreshed(connection.id, lockToken, {
|
|
81
87
|
accessToken: await cipher.encrypt(tokens.access_token, binding),
|
|
82
88
|
refreshToken: tokens.refresh_token
|
|
83
89
|
? await cipher.encrypt(tokens.refresh_token, binding)
|
|
@@ -92,22 +98,23 @@ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
|
92
98
|
/** `BexioOAuth.getAccessToken`. */
|
|
93
99
|
export async function getAccessToken(ctx, selector) {
|
|
94
100
|
const { store, clock } = ctx;
|
|
95
|
-
|
|
101
|
+
const grant = await resolveGrant(store, selector);
|
|
102
|
+
let connection = grant.connection;
|
|
96
103
|
const deadline = clock().getTime() + ctx.lockTtlMs + WAIT_GRACE_MS;
|
|
97
104
|
let wait = 50;
|
|
98
|
-
const reread = async (
|
|
99
|
-
const current = await store.
|
|
105
|
+
const reread = async () => {
|
|
106
|
+
const current = await store.getConnection(connection.id);
|
|
100
107
|
if (!current)
|
|
101
|
-
throw new BexioOAuthError("not_connected", "grant was
|
|
108
|
+
throw new BexioOAuthError("not_connected", "grant was disconnected");
|
|
102
109
|
return current;
|
|
103
110
|
};
|
|
104
111
|
for (;;) {
|
|
105
|
-
if (
|
|
112
|
+
if (connection.status === "reauth_required") {
|
|
106
113
|
throw new BexioOAuthError("reauth_required", "grant needs to be reconnected");
|
|
107
114
|
}
|
|
108
115
|
const now = clock();
|
|
109
|
-
if (isFresh(
|
|
110
|
-
return issue(ctx.cipher,
|
|
116
|
+
if (isFresh(connection, now))
|
|
117
|
+
return issue(ctx.cipher, grant, connection);
|
|
111
118
|
// Every iteration that would do more work is bounded, whether the last
|
|
112
119
|
// one waited for another refresher or lost its own lock.
|
|
113
120
|
if (now.getTime() > deadline) {
|
|
@@ -117,23 +124,24 @@ export async function getAccessToken(ctx, selector) {
|
|
|
117
124
|
await ctx.oidc.config();
|
|
118
125
|
const window = lockWindow(ctx, clock());
|
|
119
126
|
const locked = await store.acquireRefreshLock({
|
|
120
|
-
id:
|
|
127
|
+
id: connection.id,
|
|
121
128
|
...window,
|
|
122
129
|
accessExpiresBefore: new Date(now.getTime() + EXPIRY_SKEW_MS),
|
|
123
130
|
});
|
|
124
131
|
if (locked) {
|
|
125
132
|
const refreshed = await refreshLocked(ctx, locked, window.lockToken);
|
|
126
133
|
if (refreshed)
|
|
127
|
-
return issue(ctx.cipher, refreshed);
|
|
134
|
+
return issue(ctx.cipher, grant, refreshed);
|
|
128
135
|
// Lost the lock to a reconnect or another refresher: look at their
|
|
129
136
|
// result before anything else (it may be fresh, or reauth_required).
|
|
130
|
-
|
|
137
|
+
connection = await reread();
|
|
131
138
|
continue;
|
|
132
139
|
}
|
|
133
|
-
// Someone else
|
|
140
|
+
// Someone else (possibly for another owner of this connection) is
|
|
141
|
+
// refreshing, or just did: wait for their result.
|
|
134
142
|
await sleep(wait);
|
|
135
143
|
wait = Math.min(wait * 2, 1_000);
|
|
136
|
-
|
|
144
|
+
connection = await reread();
|
|
137
145
|
}
|
|
138
146
|
}
|
|
139
147
|
//# sourceMappingURL=refresh.js.map
|
package/dist/refresh.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAI7C,+DAA+D;AAC/D,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AACrC,sFAAsF;AACtF,MAAM,aAAa,GAAG,KAAK,CAAC;AAK5B,qFAAqF;AACrF,MAAM,UAAU,WAAW,CACzB,MAAqB,EACrB,GAAS;IAET,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;IACrC,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IAC3D,OAAO;QACL,eAAe,EACb,SAAS,KAAK,SAAS;YACrB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,GAAG,IAAI,CAAC;QAChD,gBAAgB,EACd,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,GAAG,CAAC;YACvD,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAAC;YACnD,CAAC,CAAC,IAAI;KACX,CAAC;AACJ,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"refresh.js","sourceRoot":"","sources":["../src/refresh.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAIV,UAAU,EAGX,MAAM,YAAY,CAAC;AASpB;;;GAGG;AACH,wBAAgB,WAAW,IAAI,UAAU,CA0JxC"}
|
package/dist/store/memory.js
CHANGED
|
@@ -4,42 +4,86 @@ import { randomUUID } from "node:crypto";
|
|
|
4
4
|
* lives in this process only.
|
|
5
5
|
*/
|
|
6
6
|
export function memoryStore() {
|
|
7
|
-
const
|
|
7
|
+
const connections = new Map();
|
|
8
|
+
const grants = new Map();
|
|
8
9
|
const lockTokens = new Map();
|
|
9
10
|
const copy = (row) => ({ ...row });
|
|
11
|
+
const joined = (grant) => ({
|
|
12
|
+
id: grant.id,
|
|
13
|
+
ownerId: grant.ownerId,
|
|
14
|
+
createdAt: grant.createdAt,
|
|
15
|
+
connection: copy(connections.get(grant.connectionId)),
|
|
16
|
+
});
|
|
17
|
+
const held = (id, lockToken) => {
|
|
18
|
+
const row = connections.get(id);
|
|
19
|
+
if (!row || lockTokens.get(id) !== lockToken)
|
|
20
|
+
return null;
|
|
21
|
+
lockTokens.delete(id);
|
|
22
|
+
row.refreshLockedUntil = null;
|
|
23
|
+
return row;
|
|
24
|
+
};
|
|
10
25
|
return {
|
|
11
26
|
async upsertGrant(input) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
const
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
const { ownerId, now, ...fields } = input;
|
|
28
|
+
const existing = [...connections.values()].find((c) => c.companyId === input.companyId && c.userId === input.userId);
|
|
29
|
+
// An older authorization than the stored one only links the grant
|
|
30
|
+
// (see GrantUpsert).
|
|
31
|
+
const connection = existing && input.authorizedAt < existing.authorizedAt
|
|
32
|
+
? existing
|
|
33
|
+
: {
|
|
34
|
+
id: existing?.id ?? randomUUID(),
|
|
35
|
+
...fields,
|
|
36
|
+
status: "active",
|
|
37
|
+
refreshLockedUntil: null,
|
|
38
|
+
lastRefreshedAt: now,
|
|
39
|
+
createdAt: existing?.createdAt ?? now,
|
|
40
|
+
updatedAt: now,
|
|
41
|
+
};
|
|
42
|
+
if (connection !== existing) {
|
|
43
|
+
connections.set(connection.id, connection);
|
|
44
|
+
lockTokens.delete(connection.id);
|
|
45
|
+
}
|
|
46
|
+
let grant = [...grants.values()].find((g) => g.ownerId === ownerId && g.connectionId === connection.id);
|
|
47
|
+
if (!grant) {
|
|
48
|
+
grant = {
|
|
49
|
+
id: randomUUID(),
|
|
50
|
+
ownerId,
|
|
51
|
+
connectionId: connection.id,
|
|
52
|
+
createdAt: now,
|
|
53
|
+
};
|
|
54
|
+
grants.set(grant.id, grant);
|
|
55
|
+
}
|
|
56
|
+
return joined(grant);
|
|
28
57
|
},
|
|
29
58
|
async findGrants({ ownerId, companyId, grantId }) {
|
|
30
|
-
return [...
|
|
31
|
-
.filter((
|
|
32
|
-
(companyId === undefined ||
|
|
33
|
-
|
|
59
|
+
return [...grants.values()]
|
|
60
|
+
.filter((g) => g.ownerId === ownerId &&
|
|
61
|
+
(companyId === undefined ||
|
|
62
|
+
connections.get(g.connectionId).companyId === companyId) &&
|
|
63
|
+
(grantId === undefined || g.id === grantId))
|
|
34
64
|
.sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime())
|
|
35
|
-
.map(
|
|
65
|
+
.map(joined);
|
|
36
66
|
},
|
|
37
|
-
async
|
|
38
|
-
|
|
67
|
+
async deleteGrant(id) {
|
|
68
|
+
grants.delete(id);
|
|
69
|
+
},
|
|
70
|
+
async getConnection(id) {
|
|
71
|
+
const row = connections.get(id);
|
|
39
72
|
return row ? copy(row) : null;
|
|
40
73
|
},
|
|
74
|
+
async deleteUnusedConnection(id) {
|
|
75
|
+
const row = connections.get(id);
|
|
76
|
+
if (!row || [...grants.values()].some((g) => g.connectionId === id))
|
|
77
|
+
return null;
|
|
78
|
+
connections.delete(id);
|
|
79
|
+
lockTokens.delete(id);
|
|
80
|
+
return {
|
|
81
|
+
connection: copy(row),
|
|
82
|
+
userHasOtherConnections: [...connections.values()].some((c) => c.userId === row.userId),
|
|
83
|
+
};
|
|
84
|
+
},
|
|
41
85
|
async acquireRefreshLock(req) {
|
|
42
|
-
const row =
|
|
86
|
+
const row = connections.get(req.id);
|
|
43
87
|
if (!row || row.status !== "active")
|
|
44
88
|
return null;
|
|
45
89
|
if (row.refreshLockedUntil && row.refreshLockedUntil > req.now)
|
|
@@ -56,10 +100,9 @@ export function memoryStore() {
|
|
|
56
100
|
return copy(row);
|
|
57
101
|
},
|
|
58
102
|
async saveRefreshed(id, lockToken, refresh) {
|
|
59
|
-
const row =
|
|
60
|
-
if (!row
|
|
103
|
+
const row = held(id, lockToken);
|
|
104
|
+
if (!row)
|
|
61
105
|
return null;
|
|
62
|
-
lockTokens.delete(id);
|
|
63
106
|
row.accessToken = refresh.accessToken;
|
|
64
107
|
row.refreshToken = refresh.refreshToken ?? row.refreshToken;
|
|
65
108
|
row.accessExpiresAt = refresh.accessExpiresAt;
|
|
@@ -67,34 +110,27 @@ export function memoryStore() {
|
|
|
67
110
|
row.scope = refresh.scope ?? row.scope;
|
|
68
111
|
row.role = refresh.role ?? row.role;
|
|
69
112
|
row.status = "active";
|
|
70
|
-
row.refreshLockedUntil = null;
|
|
71
113
|
row.lastRefreshedAt = refresh.now;
|
|
72
114
|
row.updatedAt = refresh.now;
|
|
73
115
|
return copy(row);
|
|
74
116
|
},
|
|
75
117
|
async markReauthRequired(id, lockToken, now) {
|
|
76
|
-
const row =
|
|
77
|
-
if (!row
|
|
78
|
-
return;
|
|
79
|
-
lockTokens.delete(id);
|
|
118
|
+
const row = held(id, lockToken);
|
|
119
|
+
if (!row)
|
|
120
|
+
return null;
|
|
80
121
|
row.status = "reauth_required";
|
|
81
|
-
row.refreshLockedUntil = null;
|
|
82
122
|
row.updatedAt = now;
|
|
123
|
+
return copy(row);
|
|
83
124
|
},
|
|
84
125
|
async releaseRefreshLock(id, lockToken) {
|
|
85
|
-
|
|
86
|
-
if (!row || lockTokens.get(id) !== lockToken)
|
|
87
|
-
return;
|
|
88
|
-
lockTokens.delete(id);
|
|
89
|
-
row.refreshLockedUntil = null;
|
|
90
|
-
},
|
|
91
|
-
async deleteGrant(id) {
|
|
92
|
-
rows.delete(id);
|
|
93
|
-
lockTokens.delete(id);
|
|
126
|
+
held(id, lockToken);
|
|
94
127
|
},
|
|
95
|
-
async
|
|
96
|
-
|
|
97
|
-
|
|
128
|
+
async listIdleConnections({ refreshedBefore, limit }) {
|
|
129
|
+
const linked = new Set([...grants.values()].map((g) => g.connectionId));
|
|
130
|
+
return [...connections.values()]
|
|
131
|
+
.filter((c) => c.status === "active" &&
|
|
132
|
+
c.lastRefreshedAt < refreshedBefore &&
|
|
133
|
+
linked.has(c.id))
|
|
98
134
|
.sort((a, b) => a.lastRefreshedAt.getTime() - b.lastRefreshedAt.getTime())
|
|
99
135
|
.slice(0, limit)
|
|
100
136
|
.map(copy);
|
package/dist/store/memory.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/store/memory.ts"],"names":[],"mappings":"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"}
|
package/dist/store/postgres.d.ts
CHANGED
|
@@ -9,9 +9,9 @@ export interface SqlClient {
|
|
|
9
9
|
}>;
|
|
10
10
|
}
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
13
|
-
* `npx @soulcode/bexio-oauth sql`). Every operation is a single
|
|
14
|
-
* so it works through transaction-mode poolers and HTTP drivers.
|
|
12
|
+
* Store on the `bexio_connections` and `bexio_grants` tables (create them
|
|
13
|
+
* with `npx @soulcode/bexio-oauth sql`). Every operation is a single
|
|
14
|
+
* statement, so it works through transaction-mode poolers and HTTP drivers.
|
|
15
15
|
*/
|
|
16
16
|
export declare function postgresStore(sql: SqlClient): GrantStore;
|
|
17
17
|
//# sourceMappingURL=postgres.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/store/postgres.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"postgres.d.ts","sourceRoot":"","sources":["../../src/store/postgres.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAiC,UAAU,EAAE,MAAM,YAAY,CAAC;AAE5E;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;CACvE;AA4HD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,SAAS,GAAG,UAAU,CA0MxD"}
|