diff --git a/webchannel/js/CODE_MAP.md b/webchannel/js/CODE_MAP.md new file mode 100644 index 0000000..d2f422f --- /dev/null +++ b/webchannel/js/CODE_MAP.md @@ -0,0 +1,166 @@ +# WebChannel JS Code Map + +This document provides a developer's guide and code map for the Google Closure-based WebChannel JavaScript client library (`webchannel/js`). + +--- + +## 1. Directory Structure + +Below is the directory layout of the `webchannel/js` project: + +``` +webchannel/js/ +├── CODE_MAP.md # This file +├── demo/ # Demo application for verification & testing +│ ├── index.html # HTML user interface for the demo +│ ├── demo.ts # TypeScript client-side demo code +│ ├── server.js # Minimal local Node.js web server +│ └── package.json # Build & run scripts for the demo +├── dist/ # Production bundled assets +│ ├── webchannel_blob_es2022.js # Compiled and bundled JS library +│ └── webchannel_blob_es2022.d.ts # TypeScript definitions for the bundle +└── imported_src/ # Core library source code (from Google Closure Library) + ├── channel.js # Core interface defining connection callbacks + ├── channelrequest.js # Wraps a single HTTP request (XHR / Fetch Streams) + ├── connectionstate.js # Stores connectivity state (handshake / buffering) + ├── environment.js # Origin trial and Chrome version detection + ├── forwardchannelrequestpool.js # Manages concurrent outgoing requests pool + ├── netutils.js # Network connectivity test utilities + ├── requeststats.js # Event logging and connection telemetry + ├── webchannelbase.js # Main protocol implementation (state machine, retries) + ├── webchannelbasetransport.js # Public wrapper bridging to standard WebChannel APIs + ├── webchanneldebug.js # Debug logging and payload redactor (for privacy) + ├── wire.js # Core wire protocol constants and structures + ├── wirev8.js # Version 8 protocol serializer/deserializer + ├── testing/ # Test infrastructure helper mocks + │ └── fakewebchannel.js # In-memory mock WebChannel for tests + └── tests/ # Unit tests for the modules + ├── channelrequest_test.js + ├── forwardchannelrequestpool_test.js + ├── webchannelbase_test.js + ├── webchannelbasetransport_test.js + └── wirev8_test.js +``` + +--- + +## 2. Core Architecture & Communication Flow + +The library handles bidirectional communication by wrapping raw HTTP requests into a protocol state machine. + +```mermaid +graph TD + ClientApp[Client Application] -->|Uses| Transport[WebChannelBaseTransport] + Transport -->|Creates| WebChannel[WebChannelBaseTransport.Channel] + WebChannel -->|Delegates to| WebChannelBase[WebChannelBase] + WebChannelBase -->|Manages concurrency| RequestPool[ForwardChannelRequestPool] + WebChannelBase -->|Creates network requests| ChannelRequest[ChannelRequest] + WebChannelBase -->|Serializes payload| WireV8[WireV8] + ChannelRequest -->|Triggers telemetry| RequestStats[RequestStats] + ChannelRequest -->|Performs HTTP| HTTP[XMLHttpRequest / Fetch API] + WebChannelBase -->|Logs activity| WebChannelDebug[WebChannelDebug] +``` + +### Component Interaction Flow +1. **Entry Point**: The application calls `createWebChannelTransport()` from [webchannel_blob_es2022.d.ts](dist/webchannel_blob_es2022.d.ts) to get a transport factory. +2. **Channel Instantiation**: The transport creates a high-level `WebChannel` implementation using [webchannelbasetransport.js](imported_src/webchannelbasetransport.js). +3. **Core Protocol**: This high-level wrapper delegates operations to [webchannelbase.js](imported_src/webchannelbase.js), which manages retry logic, buffering checks, handshakes, and switches between hanging-GET (streaming) back-channels and long-polling fallbacks. +4. **Serialization**: Data payloads are formatted by [wirev8.js](imported_src/wirev8.js) using the V8 wire protocol. +5. **Network Requests**: Outgoing messages are managed via the [forwardchannelrequestpool.js](imported_src/forwardchannelrequestpool.js) (which enforces single concurrency on HTTP/1.x or multi-request pooling on HTTP/2/SPDY). Individual requests are sent via [channelrequest.js](imported_src/channelrequest.js). + +--- + +## 3. Detailed Component Reference + +### Core Logic & Interfaces + +* **[imported_src/channel.js](imported_src/channel.js)** + * **Module**: `goog.labs.net.webChannel.Channel` + * **Role**: Defines the core interface for the channel implementation. It specifies abstract methods for creating XHRs, handling streaming headers, domain-limit fallbacks, checking connection states, and receiving request data/callbacks. +* **[imported_src/webchannelbase.js](imported_src/webchannelbase.js)** + * **Module**: `goog.labs.net.webChannel.WebChannelBase` + * **Role**: Implements the core protocol loop. It maintains the internal state machine (`INIT`, `OPENING`, `OPENED`, `CLOSED`), performs connection handshakes, schedules retry intervals based on network conditions, and handles server-defined host prefixes to bypass browser per-domain concurrent request limits. +* **[imported_src/webchannelbasetransport.js](imported_src/webchannelbasetransport.js)** + * **Module**: `goog.labs.net.webChannel.WebChannelBaseTransport` + * **Role**: Adapts the internal `WebChannelBase` protocol to match the public `goog.net.WebChannelTransport` and `goog.net.WebChannel` interfaces, providing standard event listeners (`OPEN`, `CLOSE`, `MESSAGE`, `ERROR`). +* **[imported_src/channelrequest.js](imported_src/channelrequest.js)** + * **Module**: `goog.labs.net.webChannel.ChannelRequest` + * **Role**: Encapsulates the execution of a single HTTP request (XHR or Fetch Streams). It manages browser-offline events, response chunk decoding, and timeout watchdog timers. + +### Protocol & Serialization + +* **[imported_src/wire.js](imported_src/wire.js)** + * **Module**: `goog.labs.net.webChannel.Wire` + * **Role**: Holds wire-format constants, specifically stating version support (`Wire.LATEST_CHANNEL_VERSION = 8`), and defines `Wire.QueuedMap` which holds unsent message payloads. +* **[imported_src/wirev8.js](imported_src/wirev8.js)** + * **Module**: `goog.labs.net.webChannel.WireV8` + * **Role**: Implements version 8 serialization. It converts message maps into URL-encoded parameters (compressing the keys using offsets relative to a base map ID) and decodes incoming JSON chunks. +* **[imported_src/forwardchannelrequestpool.js](imported_src/forwardchannelrequestpool.js)** + * **Module**: `goog.labs.net.webChannel.ForwardChannelRequestPool` + * **Role**: Manages concurrent outgoing client-to-server requests. If the browser uses HTTP/2, H2, or SPDY, concurrency is scaled up to 10 (default). Otherwise, it limits concurrency to exactly 1 request to prevent blocking standard HTTP/1.1 connections. + +### Telemetry, Logging & Utilities + +* **[imported_src/requeststats.js](imported_src/requeststats.js)** + * **Module**: `goog.labs.net.webChannel.requestStats` + * **Role**: Emits telemetry events related to server reachability and network statistics (latency, failures, buffering proxy statuses). Applications can subscribe to the singleton event target via `getStatEventTarget()`. +* **[imported_src/webchanneldebug.js](imported_src/webchanneldebug.js)** + * **Module**: `goog.labs.net.webChannel.WebChannelDebug` + * **Role**: Debug logger that wraps logging APIs. To protect user privacy, it includes a redactor (`maybeRedactPostData_` and `redactResponse_`) that scrubs non-system fields, preventing sensitive business/customer payloads from ending up in diagnostic log files. +* **[imported_src/netutils.js](imported_src/netutils.js)** + * **Module**: `goog.labs.net.webChannel.netUtils` + * **Role**: Provides helper diagnostics like `testNetwork`, which checks client reachability by loading a `cleardot.gif` image or pinging a server. +* **[imported_src/connectionstate.js](imported_src/connectionstate.js)** + * **Module**: `goog.labs.net.webChannel.ConnectionState` + * **Role**: Structure tracking buffering proxy detection results and handshake messages. +* **[imported_src/environment.js](imported_src/environment.js)** + * **Module**: `goog.labs.net.webChannel.environment` + * **Role**: Detects environments supporting Google's fetch upload streaming origin trials for `*.google.com` hosts. + +--- + +## 4. Dist Bundle (Public Interface) + +The built output is distributed under the `dist/` folder: +* **[dist/webchannel_blob_es2022.js](dist/webchannel_blob_es2022.js)**: Bundled JavaScript library transpiled to ES2022 standard. +* **[dist/webchannel_blob_es2022.d.ts](dist/webchannel_blob_es2022.d.ts)**: TypeScript declaration file defining key options, events, error codes, and factory functions: + * `createWebChannelTransport()`: Factory to instantiate the WebChannel transport. + * `getStatEventTarget()`: Telemetry event subscriber. + * `WebChannelOptions`: Configuration interface (includes options like `sendRawJson`, `detectBufferingProxy`, `forceLongPolling`, `fastHandshake`, `useFetchStreams`). + +--- + +## 5. Testing Infrastructure + +* **[imported_src/testing/fakewebchannel.js](imported_src/testing/fakewebchannel.js)** + * **Module**: `goog.labs.net.webChannel.testing.FakeWebChannel` + * **Role**: A mock implementation of the public `WebChannel` interface. It stores all "sent" messages in-memory so test cases can assert on sent payloads without triggering real networks. +* **Unit Tests**: + * Core test files are located under [imported_src/tests/](imported_src/tests/). + * Each JavaScript test runner (e.g., [channelrequest_test.js](imported_src/tests/channelrequest_test.js)) has a corresponding minimal HTML DOM file (e.g., [channelrequest_test_dom.html](imported_src/tests/channelrequest_test_dom.html)) designed for browser-based test runners. + +--- + +## 6. Running the Demo Application + +The `demo/` folder contains a TypeScript web app demonstrating library initialization and connectivity testing. + +### Demo Setup +* **[demo/index.html](demo/index.html)**: Front-end UI allowing developers to customize connectivity parameters and view logs. +* **[demo/demo.ts](demo/demo.ts)**: Interacts with the bundled WebChannel module, hooks into `OPEN`, `MESSAGE`, `ERROR`, and `CLOSE` events, and records round-trip echoes. +* **[demo/server.js](demo/server.js)**: Simple Node.js-based HTTP server to serve the demo assets locally. + +### How to Run: +1. Navigate to the demo directory: + ```bash + cd webchannel/js/demo + ``` +2. Install dev dependencies (e.g. `esbuild` for bundling TypeScript): + ```bash + npm install + ``` +3. Run the development build and start the server: + ```bash + npm start + ``` +4. Open your browser and navigate to `http://localhost:9000/`. diff --git a/webchannel/js/demo/package-lock.json b/webchannel/js/demo/package-lock.json index 851342a..eed90dd 100644 --- a/webchannel/js/demo/package-lock.json +++ b/webchannel/js/demo/package-lock.json @@ -13,7 +13,7 @@ }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", "cpu": [ "ppc64" @@ -30,7 +30,7 @@ }, "node_modules/@esbuild/android-arm": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", "cpu": [ "arm" @@ -47,7 +47,7 @@ }, "node_modules/@esbuild/android-arm64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", "cpu": [ "arm64" @@ -64,7 +64,7 @@ }, "node_modules/@esbuild/android-x64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", "cpu": [ "x64" @@ -81,7 +81,7 @@ }, "node_modules/@esbuild/darwin-arm64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", "cpu": [ "arm64" @@ -98,7 +98,7 @@ }, "node_modules/@esbuild/darwin-x64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", "cpu": [ "x64" @@ -115,7 +115,7 @@ }, "node_modules/@esbuild/freebsd-arm64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", "cpu": [ "arm64" @@ -132,7 +132,7 @@ }, "node_modules/@esbuild/freebsd-x64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", "cpu": [ "x64" @@ -149,7 +149,7 @@ }, "node_modules/@esbuild/linux-arm": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", "cpu": [ "arm" @@ -166,7 +166,7 @@ }, "node_modules/@esbuild/linux-arm64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", "cpu": [ "arm64" @@ -183,7 +183,7 @@ }, "node_modules/@esbuild/linux-ia32": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", "cpu": [ "ia32" @@ -200,7 +200,7 @@ }, "node_modules/@esbuild/linux-loong64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", "cpu": [ "loong64" @@ -217,7 +217,7 @@ }, "node_modules/@esbuild/linux-mips64el": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", "cpu": [ "mips64el" @@ -234,7 +234,7 @@ }, "node_modules/@esbuild/linux-ppc64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", "cpu": [ "ppc64" @@ -251,7 +251,7 @@ }, "node_modules/@esbuild/linux-riscv64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", "cpu": [ "riscv64" @@ -268,7 +268,7 @@ }, "node_modules/@esbuild/linux-s390x": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", "cpu": [ "s390x" @@ -285,7 +285,7 @@ }, "node_modules/@esbuild/linux-x64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", "cpu": [ "x64" @@ -302,7 +302,7 @@ }, "node_modules/@esbuild/netbsd-arm64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", "cpu": [ "arm64" @@ -319,7 +319,7 @@ }, "node_modules/@esbuild/netbsd-x64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", "cpu": [ "x64" @@ -336,7 +336,7 @@ }, "node_modules/@esbuild/openbsd-arm64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", "cpu": [ "arm64" @@ -353,7 +353,7 @@ }, "node_modules/@esbuild/openbsd-x64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", "cpu": [ "x64" @@ -370,7 +370,7 @@ }, "node_modules/@esbuild/openharmony-arm64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", "cpu": [ "arm64" @@ -387,7 +387,7 @@ }, "node_modules/@esbuild/sunos-x64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", "cpu": [ "x64" @@ -404,7 +404,7 @@ }, "node_modules/@esbuild/win32-arm64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", "cpu": [ "arm64" @@ -421,7 +421,7 @@ }, "node_modules/@esbuild/win32-ia32": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", "cpu": [ "ia32" @@ -438,7 +438,7 @@ }, "node_modules/@esbuild/win32-x64": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", "cpu": [ "x64" @@ -455,7 +455,7 @@ }, "node_modules/esbuild": { "version": "0.25.12", - "resolved": "https://us-npm.pkg.dev/artifact-foundry-prod/ah-3p-staging-npm/esbuild/-/esbuild-0.25.12.tgz", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", "dev": true, "hasInstallScript": true,