@wolfcola/devtools-bridge 0.0.0 → 1.0.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 +213 -0
- package/dist/src/index.d.ts +3 -6
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib/{bridge.d.ts → davinci-bridge.d.ts} +3 -6
- package/dist/src/lib/davinci-bridge.d.ts.map +1 -0
- package/dist/src/lib/{bridge.js → davinci-bridge.js} +28 -19
- package/dist/src/lib/davinci-bridge.js.map +1 -0
- package/dist/src/lib/emit.d.ts +5 -3
- package/dist/src/lib/emit.d.ts.map +1 -1
- package/dist/src/lib/emit.js +8 -8
- package/dist/src/lib/emit.js.map +1 -1
- package/dist/src/lib/journey-bridge.d.ts +2 -5
- package/dist/src/lib/journey-bridge.d.ts.map +1 -1
- package/dist/src/lib/journey-bridge.js +4 -7
- package/dist/src/lib/journey-bridge.js.map +1 -1
- package/dist/src/lib/oidc-bridge.d.ts +2 -5
- package/dist/src/lib/oidc-bridge.d.ts.map +1 -1
- package/dist/src/lib/oidc-bridge.js +3 -6
- package/dist/src/lib/oidc-bridge.js.map +1 -1
- package/dist/tsconfig.lib.tsbuildinfo +1 -1
- package/package.json +12 -4
- package/dist/src/lib/bridge.d.ts.map +0 -1
- package/dist/src/lib/bridge.js.map +0 -1
package/README.md
ADDED
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
# @wolfcola/devtools-bridge
|
|
2
|
+
|
|
3
|
+
Opt-in SDK adapter that connects your Ping Identity / ForgeRock application to WolfCola DevTools — either the [browser extension](../devtools-extension) or the [VS Code extension](../vscode-extension). Add it to your app in one line — it is a no-op when the extension is not installed, so it is safe to ship in production builds.
|
|
4
|
+
|
|
5
|
+
## Contents
|
|
6
|
+
|
|
7
|
+
- [Installation](#installation)
|
|
8
|
+
- [Bridges](#bridges)
|
|
9
|
+
- [DaVinci — `attachDevToolsBridge`](#davinci--attachdevtoolsbridge)
|
|
10
|
+
- [AM Journey — `attachJourneyBridge`](#am-journey--attachjourneybridge)
|
|
11
|
+
- [OIDC / OAuth — `attachOidcBridge`](#oidc--oauth--attachoidcbridge)
|
|
12
|
+
- [Low-level API](#low-level-api)
|
|
13
|
+
- [How it works](#how-it-works)
|
|
14
|
+
- [Safety](#safety)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## Installation
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
pnpm add @wolfcola/devtools-bridge
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
`effect` is a peer dependency. `@forgerock/davinci-client` is an optional peer dependency required only if you use `attachDevToolsBridge`.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Bridges
|
|
29
|
+
|
|
30
|
+
### DaVinci — `attachDevToolsBridge`
|
|
31
|
+
|
|
32
|
+
Subscribes to a DaVinci client store and emits `sdk:node-change` on every node status transition, plus `session:cookie` / `session:storage` diffs after each transition.
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { davinci } from '@forgerock/davinci-client';
|
|
36
|
+
import { attachDevToolsBridge } from '@wolfcola/devtools-bridge';
|
|
37
|
+
|
|
38
|
+
const client = await davinci({ config });
|
|
39
|
+
|
|
40
|
+
// Pass config as the second argument — emitted once as sdk:config on the first transition
|
|
41
|
+
const bridge = attachDevToolsBridge(client, config);
|
|
42
|
+
|
|
43
|
+
// Unsubscribe when the component unmounts
|
|
44
|
+
bridge.detach();
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
**What it captures per node transition:**
|
|
48
|
+
|
|
49
|
+
| Field | Source |
|
|
50
|
+
| ---------------- | --------------------------------------------- |
|
|
51
|
+
| `nodeStatus` | DaVinci node `.status` |
|
|
52
|
+
| `previousStatus` | Previous status (tracked locally) |
|
|
53
|
+
| `interactionId` | `server.interactionId` |
|
|
54
|
+
| `nodeName` | `client.name` |
|
|
55
|
+
| `collectors` | `client.collectors` (full objects) |
|
|
56
|
+
| `error` | `error.code / message / type` |
|
|
57
|
+
| `session` | `server.session` (DaVinci session token) |
|
|
58
|
+
| `responseBody` | Full DaVinci server response (from RTK cache) |
|
|
59
|
+
|
|
60
|
+
The bridge only emits when `nodeStatus` actually changes, so rapid store updates that don't advance the node do not generate noise.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
### AM Journey — `attachJourneyBridge`
|
|
65
|
+
|
|
66
|
+
Subscribes to a Journey RTK store and emits `sdk:journey-step` for each mutation that settles (`fulfilled` or `rejected`). Each event carries the full AM step response including all callbacks with their `input`/`output` arrays.
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
import { journey } from '@forgerock/journey-client'; // your RTK-based journey client
|
|
70
|
+
import { attachJourneyBridge } from '@wolfcola/devtools-bridge';
|
|
71
|
+
|
|
72
|
+
const client = await journey({ config });
|
|
73
|
+
|
|
74
|
+
attachJourneyBridge(client, config);
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
**`JourneySubscribable` interface** — any object with this shape works:
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
interface JourneySubscribable {
|
|
81
|
+
subscribe: (listener: () => void) => () => void;
|
|
82
|
+
getState: () => unknown; // must expose { journeyReducer: { mutations: Record<string, MutationEntry> } }
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
**Emitted events by step type:**
|
|
87
|
+
|
|
88
|
+
| `stepType` | When | Notable fields |
|
|
89
|
+
| -------------- | --------------------------------- | ------------------------------------------ |
|
|
90
|
+
| `Step` | AM returns `authId` | `callbacks`, `authId`, `stage`, `header` |
|
|
91
|
+
| `LoginSuccess` | AM returns `tokenId` | `tokenId`, `successUrl` |
|
|
92
|
+
| `LoginFailure` | AM returns an error / RTK rejects | `errorCode`, `errorMessage`, `errorReason` |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
### OIDC / OAuth — `attachOidcBridge`
|
|
97
|
+
|
|
98
|
+
Subscribes to an OIDC client RTK store and emits `sdk:oidc-state` for each settled mutation. Maps RTK endpoint names to human-readable phases.
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
import { oidcClient } from '@forgerock/oidc-client'; // your RTK-based OIDC client
|
|
102
|
+
import { attachOidcBridge } from '@wolfcola/devtools-bridge';
|
|
103
|
+
|
|
104
|
+
const client = oidcClient({ config });
|
|
105
|
+
|
|
106
|
+
attachOidcBridge(client, config);
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
**`OidcSubscribable` interface:**
|
|
110
|
+
|
|
111
|
+
```ts
|
|
112
|
+
interface OidcSubscribable {
|
|
113
|
+
subscribe: (listener: () => void) => () => void;
|
|
114
|
+
getState: () => unknown; // must expose { oidc: { mutations: Record<string, MutationEntry> } }
|
|
115
|
+
}
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**Endpoint → phase mapping:**
|
|
119
|
+
|
|
120
|
+
| RTK endpoint name | Emitted phase |
|
|
121
|
+
| ----------------- | ------------- |
|
|
122
|
+
| `authorizeFetch` | `authorize` |
|
|
123
|
+
| `authorizeIframe` | `authorize` |
|
|
124
|
+
| `exchange` | `exchange` |
|
|
125
|
+
| `revoke` | `revoke` |
|
|
126
|
+
| `userInfo` | `userinfo` |
|
|
127
|
+
| `endSession` | `logout` |
|
|
128
|
+
|
|
129
|
+
Pass `config.clientId` to surface it in the extension's node detail card:
|
|
130
|
+
|
|
131
|
+
```ts
|
|
132
|
+
attachOidcBridge(client, { clientId: 'my-spa-client', ...rest });
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Low-level API
|
|
138
|
+
|
|
139
|
+
If you need to emit events from outside a supported client, use the primitives directly.
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
import { emitAuthEvent, emitConfigEvent, DEVTOOLS_EVENT_NAME } from '@wolfcola/devtools-bridge';
|
|
143
|
+
|
|
144
|
+
emitAuthEvent({
|
|
145
|
+
id: crypto.randomUUID(),
|
|
146
|
+
timestamp: performance.now(),
|
|
147
|
+
type: 'sdk:node-change',
|
|
148
|
+
source: 'sdk',
|
|
149
|
+
flowId: null,
|
|
150
|
+
causedBy: null,
|
|
151
|
+
data: { _tag: 'sdk', nodeStatus: 'next' },
|
|
152
|
+
flags: { isCors: false, isError: false, isAuthRelated: true },
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
emitConfigEvent({ clientId: 'my-app', environment: 'dev' });
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
Both functions dispatch a `CustomEvent` named `DEVTOOLS_EVENT_NAME` (`'pingDevtools'`) on `window`. The content script picks this up and forwards it to the extension service worker.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## How it works
|
|
163
|
+
|
|
164
|
+
```
|
|
165
|
+
Your app
|
|
166
|
+
├── attachDevToolsBridge(davinciClient) ─┐
|
|
167
|
+
├── attachJourneyBridge(journeyClient) ─┤─ emitAuthEvent()
|
|
168
|
+
└── attachOidcBridge(oidcClient) ─┘
|
|
169
|
+
│
|
|
170
|
+
│ window.dispatchEvent(new CustomEvent('pingDevtools', { detail: event }))
|
|
171
|
+
▼
|
|
172
|
+
content-script.js
|
|
173
|
+
│
|
|
174
|
+
│ chrome.runtime.sendMessage({ type: 'SDK_EVENT', payload: event })
|
|
175
|
+
▼
|
|
176
|
+
service-worker.ts ──(validates via AuthEventSchema)──▶ EventStore
|
|
177
|
+
│
|
|
178
|
+
│ chrome.runtime.sendMessage({ type: 'EVENTS_UPDATED' })
|
|
179
|
+
▼
|
|
180
|
+
panel (Elm) ── Timeline view + Flow view
|
|
181
|
+
|
|
182
|
+
── OR (VS Code extension) ──
|
|
183
|
+
|
|
184
|
+
Your app
|
|
185
|
+
└── emitAuthEvent()
|
|
186
|
+
│
|
|
187
|
+
│ window.postMessage({ type: '__pingDevtools', ... })
|
|
188
|
+
▼
|
|
189
|
+
CDP-injected script (Page.addScriptToEvaluateOnNewDocument)
|
|
190
|
+
│
|
|
191
|
+
│ Runtime.bindingCalled('__wolfcolaBridge', payload)
|
|
192
|
+
▼
|
|
193
|
+
VS Code extension host ──▶ TreeView + WebView (Elm)
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
The VS Code extension captures SDK events via a CDP-injected script that listens for the same `__pingDevtools` postMessage — no browser extension needed.
|
|
197
|
+
|
|
198
|
+
Each bridge function:
|
|
199
|
+
|
|
200
|
+
1. Subscribes to the client store
|
|
201
|
+
2. Validates the current state with an Effect Schema decoder (returns `Option.none` on mismatch — never throws)
|
|
202
|
+
3. Deduplicates by tracking already-emitted request IDs in a `Set`
|
|
203
|
+
4. Trims that `Set` to only IDs still present in the store, bounding memory use
|
|
204
|
+
5. Dispatches the event only when `window.__PING_DEVTOOLS_EXTENSION__` is present
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Safety
|
|
209
|
+
|
|
210
|
+
- **No-op without the extension** — all bridges check for `window.__PING_DEVTOOLS_EXTENSION__` before dispatching. If the marker is absent, nothing is emitted.
|
|
211
|
+
- **No-op in SSR / Node** — all bridges return `{ detach: () => undefined }` immediately when `typeof window === 'undefined'`.
|
|
212
|
+
- **Tree-shakeable** — `sideEffects: false` in `package.json`; unused bridges are eliminated by your bundler.
|
|
213
|
+
- **No sensitive data leakage** — the bridge never reads passwords or form values; it only observes the client's Redux/RTK state.
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export type { BridgeHandle } from './lib/bridge.js';
|
|
1
|
+
export { attachDaVinciBridge } from './lib/davinci-bridge.js';
|
|
3
2
|
export { attachJourneyBridge } from './lib/journey-bridge.js';
|
|
4
|
-
export type { JourneyBridgeHandle } from './lib/journey-bridge.js';
|
|
5
3
|
export { attachOidcBridge } from './lib/oidc-bridge.js';
|
|
6
|
-
export
|
|
7
|
-
export {
|
|
8
|
-
export type { DevtoolsOptions } from './lib/emit.js';
|
|
4
|
+
export { DEVTOOLS_EVENT_NAME, emitAuthEvent, emitConfigEvent } from './lib/emit.js';
|
|
5
|
+
export type { BridgeHandle, DevtoolsOptions } from './lib/emit.js';
|
|
9
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACpF,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { attachDaVinciBridge } from './lib/davinci-bridge.js';
|
|
2
2
|
export { attachJourneyBridge } from './lib/journey-bridge.js';
|
|
3
3
|
export { attachOidcBridge } from './lib/oidc-bridge.js';
|
|
4
|
-
export { DEVTOOLS_EVENT_NAME, emitAuthEvent, emitConfigEvent
|
|
4
|
+
export { DEVTOOLS_EVENT_NAME, emitAuthEvent, emitConfigEvent } from './lib/emit.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Schema } from 'effect';
|
|
2
2
|
import type { SdkData } from '@wolfcola/devtools-types';
|
|
3
|
-
import type { DevtoolsOptions } from './emit.js';
|
|
3
|
+
import type { BridgeHandle, DevtoolsOptions } from './emit.js';
|
|
4
4
|
interface Subscribable {
|
|
5
5
|
subscribe: (listener: () => void) => () => void;
|
|
6
6
|
getNode: () => unknown;
|
|
@@ -8,9 +8,6 @@ interface Subscribable {
|
|
|
8
8
|
getCache: (requestId: string) => unknown;
|
|
9
9
|
};
|
|
10
10
|
}
|
|
11
|
-
export interface BridgeHandle {
|
|
12
|
-
detach: () => void;
|
|
13
|
-
}
|
|
14
11
|
export interface SdkConfig {
|
|
15
12
|
clientId?: string;
|
|
16
13
|
redirectUri?: string;
|
|
@@ -57,6 +54,6 @@ export declare function nodeToSdkData(node: DaVinciNode, previousStatus: string
|
|
|
57
54
|
*
|
|
58
55
|
* Returns a no-op handle when run outside a browser. Always call `detach()` on cleanup.
|
|
59
56
|
*/
|
|
60
|
-
export declare function
|
|
57
|
+
export declare function attachDaVinciBridge(client: Subscribable, config?: object, devtoolsOptions?: DevtoolsOptions): BridgeHandle;
|
|
61
58
|
export {};
|
|
62
|
-
//# sourceMappingURL=bridge.d.ts.map
|
|
59
|
+
//# sourceMappingURL=davinci-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"davinci-bridge.d.ts","sourceRoot":"","sources":["../../../src/lib/davinci-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAgB,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAGxD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE/D,UAAU,YAAY;IACpB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,OAAO,EAAE,MAAM,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE;QACN,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;KAC1C,CAAC;CACH;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD,QAAA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsBrB,CAAC;AAEH,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAQhE,wBAAgB,aAAa,CAC3B,IAAI,EAAE,WAAW,EACjB,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,YAAY,CAAC,EAAE,OAAO,GACrB,OAAO,CAmBT;AA2GD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,YAAY,EACpB,MAAM,CAAC,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,YAAY,CA8Cd"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Schema, Option, pipe } from 'effect';
|
|
2
2
|
import { SdkErrorSchema, SdkAuthorizationSchema } from '@wolfcola/devtools-types';
|
|
3
|
-
import { emitAuthEvent, emitConfigEvent
|
|
3
|
+
import { emitAuthEvent, emitConfigEvent } from './emit.js';
|
|
4
4
|
// ---------------------------------------------------------------------------
|
|
5
5
|
// DaVinci node schema — local structural contract, not a public type
|
|
6
6
|
// ---------------------------------------------------------------------------
|
|
@@ -49,14 +49,26 @@ export function nodeToSdkData(node, previousStatus, responseBody) {
|
|
|
49
49
|
}
|
|
50
50
|
function snapshotSession() {
|
|
51
51
|
const storage = {};
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
try {
|
|
53
|
+
for (let i = 0; i < localStorage.length; i++) {
|
|
54
|
+
const k = localStorage.key(i);
|
|
55
|
+
if (k)
|
|
56
|
+
storage[k] = localStorage.getItem(k) ?? '';
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
// localStorage access blocked (e.g. privacy mode, opaque origin)
|
|
61
|
+
}
|
|
62
|
+
let cookie = '';
|
|
63
|
+
try {
|
|
64
|
+
cookie = document.cookie;
|
|
56
65
|
}
|
|
57
|
-
|
|
66
|
+
catch {
|
|
67
|
+
// cookie access blocked
|
|
68
|
+
}
|
|
69
|
+
return { cookie, storage };
|
|
58
70
|
}
|
|
59
|
-
function emitSessionDiffs(before, after, flowId) {
|
|
71
|
+
function emitSessionDiffs(before, after, flowId, options) {
|
|
60
72
|
if (before.cookie !== after.cookie) {
|
|
61
73
|
emitAuthEvent({
|
|
62
74
|
id: crypto.randomUUID(),
|
|
@@ -72,7 +84,7 @@ function emitSessionDiffs(before, after, flowId) {
|
|
|
72
84
|
after: after.cookie || undefined,
|
|
73
85
|
},
|
|
74
86
|
flags: { isCors: false, isError: false, isAuthRelated: true },
|
|
75
|
-
});
|
|
87
|
+
}, options);
|
|
76
88
|
}
|
|
77
89
|
const allKeys = new Set([...Object.keys(before.storage), ...Object.keys(after.storage)]);
|
|
78
90
|
for (const key of allKeys) {
|
|
@@ -88,14 +100,14 @@ function emitSessionDiffs(before, after, flowId) {
|
|
|
88
100
|
causedBy: null,
|
|
89
101
|
data: { _tag: 'session', key, before: beforeVal, after: afterVal },
|
|
90
102
|
flags: { isCors: false, isError: false, isAuthRelated: true },
|
|
91
|
-
});
|
|
103
|
+
}, options);
|
|
92
104
|
}
|
|
93
105
|
}
|
|
94
106
|
}
|
|
95
107
|
// ---------------------------------------------------------------------------
|
|
96
108
|
// Event builders
|
|
97
109
|
// ---------------------------------------------------------------------------
|
|
98
|
-
function emitNodeChange(data) {
|
|
110
|
+
function emitNodeChange(data, options) {
|
|
99
111
|
emitAuthEvent({
|
|
100
112
|
id: crypto.randomUUID(),
|
|
101
113
|
timestamp: performance.now(),
|
|
@@ -109,7 +121,7 @@ function emitNodeChange(data) {
|
|
|
109
121
|
isError: data.nodeStatus === 'error' || data.nodeStatus === 'failure',
|
|
110
122
|
isAuthRelated: true,
|
|
111
123
|
},
|
|
112
|
-
});
|
|
124
|
+
}, options);
|
|
113
125
|
}
|
|
114
126
|
// ---------------------------------------------------------------------------
|
|
115
127
|
// Bridge
|
|
@@ -123,13 +135,10 @@ function emitNodeChange(data) {
|
|
|
123
135
|
*
|
|
124
136
|
* Returns a no-op handle when run outside a browser. Always call `detach()` on cleanup.
|
|
125
137
|
*/
|
|
126
|
-
export function
|
|
138
|
+
export function attachDaVinciBridge(client, config, devtoolsOptions) {
|
|
127
139
|
if (typeof window === 'undefined') {
|
|
128
140
|
return { detach: () => undefined };
|
|
129
141
|
}
|
|
130
|
-
if (devtoolsOptions) {
|
|
131
|
-
configureDevtools(devtoolsOptions);
|
|
132
|
-
}
|
|
133
142
|
let previousStatus;
|
|
134
143
|
let configEmitted = false;
|
|
135
144
|
let lastSnapshot = snapshotSession();
|
|
@@ -147,18 +156,18 @@ export function attachDevToolsBridge(client, config, devtoolsOptions) {
|
|
|
147
156
|
}), Option.filter(() => '__PING_DEVTOOLS_EXTENSION__' in window), Option.map((data) => {
|
|
148
157
|
if (config && !configEmitted) {
|
|
149
158
|
configEmitted = true;
|
|
150
|
-
emitConfigEvent(config);
|
|
159
|
+
emitConfigEvent(config, devtoolsOptions);
|
|
151
160
|
}
|
|
152
|
-
emitNodeChange(data);
|
|
161
|
+
emitNodeChange(data, devtoolsOptions);
|
|
153
162
|
// Snapshot before deferring so mutations in the same call stack are captured.
|
|
154
163
|
const snapshotBefore = lastSnapshot;
|
|
155
164
|
setTimeout(() => {
|
|
156
165
|
const snapshotAfter = snapshotSession();
|
|
157
|
-
emitSessionDiffs(snapshotBefore, snapshotAfter, data.interactionId ?? null);
|
|
166
|
+
emitSessionDiffs(snapshotBefore, snapshotAfter, data.interactionId ?? null, devtoolsOptions);
|
|
158
167
|
lastSnapshot = snapshotAfter;
|
|
159
168
|
}, 0);
|
|
160
169
|
}));
|
|
161
170
|
});
|
|
162
171
|
return { detach: unsubscribe };
|
|
163
172
|
}
|
|
164
|
-
//# sourceMappingURL=bridge.js.map
|
|
173
|
+
//# sourceMappingURL=davinci-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"davinci-bridge.js","sourceRoot":"","sources":["../../../src/lib/davinci-bridge.ts"],"names":[],"mappings":"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"}
|
package/dist/src/lib/emit.d.ts
CHANGED
|
@@ -3,12 +3,14 @@ export declare const DEVTOOLS_EVENT_NAME = "pingDevtools";
|
|
|
3
3
|
export interface DevtoolsOptions {
|
|
4
4
|
consoleLog?: boolean;
|
|
5
5
|
}
|
|
6
|
+
export interface BridgeHandle {
|
|
7
|
+
detach: () => void;
|
|
8
|
+
}
|
|
6
9
|
declare global {
|
|
7
10
|
interface Window {
|
|
8
11
|
__PING_DEVTOOLS_STATE__?: AuthEvent[];
|
|
9
12
|
}
|
|
10
13
|
}
|
|
11
|
-
export declare function
|
|
12
|
-
export declare function
|
|
13
|
-
export declare function emitConfigEvent(config: object): void;
|
|
14
|
+
export declare function emitAuthEvent(event: AuthEvent, options?: DevtoolsOptions): void;
|
|
15
|
+
export declare function emitConfigEvent(config: object, options?: DevtoolsOptions): void;
|
|
14
16
|
//# sourceMappingURL=emit.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/lib/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,uBAAuB,CAAC,EAAE,SAAS,EAAE,CAAC;KACvC;CACF;AAID,wBAAgB,
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../../src/lib/emit.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,eAAO,MAAM,mBAAmB,iBAAiB,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,IAAI,CAAC;CACpB;AAED,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,uBAAuB,CAAC,EAAE,SAAS,EAAE,CAAC;KACvC;CACF;AAID,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAmB/E;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,IAAI,CAc/E"}
|
package/dist/src/lib/emit.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
export const DEVTOOLS_EVENT_NAME = 'pingDevtools';
|
|
2
|
-
|
|
3
|
-
export function
|
|
4
|
-
options = opts;
|
|
5
|
-
}
|
|
6
|
-
export function emitAuthEvent(event) {
|
|
2
|
+
const MAX_STATE_ENTRIES = 500;
|
|
3
|
+
export function emitAuthEvent(event, options) {
|
|
7
4
|
if (typeof window === 'undefined')
|
|
8
5
|
return;
|
|
9
6
|
if (!window.__PING_DEVTOOLS_STATE__) {
|
|
10
7
|
window.__PING_DEVTOOLS_STATE__ = [];
|
|
11
8
|
}
|
|
12
9
|
window.__PING_DEVTOOLS_STATE__.push(event);
|
|
13
|
-
if (
|
|
10
|
+
if (window.__PING_DEVTOOLS_STATE__.length > MAX_STATE_ENTRIES) {
|
|
11
|
+
window.__PING_DEVTOOLS_STATE__.splice(0, window.__PING_DEVTOOLS_STATE__.length - MAX_STATE_ENTRIES);
|
|
12
|
+
}
|
|
13
|
+
if (options?.consoleLog) {
|
|
14
14
|
console.log('[ping-devtools]', event.type, event);
|
|
15
15
|
}
|
|
16
16
|
window.dispatchEvent(new CustomEvent(DEVTOOLS_EVENT_NAME, { detail: event }));
|
|
17
17
|
}
|
|
18
|
-
export function emitConfigEvent(config) {
|
|
18
|
+
export function emitConfigEvent(config, options) {
|
|
19
19
|
emitAuthEvent({
|
|
20
20
|
id: crypto.randomUUID(),
|
|
21
21
|
timestamp: performance.now(),
|
|
@@ -25,6 +25,6 @@ export function emitConfigEvent(config) {
|
|
|
25
25
|
causedBy: null,
|
|
26
26
|
data: { _tag: 'sdk-config', config },
|
|
27
27
|
flags: { isCors: false, isError: false, isAuthRelated: true },
|
|
28
|
-
});
|
|
28
|
+
}, options);
|
|
29
29
|
}
|
|
30
30
|
//# sourceMappingURL=emit.js.map
|
package/dist/src/lib/emit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/lib/emit.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../../src/lib/emit.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAgBlD,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAE9B,MAAM,UAAU,aAAa,CAAC,KAAgB,EAAE,OAAyB;IACvE,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO;IAE1C,IAAI,CAAC,MAAM,CAAC,uBAAuB,EAAE,CAAC;QACpC,MAAM,CAAC,uBAAuB,GAAG,EAAE,CAAC;IACtC,CAAC;IACD,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,MAAM,CAAC,uBAAuB,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QAC9D,MAAM,CAAC,uBAAuB,CAAC,MAAM,CACnC,CAAC,EACD,MAAM,CAAC,uBAAuB,CAAC,MAAM,GAAG,iBAAiB,CAC1D,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAc,EAAE,OAAyB;IACvE,aAAa,CACX;QACE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;QACvB,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE;QAC5B,IAAI,EAAE,YAAY;QAClB,MAAM,EAAE,KAAK;QACb,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;QACd,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE;QACpC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE;KAC9D,EACD,OAAO,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import type { DevtoolsOptions } from './emit.js';
|
|
2
|
-
export interface JourneyBridgeHandle {
|
|
3
|
-
detach: () => void;
|
|
4
|
-
}
|
|
1
|
+
import type { BridgeHandle, DevtoolsOptions } from './emit.js';
|
|
5
2
|
interface JourneySubscribable {
|
|
6
3
|
subscribe: (listener: () => void) => () => void;
|
|
7
4
|
getState: () => unknown;
|
|
8
5
|
}
|
|
9
|
-
export declare function attachJourneyBridge(client: JourneySubscribable, config?: object, devtoolsOptions?: DevtoolsOptions):
|
|
6
|
+
export declare function attachJourneyBridge(client: JourneySubscribable, config?: object, devtoolsOptions?: DevtoolsOptions): BridgeHandle;
|
|
10
7
|
export {};
|
|
11
8
|
//# sourceMappingURL=journey-bridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journey-bridge.d.ts","sourceRoot":"","sources":["../../../src/lib/journey-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"journey-bridge.d.ts","sourceRoot":"","sources":["../../../src/lib/journey-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG/D,UAAU,mBAAmB;IAC3B,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,QAAQ,EAAE,MAAM,OAAO,CAAC;CACzB;AA0FD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,mBAAmB,EAC3B,MAAM,CAAC,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,eAAe,GAChC,YAAY,CAiFd"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema, Option, pipe } from 'effect';
|
|
2
|
-
import { emitAuthEvent, emitConfigEvent
|
|
2
|
+
import { emitAuthEvent, emitConfigEvent } from './emit.js';
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
// Local schemas — structural contracts for RTK Query state, not public types
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
@@ -79,9 +79,6 @@ export function attachJourneyBridge(client, config, devtoolsOptions) {
|
|
|
79
79
|
if (typeof window === 'undefined') {
|
|
80
80
|
return { detach: () => undefined };
|
|
81
81
|
}
|
|
82
|
-
if (devtoolsOptions) {
|
|
83
|
-
configureDevtools(devtoolsOptions);
|
|
84
|
-
}
|
|
85
82
|
let configEmitted = false;
|
|
86
83
|
let emittedRequests = new Set();
|
|
87
84
|
const unsubscribe = client.subscribe(() => {
|
|
@@ -96,7 +93,7 @@ export function attachJourneyBridge(client, config, devtoolsOptions) {
|
|
|
96
93
|
pipe(rawEntry, decodeMutationEntry, Option.filter((entry) => entry.status === 'fulfilled' || entry.status === 'rejected'), Option.map((entry) => {
|
|
97
94
|
emittedRequests.add(requestId);
|
|
98
95
|
if (config && !configEmitted) {
|
|
99
|
-
emitConfigEvent(config);
|
|
96
|
+
emitConfigEvent(config, devtoolsOptions);
|
|
100
97
|
configEmitted = true;
|
|
101
98
|
}
|
|
102
99
|
if (entry.status === 'fulfilled') {
|
|
@@ -116,7 +113,7 @@ export function attachJourneyBridge(client, config, devtoolsOptions) {
|
|
|
116
113
|
isError: journeyData.stepType === 'LoginFailure',
|
|
117
114
|
isAuthRelated: true,
|
|
118
115
|
},
|
|
119
|
-
});
|
|
116
|
+
}, devtoolsOptions);
|
|
120
117
|
}
|
|
121
118
|
else {
|
|
122
119
|
const journeyData = {
|
|
@@ -133,7 +130,7 @@ export function attachJourneyBridge(client, config, devtoolsOptions) {
|
|
|
133
130
|
causedBy: null,
|
|
134
131
|
data: journeyData,
|
|
135
132
|
flags: { isCors: false, isError: true, isAuthRelated: true },
|
|
136
|
-
});
|
|
133
|
+
}, devtoolsOptions);
|
|
137
134
|
}
|
|
138
135
|
}));
|
|
139
136
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"journey-bridge.js","sourceRoot":"","sources":["../../../src/lib/journey-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"journey-bridge.js","sourceRoot":"","sources":["../../../src/lib/journey-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAS3D,8EAA8E;AAC9E,6EAA6E;AAC7E,8EAA8E;AAE9E,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,YAAY,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC;CACvC,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC;KAC7E,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC,mBAAmB,CAAC,CAAC;AAC5E,MAAM,kBAAkB,GAAG,MAAM,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;AAE1E,8EAA8E;AAC9E,4CAA4C;AAC5C,8EAA8E;AAE9E,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAC1C,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,IAAI,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACtC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACrC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACtC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IAC3C,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;CACzD,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,iBAAiB,CAAC,CAAC;AAExE,SAAS,wBAAwB,CAAC,IAAa;IAC7C,OAAO,IAAI,CACT,IAAI,EACJ,iBAAiB,EACjB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAClB,MAAM,QAAQ,GAA4B,IAAI,CAAC,MAAM;YACnD,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,IAAI,CAAC,UAAU;gBACf,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,cAAc,CAAC;QAErB,OAAO;YACL,IAAI,EAAE,SAAkB;YACxB,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC9D,YAAY,EAAE,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;YACpE,WAAW,EAAE,QAAQ,KAAK,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAC7C,CAAC;IAC1B,CAAC,CAAC,EACF,MAAM,CAAC,SAAS,CACjB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAc;IACzC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;QAC1D,IAAI,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,CAA4B,CAAC;YAC/C,IAAI,OAAO,CAAC,CAAC,SAAS,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,UAAU,mBAAmB,CACjC,MAA2B,EAC3B,MAAe,EACf,eAAiC;IAEjC,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QAClC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;IACrC,CAAC;IAED,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE;QACxC,IAAI,CAAC,CAAC,6BAA6B,IAAI,MAAM,CAAC;YAAE,OAAO;QAEvD,IAAI,CACF,MAAM,CAAC,QAAQ,EAAE,EACjB,kBAAkB,EAClB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE;YAC/C,8DAA8D;YAC9D,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,SAAS,CAAC,CAAC,CAAC;YAEhF,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC9D,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;oBAAE,SAAS;gBAE7C,IAAI,CACF,QAAQ,EACR,mBAAmB,EACnB,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,EACrF,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;oBACnB,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBAE/B,IAAI,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;wBAC7B,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;wBACzC,aAAa,GAAG,IAAI,CAAC;oBACvB,CAAC;oBAED,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;wBACjC,MAAM,WAAW,GAAG,wBAAwB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBACzD,IAAI,CAAC,WAAW;4BAAE,OAAO;wBACzB,aAAa,CACX;4BACE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;4BACvB,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE;4BAC5B,IAAI,EAAE,kBAAkB;4BACxB,MAAM,EAAE,KAAK;4BACb,MAAM,EAAE,IAAI;4BACZ,QAAQ,EAAE,IAAI;4BACd,IAAI,EAAE,WAAW;4BACjB,KAAK,EAAE;gCACL,MAAM,EAAE,KAAK;gCACb,OAAO,EAAE,WAAW,CAAC,QAAQ,KAAK,cAAc;gCAChD,aAAa,EAAE,IAAI;6BACpB;yBACF,EACD,eAAe,CAChB,CAAC;oBACJ,CAAC;yBAAM,CAAC;wBACN,MAAM,WAAW,GAAgB;4BAC/B,IAAI,EAAE,SAAS;4BACf,QAAQ,EAAE,cAAc;4BACxB,YAAY,EAAE,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC;yBAC/C,CAAC;wBACF,aAAa,CACX;4BACE,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;4BACvB,SAAS,EAAE,WAAW,CAAC,GAAG,EAAE;4BAC5B,IAAI,EAAE,kBAAkB;4BACxB,MAAM,EAAE,KAAK;4BACb,MAAM,EAAE,IAAI;4BACZ,QAAQ,EAAE,IAAI;4BACd,IAAI,EAAE,WAAW;4BACjB,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;yBAC7D,EACD,eAAe,CAChB,CAAC;oBACJ,CAAC;gBACH,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -1,13 +1,10 @@
|
|
|
1
|
-
import type { DevtoolsOptions } from './emit.js';
|
|
2
|
-
export interface OidcBridgeHandle {
|
|
3
|
-
detach: () => void;
|
|
4
|
-
}
|
|
1
|
+
import type { BridgeHandle, DevtoolsOptions } from './emit.js';
|
|
5
2
|
interface OidcSubscribable {
|
|
6
3
|
subscribe: (listener: () => void) => () => void;
|
|
7
4
|
getState: () => unknown;
|
|
8
5
|
}
|
|
9
6
|
export declare function attachOidcBridge(client: OidcSubscribable, config?: {
|
|
10
7
|
clientId?: string;
|
|
11
|
-
} & object, devtoolsOptions?: DevtoolsOptions):
|
|
8
|
+
} & object, devtoolsOptions?: DevtoolsOptions): BridgeHandle;
|
|
12
9
|
export {};
|
|
13
10
|
//# sourceMappingURL=oidc-bridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oidc-bridge.d.ts","sourceRoot":"","sources":["../../../src/lib/oidc-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"oidc-bridge.d.ts","sourceRoot":"","sources":["../../../src/lib/oidc-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG/D,UAAU,gBAAgB;IACxB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAChD,QAAQ,EAAE,MAAM,OAAO,CAAC;CACzB;AAqFD,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,gBAAgB,EACxB,MAAM,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,EACvC,eAAe,CAAC,EAAE,eAAe,GAChC,YAAY,CAqEd"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Schema, Option, pipe } from 'effect';
|
|
2
|
-
import { emitAuthEvent, emitConfigEvent
|
|
2
|
+
import { emitAuthEvent, emitConfigEvent } from './emit.js';
|
|
3
3
|
// ---------------------------------------------------------------------------
|
|
4
4
|
// Local schemas — structural contracts for RTK Query state, not public types
|
|
5
5
|
// ---------------------------------------------------------------------------
|
|
@@ -70,9 +70,6 @@ export function attachOidcBridge(client, config, devtoolsOptions) {
|
|
|
70
70
|
if (typeof window === 'undefined') {
|
|
71
71
|
return { detach: () => undefined };
|
|
72
72
|
}
|
|
73
|
-
if (devtoolsOptions) {
|
|
74
|
-
configureDevtools(devtoolsOptions);
|
|
75
|
-
}
|
|
76
73
|
let configEmitted = false;
|
|
77
74
|
let emittedRequests = new Set();
|
|
78
75
|
const unsubscribe = client.subscribe(() => {
|
|
@@ -87,7 +84,7 @@ export function attachOidcBridge(client, config, devtoolsOptions) {
|
|
|
87
84
|
pipe(rawEntry, decodeMutationEntry, Option.filter((entry) => entry.status === 'fulfilled' || entry.status === 'rejected'), Option.map((entry) => {
|
|
88
85
|
emittedRequests.add(requestId);
|
|
89
86
|
if (config && !configEmitted) {
|
|
90
|
-
emitConfigEvent(config);
|
|
87
|
+
emitConfigEvent(config, devtoolsOptions);
|
|
91
88
|
configEmitted = true;
|
|
92
89
|
}
|
|
93
90
|
const oidcData = mutationToOidcData(entry.endpointName, entry.status, entry.error, config?.clientId);
|
|
@@ -106,7 +103,7 @@ export function attachOidcBridge(client, config, devtoolsOptions) {
|
|
|
106
103
|
isError: oidcData.status === 'error',
|
|
107
104
|
isAuthRelated: true,
|
|
108
105
|
},
|
|
109
|
-
});
|
|
106
|
+
}, devtoolsOptions);
|
|
110
107
|
}));
|
|
111
108
|
}
|
|
112
109
|
}));
|