@atlasauth/js 0.6.0 → 0.8.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/CHANGELOG.md +63 -0
- package/dist/environment.d.ts +79 -0
- package/dist/environment.js +74 -0
- package/dist/environment.js.map +1 -0
- package/dist/frontchannel-logout.d.ts +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/instance-settings.d.ts +9 -0
- package/dist/instance-settings.js +2 -1
- package/dist/instance-settings.js.map +1 -1
- package/dist/popup-channel.d.ts +95 -0
- package/dist/popup-channel.js +231 -0
- package/dist/popup-channel.js.map +1 -0
- package/dist/redirect.d.ts +45 -4
- package/dist/redirect.js +102 -16
- package/dist/redirect.js.map +1 -1
- package/dist/sign-out-guard.d.ts +114 -0
- package/dist/sign-out-guard.js +197 -0
- package/dist/sign-out-guard.js.map +1 -0
- package/dist/sign-out.d.ts +78 -9
- package/dist/sign-out.js +236 -27
- package/dist/sign-out.js.map +1 -1
- package/package.json +1 -1
package/dist/sign-out.js
CHANGED
|
@@ -11,9 +11,9 @@
|
|
|
11
11
|
*
|
|
12
12
|
* These helpers close that gap: {@link revokeSession} retries once and reports
|
|
13
13
|
* what the server did (including the parked session it promoted, if any), and
|
|
14
|
-
* {@link SessionTombstones} remembers the ids of sessions this
|
|
15
|
-
* so a reload never re-adopts one, even when
|
|
16
|
-
* server.
|
|
14
|
+
* {@link SessionTombstones} remembers the ids of sessions this browser signed
|
|
15
|
+
* out of so a reload — or a tab opened later — never re-adopts one, even when
|
|
16
|
+
* the revoke never reached the server.
|
|
17
17
|
*/
|
|
18
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
19
|
exports.SessionTombstones = exports.SignOutError = void 0;
|
|
@@ -79,56 +79,265 @@ async function revokeSession(request, sessionId, options = {}) {
|
|
|
79
79
|
}
|
|
80
80
|
const TOMBSTONE_KEY = 'atlas:signed-out-sessions';
|
|
81
81
|
const TOMBSTONE_LIMIT = 20;
|
|
82
|
+
/** How long a tombstone is kept: longer than any refresh cookie it guards against. */
|
|
83
|
+
const TOMBSTONE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
82
84
|
/**
|
|
83
|
-
* The ids of sessions this
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
85
|
+
* The ids of sessions this browser signed out of, so a reload — or a tab opened
|
|
86
|
+
* later — never re-adopts one from a refresh cookie the revoke did not clear.
|
|
87
|
+
*
|
|
88
|
+
* Kept in `localStorage` (shared by every tab of the site and surviving a
|
|
89
|
+
* restart), at most 20 entries, each for 30 days, pruned whenever it is read,
|
|
90
|
+
* and keyed per Frontend API origin. Tabs see each other's changes on every
|
|
91
|
+
* read, and {@link SessionTombstones.subscribe} reports them as they happen
|
|
92
|
+
* (the `storage` event). `sessionStorage` is used only when `localStorage`
|
|
93
|
+
* throws (storage disabled, sandboxed frames); memory always backs both. A
|
|
94
|
+
* confirmed revoke may {@link SessionTombstones.remove} its tombstone. Never
|
|
95
|
+
* holds a token — a session id is not a credential.
|
|
87
96
|
*/
|
|
88
97
|
class SessionTombstones {
|
|
98
|
+
entries;
|
|
99
|
+
/** Ids no storage accepted: only memory remembers them, so a sync keeps them. */
|
|
100
|
+
unsaved = new Set();
|
|
89
101
|
storageKey;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
102
|
+
now;
|
|
103
|
+
store;
|
|
104
|
+
/** False until a custom store has been read: writing earlier would drop what it holds. */
|
|
105
|
+
hydrated = true;
|
|
106
|
+
/**
|
|
107
|
+
* Settles once the tombstones a {@link SessionTombstonesOptions.store} holds
|
|
108
|
+
* have been read (at once for `localStorage`). Never rejects.
|
|
109
|
+
*/
|
|
110
|
+
ready;
|
|
111
|
+
constructor(options = {}) {
|
|
112
|
+
const opts = typeof options === 'string' ? { storageKey: options } : options;
|
|
113
|
+
this.storageKey = opts.storageKey ?? scopedKey(opts.frontendApi);
|
|
114
|
+
this.now = opts.now ?? Date.now;
|
|
115
|
+
this.store = opts.store;
|
|
116
|
+
if (this.store) {
|
|
117
|
+
this.entries = [];
|
|
118
|
+
this.hydrated = false;
|
|
119
|
+
this.ready = this.hydrate(this.store);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
this.ready = Promise.resolve();
|
|
123
|
+
const stored = readStored(this.storageKey) ?? [];
|
|
124
|
+
const legacy = readLegacy(this.storageKey, this.now()).filter((l) => !stored.some((e) => e.id === l.id));
|
|
125
|
+
this.entries = this.prune([...stored, ...legacy]);
|
|
126
|
+
// Carry an older SDK's per-tab tombstones over into the shared store, once.
|
|
127
|
+
if (legacy.length) {
|
|
128
|
+
this.persist();
|
|
129
|
+
try {
|
|
130
|
+
storage('session')?.removeItem(TOMBSTONE_KEY);
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
/* sessionStorage unavailable */
|
|
134
|
+
}
|
|
135
|
+
}
|
|
94
136
|
}
|
|
95
137
|
has(sessionId) {
|
|
96
|
-
|
|
138
|
+
if (typeof sessionId !== 'string' || !sessionId)
|
|
139
|
+
return false;
|
|
140
|
+
this.sync();
|
|
141
|
+
return this.entries.some((e) => e.id === sessionId);
|
|
97
142
|
}
|
|
98
143
|
add(...sessionIds) {
|
|
144
|
+
this.sync();
|
|
99
145
|
let changed = false;
|
|
100
146
|
for (const id of sessionIds) {
|
|
101
|
-
if (typeof id !== 'string' || !id || this.
|
|
147
|
+
if (typeof id !== 'string' || !id || this.entries.some((e) => e.id === id))
|
|
102
148
|
continue;
|
|
103
|
-
this.
|
|
149
|
+
this.entries.push({ id, at: this.now() });
|
|
104
150
|
changed = true;
|
|
105
151
|
}
|
|
106
|
-
if (
|
|
152
|
+
if (changed)
|
|
153
|
+
this.persist();
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Forget tombstones — called once a later revoke of the session is confirmed
|
|
157
|
+
* (the server has ended it, so there is nothing left to re-adopt).
|
|
158
|
+
*/
|
|
159
|
+
remove(...sessionIds) {
|
|
160
|
+
this.sync();
|
|
161
|
+
const before = this.entries.length;
|
|
162
|
+
this.entries = this.entries.filter((e) => !sessionIds.includes(e.id));
|
|
163
|
+
if (this.entries.length !== before)
|
|
164
|
+
this.persist();
|
|
165
|
+
}
|
|
166
|
+
list() {
|
|
167
|
+
this.sync();
|
|
168
|
+
return this.entries.map((e) => e.id);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Call `listener` when another tab adds or removes a tombstone (the `storage`
|
|
172
|
+
* event). Returns the unsubscribe function; a no-op outside a browser.
|
|
173
|
+
*/
|
|
174
|
+
subscribe(listener) {
|
|
175
|
+
if (this.store)
|
|
176
|
+
return () => undefined;
|
|
177
|
+
const target = globalThis;
|
|
178
|
+
if (typeof target.addEventListener !== 'function')
|
|
179
|
+
return () => undefined;
|
|
180
|
+
const onStorage = (event) => {
|
|
181
|
+
if (event.key !== this.storageKey && event.key !== null)
|
|
182
|
+
return;
|
|
183
|
+
listener(this.list());
|
|
184
|
+
};
|
|
185
|
+
target.addEventListener('storage', onStorage);
|
|
186
|
+
return () => target.removeEventListener?.('storage', onStorage);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Re-read storage — the source of truth, so another tab's add or remove is
|
|
190
|
+
* seen here — keeping only what this tab could not store; then drop expired
|
|
191
|
+
* entries. With no readable storage, memory is all there is.
|
|
192
|
+
*/
|
|
193
|
+
sync() {
|
|
194
|
+
// A custom store is written through from memory, which is authoritative.
|
|
195
|
+
const stored = this.store ? null : readStored(this.storageKey);
|
|
196
|
+
if (!stored) {
|
|
197
|
+
this.entries = this.prune(this.entries);
|
|
107
198
|
return;
|
|
108
|
-
|
|
109
|
-
|
|
199
|
+
}
|
|
200
|
+
const known = new Set(stored.map((e) => e.id));
|
|
201
|
+
this.entries = this.prune([
|
|
202
|
+
...stored,
|
|
203
|
+
...this.entries.filter((e) => this.unsaved.has(e.id) && !known.has(e.id)),
|
|
204
|
+
]);
|
|
205
|
+
}
|
|
206
|
+
prune(entries) {
|
|
207
|
+
const cutoff = this.now() - TOMBSTONE_TTL_MS;
|
|
208
|
+
const seen = new Set();
|
|
209
|
+
const fresh = entries
|
|
210
|
+
.filter((e) => e.at > cutoff && !seen.has(e.id) && seen.add(e.id))
|
|
211
|
+
.sort((a, b) => a.at - b.at);
|
|
212
|
+
return fresh.slice(-TOMBSTONE_LIMIT);
|
|
213
|
+
}
|
|
214
|
+
/** Read a custom store once, merging anything added before it answered. */
|
|
215
|
+
async hydrate(store) {
|
|
216
|
+
let raw;
|
|
110
217
|
try {
|
|
111
|
-
|
|
218
|
+
raw = await store.getItem(this.storageKey);
|
|
112
219
|
}
|
|
113
220
|
catch {
|
|
114
|
-
|
|
221
|
+
raw = null;
|
|
115
222
|
}
|
|
223
|
+
const added = this.entries;
|
|
224
|
+
this.entries = this.prune([...parseEntries(raw, this.now()), ...added]);
|
|
225
|
+
this.hydrated = true;
|
|
226
|
+
if (added.length)
|
|
227
|
+
this.persist();
|
|
116
228
|
}
|
|
117
|
-
|
|
118
|
-
|
|
229
|
+
persist() {
|
|
230
|
+
this.entries = this.prune(this.entries);
|
|
231
|
+
const raw = JSON.stringify(this.entries);
|
|
232
|
+
if (this.store) {
|
|
233
|
+
if (!this.hydrated)
|
|
234
|
+
return;
|
|
235
|
+
const store = this.store;
|
|
236
|
+
try {
|
|
237
|
+
void Promise.resolve(store.setItem(this.storageKey, raw)).catch(() => undefined);
|
|
238
|
+
}
|
|
239
|
+
catch {
|
|
240
|
+
/* memory still protects this process */
|
|
241
|
+
}
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (write('local', this.storageKey, raw)) {
|
|
245
|
+
// Anything parked in sessionStorage by an earlier failed write is now in localStorage.
|
|
246
|
+
try {
|
|
247
|
+
storage('session')?.removeItem(this.storageKey);
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
250
|
+
/* nothing parked, or sessionStorage unavailable */
|
|
251
|
+
}
|
|
252
|
+
this.unsaved.clear();
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
// localStorage threw (disabled, sandboxed, full): fall back to this tab's
|
|
256
|
+
// sessionStorage, and memory still protects this tab if that throws too.
|
|
257
|
+
this.unsaved = write('session', this.storageKey, raw) ? new Set() : new Set(this.entries.map((e) => e.id));
|
|
119
258
|
}
|
|
120
259
|
}
|
|
121
260
|
exports.SessionTombstones = SessionTombstones;
|
|
122
|
-
|
|
261
|
+
/** `atlas:signed-out-sessions:<frontend api origin>`. */
|
|
262
|
+
function scopedKey(frontendApi) {
|
|
263
|
+
if (!frontendApi)
|
|
264
|
+
return TOMBSTONE_KEY;
|
|
123
265
|
try {
|
|
124
|
-
|
|
125
|
-
const parsed = raw ? JSON.parse(raw) : [];
|
|
126
|
-
return Array.isArray(parsed)
|
|
127
|
-
? parsed.filter((v) => typeof v === 'string').slice(-TOMBSTONE_LIMIT)
|
|
128
|
-
: [];
|
|
266
|
+
return `${TOMBSTONE_KEY}:${new URL(frontendApi).origin}`;
|
|
129
267
|
}
|
|
130
268
|
catch {
|
|
269
|
+
return `${TOMBSTONE_KEY}:${frontendApi}`;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
function storage(kind) {
|
|
273
|
+
// Reading `localStorage` itself throws in some sandboxed contexts.
|
|
274
|
+
return kind === 'local' ? globalThis.localStorage : globalThis.sessionStorage;
|
|
275
|
+
}
|
|
276
|
+
function write(kind, key, value) {
|
|
277
|
+
try {
|
|
278
|
+
const s = storage(kind);
|
|
279
|
+
if (!s)
|
|
280
|
+
return false;
|
|
281
|
+
s.setItem(key, value);
|
|
282
|
+
return true;
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
return false;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
function parseEntries(raw, now) {
|
|
289
|
+
if (!raw)
|
|
131
290
|
return [];
|
|
291
|
+
try {
|
|
292
|
+
const parsed = JSON.parse(raw);
|
|
293
|
+
if (!Array.isArray(parsed))
|
|
294
|
+
return [];
|
|
295
|
+
const out = [];
|
|
296
|
+
for (const v of parsed) {
|
|
297
|
+
// Bare ids are the pre-TTL format: date them now.
|
|
298
|
+
if (typeof v === 'string' && v)
|
|
299
|
+
out.push({ id: v, at: now });
|
|
300
|
+
else if (v && typeof v === 'object') {
|
|
301
|
+
const { id, at } = v;
|
|
302
|
+
if (typeof id === 'string' && id && typeof at === 'number' && Number.isFinite(at))
|
|
303
|
+
out.push({ id, at });
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return out;
|
|
132
307
|
}
|
|
308
|
+
catch {
|
|
309
|
+
return [];
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* localStorage (plus anything a failed write parked in sessionStorage), or
|
|
314
|
+
* sessionStorage alone when localStorage throws; null when neither is readable.
|
|
315
|
+
*/
|
|
316
|
+
function readStored(key) {
|
|
317
|
+
const now = Date.now();
|
|
318
|
+
try {
|
|
319
|
+
const s = storage('local');
|
|
320
|
+
if (s)
|
|
321
|
+
return [...parseEntries(s.getItem(key), now), ...(readSession(key, now) ?? [])];
|
|
322
|
+
}
|
|
323
|
+
catch {
|
|
324
|
+
/* fall through to sessionStorage */
|
|
325
|
+
}
|
|
326
|
+
return readSession(key, now);
|
|
327
|
+
}
|
|
328
|
+
function readSession(key, now) {
|
|
329
|
+
try {
|
|
330
|
+
const s = storage('session');
|
|
331
|
+
return s ? parseEntries(s.getItem(key), now) : null;
|
|
332
|
+
}
|
|
333
|
+
catch {
|
|
334
|
+
return null;
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
/** Tombstones written by earlier SDK versions: per tab, unscoped, in sessionStorage. */
|
|
338
|
+
function readLegacy(key, now) {
|
|
339
|
+
if (key === TOMBSTONE_KEY)
|
|
340
|
+
return [];
|
|
341
|
+
return readSession(TOMBSTONE_KEY, now) ?? [];
|
|
133
342
|
}
|
|
134
343
|
//# sourceMappingURL=sign-out.js.map
|
package/dist/sign-out.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sign-out.js","sourceRoot":"","sources":["../src/sign-out.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;AAwDH,sCAgCC;AAvED,gFAAgF;AAChF,MAAa,YAAa,SAAQ,KAAK;IAC5B,IAAI,GAAG,wBAAiC,CAAC;IAClD,6CAA6C;IACpC,SAAS,CAAS;IAC3B,gFAAgF;IACvE,MAAM,CAAS;IAExB,YAAY,SAAiB,EAAE,MAAc;QAC3C,KAAK,CACH,MAAM,KAAK,CAAC;YACV,CAAC,CAAC,yFAAyF;YAC3F,CAAC,CAAC,mFAAmF,MAAM,IAAI,CAClG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAjBD,oCAiBC;AAaD;;;;;;;GAOG;AACI,KAAK,UAAU,aAAa,CACjC,OAAgE,EAChE,SAAiB,EACjB,UAAgC,EAAE;IAElC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAClD,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;QACpD,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,OAAO,CAAC,uBAAuB,kBAAkB,CAAC,SAAS,CAAC,SAAS,EAAE;gBACtF,MAAM,EAAE,MAAM;aACf,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,GAAG,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;QACzB,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;YAChB,IAAI,eAAmC,CAAC;YACxC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAA2C,CAAC;gBACvF,IAAI,OAAO,IAAI,EAAE,iBAAiB,KAAK,QAAQ;oBAAE,eAAe,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAC5F,CAAC;YAAC,MAAM,CAAC;gBACP,0DAA0D;YAC5D,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9F,CAAC;QACD,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACrD,IAAI,MAAM,GAAG,GAAG,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;IAC5C,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,aAAa,GAAG,2BAA2B,CAAC;AAClD,MAAM,eAAe,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"sign-out.js","sourceRoot":"","sources":["../src/sign-out.ts"],"names":[],"mappings":"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"}
|