Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
146 lines
No EOL
4.2 KiB
Text
146 lines
No EOL
4.2 KiB
Text
/**
|
|
* @license
|
|
* Copyright 2023 Google Inc.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
import * as BidiMapper from 'chromium-bidi/lib/cjs/bidiMapper/BidiMapper.js';
|
|
import { debug } from '../common/Debug.js';
|
|
import { TargetCloseError } from '../common/Errors.js';
|
|
import { BidiConnection } from './Connection.js';
|
|
const bidiServerLogger = (prefix, ...args) => {
|
|
debug(`bidi:${prefix}`)(args);
|
|
};
|
|
/**
|
|
* @internal
|
|
*/
|
|
export async function connectBidiOverCdp(cdp) {
|
|
const transportBiDi = new NoOpTransport();
|
|
const cdpConnectionAdapter = new CdpConnectionAdapter(cdp);
|
|
const pptrTransport = {
|
|
send(message) {
|
|
// Forwards a BiDi command sent by Puppeteer to the input of the BidiServer.
|
|
transportBiDi.emitMessage(JSON.parse(message));
|
|
},
|
|
close() {
|
|
bidiServer.close();
|
|
cdpConnectionAdapter.close();
|
|
cdp.dispose();
|
|
},
|
|
onmessage(_message) {
|
|
// The method is overridden by the Connection.
|
|
},
|
|
};
|
|
transportBiDi.on('bidiResponse', (message) => {
|
|
// Forwards a BiDi event sent by BidiServer to Puppeteer.
|
|
pptrTransport.onmessage(JSON.stringify(message));
|
|
});
|
|
const pptrBiDiConnection = new BidiConnection(cdp.url(), pptrTransport, cdp._idGenerator, cdp.delay, cdp.timeout);
|
|
const bidiServer = await BidiMapper.BidiServer.createAndStart(transportBiDi, cdpConnectionAdapter, cdpConnectionAdapter.browserClient(),
|
|
/* selfTargetId= */ '', undefined, bidiServerLogger);
|
|
return pptrBiDiConnection;
|
|
}
|
|
/**
|
|
* Manages CDPSessions for BidiServer.
|
|
* @internal
|
|
*/
|
|
class CdpConnectionAdapter {
|
|
#cdp;
|
|
#adapters = new Map();
|
|
#browserCdpConnection;
|
|
constructor(cdp) {
|
|
this.#cdp = cdp;
|
|
this.#browserCdpConnection = new CDPClientAdapter(cdp);
|
|
}
|
|
browserClient() {
|
|
return this.#browserCdpConnection;
|
|
}
|
|
getCdpClient(id) {
|
|
const session = this.#cdp.session(id);
|
|
if (!session) {
|
|
throw new Error(`Unknown CDP session with id ${id}`);
|
|
}
|
|
if (!this.#adapters.has(session)) {
|
|
const adapter = new CDPClientAdapter(session, id, this.#browserCdpConnection);
|
|
this.#adapters.set(session, adapter);
|
|
return adapter;
|
|
}
|
|
return this.#adapters.get(session);
|
|
}
|
|
close() {
|
|
this.#browserCdpConnection.close();
|
|
for (const adapter of this.#adapters.values()) {
|
|
adapter.close();
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Wrapper on top of CDPSession/CDPConnection to satisfy CDP interface that
|
|
* BidiServer needs.
|
|
*
|
|
* @internal
|
|
*/
|
|
class CDPClientAdapter extends BidiMapper.EventEmitter {
|
|
#closed = false;
|
|
#client;
|
|
sessionId = undefined;
|
|
#browserClient;
|
|
constructor(client, sessionId, browserClient) {
|
|
super();
|
|
this.#client = client;
|
|
this.sessionId = sessionId;
|
|
this.#browserClient = browserClient;
|
|
this.#client.on('*', this.#forwardMessage);
|
|
}
|
|
browserClient() {
|
|
return this.#browserClient;
|
|
}
|
|
#forwardMessage = (method, event) => {
|
|
this.emit(method, event);
|
|
};
|
|
async sendCommand(method, ...params) {
|
|
if (this.#closed) {
|
|
return;
|
|
}
|
|
try {
|
|
return await this.#client.send(method, ...params);
|
|
}
|
|
catch (err) {
|
|
if (this.#closed) {
|
|
return;
|
|
}
|
|
throw err;
|
|
}
|
|
}
|
|
close() {
|
|
this.#client.off('*', this.#forwardMessage);
|
|
this.#closed = true;
|
|
}
|
|
isCloseError(error) {
|
|
return error instanceof TargetCloseError;
|
|
}
|
|
}
|
|
/**
|
|
* This transport is given to the BiDi server instance and allows Puppeteer
|
|
* to send and receive commands to the BiDiServer.
|
|
* @internal
|
|
*/
|
|
class NoOpTransport extends BidiMapper.EventEmitter {
|
|
#onMessage = async (_m) => {
|
|
return;
|
|
};
|
|
emitMessage(message) {
|
|
void this.#onMessage(message);
|
|
}
|
|
setOnMessage(onMessage) {
|
|
this.#onMessage = onMessage;
|
|
}
|
|
async sendMessage(message) {
|
|
this.emit('bidiResponse', message);
|
|
}
|
|
close() {
|
|
this.#onMessage = async (_m) => {
|
|
return;
|
|
};
|
|
}
|
|
}
|
|
//# sourceMappingURL=BidiOverCdp.js.map |