@curless/shopify-storefront 0.3.0 → 0.4.0
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/dist/__tests__/privacy-page.test.js +1 -1
- package/dist/__tests__/privacy-page.test.js.map +1 -1
- package/dist/__tests__/token-refresh.test.d.ts +2 -0
- package/dist/__tests__/token-refresh.test.d.ts.map +1 -0
- package/dist/__tests__/token-refresh.test.js +158 -0
- package/dist/__tests__/token-refresh.test.js.map +1 -0
- package/dist/catalog.d.ts +31 -1
- package/dist/catalog.d.ts.map +1 -1
- package/dist/catalog.js +28 -2
- package/dist/catalog.js.map +1 -1
- package/dist/index.js +92 -12
- package/dist/index.js.map +1 -1
- package/dist/legal.d.ts.map +1 -1
- package/dist/legal.js +3 -2
- package/dist/legal.js.map +1 -1
- package/dist/multi-token-store.d.ts +8 -0
- package/dist/multi-token-store.d.ts.map +1 -1
- package/dist/multi-token-store.js +26 -1
- package/dist/multi-token-store.js.map +1 -1
- package/dist/oauth.d.ts +22 -1
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +50 -5
- package/dist/oauth.js.map +1 -1
- package/dist/token-refresh.d.ts +74 -0
- package/dist/token-refresh.d.ts.map +1 -0
- package/dist/token-refresh.js +122 -0
- package/dist/token-refresh.js.map +1 -0
- package/dist/token-store.d.ts +10 -0
- package/dist/token-store.d.ts.map +1 -1
- package/dist/token-store.js.map +1 -1
- package/package.json +1 -1
|
@@ -19,7 +19,7 @@ const CTX = {
|
|
|
19
19
|
operatorContact: 'ops@curless.ai',
|
|
20
20
|
updated: '24 August 2026',
|
|
21
21
|
shopDomain: 'rqxbft-fw.myshopify.com',
|
|
22
|
-
region: '
|
|
22
|
+
region: 'Singapore',
|
|
23
23
|
merchantContact: 'support@moodylenses.com',
|
|
24
24
|
rateGeneral: 60,
|
|
25
25
|
rateLookup: 10,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"privacy-page.test.js","sourceRoot":"","sources":["../../src/__tests__/privacy-page.test.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,8EAA8E;AAC9E,+EAA+E;AAC/E,iFAAiF;AACjF,WAAW;AACX,EAAE;AACF,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAE/E,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAqB,YAAY,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3E,MAAM,GAAG,GAAiB;IACxB,YAAY,EAAE,cAAc;IAC5B,UAAU,EAAE,yBAAyB;IACrC,QAAQ,EAAE,SAAS;IACnB,eAAe,EAAE,gBAAgB;IACjC,OAAO,EAAE,gBAAgB;IACzB,UAAU,EAAE,yBAAyB;IACrC,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"privacy-page.test.js","sourceRoot":"","sources":["../../src/__tests__/privacy-page.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-refresh.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/token-refresh.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { describe, expect, test, vi } from 'vitest';
|
|
2
|
+
import { REFRESH_SKEW_MS, keepAlive, needsRefresh, refreshIfDue } from '../token-refresh.js';
|
|
3
|
+
const NOW = new Date('2026-09-09T12:00:00.000Z');
|
|
4
|
+
const at = (msFromNow) => new Date(NOW.getTime() + msFromNow).toISOString();
|
|
5
|
+
const oauth = {
|
|
6
|
+
shopDomain: 'shop.myshopify.com',
|
|
7
|
+
clientId: 'cid',
|
|
8
|
+
clientSecret: 'csec',
|
|
9
|
+
appUrl: 'https://x.test',
|
|
10
|
+
scopes: 'read_products',
|
|
11
|
+
};
|
|
12
|
+
const token = (over = {}) => ({
|
|
13
|
+
shopDomain: 'shop.myshopify.com',
|
|
14
|
+
accessToken: 'shpat_old',
|
|
15
|
+
scope: 'read_products,read_orders',
|
|
16
|
+
installedAt: NOW.toISOString(),
|
|
17
|
+
...over,
|
|
18
|
+
});
|
|
19
|
+
const okResponse = (body) => ({ ok: true, json: async () => body });
|
|
20
|
+
describe('needsRefresh', () => {
|
|
21
|
+
// ⚠️ THE COMPATIBILITY CASE, and the one that would take moody and elspet
|
|
22
|
+
// offline if it were wrong. Their records were written in August with no
|
|
23
|
+
// `expiresAt` because their tokens do not expire. Absent means NEVER.
|
|
24
|
+
test('a record with no expiresAt is never due — it does not expire', () => {
|
|
25
|
+
expect(needsRefresh(token(), NOW)).toBe(false);
|
|
26
|
+
});
|
|
27
|
+
test('due once inside the skew window, not before', () => {
|
|
28
|
+
expect(needsRefresh(token({ expiresAt: at(REFRESH_SKEW_MS + 60_000) }), NOW)).toBe(false);
|
|
29
|
+
expect(needsRefresh(token({ expiresAt: at(REFRESH_SKEW_MS - 60_000) }), NOW)).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
test('already expired is due', () => {
|
|
32
|
+
expect(needsRefresh(token({ expiresAt: at(-1) }), NOW)).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
// A corrupt timestamp is not a fresh token. One wasted call beats serving a
|
|
35
|
+
// token we cannot reason about until it 401s.
|
|
36
|
+
test('an unparseable expiresAt is due', () => {
|
|
37
|
+
expect(needsRefresh(token({ expiresAt: 'not-a-date' }), NOW)).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
describe('refreshIfDue', () => {
|
|
41
|
+
test('a token that does not expire is left completely alone', async () => {
|
|
42
|
+
const fetchImpl = vi.fn();
|
|
43
|
+
const save = vi.fn();
|
|
44
|
+
const res = await refreshIfDue(token(), oauth, save, { now: NOW, fetchImpl });
|
|
45
|
+
expect(res.refreshed).toBe(false);
|
|
46
|
+
expect(fetchImpl).not.toHaveBeenCalled();
|
|
47
|
+
expect(save).not.toHaveBeenCalled();
|
|
48
|
+
});
|
|
49
|
+
test('a due token is renewed and persisted', async () => {
|
|
50
|
+
const fetchImpl = vi.fn(async () => okResponse({
|
|
51
|
+
access_token: 'shpat_new',
|
|
52
|
+
refresh_token: 'shprt_new',
|
|
53
|
+
expires_in: 3600,
|
|
54
|
+
scope: 'read_products,read_orders',
|
|
55
|
+
}));
|
|
56
|
+
const saved = [];
|
|
57
|
+
const res = await refreshIfDue(token({ expiresAt: at(-1), refreshToken: 'shprt_old' }), oauth, async (t) => {
|
|
58
|
+
saved.push(t);
|
|
59
|
+
}, { now: NOW, fetchImpl });
|
|
60
|
+
expect(res.refreshed).toBe(true);
|
|
61
|
+
expect(res.token.accessToken).toBe('shpat_new');
|
|
62
|
+
// ⚠️ THE NEW REFRESH TOKEN IS STORED. Shopify keeps the old one alive only
|
|
63
|
+
// until the replacement is first used; keeping the old one means the NEXT
|
|
64
|
+
// refresh is the one that fails — an hour later, far from this code.
|
|
65
|
+
expect(saved[0]?.refreshToken).toBe('shprt_new');
|
|
66
|
+
expect(saved[0]?.expiresAt).toBe(at(3600_000));
|
|
67
|
+
});
|
|
68
|
+
// A refresh answer legitimately omits `scope` — it renews a token, it does
|
|
69
|
+
// not re-grant permissions. Overwriting with '' would make the install read
|
|
70
|
+
// as unscoped.
|
|
71
|
+
test('an answer with no scope keeps the granted scope', async () => {
|
|
72
|
+
const fetchImpl = vi.fn(async () => okResponse({ access_token: 'shpat_new', refresh_token: 'shprt_new', expires_in: 3600 }));
|
|
73
|
+
const res = await refreshIfDue(token({ expiresAt: at(-1), refreshToken: 'shprt_old' }), oauth, async () => { }, { now: NOW, fetchImpl });
|
|
74
|
+
expect(res.token.scope).toBe('read_products,read_orders');
|
|
75
|
+
});
|
|
76
|
+
// ⚠️ A FAILED REFRESH IS NOT AN OUTAGE. Shopify being down for a minute must
|
|
77
|
+
// not throw out a token that is still valid for another five; the 401 path
|
|
78
|
+
// handles one that really is dead.
|
|
79
|
+
test('a failed refresh keeps serving the old token and reports the error', async () => {
|
|
80
|
+
const fetchImpl = vi.fn(async () => ({ ok: false, status: 503 }));
|
|
81
|
+
const onError = vi.fn();
|
|
82
|
+
const res = await refreshIfDue(token({ expiresAt: at(60_000), refreshToken: 'shprt_old' }), oauth, async () => {
|
|
83
|
+
throw new Error('must not save');
|
|
84
|
+
}, { now: NOW, fetchImpl, onError });
|
|
85
|
+
expect(res.refreshed).toBe(false);
|
|
86
|
+
expect(res.token.accessToken).toBe('shpat_old');
|
|
87
|
+
expect(onError).toHaveBeenCalled();
|
|
88
|
+
});
|
|
89
|
+
test('due but with no refresh token says so instead of looping', async () => {
|
|
90
|
+
const onError = vi.fn();
|
|
91
|
+
const res = await refreshIfDue(token({ expiresAt: at(-1) }), oauth, async () => { }, {
|
|
92
|
+
now: NOW,
|
|
93
|
+
onError,
|
|
94
|
+
});
|
|
95
|
+
expect(res).toMatchObject({ refreshed: false, reason: 'no-refresh-token' });
|
|
96
|
+
expect(onError).toHaveBeenCalled();
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('keepAlive', () => {
|
|
100
|
+
// ⚠️ THE WHOLE POINT: a shop nobody touches. Its access token died 3 days ago
|
|
101
|
+
// and no request has asked for a new one, so only this sweep stands between
|
|
102
|
+
// the install and a refresh token that lapses at 90 days.
|
|
103
|
+
test('renews an install that expired days ago and nobody has used', async () => {
|
|
104
|
+
const fetchImpl = vi.fn(async () => okResponse({ access_token: 'shpat_new', refresh_token: 'shprt_new', expires_in: 3600 }));
|
|
105
|
+
const saved = [];
|
|
106
|
+
const n = await keepAlive(async () => [
|
|
107
|
+
token({
|
|
108
|
+
shopDomain: 'quiet.myshopify.com',
|
|
109
|
+
expiresAt: at(-3 * 24 * 3600_000),
|
|
110
|
+
refreshToken: 'shprt_old',
|
|
111
|
+
}),
|
|
112
|
+
], oauth, async (t) => {
|
|
113
|
+
saved.push(t);
|
|
114
|
+
}, { now: NOW, fetchImpl });
|
|
115
|
+
expect(n).toBe(1);
|
|
116
|
+
expect(saved[0]?.refreshToken).toBe('shprt_new');
|
|
117
|
+
});
|
|
118
|
+
// Even one still comfortably inside its hour: the sweep exists to roll the
|
|
119
|
+
// 90-day window, not to wait until the token is nearly dead.
|
|
120
|
+
test('renews a token that is still valid — the window it rolls is the 90-day one', async () => {
|
|
121
|
+
const fetchImpl = vi.fn(async () => okResponse({ access_token: 'shpat_new', refresh_token: 'shprt_new', expires_in: 3600 }));
|
|
122
|
+
const n = await keepAlive(async () => [token({ expiresAt: at(50 * 60_000), refreshToken: 'shprt_old' })], oauth, async () => { }, { now: NOW, fetchImpl });
|
|
123
|
+
expect(n).toBe(1);
|
|
124
|
+
});
|
|
125
|
+
// ⚠️ moody and elspet. Non-expiring installs must not be woken up daily to
|
|
126
|
+
// chase a refresh token they do not have.
|
|
127
|
+
// ⚠️ THE FIXTURE CARRIES A REFRESH TOKEN ON PURPOSE. Without one this test
|
|
128
|
+
// passes for the wrong reason — the sweep skips it as "nothing to renew with"
|
|
129
|
+
// rather than as "this one does not expire" — and a mutation that made a
|
|
130
|
+
// missing `expiresAt` mean DUE went green here. Found by running exactly that
|
|
131
|
+
// mutation. With the refresh token present, the expiry rule is the only thing
|
|
132
|
+
// left holding it back.
|
|
133
|
+
test('never touches a non-expiring install, even one that could be refreshed', async () => {
|
|
134
|
+
const fetchImpl = vi.fn();
|
|
135
|
+
const n = await keepAlive(async () => [token({ refreshToken: 'shprt_usable' })], oauth, async () => { }, {
|
|
136
|
+
now: NOW,
|
|
137
|
+
fetchImpl,
|
|
138
|
+
});
|
|
139
|
+
expect(n).toBe(0);
|
|
140
|
+
expect(fetchImpl).not.toHaveBeenCalled();
|
|
141
|
+
});
|
|
142
|
+
// One bad install must not stop the sweep reaching the rest.
|
|
143
|
+
test('a failing shop does not stop the others', async () => {
|
|
144
|
+
let call = 0;
|
|
145
|
+
const fetchImpl = vi.fn(async () => {
|
|
146
|
+
call += 1;
|
|
147
|
+
return call === 1
|
|
148
|
+
? { ok: false, status: 500 }
|
|
149
|
+
: okResponse({ access_token: 'shpat_new', refresh_token: 'shprt_new', expires_in: 3600 });
|
|
150
|
+
});
|
|
151
|
+
const n = await keepAlive(async () => [
|
|
152
|
+
token({ shopDomain: 'bad.myshopify.com', expiresAt: at(-1), refreshToken: 'r1' }),
|
|
153
|
+
token({ shopDomain: 'good.myshopify.com', expiresAt: at(-1), refreshToken: 'r2' }),
|
|
154
|
+
], oauth, async () => { }, { now: NOW, fetchImpl, onError: () => { } });
|
|
155
|
+
expect(n).toBe(1);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
//# sourceMappingURL=token-refresh.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-refresh.test.js","sourceRoot":"","sources":["../../src/__tests__/token-refresh.test.ts"],"names":[],"mappings":"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"}
|
package/dist/catalog.d.ts
CHANGED
|
@@ -23,11 +23,41 @@ export type CatalogSnapshot = {
|
|
|
23
23
|
export declare class Catalog {
|
|
24
24
|
private readonly resolveConfig;
|
|
25
25
|
private readonly log;
|
|
26
|
+
/**
|
|
27
|
+
* Last resort for a token that died before we expected it to.
|
|
28
|
+
*
|
|
29
|
+
* ⚠️ The resolver already renews a token that is NEARLY expired, so nothing
|
|
30
|
+
* here fires on the ordinary hourly rollover. What is left is the case the
|
|
31
|
+
* clock cannot predict: Shopify rotated the token and we never persisted
|
|
32
|
+
* the answer, or our clock is wrong. Shopify keeps the previous refresh
|
|
33
|
+
* token working until its replacement is first used precisely so this
|
|
34
|
+
* recovers instead of needing the merchant to reinstall.
|
|
35
|
+
*
|
|
36
|
+
* ONE retry. A 401 that survives a forced refresh means the app was
|
|
37
|
+
* uninstalled or the credential revoked, and retrying that is a loop
|
|
38
|
+
* against someone who has told us to stop.
|
|
39
|
+
*/
|
|
40
|
+
private readonly onUnauthorized?;
|
|
26
41
|
private snapshot;
|
|
27
42
|
private inFlight;
|
|
28
43
|
private variants;
|
|
29
44
|
private upstream;
|
|
30
|
-
constructor(resolveConfig: () => Promise<ShopifyConfig | null>, log?: (msg: string) => void
|
|
45
|
+
constructor(resolveConfig: () => Promise<ShopifyConfig | null>, log?: (msg: string) => void,
|
|
46
|
+
/**
|
|
47
|
+
* Last resort for a token that died before we expected it to.
|
|
48
|
+
*
|
|
49
|
+
* ⚠️ The resolver already renews a token that is NEARLY expired, so nothing
|
|
50
|
+
* here fires on the ordinary hourly rollover. What is left is the case the
|
|
51
|
+
* clock cannot predict: Shopify rotated the token and we never persisted
|
|
52
|
+
* the answer, or our clock is wrong. Shopify keeps the previous refresh
|
|
53
|
+
* token working until its replacement is first used precisely so this
|
|
54
|
+
* recovers instead of needing the merchant to reinstall.
|
|
55
|
+
*
|
|
56
|
+
* ONE retry. A 401 that survives a forced refresh means the app was
|
|
57
|
+
* uninstalled or the credential revoked, and retrying that is a loop
|
|
58
|
+
* against someone who has told us to stop.
|
|
59
|
+
*/
|
|
60
|
+
onUnauthorized?: (() => Promise<void>) | undefined);
|
|
31
61
|
get current(): CatalogSnapshot;
|
|
32
62
|
/** Products, newest snapshot. Empty only before the first successful load. */
|
|
33
63
|
list(): ShopifyProduct[];
|
package/dist/catalog.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EAKpB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AA2BF,qBAAa,OAAO;IAchB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG;
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AASA,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,cAAc,EAKpB,MAAM,0BAA0B,CAAC;AAGlC,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,uEAAuE;IACvE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IACtB,iFAAiF;IACjF,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,CAAC;AA2BF,qBAAa,OAAO;IAchB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;IA7BlC,OAAO,CAAC,QAAQ,CAAoE;IACpF,OAAO,CAAC,QAAQ,CAA8B;IAG9C,OAAO,CAAC,QAAQ,CAA6D;IAE7E,OAAO,CAAC,QAAQ,CAAoD;gBAOjD,aAAa,EAAE,MAAM,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,EAClD,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAA2C;IAClF;;;;;;;;;;;;;OAaG;IACc,cAAc,CAAC,GAAE,MAAM,OAAO,CAAC,IAAI,CAAC,aAAA;IAGvD,IAAI,OAAO,IAAI,eAAe,CAE7B;IAED,8EAA8E;IAC9E,IAAI,IAAI,cAAc,EAAE;IAIxB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAYhD,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4E9B,6EAA6E;IACvE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,GAAE,MAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAyBtF,OAAO,CAAC,KAAK,CAA+C;IAE5D,wFAAwF;IACxF,KAAK,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAQ/B;;;;;;;OAOG;IACH,IAAI,IAAI,IAAI;CAIb"}
|
package/dist/catalog.js
CHANGED
|
@@ -35,6 +35,7 @@ const VARIANT_FETCHES_PER_MIN = 90;
|
|
|
35
35
|
export class Catalog {
|
|
36
36
|
resolveConfig;
|
|
37
37
|
log;
|
|
38
|
+
onUnauthorized;
|
|
38
39
|
snapshot = { products: [], loadedAt: null, discounts: [] };
|
|
39
40
|
inFlight = null;
|
|
40
41
|
// Per INSTANCE, not per module: a module-level cache outlives whatever created
|
|
@@ -46,9 +47,25 @@ export class Catalog {
|
|
|
46
47
|
// arrives when the merchant installs the app, which may be long after this
|
|
47
48
|
// process started. Null means "not connected yet" — a state to report, not to
|
|
48
49
|
// crash on.
|
|
49
|
-
constructor(resolveConfig, log = (m) => console.log(`[catalog] ${m}`)
|
|
50
|
+
constructor(resolveConfig, log = (m) => console.log(`[catalog] ${m}`),
|
|
51
|
+
/**
|
|
52
|
+
* Last resort for a token that died before we expected it to.
|
|
53
|
+
*
|
|
54
|
+
* ⚠️ The resolver already renews a token that is NEARLY expired, so nothing
|
|
55
|
+
* here fires on the ordinary hourly rollover. What is left is the case the
|
|
56
|
+
* clock cannot predict: Shopify rotated the token and we never persisted
|
|
57
|
+
* the answer, or our clock is wrong. Shopify keeps the previous refresh
|
|
58
|
+
* token working until its replacement is first used precisely so this
|
|
59
|
+
* recovers instead of needing the merchant to reinstall.
|
|
60
|
+
*
|
|
61
|
+
* ONE retry. A 401 that survives a forced refresh means the app was
|
|
62
|
+
* uninstalled or the credential revoked, and retrying that is a loop
|
|
63
|
+
* against someone who has told us to stop.
|
|
64
|
+
*/
|
|
65
|
+
onUnauthorized) {
|
|
50
66
|
this.resolveConfig = resolveConfig;
|
|
51
67
|
this.log = log;
|
|
68
|
+
this.onUnauthorized = onUnauthorized;
|
|
52
69
|
}
|
|
53
70
|
get current() {
|
|
54
71
|
return this.snapshot;
|
|
@@ -79,7 +96,16 @@ export class Catalog {
|
|
|
79
96
|
};
|
|
80
97
|
return;
|
|
81
98
|
}
|
|
82
|
-
const products = await fetchShopifyProducts(config, fetch, (m) => this.log(m))
|
|
99
|
+
const products = await fetchShopifyProducts(config, fetch, (m) => this.log(m)).catch(async (err) => {
|
|
100
|
+
if (!this.onUnauthorized || !/HTTP 401/.test(String(err)))
|
|
101
|
+
throw err;
|
|
102
|
+
this.log('admin API answered 401 — forcing a token refresh and retrying once');
|
|
103
|
+
await this.onUnauthorized();
|
|
104
|
+
const fresh = await this.resolveConfig();
|
|
105
|
+
if (!fresh)
|
|
106
|
+
throw err;
|
|
107
|
+
return fetchShopifyProducts(fresh, fetch, (m) => this.log(m));
|
|
108
|
+
});
|
|
83
109
|
if (products.length === 0) {
|
|
84
110
|
// Shopify answered, with nothing. Could be a real empty store, could
|
|
85
111
|
// be a scope we lost — either way, do not replace a shelf that has
|
package/dist/catalog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,EAAE;AACF,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,6EAA6E;AAC7E,6EAA6E;AAC7E,sCAAsC;AACtC,OAAO,EAKL,eAAe,EACf,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAwB9C,2EAA2E;AAC3E,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,qBAAqB;AACrB,MAAM,cAAc,GAAG,CAAC,GAAG,MAAM,CAAC;AAClC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAE7B,iFAAiF;AACjF,yBAAyB;AACzB,EAAE;AACF,gFAAgF;AAChF,iFAAiF;AACjF,gFAAgF;AAChF,+EAA+E;AAC/E,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,6BAA6B;AAC7B,EAAE;AACF,iFAAiF;AACjF,iFAAiF;AACjF,uDAAuD;AACvD,MAAM,uBAAuB,GAAG,EAAE,CAAC;AAEnC,MAAM,OAAO,OAAO;IAcC;IACA;
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -60,6 +60,7 @@ import { MultiTokenStore, isStorableShop } from './multi-token-store.js';
|
|
|
60
60
|
import { exchangeCode, installUrl, isShopDomain, makeState, verifyCallbackHmac, verifyState, } from './oauth.js';
|
|
61
61
|
import { RateLimiter, clientIp } from './rate-limit.js';
|
|
62
62
|
import { explainNoTenant, multiShopResolver, singleShopResolver } from './tenant.js';
|
|
63
|
+
import { KEEPALIVE_INTERVAL_MS, keepAlive, refreshIfDue } from './token-refresh.js';
|
|
63
64
|
import { TokenStore } from './token-store.js';
|
|
64
65
|
import { buildOutputSchemas, buildTools, callTool } from './tools.js';
|
|
65
66
|
import { handleWebhook, verifyWebhookHmac } from './webhooks.js';
|
|
@@ -145,6 +146,12 @@ const oauth = {
|
|
|
145
146
|
shopDomain: SHOP_DOMAIN,
|
|
146
147
|
appUrl: APP_URL,
|
|
147
148
|
scopes: SCOPES,
|
|
149
|
+
// Only the listed public app. Shopify mandates expiring offline tokens for
|
|
150
|
+
// public apps created on or after 2026-04-01 and for every public app by
|
|
151
|
+
// 2027-01-01, and exempts custom apps — moody and elspet hold non-expiring
|
|
152
|
+
// tokens from August that still work, and asking for expiring ones would
|
|
153
|
+
// trade zero maintenance for an hourly refresh they gain nothing from.
|
|
154
|
+
expiring: STORE.config.shopify.mode === 'oauth-install',
|
|
148
155
|
};
|
|
149
156
|
const tokens = new TokenStore(TOKEN_PATH);
|
|
150
157
|
// Two buckets. The wide one keeps anyone from spending the merchant's Shopify
|
|
@@ -189,14 +196,36 @@ const lookupLimit = new RateLimiter(LOOKUP_RATE_PER_MIN, 60_000);
|
|
|
189
196
|
// arrives when the merchant installs — which may be days after this process
|
|
190
197
|
// started. Until then every tool answers "not connected yet" instead of the
|
|
191
198
|
// service being dead or, worse, looking like an empty store.
|
|
199
|
+
//
|
|
200
|
+
// ⚠️ AND IT IS ALSO WHERE THE TOKEN IS KEPT ALIVE. Every Shopify call in this
|
|
201
|
+
// service goes through a resolver like this one, which makes it the single
|
|
202
|
+
// place that can promise "the token you are about to use is valid". Renewing
|
|
203
|
+
// here beats renewing after a 401: nothing fails first. `refreshIfDue` is a
|
|
204
|
+
// no-op for a token with no `expiresAt`, so the branded deployments never touch
|
|
205
|
+
// the network for this.
|
|
192
206
|
const shopifyConfig = async () => {
|
|
193
207
|
const envToken = process.env.STOREFRONT_SHOPIFY_ADMIN_TOKEN;
|
|
194
208
|
if (envToken)
|
|
195
209
|
return { shopDomain: SHOP_DOMAIN, adminToken: envToken };
|
|
196
210
|
const stored = await tokens.get();
|
|
197
|
-
|
|
211
|
+
if (!stored)
|
|
212
|
+
return null;
|
|
213
|
+
const { token } = await refreshIfDue(stored, oauth, (t) => tokens.set(t), {
|
|
214
|
+
onError: (err) => console.error(`[token] refresh failed for ${SHOP_DOMAIN}: ${err}`),
|
|
215
|
+
});
|
|
216
|
+
return { shopDomain: SHOP_DOMAIN, adminToken: token.accessToken };
|
|
217
|
+
};
|
|
218
|
+
// Forcing a renewal when the Admin API says 401 despite a token we believed
|
|
219
|
+
// was fresh. Expiring the record is enough: the resolver renews anything past
|
|
220
|
+
// its deadline, and this is the one place that can say "whatever the clock
|
|
221
|
+
// thinks, this token is dead".
|
|
222
|
+
const forceRefresh = async () => {
|
|
223
|
+
const stored = await tokens.get();
|
|
224
|
+
if (!stored?.refreshToken)
|
|
225
|
+
return;
|
|
226
|
+
await refreshIfDue({ ...stored, expiresAt: new Date(0).toISOString() }, oauth, (t) => tokens.set(t));
|
|
198
227
|
};
|
|
199
|
-
const catalog = new Catalog(shopifyConfig);
|
|
228
|
+
const catalog = new Catalog(shopifyConfig, (m) => console.log(`[catalog] ${m}`), forceRefresh);
|
|
200
229
|
// ── Multi-tenant, for the listed app ────────────────────────────────────────
|
|
201
230
|
//
|
|
202
231
|
// Built in BOTH modes, and deliberately so. If these only existed under
|
|
@@ -207,7 +236,15 @@ const catalog = new Catalog(shopifyConfig);
|
|
|
207
236
|
const multiTokens = new MultiTokenStore(`${dirname(TOKEN_PATH)}/shops`);
|
|
208
237
|
const registry = new CatalogRegistry(async (shop) => {
|
|
209
238
|
const stored = await multiTokens.get(shop);
|
|
210
|
-
|
|
239
|
+
if (!stored)
|
|
240
|
+
return null;
|
|
241
|
+
// The listed app is the one that HAS expiring tokens, so this is the
|
|
242
|
+
// resolver that actually does work — one refresh per shop, at most once
|
|
243
|
+
// every 55 minutes, and only for shops someone is using.
|
|
244
|
+
const { token } = await refreshIfDue(stored, oauth, (t) => multiTokens.set(t), {
|
|
245
|
+
onError: (err) => console.error(`[token] refresh failed for ${shop}: ${err}`),
|
|
246
|
+
});
|
|
247
|
+
return { shopDomain: shop, adminToken: token.accessToken };
|
|
211
248
|
}, { refreshMs: REFRESH_MS });
|
|
212
249
|
// The merchant's artwork, read once at boot from beside their config.
|
|
213
250
|
//
|
|
@@ -302,7 +339,10 @@ const LEGAL = {
|
|
|
302
339
|
merchantContact: STORE.config.legal.merchantContact ?? '',
|
|
303
340
|
updated: STORE.config.legal.updated ?? '',
|
|
304
341
|
shopDomain: SHOP_DOMAIN,
|
|
305
|
-
|
|
342
|
+
// A COUNTRY, not a cloud region code — `ap-southeast-1` is an ops note, and
|
|
343
|
+
// every policy we compared against is country-level. Same fix as the gateway's
|
|
344
|
+
// page; see the ⚠️ on LegalInfo.region in apps/api/src/routes/legal/pages.ts.
|
|
345
|
+
region: STORE.config.legal.region ?? 'Singapore',
|
|
306
346
|
// Quoted from the limiters themselves, so the page cannot claim a number the
|
|
307
347
|
// code stopped enforcing.
|
|
308
348
|
rateGeneral: MCP_RATE_PER_MIN,
|
|
@@ -329,13 +369,21 @@ const storefrontUrl = () => {
|
|
|
329
369
|
}
|
|
330
370
|
};
|
|
331
371
|
app.get('/docs', (c) => c.html(docsPage({ ...LEGAL, storefront: storefrontUrl() })));
|
|
332
|
-
//
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
//
|
|
336
|
-
//
|
|
337
|
-
//
|
|
338
|
-
// connector returns, and that omission is
|
|
372
|
+
// ⚠️ THESE TWO DO DIFFERENT THINGS, and the difference is deliberate.
|
|
373
|
+
//
|
|
374
|
+
// `/terms` redirects: the sale is the merchant's, their terms of service govern
|
|
375
|
+
// it, and a second set from us would be a second answer to one question.
|
|
376
|
+
//
|
|
377
|
+
// `/privacy` does NOT redirect, and used to — a Shopify store policy cannot
|
|
378
|
+
// disclose what an MCP connector returns field by field, and that omission is
|
|
379
|
+
// exactly what an app directory rejects. So we serve our own, scoped page which
|
|
380
|
+
// says in its first line that it is not the merchant's policy and links to it.
|
|
381
|
+
//
|
|
382
|
+
// ⚠️ What is FILED with a directory is a third, separate decision, and for Moody
|
|
383
|
+
// it is the merchant's own URL — so nothing above puts this page in front of a
|
|
384
|
+
// reviewer. If a directory ever asks Moody the field-disclosure question that
|
|
385
|
+
// Curless was rejected over three times, the answer has to be pointed at this
|
|
386
|
+
// page; a store policy cannot answer it. See docs/moody-connector-listing.md.
|
|
339
387
|
app.get('/privacy', (c) => c.html(privacyPage({ ...LEGAL, storefront: storefrontUrl() })));
|
|
340
388
|
app.get('/terms', (c) => c.redirect(`${storefrontUrl()}/policies/terms-of-service`, 301));
|
|
341
389
|
// Product images, re-served from OUR origin.
|
|
@@ -628,7 +676,7 @@ app.get('/auth/callback', async (c) => {
|
|
|
628
676
|
if (!code)
|
|
629
677
|
return c.text('missing code', 400);
|
|
630
678
|
try {
|
|
631
|
-
const { accessToken, scope } = await exchangeCode(oauth, code);
|
|
679
|
+
const { accessToken, scope, refreshToken, expiresAt } = await exchangeCode(oauth, code);
|
|
632
680
|
// Per-shop in the listed app, single-file in a branded one. The record is
|
|
633
681
|
// the same; where it lands is the whole difference between serving one
|
|
634
682
|
// merchant and serving many.
|
|
@@ -637,6 +685,11 @@ app.get('/auth/callback', async (c) => {
|
|
|
637
685
|
accessToken,
|
|
638
686
|
scope,
|
|
639
687
|
installedAt: new Date().toISOString(),
|
|
688
|
+
// Both or neither — a non-expiring token answers with neither, and an
|
|
689
|
+
// invented deadline would send the refresher chasing a token that has no
|
|
690
|
+
// renewal path.
|
|
691
|
+
...(refreshToken ? { refreshToken } : {}),
|
|
692
|
+
...(expiresAt ? { expiresAt } : {}),
|
|
640
693
|
};
|
|
641
694
|
if (MULTI)
|
|
642
695
|
await multiTokens.set(record);
|
|
@@ -979,6 +1032,33 @@ app.on('POST', MCP_PATHS, async (c) => {
|
|
|
979
1032
|
// which reads as "wrong URL" while debugging a connector.
|
|
980
1033
|
app.get('/mcp', (c) => c.json({ name: STORE.config.server.name, transport: 'streamable-http' }));
|
|
981
1034
|
catalog.start(REFRESH_MS);
|
|
1035
|
+
// ⚠️ ONLY WHERE TOKENS EXPIRE, and paced to the 90-DAY refresh window rather
|
|
1036
|
+
// than the one-hour access-token one — the resolver already renews at the point
|
|
1037
|
+
// of use, so a shop with any traffic never needs this. What it buys is the
|
|
1038
|
+
// quiet shop: nobody calls it, nothing renews its token, and 90 days later its
|
|
1039
|
+
// refresh token lapses and the merchant has to install the app again. One call
|
|
1040
|
+
// per shop per day rolls that window forward for ever.
|
|
1041
|
+
if (oauth.expiring) {
|
|
1042
|
+
const sweep = async () => {
|
|
1043
|
+
try {
|
|
1044
|
+
const n = MULTI
|
|
1045
|
+
? await keepAlive(() => multiTokens.list(), oauth, (t) => multiTokens.set(t))
|
|
1046
|
+
: await keepAlive(async () => {
|
|
1047
|
+
const t = await tokens.get();
|
|
1048
|
+
return t ? [t] : [];
|
|
1049
|
+
}, oauth, (t) => tokens.set(t));
|
|
1050
|
+
if (n)
|
|
1051
|
+
console.log(`[token] keepalive renewed ${n} install(s)`);
|
|
1052
|
+
}
|
|
1053
|
+
catch (err) {
|
|
1054
|
+
// Never let a sweep take the process down: the tokens it failed to renew
|
|
1055
|
+
// are still valid, and the next sweep gets another turn.
|
|
1056
|
+
console.error(`[token] keepalive sweep failed: ${err}`);
|
|
1057
|
+
}
|
|
1058
|
+
};
|
|
1059
|
+
void sweep();
|
|
1060
|
+
setInterval(sweep, KEEPALIVE_INTERVAL_MS).unref();
|
|
1061
|
+
}
|
|
982
1062
|
serve({ fetch: app.fetch, port: PORT }, (info) => {
|
|
983
1063
|
console.log(`${STORE.config.id}: listening on :${info.port} (shop ${SHOP_DOMAIN}, refresh ${REFRESH_MS}ms)`);
|
|
984
1064
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/legal.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AA2CA,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB;6DACyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;;OAUG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,GAAI,GAAG,YAAY,KAAG,MAkGxC,CAAC;AAkBJ,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAexE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,YAAY,KAAG,
|
|
1
|
+
{"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AA2CA,4EAA4E;AAC5E,MAAM,MAAM,YAAY,GAAG;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB;6DACyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;;;;;OAUG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;;OAOG;IACH,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5E,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,QAAQ,GAAI,GAAG,YAAY,KAAG,MAkGxC,CAAC;AAkBJ,eAAO,MAAM,YAAY,EAAE,aAAa,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,CAexE,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,YAAY,KAAG,MA6D3C,CAAC"}
|
package/dist/legal.js
CHANGED
|
@@ -130,7 +130,7 @@ export const docsPage = (c) => PAGE(`Documentation — ${c.merchantName} shoppin
|
|
|
130
130
|
|
|
131
131
|
<h2>Operations</h2>
|
|
132
132
|
<ul>
|
|
133
|
-
<li>Hosted by ${c.operator} on
|
|
133
|
+
<li>Hosted by ${c.operator} on Amazon Web Services, in ${c.region}.</li>
|
|
134
134
|
<li>TLS by Let's Encrypt, renewed automatically.</li>
|
|
135
135
|
<li>Catalogue refreshed every five minutes; a failed refresh keeps serving the last
|
|
136
136
|
good snapshot rather than presenting an empty store.</li>
|
|
@@ -226,7 +226,8 @@ export const privacyPage = (c) => PAGE(`Privacy — ${c.merchantName} shopping a
|
|
|
226
226
|
<h2>Where it goes</h2>
|
|
227
227
|
<p>Two hosts, both Shopify's: <code>${c.shopDomain}</code> for the catalogue and the single
|
|
228
228
|
order lookup, and <code>cdn.shopify.com</code> for product images. Nothing is sent to any
|
|
229
|
-
other third party.
|
|
229
|
+
other third party. Our servers are in ${c.region}, hosted on Amazon Web
|
|
230
|
+
Services.</p>
|
|
230
231
|
|
|
231
232
|
<h2>Your rights</h2>
|
|
232
233
|
<p>Exercise them with ${c.merchantName} — they hold the order, and this connector holds no
|
package/dist/legal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"legal.js","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,qBAAqB;AACrB,EAAE;AACF,iFAAiF;AACjF,+EAA+E;AAC/E,4EAA4E;AAC5E,0EAA0E;AAC1E,6EAA6E;AAC7E,6EAA6E;AAC7E,2DAA2D;AAC3D,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,gEAAgE;AAChE,EAAE;AACF,iFAAiF;AACjF,6EAA6E;AAC7E,8EAA8E;AAC9E,kCAAkC;AAElC,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,IAAY,EAAU,EAAE,CACnD;;YAEU,KAAK;;;;;;;;;;;;;;;KAeZ,IAAI,EAAE,CAAC;AA4CZ;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAe,EAAU,EAAE,CAClD,IAAI,CACF,mBAAmB,CAAC,CAAC,YAAY,qBAAqB,EACtD,OAAO,CAAC,CAAC,YAAY;oFAC2D,CAAC,CAAC,OAAO;;kDAE3C,CAAC,CAAC,YAAY;;OAEzD,CAAC,CAAC,YAAY,gCAAgC,CAAC,CAAC,QAAQ;;;;;;;;;;;;;;;;;;;;mBAoB5C,CAAC,CAAC,KAAK,CAAC,IAAI;;mBAEZ,CAAC,CAAC,KAAK,CAAC,GAAG;;mBAEX,CAAC,CAAC,KAAK,CAAC,QAAQ;;mBAEhB,CAAC,CAAC,KAAK,CAAC,WAAW;;;;;;;;;;;mBAWnB,CAAC,CAAC,UAAU;;;;;;;;;;;iFAWkD,CAAC,CAAC,WAAW;8CAChD,CAAC,CAAC,UAAU;;;;;;;;;;;;;;;;;;;;;;;;uBAwBnC,CAAC,CAAC,QAAQ,
|
|
1
|
+
{"version":3,"file":"legal.js","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,14 @@ export declare class MultiTokenStore {
|
|
|
13
13
|
* on its own: a cached token would keep answering after the merchant revoked
|
|
14
14
|
* it, so the cache is dropped first and unconditionally.
|
|
15
15
|
*/
|
|
16
|
+
/**
|
|
17
|
+
* Every shop with a stored token.
|
|
18
|
+
*
|
|
19
|
+
* Reads the directory rather than the cache: the cache only holds shops this
|
|
20
|
+
* process has served, and the keepalive sweep exists precisely for the ones
|
|
21
|
+
* nobody has touched.
|
|
22
|
+
*/
|
|
23
|
+
list(): Promise<StoredToken[]>;
|
|
16
24
|
forget(shop: string): Promise<void>;
|
|
17
25
|
}
|
|
18
26
|
//# sourceMappingURL=multi-token-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-token-store.d.ts","sourceRoot":"","sources":["../src/multi-token-store.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAapD,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,OAAwC,CAAC;AAEvF,qBAAa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;gBAE3B,GAAG,EAAE,MAAM;IAExC,OAAO,CAAC,OAAO;IAYT,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqB9C,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5C;;;;;OAKG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU1C"}
|
|
1
|
+
{"version":3,"file":"multi-token-store.d.ts","sourceRoot":"","sources":["../src/multi-token-store.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAapD,eAAO,MAAM,cAAc,GAAI,MAAM,MAAM,KAAG,OAAwC,CAAC;AAEvF,qBAAa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkC;gBAE3B,GAAG,EAAE,MAAM;IAExC,OAAO,CAAC,OAAO;IAYT,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAqB9C,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAY5C;;;;;OAKG;IACH;;;;;;OAMG;IACG,IAAI,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAgB9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU1C"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
// database, and putting real merchants' access tokens in the payment gateway's
|
|
10
10
|
// Postgres would undo the separation that keeps a merchant's credentials out of
|
|
11
11
|
// the gateway's blast radius. One directory, one file per shop, each 0600.
|
|
12
|
-
import { mkdir, readFile, rename, writeFile } from 'node:fs/promises';
|
|
12
|
+
import { mkdir, readFile, readdir, rename, writeFile } from 'node:fs/promises';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
14
|
/**
|
|
15
15
|
* A shop domain arrives as a REQUEST PARAMETER and is about to become a
|
|
@@ -80,6 +80,31 @@ export class MultiTokenStore {
|
|
|
80
80
|
* on its own: a cached token would keep answering after the merchant revoked
|
|
81
81
|
* it, so the cache is dropped first and unconditionally.
|
|
82
82
|
*/
|
|
83
|
+
/**
|
|
84
|
+
* Every shop with a stored token.
|
|
85
|
+
*
|
|
86
|
+
* Reads the directory rather than the cache: the cache only holds shops this
|
|
87
|
+
* process has served, and the keepalive sweep exists precisely for the ones
|
|
88
|
+
* nobody has touched.
|
|
89
|
+
*/
|
|
90
|
+
async list() {
|
|
91
|
+
let names;
|
|
92
|
+
try {
|
|
93
|
+
names = await readdir(this.dir);
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return []; // nothing installed yet — the normal state of a fresh deploy
|
|
97
|
+
}
|
|
98
|
+
const out = [];
|
|
99
|
+
for (const n of names) {
|
|
100
|
+
if (!n.endsWith('.json'))
|
|
101
|
+
continue;
|
|
102
|
+
const t = await this.get(n.slice(0, -'.json'.length));
|
|
103
|
+
if (t)
|
|
104
|
+
out.push(t);
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
83
108
|
async forget(shop) {
|
|
84
109
|
const key = shop.toLowerCase();
|
|
85
110
|
this.cache.delete(key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multi-token-store.js","sourceRoot":"","sources":["../src/multi-token-store.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,0EAA0E;AAC1E,0DAA0D;AAC1D,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,gFAAgF;AAChF,2EAA2E;AAC3E,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"multi-token-store.js","sourceRoot":"","sources":["../src/multi-token-store.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
CHANGED
|
@@ -6,6 +6,14 @@ export type OauthConfig = {
|
|
|
6
6
|
/** Public base, e.g. https://mcp.curless.ai/moody */
|
|
7
7
|
appUrl: string;
|
|
8
8
|
scopes: string;
|
|
9
|
+
/**
|
|
10
|
+
* Ask Shopify for an EXPIRING offline token (1 hour + a 90-day refresh token).
|
|
11
|
+
*
|
|
12
|
+
* Off by default, because the deployments that exist today are custom
|
|
13
|
+
* distributions and exempt. The listed public app turns it on — it has no
|
|
14
|
+
* choice: it was created after 2026-04-01.
|
|
15
|
+
*/
|
|
16
|
+
expiring?: boolean;
|
|
9
17
|
};
|
|
10
18
|
export declare const isShopDomain: (shop: string) => boolean;
|
|
11
19
|
export declare const makeState: (secret: string, now?: number) => string;
|
|
@@ -15,6 +23,19 @@ export declare const installUrl: (config: OauthConfig, state: string) => string;
|
|
|
15
23
|
export type TokenExchange = {
|
|
16
24
|
accessToken: string;
|
|
17
25
|
scope: string;
|
|
26
|
+
/** Present only for an EXPIRING token — the thing that buys the next hour. */
|
|
27
|
+
refreshToken?: string;
|
|
28
|
+
/** ISO instant this access token stops working. Absent = never expires. */
|
|
29
|
+
expiresAt?: string;
|
|
18
30
|
};
|
|
19
|
-
export declare const exchangeCode: (config: OauthConfig, code: string, fetchImpl?: typeof fetch) => Promise<TokenExchange>;
|
|
31
|
+
export declare const exchangeCode: (config: OauthConfig, code: string, fetchImpl?: typeof fetch, now?: Date) => Promise<TokenExchange>;
|
|
32
|
+
/**
|
|
33
|
+
* Buy the next hour with the refresh token — no merchant involved.
|
|
34
|
+
*
|
|
35
|
+
* ⚠️ The response carries a NEW refresh token, and the caller must store it.
|
|
36
|
+
* Shopify keeps the previous one working until the replacement is first used,
|
|
37
|
+
* which is what lets an install survive a refresh whose response we never
|
|
38
|
+
* managed to persist; it is not a licence to keep using the old one.
|
|
39
|
+
*/
|
|
40
|
+
export declare const refreshAccessToken: (config: OauthConfig, refreshToken: string, fetchImpl?: typeof fetch, now?: Date) => Promise<TokenExchange>;
|
|
20
41
|
//# sourceMappingURL=oauth.d.ts.map
|
package/dist/oauth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAqBA,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,gFAAgF;IAChF,UAAU,EAAE,MAAM,CAAC;IACnB,qDAAqD;IACrD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAMF,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,KAAG,OAA6B,CAAC;AAe1E,eAAO,MAAM,SAAS,GAAI,QAAQ,MAAM,EAAE,MAAK,MAAmB,KAAG,MAIpE,CAAC;AAMF,eAAO,MAAM,WAAW,GAAI,QAAQ,MAAM,EAAE,OAAO,MAAM,EAAE,MAAK,MAAmB,KAAG,OASrF,CAAC;AAKF,eAAO,MAAM,kBAAkB,GAAI,QAAQ,MAAM,EAAE,UAAU,MAAM,KAAG,OA0BrE,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,WAAW,EAAE,OAAO,MAAM,KAAG,MAc/D,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,8EAA8E;IAC9E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA0BF,eAAO,MAAM,YAAY,GACvB,QAAQ,WAAW,EACnB,MAAM,MAAM,EACZ,YAAW,OAAO,KAAa,EAC/B,MAAK,IAAiB,KACrB,OAAO,CAAC,aAAa,CA0BvB,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAC7B,QAAQ,WAAW,EACnB,cAAc,MAAM,EACpB,YAAW,OAAO,KAAa,EAC/B,MAAK,IAAiB,KACrB,OAAO,CAAC,aAAa,CAavB,CAAC"}
|
package/dist/oauth.js
CHANGED
|
@@ -99,7 +99,23 @@ export const installUrl = (config, state) => {
|
|
|
99
99
|
// value is neither, and not something the docs define.
|
|
100
100
|
return `https://${config.shopDomain}/admin/oauth/authorize?${qs.toString()}`;
|
|
101
101
|
};
|
|
102
|
-
|
|
102
|
+
const readToken = (body, now) => {
|
|
103
|
+
if (!body.access_token)
|
|
104
|
+
throw new Error('shopify token exchange returned no access_token');
|
|
105
|
+
return {
|
|
106
|
+
accessToken: body.access_token,
|
|
107
|
+
scope: body.scope ?? '',
|
|
108
|
+
// ⚠️ BOTH OR NEITHER. A non-expiring token (custom distribution) answers
|
|
109
|
+
// with neither field, and writing an `expiresAt` we invented would put a
|
|
110
|
+
// deadline on a token that has none — the refresher would then chase a
|
|
111
|
+
// refresh token that does not exist and take a working install offline.
|
|
112
|
+
...(body.refresh_token ? { refreshToken: body.refresh_token } : {}),
|
|
113
|
+
...(typeof body.expires_in === 'number'
|
|
114
|
+
? { expiresAt: new Date(now.getTime() + body.expires_in * 1000).toISOString() }
|
|
115
|
+
: {}),
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
export const exchangeCode = async (config, code, fetchImpl = fetch, now = new Date()) => {
|
|
103
119
|
const res = await fetchImpl(`https://${config.shopDomain}/admin/oauth/access_token`, {
|
|
104
120
|
method: 'POST',
|
|
105
121
|
headers: { 'content-type': 'application/json', accept: 'application/json' },
|
|
@@ -107,6 +123,15 @@ export const exchangeCode = async (config, code, fetchImpl = fetch) => {
|
|
|
107
123
|
client_id: config.clientId,
|
|
108
124
|
client_secret: config.clientSecret,
|
|
109
125
|
code,
|
|
126
|
+
// ⚠️ ASKED FOR, NOT ASSUMED — and only where the deployment says so.
|
|
127
|
+
//
|
|
128
|
+
// Shopify requires expiring offline tokens for PUBLIC apps created on or
|
|
129
|
+
// after 2026-04-01, and for every public app by 2027-01-01. It explicitly
|
|
130
|
+
// does NOT apply to custom apps: moody and elspet hold non-expiring
|
|
131
|
+
// tokens issued in August and still working. Sending `expiring: 1` for
|
|
132
|
+
// them would trade a token that needs no maintenance for one that needs
|
|
133
|
+
// an hourly refresh — a regression bought for nothing.
|
|
134
|
+
...(config.expiring ? { expiring: 1 } : {}),
|
|
110
135
|
}),
|
|
111
136
|
});
|
|
112
137
|
if (!res.ok) {
|
|
@@ -115,9 +140,29 @@ export const exchangeCode = async (config, code, fetchImpl = fetch) => {
|
|
|
115
140
|
// (401) from Shopify being down (5xx).
|
|
116
141
|
throw new Error(`shopify token exchange failed: HTTP ${res.status}`);
|
|
117
142
|
}
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
143
|
+
return readToken((await res.json()), now);
|
|
144
|
+
};
|
|
145
|
+
/**
|
|
146
|
+
* Buy the next hour with the refresh token — no merchant involved.
|
|
147
|
+
*
|
|
148
|
+
* ⚠️ The response carries a NEW refresh token, and the caller must store it.
|
|
149
|
+
* Shopify keeps the previous one working until the replacement is first used,
|
|
150
|
+
* which is what lets an install survive a refresh whose response we never
|
|
151
|
+
* managed to persist; it is not a licence to keep using the old one.
|
|
152
|
+
*/
|
|
153
|
+
export const refreshAccessToken = async (config, refreshToken, fetchImpl = fetch, now = new Date()) => {
|
|
154
|
+
const res = await fetchImpl(`https://${config.shopDomain}/admin/oauth/access_token`, {
|
|
155
|
+
method: 'POST',
|
|
156
|
+
headers: { 'content-type': 'application/json', accept: 'application/json' },
|
|
157
|
+
body: JSON.stringify({
|
|
158
|
+
client_id: config.clientId,
|
|
159
|
+
client_secret: config.clientSecret,
|
|
160
|
+
grant_type: 'refresh_token',
|
|
161
|
+
refresh_token: refreshToken,
|
|
162
|
+
}),
|
|
163
|
+
});
|
|
164
|
+
if (!res.ok)
|
|
165
|
+
throw new Error(`shopify token refresh failed: HTTP ${res.status}`);
|
|
166
|
+
return readToken((await res.json()), now);
|
|
122
167
|
};
|
|
123
168
|
//# sourceMappingURL=oauth.js.map
|
package/dist/oauth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,EAAE;AACF,8EAA8E;AAC9E,4EAA4E;AAC5E,+EAA+E;AAC/E,+EAA+E;AAC/E,qCAAqC;AACrC,EAAE;AACF,8EAA8E;AAC9E,qDAAqD;AACrD,EAAE;AACF,+EAA+E;AAC/E,4EAA4E;AAC5E,uEAAuE;AACvE,8EAA8E;AAC9E,uEAAuE;AACvE,EAAE;AACF,8EAA8E;AAC9E,yEAAyE;AACzE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../src/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { type OauthConfig } from './oauth.js';
|
|
2
|
+
import type { StoredToken } from './token-store.js';
|
|
3
|
+
/**
|
|
4
|
+
* Refresh this far before the token actually dies.
|
|
5
|
+
*
|
|
6
|
+
* Five minutes, not five seconds: a refresh is a network call that can fail and
|
|
7
|
+
* be retried, and a token that expires mid-flight fails a request a shopper is
|
|
8
|
+
* waiting on. It is also comfortably longer than the periodic sweep below, so
|
|
9
|
+
* the sweep always gets a turn before the just-in-time path has to.
|
|
10
|
+
*/
|
|
11
|
+
export declare const REFRESH_SKEW_MS: number;
|
|
12
|
+
/**
|
|
13
|
+
* Does this record need a new access token?
|
|
14
|
+
*
|
|
15
|
+
* ⚠️ NO `expiresAt` MEANS NEVER, NOT UNKNOWN. That is the whole compatibility
|
|
16
|
+
* story with the two installs that predate this file: treating a missing field
|
|
17
|
+
* as "expired" would refresh a token that has no refresh token to refresh it
|
|
18
|
+
* with, fail, and take a working merchant offline.
|
|
19
|
+
*/
|
|
20
|
+
export declare const needsRefresh: (token: Pick<StoredToken, "expiresAt">, now?: Date, skewMs?: number) => boolean;
|
|
21
|
+
/** Where a refreshed record goes. Satisfied by TokenStore and MultiTokenStore alike. */
|
|
22
|
+
export type TokenSink = (token: StoredToken) => Promise<void>;
|
|
23
|
+
export type RefreshResult = {
|
|
24
|
+
refreshed: false;
|
|
25
|
+
token: StoredToken;
|
|
26
|
+
reason: 'not-due' | 'no-refresh-token';
|
|
27
|
+
} | {
|
|
28
|
+
refreshed: true;
|
|
29
|
+
token: StoredToken;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Renew if due, persist, and answer with whatever the caller should now use.
|
|
33
|
+
*
|
|
34
|
+
* ⚠️ NEVER THROWS ON A FAILED REFRESH — it returns the old token instead. A
|
|
35
|
+
* refresh can fail because Shopify is briefly down, and an exception here would
|
|
36
|
+
* turn a recoverable minute into a hard outage for a token that is still valid
|
|
37
|
+
* for another five. The 401 path is what handles a token that really is dead.
|
|
38
|
+
*/
|
|
39
|
+
export declare const refreshIfDue: (token: StoredToken, oauth: OauthConfig, save: TokenSink, opts?: {
|
|
40
|
+
now?: Date;
|
|
41
|
+
skewMs?: number;
|
|
42
|
+
fetchImpl?: typeof fetch;
|
|
43
|
+
onError?: (err: unknown) => void;
|
|
44
|
+
}) => Promise<RefreshResult>;
|
|
45
|
+
/**
|
|
46
|
+
* Keep every install's REFRESH token from ageing out.
|
|
47
|
+
*
|
|
48
|
+
* ⚠️ THIS IS NOT WHAT KEEPS THE ACCESS TOKEN ALIVE — the resolver does that at
|
|
49
|
+
* the point of use, so a shop in traffic never needs this. The one thing the
|
|
50
|
+
* resolver cannot fix is a shop NOBODY TOUCHES: its access token expires in an
|
|
51
|
+
* hour and nothing asks for a new one, and 90 days later the refresh token
|
|
52
|
+
* expires too and the merchant has to install the app again. A shop that quiet
|
|
53
|
+
* is the normal state of a listed app, not an edge case.
|
|
54
|
+
*
|
|
55
|
+
* ⚠️ SO THE INTERVAL IS PACED TO THE 90-DAY WINDOW, NOT THE ONE-HOUR ONE. Each
|
|
56
|
+
* refresh returns a NEW refresh token with a fresh 90 days, so rolling every
|
|
57
|
+
* install forward once a day keeps them all alive indefinitely — at one call
|
|
58
|
+
* per shop per day. Sweeping hourly would be 24x the calls to buy nothing: the
|
|
59
|
+
* hourly problem is already solved where it actually shows up.
|
|
60
|
+
*/
|
|
61
|
+
export declare const KEEPALIVE_INTERVAL_MS: number;
|
|
62
|
+
/**
|
|
63
|
+
* Roll every stored token forward. Returns how many were renewed.
|
|
64
|
+
*
|
|
65
|
+
* Uses a skew wide enough to catch tokens that are merely OLD rather than
|
|
66
|
+
* nearly-dead — the point is to touch each install once a day, not to wait
|
|
67
|
+
* until it is about to break.
|
|
68
|
+
*/
|
|
69
|
+
export declare const keepAlive: (load: () => Promise<StoredToken[]>, oauth: OauthConfig, save: TokenSink, opts?: {
|
|
70
|
+
now?: Date;
|
|
71
|
+
fetchImpl?: typeof fetch;
|
|
72
|
+
onError?: (err: unknown) => void;
|
|
73
|
+
}) => Promise<number>;
|
|
74
|
+
//# sourceMappingURL=token-refresh.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-refresh.d.ts","sourceRoot":"","sources":["../src/token-refresh.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,WAAW,EAAsB,MAAM,YAAY,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,QAAa,CAAC;AAE1C;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EACrC,MAAK,IAAiB,EACtB,SAAQ,MAAwB,KAC/B,OAQF,CAAC;AAEF,wFAAwF;AACxF,MAAM,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE9D,MAAM,MAAM,aAAa,GACrB;IAAE,SAAS,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAC;IAAC,MAAM,EAAE,SAAS,GAAG,kBAAkB,CAAA;CAAE,GAChF;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AAE5C;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GACvB,OAAO,WAAW,EAClB,OAAO,WAAW,EAClB,MAAM,SAAS,EACf,OAAM;IACJ,GAAG,CAAC,EAAE,IAAI,CAAC;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;CAC7B,KACL,OAAO,CAAC,aAAa,CAoCvB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,QAAmB,CAAC;AAEtD;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,GACpB,MAAM,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC,EAClC,OAAO,WAAW,EAClB,MAAM,SAAS,EACf,OAAM;IAAE,GAAG,CAAC,EAAE,IAAI,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,KACpF,OAAO,CAAC,MAAM,CAYhB,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
// Keeping an expiring offline access token alive.
|
|
2
|
+
//
|
|
3
|
+
// ⚠️ WHY THIS EXISTS. Shopify requires expiring offline tokens for public apps
|
|
4
|
+
// created on or after 2026-04-01, and for every public app by 2027-01-01. They
|
|
5
|
+
// last ONE HOUR; the refresh token that renews them lasts 90 days. Custom
|
|
6
|
+
// distributions are exempt — moody and elspet hold non-expiring tokens from
|
|
7
|
+
// August that still work — so everything here is a no-op for them, by shape
|
|
8
|
+
// rather than by flag: a record with no `expiresAt` is never refreshed.
|
|
9
|
+
//
|
|
10
|
+
// The reviewer's first act on a listed app is to install it. Without this, the
|
|
11
|
+
// connector works for an hour and then answers 401 for ever, and the symptom
|
|
12
|
+
// reads as "it worked yesterday".
|
|
13
|
+
import { refreshAccessToken } from './oauth.js';
|
|
14
|
+
/**
|
|
15
|
+
* Refresh this far before the token actually dies.
|
|
16
|
+
*
|
|
17
|
+
* Five minutes, not five seconds: a refresh is a network call that can fail and
|
|
18
|
+
* be retried, and a token that expires mid-flight fails a request a shopper is
|
|
19
|
+
* waiting on. It is also comfortably longer than the periodic sweep below, so
|
|
20
|
+
* the sweep always gets a turn before the just-in-time path has to.
|
|
21
|
+
*/
|
|
22
|
+
export const REFRESH_SKEW_MS = 5 * 60_000;
|
|
23
|
+
/**
|
|
24
|
+
* Does this record need a new access token?
|
|
25
|
+
*
|
|
26
|
+
* ⚠️ NO `expiresAt` MEANS NEVER, NOT UNKNOWN. That is the whole compatibility
|
|
27
|
+
* story with the two installs that predate this file: treating a missing field
|
|
28
|
+
* as "expired" would refresh a token that has no refresh token to refresh it
|
|
29
|
+
* with, fail, and take a working merchant offline.
|
|
30
|
+
*/
|
|
31
|
+
export const needsRefresh = (token, now = new Date(), skewMs = REFRESH_SKEW_MS) => {
|
|
32
|
+
if (!token.expiresAt)
|
|
33
|
+
return false;
|
|
34
|
+
const at = Date.parse(token.expiresAt);
|
|
35
|
+
// An unparseable timestamp is a corrupt record, not a fresh token. Refresh it
|
|
36
|
+
// — the worst case is one wasted call, and the alternative is serving a
|
|
37
|
+
// token we cannot reason about until it 401s.
|
|
38
|
+
if (Number.isNaN(at))
|
|
39
|
+
return true;
|
|
40
|
+
return at - now.getTime() <= skewMs;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Renew if due, persist, and answer with whatever the caller should now use.
|
|
44
|
+
*
|
|
45
|
+
* ⚠️ NEVER THROWS ON A FAILED REFRESH — it returns the old token instead. A
|
|
46
|
+
* refresh can fail because Shopify is briefly down, and an exception here would
|
|
47
|
+
* turn a recoverable minute into a hard outage for a token that is still valid
|
|
48
|
+
* for another five. The 401 path is what handles a token that really is dead.
|
|
49
|
+
*/
|
|
50
|
+
export const refreshIfDue = async (token, oauth, save, opts = {}) => {
|
|
51
|
+
const now = opts.now ?? new Date();
|
|
52
|
+
if (!needsRefresh(token, now, opts.skewMs))
|
|
53
|
+
return { refreshed: false, token, reason: 'not-due' };
|
|
54
|
+
if (!token.refreshToken) {
|
|
55
|
+
// Due, but nothing to renew with. That is a record Shopify issued as
|
|
56
|
+
// expiring while we stored only half of it — worth saying out loud rather
|
|
57
|
+
// than looping on it.
|
|
58
|
+
opts.onError?.(new Error(`${token.shopDomain}: token is expiring but no refresh_token stored`));
|
|
59
|
+
return { refreshed: false, token, reason: 'no-refresh-token' };
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const next = await refreshAccessToken({ ...oauth, shopDomain: token.shopDomain }, token.refreshToken, opts.fetchImpl, now);
|
|
63
|
+
const record = {
|
|
64
|
+
...token,
|
|
65
|
+
accessToken: next.accessToken,
|
|
66
|
+
// ⚠️ Keep the granted scope if the refresh answer omits it — a refresh
|
|
67
|
+
// renews a token, it does not re-grant permissions, and overwriting the
|
|
68
|
+
// record's scope with '' would make the install look unscoped.
|
|
69
|
+
scope: next.scope || token.scope,
|
|
70
|
+
// ⚠️ STORE THE NEW REFRESH TOKEN. Shopify keeps the old one working only
|
|
71
|
+
// until the replacement is first used; holding on to it means the next
|
|
72
|
+
// refresh is the one that fails.
|
|
73
|
+
...(next.refreshToken ? { refreshToken: next.refreshToken } : {}),
|
|
74
|
+
...(next.expiresAt ? { expiresAt: next.expiresAt } : {}),
|
|
75
|
+
};
|
|
76
|
+
await save(record);
|
|
77
|
+
return { refreshed: true, token: record };
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
opts.onError?.(err);
|
|
81
|
+
return { refreshed: false, token, reason: 'not-due' };
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
/**
|
|
85
|
+
* Keep every install's REFRESH token from ageing out.
|
|
86
|
+
*
|
|
87
|
+
* ⚠️ THIS IS NOT WHAT KEEPS THE ACCESS TOKEN ALIVE — the resolver does that at
|
|
88
|
+
* the point of use, so a shop in traffic never needs this. The one thing the
|
|
89
|
+
* resolver cannot fix is a shop NOBODY TOUCHES: its access token expires in an
|
|
90
|
+
* hour and nothing asks for a new one, and 90 days later the refresh token
|
|
91
|
+
* expires too and the merchant has to install the app again. A shop that quiet
|
|
92
|
+
* is the normal state of a listed app, not an edge case.
|
|
93
|
+
*
|
|
94
|
+
* ⚠️ SO THE INTERVAL IS PACED TO THE 90-DAY WINDOW, NOT THE ONE-HOUR ONE. Each
|
|
95
|
+
* refresh returns a NEW refresh token with a fresh 90 days, so rolling every
|
|
96
|
+
* install forward once a day keeps them all alive indefinitely — at one call
|
|
97
|
+
* per shop per day. Sweeping hourly would be 24x the calls to buy nothing: the
|
|
98
|
+
* hourly problem is already solved where it actually shows up.
|
|
99
|
+
*/
|
|
100
|
+
export const KEEPALIVE_INTERVAL_MS = 24 * 60 * 60_000;
|
|
101
|
+
/**
|
|
102
|
+
* Roll every stored token forward. Returns how many were renewed.
|
|
103
|
+
*
|
|
104
|
+
* Uses a skew wide enough to catch tokens that are merely OLD rather than
|
|
105
|
+
* nearly-dead — the point is to touch each install once a day, not to wait
|
|
106
|
+
* until it is about to break.
|
|
107
|
+
*/
|
|
108
|
+
export const keepAlive = async (load, oauth, save, opts = {}) => {
|
|
109
|
+
let renewed = 0;
|
|
110
|
+
for (const token of await load()) {
|
|
111
|
+
// Skew = the whole interval, so any token issued before the last sweep is
|
|
112
|
+
// due. Non-expiring records still fall out on the `expiresAt` check inside.
|
|
113
|
+
const res = await refreshIfDue(token, oauth, save, {
|
|
114
|
+
...opts,
|
|
115
|
+
skewMs: Number.POSITIVE_INFINITY,
|
|
116
|
+
});
|
|
117
|
+
if (res.refreshed)
|
|
118
|
+
renewed += 1;
|
|
119
|
+
}
|
|
120
|
+
return renewed;
|
|
121
|
+
};
|
|
122
|
+
//# sourceMappingURL=token-refresh.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-refresh.js","sourceRoot":"","sources":["../src/token-refresh.ts"],"names":[],"mappings":"AAAA,kDAAkD;AAClD,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,0EAA0E;AAC1E,4EAA4E;AAC5E,4EAA4E;AAC5E,wEAAwE;AACxE,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,kCAAkC;AAClC,OAAO,EAAoB,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAGlE;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,GAAG,MAAM,CAAC;AAE1C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAqC,EACrC,MAAY,IAAI,IAAI,EAAE,EACtB,SAAiB,eAAe,EACvB,EAAE;IACX,IAAI,CAAC,KAAK,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACvC,8EAA8E;IAC9E,wEAAwE;IACxE,8CAA8C;IAC9C,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,MAAM,CAAC;AACtC,CAAC,CAAC;AASF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,KAAkB,EAClB,KAAkB,EAClB,IAAe,EACf,OAKI,EAAE,EACkB,EAAE;IAC1B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;IACnC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAClG,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;QACxB,qEAAqE;QACrE,0EAA0E;QAC1E,sBAAsB;QACtB,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,UAAU,iDAAiD,CAAC,CAAC,CAAC;QAChG,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,kBAAkB,CACnC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,EAC1C,KAAK,CAAC,YAAY,EAClB,IAAI,CAAC,SAAS,EACd,GAAG,CACJ,CAAC;QACF,MAAM,MAAM,GAAgB;YAC1B,GAAG,KAAK;YACR,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,uEAAuE;YACvE,wEAAwE;YACxE,+DAA+D;YAC/D,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK;YAChC,yEAAyE;YACzE,uEAAuE;YACvE,iCAAiC;YACjC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACzD,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QACpB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IACxD,CAAC;AACH,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC;AAEtD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,KAAK,EAC5B,IAAkC,EAClC,KAAkB,EAClB,IAAe,EACf,OAAmF,EAAE,EACpE,EAAE;IACnB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,KAAK,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;QACjC,0EAA0E;QAC1E,4EAA4E;QAC5E,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE;YACjD,GAAG,IAAI;YACP,MAAM,EAAE,MAAM,CAAC,iBAAiB;SACjC,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC"}
|
package/dist/token-store.d.ts
CHANGED
|
@@ -4,6 +4,16 @@ export type StoredToken = {
|
|
|
4
4
|
/** The scopes Shopify actually granted — may differ from what we asked for. */
|
|
5
5
|
scope: string;
|
|
6
6
|
installedAt: string;
|
|
7
|
+
/**
|
|
8
|
+
* Set only for an EXPIRING offline token. Both fields are OPTIONAL and must
|
|
9
|
+
* stay that way: moody's and elspet's files were written in August with
|
|
10
|
+
* neither, their tokens do not expire, and a required field would read those
|
|
11
|
+
* installs as broken on the next boot.
|
|
12
|
+
*
|
|
13
|
+
* Absent `expiresAt` therefore means "never expires", not "expiry unknown".
|
|
14
|
+
*/
|
|
15
|
+
refreshToken?: string;
|
|
16
|
+
expiresAt?: string;
|
|
7
17
|
};
|
|
8
18
|
export declare class TokenStore {
|
|
9
19
|
private readonly path;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"token-store.d.ts","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"AAaA,MAAM,MAAM,WAAW,GAAG;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,+EAA+E;IAC/E,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,qBAAa,UAAU;IAIT,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAS;gBAEM,IAAI,EAAE,MAAM;IAEnC,GAAG,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAelC,GAAG,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAU7C"}
|
package/dist/token-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,gEAAgE;AAChE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"token-store.js","sourceRoot":"","sources":["../src/token-store.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,8EAA8E;AAC9E,+CAA+C;AAC/C,EAAE;AACF,2EAA2E;AAC3E,0EAA0E;AAC1E,gEAAgE;AAChE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoBpC,MAAM,OAAO,UAAU;IAIQ;IAHrB,MAAM,GAAuB,IAAI,CAAC;IAClC,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAE7C,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAC;YAC9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;QACnD,CAAC;QAAC,MAAM,CAAC;YACP,yEAAyE;YACzE,iEAAiE;YACjE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAkB;QAC1B,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,4EAA4E;QAC5E,0CAA0C;QAC1C,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC;QAC/B,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACtE,MAAM,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;IACrB,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@curless/shopify-storefront",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "One Shopify storefront MCP connector, driven by a config file. Identity, tool names, vocabulary and shop wiring come from a StorefrontConfig, so a second merchant is a JSON file rather than a fork of 3,400 lines.",
|
|
6
6
|
"keywords": [
|