@albertomarturelo/sii-core 0.10.0 → 0.11.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 +40 -0
- package/dist/adapters/fake/index.d.ts +17 -3
- package/dist/adapters/fake/index.d.ts.map +1 -1
- package/dist/adapters/fake/index.js +36 -3
- package/dist/adapters/fake/index.js.map +1 -1
- package/dist/adapters/node/cookie-jar.d.ts +35 -0
- package/dist/adapters/node/cookie-jar.d.ts.map +1 -0
- package/dist/adapters/node/cookie-jar.js +211 -0
- package/dist/adapters/node/cookie-jar.js.map +1 -0
- package/dist/adapters/node/http.d.ts +12 -0
- package/dist/adapters/node/http.d.ts.map +1 -0
- package/dist/adapters/node/http.js +262 -0
- package/dist/adapters/node/http.js.map +1 -0
- package/dist/adapters/node/portal.d.ts.map +1 -1
- package/dist/adapters/node/portal.js +7 -4
- package/dist/adapters/node/portal.js.map +1 -1
- package/dist/adapters/node/response.d.ts.map +1 -1
- package/dist/adapters/node/response.js +4 -1
- package/dist/adapters/node/response.js.map +1 -1
- package/dist/auth/auth.d.ts +27 -1
- package/dist/auth/auth.d.ts.map +1 -1
- package/dist/auth/auth.js +108 -32
- package/dist/auth/auth.js.map +1 -1
- package/dist/auth/datos-cntr.d.ts +23 -0
- package/dist/auth/datos-cntr.d.ts.map +1 -0
- package/dist/auth/datos-cntr.js +81 -0
- package/dist/auth/datos-cntr.js.map +1 -0
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/login-block.d.ts +23 -0
- package/dist/auth/login-block.d.ts.map +1 -0
- package/dist/auth/login-block.js +53 -0
- package/dist/auth/login-block.js.map +1 -0
- package/dist/auth/login-error.d.ts +20 -3
- package/dist/auth/login-error.d.ts.map +1 -1
- package/dist/auth/login-error.js +20 -5
- package/dist/auth/login-error.js.map +1 -1
- package/dist/auth/session.d.ts +13 -1
- package/dist/auth/session.d.ts.map +1 -1
- package/dist/auth/session.js +23 -2
- package/dist/auth/session.js.map +1 -1
- package/dist/cli.d.ts +2 -2
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/config/config.d.ts +8 -0
- package/dist/config/config.d.ts.map +1 -1
- package/dist/config/config.js +8 -0
- package/dist/config/config.js.map +1 -1
- package/dist/errors/errors.d.ts +34 -2
- package/dist/errors/errors.d.ts.map +1 -1
- package/dist/errors/errors.js +30 -2
- package/dist/errors/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/node.d.ts +7 -3
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +10 -4
- package/dist/node.js.map +1 -1
- package/dist/seams/index.d.ts +7 -0
- package/dist/seams/index.d.ts.map +1 -1
- package/dist/tasks/auth.d.ts +16 -2
- package/dist/tasks/auth.d.ts.map +1 -1
- package/dist/tasks/auth.js +12 -0
- package/dist/tasks/auth.js.map +1 -1
- package/dist/tasks/bte.d.ts.map +1 -1
- package/dist/tasks/bte.js +4 -2
- package/dist/tasks/bte.js.map +1 -1
- package/dist/tasks/dte.js +8 -8
- package/dist/tasks/dte.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,46 @@ All notable changes to `@albertomarturelo/sii-core` are documented here. The for
|
|
|
4
4
|
loosely based on [Keep a Changelog](https://keepachangelog.com/); the package is
|
|
5
5
|
pre-1.0, so MINOR bumps may carry breaking changes (pin or use `~` downstream).
|
|
6
6
|
|
|
7
|
+
## 0.11.0 — 2026-10-18
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **`HttpPortalDriver` (ADR-027, #131)** — every `PortalSession` primitive over Node `fetch`
|
|
12
|
+
and an in-house cookie jar, which (de)serialises to Playwright's `storageState` shape, so a
|
|
13
|
+
session minted by either engine restores in the other. The login is the hand-built
|
|
14
|
+
five-field POST that SII's page computes; success is decided by the session cookies plus the
|
|
15
|
+
body's navigation off the login host, because SII answers `200` on both success and
|
|
16
|
+
rejection. Queue-it's waiting room raises `LoginQueuedError` (never retried).
|
|
17
|
+
- **`Runtime.browser`** — the optional, lazy Playwright engine, used only by the tasks that
|
|
18
|
+
run SII's own page JS (BTE `list`, the MIPYME/DTE tasks). `createNodeRuntime` wires it; a
|
|
19
|
+
hand-built `Runtime` without it makes those tasks raise `BrowserRequiredError`, which names
|
|
20
|
+
the install. Internally, the Mi SII identity is now parsed from the page's inline JSON literal
|
|
21
|
+
(zod-validated) instead of `session.evaluate`, so it works on either engine.
|
|
22
|
+
- **Typed login failures (#129).** `LoginFailedError` carries `reason: 'wrong-clave' |
|
|
23
|
+
'unknown'` and `codigo` (SII's message code). Only the observed wrong-Clave code classifies
|
|
24
|
+
as `wrong-clave`; anything else is `unknown`, the safe direction.
|
|
25
|
+
- **Non-interactive login (ADR-028, #133).** `suppliedClaveLogin(runtime, {rut, clave,
|
|
26
|
+
source: 'env' | 'stdin'})` and `unblockLogin(runtime, {rut?})`, both exported only from the
|
|
27
|
+
CLI-only `@albertomarturelo/sii-core/cli` subpath (a test asserts the main barrel lacks them).
|
|
28
|
+
- **The rejection latch** (`auth/login-block.ts`, `~/.sii/login-blocked.json`, one `{rut, at,
|
|
29
|
+
codigo}` entry per RUT, no secret). Any SII error page with a código trips it, from any Clave
|
|
30
|
+
source; Queue-it, timeouts and network errors never do. While set, env/stdin/keyring logins
|
|
31
|
+
for that RUT raise `LoginBlockedError` (a `LoginFailedError`) without contacting SII. A fresh
|
|
32
|
+
console or browser login for that RUT clears it, as does `unblockLogin`.
|
|
33
|
+
- **`AuthStatusLocal.loginBlocked`** — the latch, reported by `authStatus`, so a caller checks
|
|
34
|
+
it before deciding to log in.
|
|
35
|
+
- **`source` on every `auth_login` audit receipt** (`env | stdin | keyring | console |
|
|
36
|
+
browser`), never the value; a latch refusal is `result: 'blocked'`.
|
|
37
|
+
|
|
38
|
+
### Changed
|
|
39
|
+
|
|
40
|
+
- **`createNodeRuntime().portal` defaults to `HttpPortalDriver`**; Playwright moved to
|
|
41
|
+
`Runtime.browser`. A consumer that injects its own `portal` and expected it to run page JS
|
|
42
|
+
must now also supply `browser`.
|
|
43
|
+
- **Every credential login is RUT-aware.** A live session for a different RUT raises
|
|
44
|
+
`ValidationError` instead of answering `already_authenticated` as the wrong account.
|
|
45
|
+
- `AuthLoginResult.reason` gains `env_login` and `stdin_login`.
|
|
46
|
+
|
|
7
47
|
## 0.10.0 — 2026-09-12
|
|
8
48
|
|
|
9
49
|
### Added
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { AccountType } from '../../identity/index.js';
|
|
2
|
+
import type { AuditEntry, AuditSink, BinaryRequest, BinaryResponse, Clock, CredentialLoginOptions, FormRequest, InteractiveLoginOptions, JsonRequest, FileSink, KeyValueStore, PortalDriver, PortalSession, PublicRequest, PublicResponse, Runtime, SecretStore, TextRequest } from '../../seams/index.js';
|
|
2
3
|
export declare class FixedClock implements Clock {
|
|
3
4
|
private current;
|
|
4
5
|
/** Each `sleep(ms)` is recorded (not awaited) so a test can assert pacing without
|
|
@@ -24,14 +25,20 @@ export interface FakeSessionScript {
|
|
|
24
25
|
landingUrl?: string;
|
|
25
26
|
/** Result for `evaluate(expression)`. */
|
|
26
27
|
evaluate?: (expression: string) => unknown;
|
|
28
|
+
/** The Mi SII identity snapshot (`DatosCntrNow`). Since ADR-027 the auth flows read identity
|
|
29
|
+
* from the Mi SII HTML (not `evaluate`), so the fake synthesises that HTML for a
|
|
30
|
+
* `requestText(HOSTS.miSii)` from this — falling back to `evaluate` so pre-ADR-027 fixtures
|
|
31
|
+
* (`evaluate: datos`) keep working untouched. */
|
|
32
|
+
datos?: () => unknown;
|
|
27
33
|
/** Result for `requestJson(url, options)` — the SDI facade JSON envelope. */
|
|
28
34
|
requestJson?: (url: string, options?: JsonRequest) => unknown;
|
|
29
35
|
/** Result for `requestForm(url, options)` — an authenticated form-POST (BHE emit,
|
|
30
36
|
* ADR-017). Return the decoded body string (status 200) or a full PublicResponse. */
|
|
31
37
|
requestForm?: (url: string, options?: FormRequest) => PublicResponse | string;
|
|
32
38
|
/** Result for `requestText(url, options)` — an authenticated raw-body request (GWT-RPC
|
|
33
|
-
* reads, ADR-020). Return the decoded body string (status 200) or a full PublicResponse
|
|
34
|
-
|
|
39
|
+
* reads, ADR-020). Return the decoded body string (status 200) or a full PublicResponse;
|
|
40
|
+
* `undefined` defers to the fake's default (incl. the Mi SII identity synthesis, ADR-027). */
|
|
41
|
+
requestText?: (url: string, options?: TextRequest) => PublicResponse | string | undefined;
|
|
35
42
|
/** Result for `requestBinary(url, options)` — an authenticated download (F29 PDFs,
|
|
36
43
|
* ADR-022). Return the raw bytes (content-type defaults to `application/pdf`) or a
|
|
37
44
|
* full BinaryResponse to script an error page / odd content-type. */
|
|
@@ -123,6 +130,13 @@ export declare class InMemoryFileSink implements FileSink {
|
|
|
123
130
|
readonly files: Map<string, Uint8Array<ArrayBufferLike>>;
|
|
124
131
|
write(dir: string, name: string, bytes: Uint8Array): Promise<string>;
|
|
125
132
|
}
|
|
133
|
+
/** Seed an authenticated cookies-only session + operate state directly into a runtime's store
|
|
134
|
+
* — so a surface test that just needs "logged in as self" doesn't drive the login command
|
|
135
|
+
* (which, since ADR-027, prompts for a Clave on the CLI). Synthetic RUT, no SII touched. */
|
|
136
|
+
export declare function seedSession(runtime: Runtime, opts?: {
|
|
137
|
+
rut?: string;
|
|
138
|
+
accountType?: AccountType;
|
|
139
|
+
}): Promise<void>;
|
|
126
140
|
/** In-memory SecretStore: the keyring stand-in, so a test never reads the real one
|
|
127
141
|
* (ADR-003 / ADR-025). `entries` is keyed by account exactly as the keyring's username. */
|
|
128
142
|
export declare class InMemorySecretStore implements SecretStore {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/fake/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/fake/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
// In-memory fakes for tests — never touch the real SII / fs / clock.
|
|
2
|
+
import { HOSTS } from '../../config/index.js';
|
|
3
|
+
import { writeSession } from '../../auth/session.js';
|
|
4
|
+
import { initOperateState } from '../../identity/index.js';
|
|
1
5
|
export class FixedClock {
|
|
2
6
|
current;
|
|
3
7
|
/** Each `sleep(ms)` is recorded (not awaited) so a test can assert pacing without
|
|
@@ -72,9 +76,21 @@ export class FakePortalSession {
|
|
|
72
76
|
async requestText(url, options) {
|
|
73
77
|
this.lastTextRequest = options ? { url, options } : { url };
|
|
74
78
|
const r = this.script.requestText?.(url, options);
|
|
75
|
-
if (r
|
|
76
|
-
return { status: 200, body:
|
|
77
|
-
|
|
79
|
+
if (r !== undefined)
|
|
80
|
+
return typeof r === 'string' ? { status: 200, body: r } : r;
|
|
81
|
+
// Synthesise the Mi SII identity HTML (ADR-027): the auth flows now read `DatosCntrNow`
|
|
82
|
+
// from the landing's HTML, so a login/whoami/status fixture that set `datos` (or the older
|
|
83
|
+
// `evaluate: datos`) still serves identity without being rewritten.
|
|
84
|
+
if (url === HOSTS.miSii) {
|
|
85
|
+
// Pass a DatosCntrNow-flavoured expression so a fixture that branches its `evaluate` on the
|
|
86
|
+
// expression (the pre-ADR-027 `evaluate: (e) => e.includes('DatosCntrNow') ? … : …` style)
|
|
87
|
+
// returns the identity branch, not a map/else branch.
|
|
88
|
+
const d = this.script.datos?.() ?? this.script.evaluate?.('DatosCntrNow');
|
|
89
|
+
if (d !== undefined && d !== null) {
|
|
90
|
+
return { status: 200, body: `<script>var DatosCntrNow = ${JSON.stringify(d)};</script>` };
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { status: 200, body: '' };
|
|
78
94
|
}
|
|
79
95
|
/** The last requestBinary call — lets a test assert the download URL sent to SII. */
|
|
80
96
|
lastBinaryRequest = null;
|
|
@@ -158,6 +174,23 @@ export class InMemoryFileSink {
|
|
|
158
174
|
return path;
|
|
159
175
|
}
|
|
160
176
|
}
|
|
177
|
+
/** Seed an authenticated cookies-only session + operate state directly into a runtime's store
|
|
178
|
+
* — so a surface test that just needs "logged in as self" doesn't drive the login command
|
|
179
|
+
* (which, since ADR-027, prompts for a Clave on the CLI). Synthetic RUT, no SII touched. */
|
|
180
|
+
export async function seedSession(runtime, opts = {}) {
|
|
181
|
+
const rut = opts.rut ?? '11111111-1';
|
|
182
|
+
const accountType = opts.accountType ?? 'persona';
|
|
183
|
+
await writeSession(runtime.store, {
|
|
184
|
+
rut,
|
|
185
|
+
cookies: { cookies: [] },
|
|
186
|
+
savedAt: runtime.clock.now().toISOString(),
|
|
187
|
+
});
|
|
188
|
+
await initOperateState(runtime.store, {
|
|
189
|
+
selfRut: rut,
|
|
190
|
+
accountType,
|
|
191
|
+
operable: [{ rut, razonSocial: rut, isSelf: true }],
|
|
192
|
+
});
|
|
193
|
+
}
|
|
161
194
|
/** In-memory SecretStore: the keyring stand-in, so a test never reads the real one
|
|
162
195
|
* (ADR-003 / ADR-025). `entries` is keyed by account exactly as the keyring's username. */
|
|
163
196
|
export class InMemorySecretStore {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/fake/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/fake/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/** One cookie in Playwright's `storageState().cookies` shape — the persisted contract. */
|
|
2
|
+
export interface SerializedCookie {
|
|
3
|
+
name: string;
|
|
4
|
+
value: string;
|
|
5
|
+
domain: string;
|
|
6
|
+
path: string;
|
|
7
|
+
/** Epoch SECONDS; `-1` for a session cookie (Playwright's convention). */
|
|
8
|
+
expires: number;
|
|
9
|
+
httpOnly: boolean;
|
|
10
|
+
secure: boolean;
|
|
11
|
+
sameSite: 'Strict' | 'Lax' | 'None';
|
|
12
|
+
}
|
|
13
|
+
export declare class CookieJar {
|
|
14
|
+
private readonly cookies;
|
|
15
|
+
/** Apply the `Set-Cookie` header lines from a response received for `requestUrl`.
|
|
16
|
+
* `setCookieLines` is what `Headers.getSetCookie()` returns (one unfolded line each). */
|
|
17
|
+
applySetCookies(requestUrl: string, setCookieLines: readonly string[]): void;
|
|
18
|
+
private applyOne;
|
|
19
|
+
/** The `Cookie` request header value for `requestUrl` (matching cookies joined by `; `),
|
|
20
|
+
* or `null` when none match. Expired cookies are skipped (and evicted). */
|
|
21
|
+
header(requestUrl: string): string | null;
|
|
22
|
+
/** Value of a single cookie visible to `requestUrl` (e.g. the SPA `TOKEN`), or null. */
|
|
23
|
+
value(requestUrl: string, name: string): string | null;
|
|
24
|
+
/** The cookies-only storage state to persist (Playwright's shape, ADR-006/ADR-027). A
|
|
25
|
+
* non-host-only cookie is exported with a leading-dot `domain` — Playwright's convention
|
|
26
|
+
* for a shared cookie — so BOTH engines read the host-only/shared split back correctly. */
|
|
27
|
+
toStorageState(): {
|
|
28
|
+
cookies: SerializedCookie[];
|
|
29
|
+
};
|
|
30
|
+
/** Build a jar from a persisted storage state (either engine's). A leading-dot `domain`
|
|
31
|
+
* means a shared (non-host-only) cookie, a bare host means host-only — Playwright's
|
|
32
|
+
* convention. Tolerant of a missing `cookies` array (a garbage jar restores empty). */
|
|
33
|
+
static fromStorageState(state: unknown): CookieJar;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cookie-jar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie-jar.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/cookie-jar.ts"],"names":[],"mappings":"AAWA,0FAA0F;AAC1F,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;CACrC;AAUD,qBAAa,SAAS;IAEpB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IAExD;8FAC0F;IAC1F,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI;IAK5E,OAAO,CAAC,QAAQ;IAgFhB;gFAC4E;IAC5E,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAmBzC,wFAAwF;IACxF,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAYtD;;gGAE4F;IAC5F,cAAc,IAAI;QAAE,OAAO,EAAE,gBAAgB,EAAE,CAAA;KAAE;IAQjD;;4FAEwF;IACxF,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS;CAuBnD"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
// In-house cookie jar for the HTTP PortalDriver (ADR-027). SII's session rides entirely
|
|
2
|
+
// on cookies (observed 2026-10-17: a plain `fetch` login sets TOKEN / CSESSIONID /
|
|
3
|
+
// NETSCAPE_LIVEWIRE.* via Set-Cookie and NOTHING is set by page JS), so a small, correct
|
|
4
|
+
// jar replaces Playwright's context for every non-JS surface.
|
|
5
|
+
//
|
|
6
|
+
// No third-party cookie library (ADR-004 posture + a narrow, observed need): the jar
|
|
7
|
+
// models only what SII uses — Set-Cookie with Domain / Path / Max-Age / Expires / Secure /
|
|
8
|
+
// HttpOnly on one registrable domain (.sii.cl and its sub-hosts). It (de)serialises to the
|
|
9
|
+
// SAME shape Playwright's `storageState().cookies` uses, so a jar minted over HTTP restores
|
|
10
|
+
// into the browser engine and vice-versa — the session file is engine-agnostic (ADR-027).
|
|
11
|
+
const SESSION_EXPIRY = -1;
|
|
12
|
+
export class CookieJar {
|
|
13
|
+
// Keyed by name|domain|path (RFC 6265 cookie identity) so a re-Set overwrites in place.
|
|
14
|
+
cookies = new Map();
|
|
15
|
+
/** Apply the `Set-Cookie` header lines from a response received for `requestUrl`.
|
|
16
|
+
* `setCookieLines` is what `Headers.getSetCookie()` returns (one unfolded line each). */
|
|
17
|
+
applySetCookies(requestUrl, setCookieLines) {
|
|
18
|
+
const reqUrl = new URL(requestUrl);
|
|
19
|
+
for (const line of setCookieLines)
|
|
20
|
+
this.applyOne(reqUrl, line);
|
|
21
|
+
}
|
|
22
|
+
applyOne(reqUrl, line) {
|
|
23
|
+
const [pair, ...attrParts] = line.split(';');
|
|
24
|
+
if (pair === undefined)
|
|
25
|
+
return;
|
|
26
|
+
const eq = pair.indexOf('=');
|
|
27
|
+
if (eq < 1)
|
|
28
|
+
return; // no name — ignore
|
|
29
|
+
const name = pair.slice(0, eq).trim();
|
|
30
|
+
const value = pair.slice(eq + 1).trim();
|
|
31
|
+
let domain = reqUrl.hostname.toLowerCase();
|
|
32
|
+
let hostOnly = true;
|
|
33
|
+
// Default path is the request path's directory (RFC 6265 §5.1.4, simplified).
|
|
34
|
+
let path = defaultPath(reqUrl.pathname);
|
|
35
|
+
let expires = SESSION_EXPIRY;
|
|
36
|
+
let secure = false;
|
|
37
|
+
let httpOnly = false;
|
|
38
|
+
let sameSite = 'Lax';
|
|
39
|
+
let maxAgeDelete = false;
|
|
40
|
+
for (const attr of attrParts) {
|
|
41
|
+
const ieq = attr.indexOf('=');
|
|
42
|
+
const key = (ieq < 0 ? attr : attr.slice(0, ieq)).trim().toLowerCase();
|
|
43
|
+
const val = ieq < 0 ? '' : attr.slice(ieq + 1).trim();
|
|
44
|
+
switch (key) {
|
|
45
|
+
case 'domain':
|
|
46
|
+
if (val) {
|
|
47
|
+
domain = val.replace(/^\./, '').toLowerCase();
|
|
48
|
+
hostOnly = false;
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case 'path':
|
|
52
|
+
if (val.startsWith('/'))
|
|
53
|
+
path = val;
|
|
54
|
+
break;
|
|
55
|
+
case 'secure':
|
|
56
|
+
secure = true;
|
|
57
|
+
break;
|
|
58
|
+
case 'httponly':
|
|
59
|
+
httpOnly = true;
|
|
60
|
+
break;
|
|
61
|
+
case 'samesite':
|
|
62
|
+
sameSite = normalizeSameSite(val);
|
|
63
|
+
break;
|
|
64
|
+
case 'max-age': {
|
|
65
|
+
const secs = Number(val);
|
|
66
|
+
if (Number.isFinite(secs)) {
|
|
67
|
+
if (secs <= 0)
|
|
68
|
+
maxAgeDelete = true;
|
|
69
|
+
else
|
|
70
|
+
expires = Math.floor(Date.now() / 1000) + secs;
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case 'expires': {
|
|
75
|
+
const ms = Date.parse(val);
|
|
76
|
+
if (!Number.isNaN(ms)) {
|
|
77
|
+
if (ms <= Date.now())
|
|
78
|
+
maxAgeDelete = true;
|
|
79
|
+
else
|
|
80
|
+
expires = Math.floor(ms / 1000);
|
|
81
|
+
}
|
|
82
|
+
break;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const id = `${name}|${domain}|${path}`;
|
|
87
|
+
// An empty value or a past Max-Age/Expires is a deletion (SII clears the classic jar
|
|
88
|
+
// this way on logout / on the OAuth page). Drop the matching cookie.
|
|
89
|
+
if (value === '' || maxAgeDelete) {
|
|
90
|
+
this.cookies.delete(id);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
this.cookies.set(id, {
|
|
94
|
+
name,
|
|
95
|
+
value,
|
|
96
|
+
domain,
|
|
97
|
+
path,
|
|
98
|
+
expires,
|
|
99
|
+
httpOnly,
|
|
100
|
+
secure,
|
|
101
|
+
sameSite,
|
|
102
|
+
hostOnly,
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
/** The `Cookie` request header value for `requestUrl` (matching cookies joined by `; `),
|
|
106
|
+
* or `null` when none match. Expired cookies are skipped (and evicted). */
|
|
107
|
+
header(requestUrl) {
|
|
108
|
+
const url = new URL(requestUrl);
|
|
109
|
+
const host = url.hostname.toLowerCase();
|
|
110
|
+
const isHttps = url.protocol === 'https:';
|
|
111
|
+
const nowSecs = Math.floor(Date.now() / 1000);
|
|
112
|
+
const parts = [];
|
|
113
|
+
for (const [id, c] of this.cookies) {
|
|
114
|
+
if (c.expires !== SESSION_EXPIRY && c.expires <= nowSecs) {
|
|
115
|
+
this.cookies.delete(id);
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
if (c.secure && !isHttps)
|
|
119
|
+
continue;
|
|
120
|
+
if (!domainMatch(host, c.domain, c.hostOnly))
|
|
121
|
+
continue;
|
|
122
|
+
if (!pathMatch(url.pathname, c.path))
|
|
123
|
+
continue;
|
|
124
|
+
parts.push(`${c.name}=${c.value}`);
|
|
125
|
+
}
|
|
126
|
+
return parts.length ? parts.join('; ') : null;
|
|
127
|
+
}
|
|
128
|
+
/** Value of a single cookie visible to `requestUrl` (e.g. the SPA `TOKEN`), or null. */
|
|
129
|
+
value(requestUrl, name) {
|
|
130
|
+
const url = new URL(requestUrl);
|
|
131
|
+
const host = url.hostname.toLowerCase();
|
|
132
|
+
for (const c of this.cookies.values()) {
|
|
133
|
+
if (c.name !== name)
|
|
134
|
+
continue;
|
|
135
|
+
if (!domainMatch(host, c.domain, c.hostOnly))
|
|
136
|
+
continue;
|
|
137
|
+
if (!pathMatch(url.pathname, c.path))
|
|
138
|
+
continue;
|
|
139
|
+
return c.value;
|
|
140
|
+
}
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
/** The cookies-only storage state to persist (Playwright's shape, ADR-006/ADR-027). A
|
|
144
|
+
* non-host-only cookie is exported with a leading-dot `domain` — Playwright's convention
|
|
145
|
+
* for a shared cookie — so BOTH engines read the host-only/shared split back correctly. */
|
|
146
|
+
toStorageState() {
|
|
147
|
+
const cookies = [...this.cookies.values()].map(({ hostOnly, ...c }) => ({
|
|
148
|
+
...c,
|
|
149
|
+
domain: hostOnly ? c.domain : `.${c.domain}`,
|
|
150
|
+
}));
|
|
151
|
+
return { cookies };
|
|
152
|
+
}
|
|
153
|
+
/** Build a jar from a persisted storage state (either engine's). A leading-dot `domain`
|
|
154
|
+
* means a shared (non-host-only) cookie, a bare host means host-only — Playwright's
|
|
155
|
+
* convention. Tolerant of a missing `cookies` array (a garbage jar restores empty). */
|
|
156
|
+
static fromStorageState(state) {
|
|
157
|
+
const jar = new CookieJar();
|
|
158
|
+
const raw = state?.cookies;
|
|
159
|
+
if (!Array.isArray(raw))
|
|
160
|
+
return jar;
|
|
161
|
+
for (const c of raw) {
|
|
162
|
+
if (typeof c?.name !== 'string' || typeof c.domain !== 'string')
|
|
163
|
+
continue;
|
|
164
|
+
const hostOnly = !c.domain.startsWith('.');
|
|
165
|
+
const domain = c.domain.replace(/^\./, '').toLowerCase();
|
|
166
|
+
const path = c.path ?? '/';
|
|
167
|
+
jar.cookies.set(`${c.name}|${domain}|${path}`, {
|
|
168
|
+
name: c.name,
|
|
169
|
+
value: c.value ?? '',
|
|
170
|
+
domain,
|
|
171
|
+
path,
|
|
172
|
+
expires: typeof c.expires === 'number' ? c.expires : SESSION_EXPIRY,
|
|
173
|
+
httpOnly: c.httpOnly ?? false,
|
|
174
|
+
secure: c.secure ?? false,
|
|
175
|
+
sameSite: normalizeSameSite(c.sameSite ?? 'Lax'),
|
|
176
|
+
hostOnly,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return jar;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
function defaultPath(pathname) {
|
|
183
|
+
if (!pathname.startsWith('/'))
|
|
184
|
+
return '/';
|
|
185
|
+
const lastSlash = pathname.lastIndexOf('/');
|
|
186
|
+
return lastSlash <= 0 ? '/' : pathname.slice(0, lastSlash);
|
|
187
|
+
}
|
|
188
|
+
function domainMatch(host, cookieDomain, hostOnly) {
|
|
189
|
+
if (host === cookieDomain)
|
|
190
|
+
return true;
|
|
191
|
+
if (hostOnly)
|
|
192
|
+
return false;
|
|
193
|
+
return host.endsWith(`.${cookieDomain}`);
|
|
194
|
+
}
|
|
195
|
+
function pathMatch(requestPath, cookiePath) {
|
|
196
|
+
if (requestPath === cookiePath)
|
|
197
|
+
return true;
|
|
198
|
+
if (requestPath.startsWith(cookiePath)) {
|
|
199
|
+
return cookiePath.endsWith('/') || requestPath[cookiePath.length] === '/';
|
|
200
|
+
}
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
function normalizeSameSite(val) {
|
|
204
|
+
const v = val.toLowerCase();
|
|
205
|
+
if (v === 'strict')
|
|
206
|
+
return 'Strict';
|
|
207
|
+
if (v === 'none')
|
|
208
|
+
return 'None';
|
|
209
|
+
return 'Lax';
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=cookie-jar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cookie-jar.js","sourceRoot":"","sources":["../../../src/adapters/node/cookie-jar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CredentialLoginOptions, InteractiveLoginOptions, PortalDriver, PortalSession, PublicRequest, PublicResponse } from '../../seams/index.js';
|
|
2
|
+
/** The `fetch` implementation, injectable so tests drive a fake without a network (ADR-003). */
|
|
3
|
+
export type FetchLike = typeof globalThis.fetch;
|
|
4
|
+
export declare class HttpPortalDriver implements PortalDriver {
|
|
5
|
+
private readonly fetchImpl;
|
|
6
|
+
constructor(fetchImpl?: FetchLike);
|
|
7
|
+
interactiveLogin(_options: InteractiveLoginOptions): Promise<PortalSession>;
|
|
8
|
+
credentialLogin(options: CredentialLoginOptions): Promise<PortalSession>;
|
|
9
|
+
restore(storageState: unknown): Promise<PortalSession>;
|
|
10
|
+
requestPublic(url: string, options?: PublicRequest): Promise<PublicResponse>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../../src/adapters/node/http.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAGV,sBAAsB,EAEtB,uBAAuB,EAEvB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,cAAc,EAEf,MAAM,sBAAsB,CAAC;AAE9B,gGAAgG;AAChG,MAAM,MAAM,SAAS,GAAG,OAAO,UAAU,CAAC,KAAK,CAAC;AA0LhD,qBAAa,gBAAiB,YAAW,YAAY;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,GAAE,SAA4B;IAEpE,gBAAgB,CAAC,QAAQ,EAAE,uBAAuB,GAAG,OAAO,CAAC,aAAa,CAAC;IAKrE,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,aAAa,CAAC;IAgD9E,OAAO,CAAC,YAAY,EAAE,OAAO,GAAG,OAAO,CAAC,aAAa,CAAC;IAMhD,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,cAAc,CAAC;CAuBvF"}
|