@lushly-dev/afd-auth 2.0.0 → 2.1.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/README.md
CHANGED
|
@@ -132,3 +132,70 @@ lock timestamp more than one second in the future counts as stale.
|
|
|
132
132
|
`localStorage` does not provide compare-and-swap, so acquisition remains
|
|
133
133
|
non-atomic under a simultaneous cross-tab race; applications that require
|
|
134
134
|
stronger serialization should use a provider-level refresh mechanism.
|
|
135
|
+
|
|
136
|
+
## Integration evidence
|
|
137
|
+
|
|
138
|
+
`pnpm -F @lushly-dev/afd-auth exec vitest run src/adapters/better-auth.integration.test.ts`
|
|
139
|
+
starts the installed Better Auth provider on an ephemeral loopback port with its memory
|
|
140
|
+
adapter. The actual vanilla client and `BetterAuthAdapter` exercise registration,
|
|
141
|
+
cookie issuance, credential rejection, sign-in, session expiry mapping, independent
|
|
142
|
+
session read-back, sign-out and revocation of the old cookie. A small Node cookie jar
|
|
143
|
+
forwards real `Set-Cookie` values; it does not implement browser cookie policy.
|
|
144
|
+
The test disposes subscriptions, closes sockets and discards all synthetic data.
|
|
145
|
+
Both the real vanilla store and the legacy function accessor are supported.
|
|
146
|
+
|
|
147
|
+
The separate browser suite installs only development tooling and runs without
|
|
148
|
+
provider credentials:
|
|
149
|
+
|
|
150
|
+
```sh
|
|
151
|
+
pnpm -F @lushly-dev/afd-auth exec playwright install chromium
|
|
152
|
+
pnpm -F @lushly-dev/afd-auth test:browser
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
`browser/lifecycle.test.ts` starts the actual Better Auth memory provider and
|
|
156
|
+
bundles a small application using `BetterAuthAdapter`, `createAuthHooks` and
|
|
157
|
+
`SessionSync`. Chromium uses its own cookie jar and two real tabs in one fresh
|
|
158
|
+
context. The application explicitly broadcasts auth changes and refetches provider
|
|
159
|
+
state on received AFD messages. The suite checks:
|
|
160
|
+
|
|
161
|
+
- Registration, invalid credentials, sign-in, React session/user rendering and
|
|
162
|
+
restoration after reload; a separate browser context stays signed out.
|
|
163
|
+
- Actual HttpOnly cookie protection from `document.cookie`, SameSite=Lax and path
|
|
164
|
+
attributes, cookie removal on sign-out and expiry, and independent replay of
|
|
165
|
+
revoked or expired synthetic cookies against the provider.
|
|
166
|
+
- Cross-tab sign-in, sign-out and session renewal with BroadcastChannel, then with
|
|
167
|
+
BroadcastChannel unavailable to exercise real localStorage `storage` events.
|
|
168
|
+
- Refresh-lock ownership across tabs: a non-owner cannot acquire or release an
|
|
169
|
+
existing lock, and the next owner can acquire after release.
|
|
170
|
+
- Real wall-clock provider session renewal and expiry. The expiry case first
|
|
171
|
+
observes Chromium remove the cookie while asserting that no provider request
|
|
172
|
+
occurs, then refetches and verifies the signed-out hooks and expired-cookie
|
|
173
|
+
rejection. It uses no fake timers, injected sessions, cookie shim or mocked
|
|
174
|
+
provider endpoints.
|
|
175
|
+
|
|
176
|
+
Each run uses ephemeral loopback ports and synthetic accounts. Teardown closes
|
|
177
|
+
browser contexts, provider connections and servers and clears provider memory,
|
|
178
|
+
including after failed assertions. Session cookies and tokens are never written to
|
|
179
|
+
an evidence file. Startup, test and CI deadlines bound the run. The path-filtered
|
|
180
|
+
`Auth browser integration` workflow runs the same suite on Node 24 with a pinned
|
|
181
|
+
Playwright version and its matching Chromium. It is separate from `pnpm check`,
|
|
182
|
+
so the TypeScript gate does not require a downloaded browser binary.
|
|
183
|
+
|
|
184
|
+
This is local Chromium/provider evidence using HTTP with `Secure=false`. It does
|
|
185
|
+
not establish HTTPS Secure-cookie or cross-site SameSite enforcement, OAuth
|
|
186
|
+
callbacks, refresh of upstream OAuth tokens, simultaneous refresh-lock atomicity,
|
|
187
|
+
other browsers or Convex deployment behavior. Those deployment-specific checks
|
|
188
|
+
remain tracked in [#362](https://github.com/lushly-dev/afd/issues/362).
|
|
189
|
+
|
|
190
|
+
For an optional provider/browser validation run, provision a disposable staging
|
|
191
|
+
application with its HTTPS origin and callback URL registered with the provider,
|
|
192
|
+
a dedicated test account, test OAuth client configuration (or a dedicated Convex
|
|
193
|
+
deployment) and a short session lifetime. Use two tabs in one fresh browser profile:
|
|
194
|
+
complete OAuth through the actual callback, verify the adapter user/session in both
|
|
195
|
+
tabs, trigger provider refresh across expiry, then sign out and verify both tabs
|
|
196
|
+
and an independent session endpoint reject the previous session. Record deployment
|
|
197
|
+
revision, provider/client version, cookie attributes, timing and each observed
|
|
198
|
+
outcome without recording tokens. Revoke test sessions, delete the test account
|
|
199
|
+
and disposable deployment, and close the profile. Missing configuration means
|
|
200
|
+
**not run**; the local test cannot satisfy those checks. Production credentials
|
|
201
|
+
are unnecessary for the default gate.
|
|
@@ -36,15 +36,16 @@ interface BetterAuthClient {
|
|
|
36
36
|
}) => Promise<BetterAuthMethodResponse>;
|
|
37
37
|
};
|
|
38
38
|
signOut: () => Promise<BetterAuthMethodResponse>;
|
|
39
|
-
useSession: () =>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
39
|
+
useSession: BetterAuthSessionStore | (() => BetterAuthSessionStore);
|
|
40
|
+
}
|
|
41
|
+
interface BetterAuthSessionStore {
|
|
42
|
+
subscribe: (callback: (value: {
|
|
43
|
+
data: BetterAuthSessionData | null;
|
|
44
|
+
isPending: boolean;
|
|
45
|
+
}) => void) => () => void;
|
|
46
|
+
get: () => {
|
|
47
|
+
data: BetterAuthSessionData | null;
|
|
48
|
+
isPending: boolean;
|
|
48
49
|
};
|
|
49
50
|
}
|
|
50
51
|
interface BetterAuthSessionData {
|
|
@@ -56,7 +57,7 @@ interface BetterAuthSessionData {
|
|
|
56
57
|
id: string;
|
|
57
58
|
email: string;
|
|
58
59
|
name?: string;
|
|
59
|
-
image?: string;
|
|
60
|
+
image?: string | null;
|
|
60
61
|
};
|
|
61
62
|
}
|
|
62
63
|
export interface BetterAuthAdapterOptions {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../../src/adapters/better-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,KAAK,oBAAoB,EAAe,MAAM,iBAAiB,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI/F,oEAAoE;AACpE,UAAU,uBAAuB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,UAAU,sBAAsB;IAC/B,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,uBAAuB,GAAG,IAAI,CAAC;CACvC;AAED,KAAK,wBAAwB,GAAG,sBAAsB,GAAG,SAAS,CAAC;AAEnE,UAAU,gBAAgB;IACzB,MAAM,EAAE;QACP,MAAM,EAAE,CAAC,MAAM,EAAE;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,WAAW,CAAC,EAAE,MAAM,CAAC;YACrB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;SAClB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;QACxC,KAAK,EAAE,CAAC,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;KAC1F,CAAC;IACF,OAAO,EAAE,MAAM,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACjD,UAAU,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"better-auth.d.ts","sourceRoot":"","sources":["../../src/adapters/better-auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -77,8 +77,8 @@ export class BetterAuthAdapter {
|
|
|
77
77
|
this.listeners.clear();
|
|
78
78
|
}
|
|
79
79
|
setupSubscription() {
|
|
80
|
-
|
|
81
|
-
const store = this.client
|
|
80
|
+
const storeAccessor = this.client.useSession;
|
|
81
|
+
const store = typeof storeAccessor === 'function' ? storeAccessor.call(this.client) : storeAccessor;
|
|
82
82
|
// Read before subscribing so stores that invoke the callback immediately do
|
|
83
83
|
// not replace an equivalent initial snapshot with a new object.
|
|
84
84
|
this.currentState = this.mapToState(store.get());
|
|
@@ -137,7 +137,7 @@ export class BetterAuthAdapter {
|
|
|
137
137
|
id: value.data.user.id,
|
|
138
138
|
email: value.data.user.email,
|
|
139
139
|
name: value.data.user.name,
|
|
140
|
-
image: value.data.user.image,
|
|
140
|
+
image: value.data.user.image ?? undefined,
|
|
141
141
|
},
|
|
142
142
|
};
|
|
143
143
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"better-auth.js","sourceRoot":"","sources":["../../src/adapters/better-auth.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAA6B,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"better-auth.js","sourceRoot":"","sources":["../../src/adapters/better-auth.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lushly-dev/afd-auth",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "Provider-agnostic authentication adapter for AFD applications",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -24,14 +24,14 @@
|
|
|
24
24
|
"README.md"
|
|
25
25
|
],
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@lushly-dev/afd-core": "2.
|
|
27
|
+
"@lushly-dev/afd-core": "2.1.0"
|
|
28
28
|
},
|
|
29
29
|
"peerDependencies": {
|
|
30
30
|
"@convex-dev/auth": ">=0.0.95",
|
|
31
31
|
"better-auth": "^1.6.22",
|
|
32
32
|
"react": "^18.0.0 || ^19.0.0",
|
|
33
33
|
"zod": "^4.0.0",
|
|
34
|
-
"@lushly-dev/afd-server": "2.
|
|
34
|
+
"@lushly-dev/afd-server": "^2.1.0"
|
|
35
35
|
},
|
|
36
36
|
"peerDependenciesMeta": {
|
|
37
37
|
"@lushly-dev/afd-server": {
|
|
@@ -52,6 +52,7 @@
|
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@auth/core": "^0.41.3",
|
|
55
|
+
"better-auth": "^1.6.22",
|
|
55
56
|
"@testing-library/react": "^16.3.3",
|
|
56
57
|
"@types/react": "^19.3.0",
|
|
57
58
|
"@vitest/coverage-v8": "^4.1.11",
|
|
@@ -61,7 +62,10 @@
|
|
|
61
62
|
"typescript": "^5.9.3",
|
|
62
63
|
"vitest": "^4.1.11",
|
|
63
64
|
"zod": "^4.5.4",
|
|
64
|
-
"
|
|
65
|
+
"esbuild": "0.28.2",
|
|
66
|
+
"playwright": "1.64.0",
|
|
67
|
+
"@types/react-dom": "19.3.0",
|
|
68
|
+
"@lushly-dev/afd-server": "2.1.0"
|
|
65
69
|
},
|
|
66
70
|
"keywords": [
|
|
67
71
|
"afd",
|
|
@@ -94,6 +98,7 @@
|
|
|
94
98
|
"dev": "tsc --watch",
|
|
95
99
|
"test": "vitest run",
|
|
96
100
|
"test:watch": "vitest",
|
|
97
|
-
"clean": "rm -rf dist"
|
|
101
|
+
"clean": "rm -rf dist",
|
|
102
|
+
"test:browser": "vitest run --config browser/vitest.config.ts"
|
|
98
103
|
}
|
|
99
104
|
}
|