@heojeongbo/wirestage 0.0.0-stage → 0.1.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/LICENSE +21 -0
- package/LICENSES.md +21 -0
- package/README.md +150 -2
- package/dist/app/playwright/index.d.ts +3 -0
- package/dist/app/playwright/index.d.ts.map +1 -0
- package/dist/app/playwright/index.js +2 -0
- package/dist/app/playwright/index.js.map +1 -0
- package/dist/app/playwright/lib/fixture.d.ts +61 -0
- package/dist/app/playwright/lib/fixture.d.ts.map +1 -0
- package/dist/app/playwright/lib/fixture.js +110 -0
- package/dist/app/playwright/lib/fixture.js.map +1 -0
- package/dist/connect.d.ts +7 -0
- package/dist/connect.d.ts.map +1 -0
- package/dist/connect.js +7 -0
- package/dist/connect.js.map +1 -0
- package/dist/entities/frame/@x/plugin.d.ts +9 -0
- package/dist/entities/frame/@x/plugin.d.ts.map +1 -0
- package/dist/entities/frame/@x/plugin.js +2 -0
- package/dist/entities/frame/@x/plugin.js.map +1 -0
- package/dist/entities/frame/index.d.ts +6 -0
- package/dist/entities/frame/index.d.ts.map +1 -0
- package/dist/entities/frame/index.js +4 -0
- package/dist/entities/frame/index.js.map +1 -0
- package/dist/entities/frame/lib/filter.d.ts +8 -0
- package/dist/entities/frame/lib/filter.d.ts.map +1 -0
- package/dist/entities/frame/lib/filter.js +62 -0
- package/dist/entities/frame/lib/filter.js.map +1 -0
- package/dist/entities/frame/lib/payload.d.ts +8 -0
- package/dist/entities/frame/lib/payload.d.ts.map +1 -0
- package/dist/entities/frame/lib/payload.js +42 -0
- package/dist/entities/frame/lib/payload.js.map +1 -0
- package/dist/entities/frame/lib/snapshot.d.ts +15 -0
- package/dist/entities/frame/lib/snapshot.d.ts.map +1 -0
- package/dist/entities/frame/lib/snapshot.js +90 -0
- package/dist/entities/frame/lib/snapshot.js.map +1 -0
- package/dist/entities/frame/lib/timeline.d.ts +23 -0
- package/dist/entities/frame/lib/timeline.d.ts.map +1 -0
- package/dist/entities/frame/lib/timeline.js +122 -0
- package/dist/entities/frame/lib/timeline.js.map +1 -0
- package/dist/entities/frame/model/frame.d.ts +182 -0
- package/dist/entities/frame/model/frame.d.ts.map +1 -0
- package/dist/entities/frame/model/frame.js +2 -0
- package/dist/entities/frame/model/frame.js.map +1 -0
- package/dist/entities/plugin/index.d.ts +9 -0
- package/dist/entities/plugin/index.d.ts.map +1 -0
- package/dist/entities/plugin/index.js +3 -0
- package/dist/entities/plugin/index.js.map +1 -0
- package/dist/entities/plugin/lib/define-plugin.d.ts +8 -0
- package/dist/entities/plugin/lib/define-plugin.d.ts.map +1 -0
- package/dist/entities/plugin/lib/define-plugin.js +9 -0
- package/dist/entities/plugin/lib/define-plugin.js.map +1 -0
- package/dist/entities/plugin/lib/named.d.ts +10 -0
- package/dist/entities/plugin/lib/named.d.ts.map +1 -0
- package/dist/entities/plugin/lib/named.js +17 -0
- package/dist/entities/plugin/lib/named.js.map +1 -0
- package/dist/entities/plugin/model/attachment.d.ts +18 -0
- package/dist/entities/plugin/model/attachment.d.ts.map +1 -0
- package/dist/entities/plugin/model/attachment.js +2 -0
- package/dist/entities/plugin/model/attachment.js.map +1 -0
- package/dist/entities/plugin/model/http.d.ts +126 -0
- package/dist/entities/plugin/model/http.d.ts.map +1 -0
- package/dist/entities/plugin/model/http.js +2 -0
- package/dist/entities/plugin/model/http.js.map +1 -0
- package/dist/entities/plugin/model/page.d.ts +100 -0
- package/dist/entities/plugin/model/page.d.ts.map +1 -0
- package/dist/entities/plugin/model/page.js +2 -0
- package/dist/entities/plugin/model/page.js.map +1 -0
- package/dist/entities/plugin/model/plugin.d.ts +83 -0
- package/dist/entities/plugin/model/plugin.d.ts.map +1 -0
- package/dist/entities/plugin/model/plugin.js +2 -0
- package/dist/entities/plugin/model/plugin.js.map +1 -0
- package/dist/entities/plugin/model/socket.d.ts +102 -0
- package/dist/entities/plugin/model/socket.d.ts.map +1 -0
- package/dist/entities/plugin/model/socket.js +2 -0
- package/dist/entities/plugin/model/socket.js.map +1 -0
- package/dist/entities/plugin/model/stream.d.ts +43 -0
- package/dist/entities/plugin/model/stream.d.ts.map +1 -0
- package/dist/entities/plugin/model/stream.js +2 -0
- package/dist/entities/plugin/model/stream.js.map +1 -0
- package/dist/features/connect/index.d.ts +5 -0
- package/dist/features/connect/index.d.ts.map +1 -0
- package/dist/features/connect/index.js +4 -0
- package/dist/features/connect/index.js.map +1 -0
- package/dist/features/connect/lib/calls.d.ts +9 -0
- package/dist/features/connect/lib/calls.d.ts.map +1 -0
- package/dist/features/connect/lib/calls.js +46 -0
- package/dist/features/connect/lib/calls.js.map +1 -0
- package/dist/features/connect/lib/client.d.ts +33 -0
- package/dist/features/connect/lib/client.d.ts.map +1 -0
- package/dist/features/connect/lib/client.js +147 -0
- package/dist/features/connect/lib/client.js.map +1 -0
- package/dist/features/connect/lib/create-connect.d.ts +14 -0
- package/dist/features/connect/lib/create-connect.d.ts.map +1 -0
- package/dist/features/connect/lib/create-connect.js +124 -0
- package/dist/features/connect/lib/create-connect.js.map +1 -0
- package/dist/features/connect/lib/faults.d.ts +18 -0
- package/dist/features/connect/lib/faults.d.ts.map +1 -0
- package/dist/features/connect/lib/faults.js +85 -0
- package/dist/features/connect/lib/faults.js.map +1 -0
- package/dist/features/connect/lib/protocol.d.ts +42 -0
- package/dist/features/connect/lib/protocol.d.ts.map +1 -0
- package/dist/features/connect/lib/protocol.js +228 -0
- package/dist/features/connect/lib/protocol.js.map +1 -0
- package/dist/features/connect/lib/record.d.ts +14 -0
- package/dist/features/connect/lib/record.d.ts.map +1 -0
- package/dist/features/connect/lib/record.js +36 -0
- package/dist/features/connect/lib/record.js.map +1 -0
- package/dist/features/connect/lib/recorder.d.ts +77 -0
- package/dist/features/connect/lib/recorder.d.ts.map +1 -0
- package/dist/features/connect/lib/recorder.js +209 -0
- package/dist/features/connect/lib/recorder.js.map +1 -0
- package/dist/features/connect/lib/rules.d.ts +51 -0
- package/dist/features/connect/lib/rules.d.ts.map +1 -0
- package/dist/features/connect/lib/rules.js +222 -0
- package/dist/features/connect/lib/rules.js.map +1 -0
- package/dist/features/connect/lib/serve.d.ts +10 -0
- package/dist/features/connect/lib/serve.d.ts.map +1 -0
- package/dist/features/connect/lib/serve.js +78 -0
- package/dist/features/connect/lib/serve.js.map +1 -0
- package/dist/features/connect/lib/status-of.d.ts +11 -0
- package/dist/features/connect/lib/status-of.d.ts.map +1 -0
- package/dist/features/connect/lib/status-of.js +22 -0
- package/dist/features/connect/lib/status-of.js.map +1 -0
- package/dist/features/connect/lib/stubs.d.ts +18 -0
- package/dist/features/connect/lib/stubs.d.ts.map +1 -0
- package/dist/features/connect/lib/stubs.js +174 -0
- package/dist/features/connect/lib/stubs.js.map +1 -0
- package/dist/features/connect/lib/universal.d.ts +19 -0
- package/dist/features/connect/lib/universal.d.ts.map +1 -0
- package/dist/features/connect/lib/universal.js +71 -0
- package/dist/features/connect/lib/universal.js.map +1 -0
- package/dist/features/connect/model/types.d.ts +247 -0
- package/dist/features/connect/model/types.d.ts.map +1 -0
- package/dist/features/connect/model/types.js +2 -0
- package/dist/features/connect/model/types.js.map +1 -0
- package/dist/features/rest/index.d.ts +5 -0
- package/dist/features/rest/index.d.ts.map +1 -0
- package/dist/features/rest/index.js +3 -0
- package/dist/features/rest/index.js.map +1 -0
- package/dist/features/rest/lib/calls.d.ts +8 -0
- package/dist/features/rest/lib/calls.d.ts.map +1 -0
- package/dist/features/rest/lib/calls.js +32 -0
- package/dist/features/rest/lib/calls.js.map +1 -0
- package/dist/features/rest/lib/create-rest.d.ts +8 -0
- package/dist/features/rest/lib/create-rest.d.ts.map +1 -0
- package/dist/features/rest/lib/create-rest.js +136 -0
- package/dist/features/rest/lib/create-rest.js.map +1 -0
- package/dist/features/rest/lib/path.d.ts +14 -0
- package/dist/features/rest/lib/path.d.ts.map +1 -0
- package/dist/features/rest/lib/path.js +58 -0
- package/dist/features/rest/lib/path.js.map +1 -0
- package/dist/features/rest/lib/reply.d.ts +25 -0
- package/dist/features/rest/lib/reply.d.ts.map +1 -0
- package/dist/features/rest/lib/reply.js +40 -0
- package/dist/features/rest/lib/reply.js.map +1 -0
- package/dist/features/rest/model/types.d.ts +74 -0
- package/dist/features/rest/model/types.d.ts.map +1 -0
- package/dist/features/rest/model/types.js +2 -0
- package/dist/features/rest/model/types.js.map +1 -0
- package/dist/features/sse/index.d.ts +4 -0
- package/dist/features/sse/index.d.ts.map +1 -0
- package/dist/features/sse/index.js +3 -0
- package/dist/features/sse/index.js.map +1 -0
- package/dist/features/sse/lib/create-sse.d.ts +9 -0
- package/dist/features/sse/lib/create-sse.d.ts.map +1 -0
- package/dist/features/sse/lib/create-sse.js +120 -0
- package/dist/features/sse/lib/create-sse.js.map +1 -0
- package/dist/features/sse/lib/encode.d.ts +8 -0
- package/dist/features/sse/lib/encode.d.ts.map +1 -0
- package/dist/features/sse/lib/encode.js +29 -0
- package/dist/features/sse/lib/encode.js.map +1 -0
- package/dist/features/sse/model/types.d.ts +62 -0
- package/dist/features/sse/model/types.d.ts.map +1 -0
- package/dist/features/sse/model/types.js +2 -0
- package/dist/features/sse/model/types.js.map +1 -0
- package/dist/features/webrtc/index.d.ts +3 -0
- package/dist/features/webrtc/index.d.ts.map +1 -0
- package/dist/features/webrtc/index.js +2 -0
- package/dist/features/webrtc/index.js.map +1 -0
- package/dist/features/webrtc/lib/create-webrtc.d.ts +9 -0
- package/dist/features/webrtc/lib/create-webrtc.d.ts.map +1 -0
- package/dist/features/webrtc/lib/create-webrtc.js +123 -0
- package/dist/features/webrtc/lib/create-webrtc.js.map +1 -0
- package/dist/features/webrtc/lib/rtc-page-module.d.ts +22 -0
- package/dist/features/webrtc/lib/rtc-page-module.d.ts.map +1 -0
- package/dist/features/webrtc/lib/rtc-page-module.js +161 -0
- package/dist/features/webrtc/lib/rtc-page-module.js.map +1 -0
- package/dist/features/webrtc/lib/to-frame.d.ts +9 -0
- package/dist/features/webrtc/lib/to-frame.d.ts.map +1 -0
- package/dist/features/webrtc/lib/to-frame.js +43 -0
- package/dist/features/webrtc/lib/to-frame.js.map +1 -0
- package/dist/features/webrtc/model/types.d.ts +70 -0
- package/dist/features/webrtc/model/types.d.ts.map +1 -0
- package/dist/features/webrtc/model/types.js +2 -0
- package/dist/features/webrtc/model/types.js.map +1 -0
- package/dist/features/websocket/index.d.ts +3 -0
- package/dist/features/websocket/index.d.ts.map +1 -0
- package/dist/features/websocket/index.js +2 -0
- package/dist/features/websocket/index.js.map +1 -0
- package/dist/features/websocket/lib/create-websocket.d.ts +9 -0
- package/dist/features/websocket/lib/create-websocket.d.ts.map +1 -0
- package/dist/features/websocket/lib/create-websocket.js +34 -0
- package/dist/features/websocket/lib/create-websocket.js.map +1 -0
- package/dist/features/websocket/lib/mock.d.ts +6 -0
- package/dist/features/websocket/lib/mock.d.ts.map +1 -0
- package/dist/features/websocket/lib/mock.js +96 -0
- package/dist/features/websocket/lib/mock.js.map +1 -0
- package/dist/features/websocket/lib/proxy.d.ts +9 -0
- package/dist/features/websocket/lib/proxy.d.ts.map +1 -0
- package/dist/features/websocket/lib/proxy.js +107 -0
- package/dist/features/websocket/lib/proxy.js.map +1 -0
- package/dist/features/websocket/lib/wire.d.ts +16 -0
- package/dist/features/websocket/lib/wire.d.ts.map +1 -0
- package/dist/features/websocket/lib/wire.js +46 -0
- package/dist/features/websocket/lib/wire.js.map +1 -0
- package/dist/features/websocket/model/types.d.ts +129 -0
- package/dist/features/websocket/model/types.d.ts.map +1 -0
- package/dist/features/websocket/model/types.js +2 -0
- package/dist/features/websocket/model/types.js.map +1 -0
- package/dist/index.d.ts +27 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/playwright.d.ts +4 -0
- package/dist/playwright.d.ts.map +1 -0
- package/dist/playwright.js +2 -0
- package/dist/playwright.js.map +1 -0
- package/dist/rest.d.ts +3 -0
- package/dist/rest.d.ts.map +1 -0
- package/dist/rest.js +3 -0
- package/dist/rest.js.map +1 -0
- package/dist/shared/api/http-server/index.d.ts +3 -0
- package/dist/shared/api/http-server/index.d.ts.map +1 -0
- package/dist/shared/api/http-server/index.js +2 -0
- package/dist/shared/api/http-server/index.js.map +1 -0
- package/dist/shared/api/http-server/listen.d.ts +25 -0
- package/dist/shared/api/http-server/listen.d.ts.map +1 -0
- package/dist/shared/api/http-server/listen.js +44 -0
- package/dist/shared/api/http-server/listen.js.map +1 -0
- package/dist/shared/api/playwright/index.d.ts +2 -0
- package/dist/shared/api/playwright/index.d.ts.map +1 -0
- package/dist/shared/api/playwright/index.js +2 -0
- package/dist/shared/api/playwright/index.js.map +1 -0
- package/dist/shared/api/playwright/ports.d.ts +117 -0
- package/dist/shared/api/playwright/ports.d.ts.map +1 -0
- package/dist/shared/api/playwright/ports.js +11 -0
- package/dist/shared/api/playwright/ports.js.map +1 -0
- package/dist/shared/api/stream-server/index.d.ts +3 -0
- package/dist/shared/api/stream-server/index.d.ts.map +1 -0
- package/dist/shared/api/stream-server/index.js +2 -0
- package/dist/shared/api/stream-server/index.js.map +1 -0
- package/dist/shared/api/stream-server/stream-server.d.ts +43 -0
- package/dist/shared/api/stream-server/stream-server.d.ts.map +1 -0
- package/dist/shared/api/stream-server/stream-server.js +160 -0
- package/dist/shared/api/stream-server/stream-server.js.map +1 -0
- package/dist/shared/lib/async/arrivals.d.ts +31 -0
- package/dist/shared/lib/async/arrivals.d.ts.map +1 -0
- package/dist/shared/lib/async/arrivals.js +57 -0
- package/dist/shared/lib/async/arrivals.js.map +1 -0
- package/dist/shared/lib/async/async-queue.d.ts +23 -0
- package/dist/shared/lib/async/async-queue.d.ts.map +1 -0
- package/dist/shared/lib/async/async-queue.js +80 -0
- package/dist/shared/lib/async/async-queue.js.map +1 -0
- package/dist/shared/lib/async/deferred.d.ts +12 -0
- package/dist/shared/lib/async/deferred.d.ts.map +1 -0
- package/dist/shared/lib/async/deferred.js +34 -0
- package/dist/shared/lib/async/deferred.js.map +1 -0
- package/dist/shared/lib/async/index.d.ts +8 -0
- package/dist/shared/lib/async/index.d.ts.map +1 -0
- package/dist/shared/lib/async/index.js +5 -0
- package/dist/shared/lib/async/index.js.map +1 -0
- package/dist/shared/lib/async/run-all.d.ts +8 -0
- package/dist/shared/lib/async/run-all.d.ts.map +1 -0
- package/dist/shared/lib/async/run-all.js +22 -0
- package/dist/shared/lib/async/run-all.js.map +1 -0
- package/dist/shared/lib/bytes/bytes.d.ts +18 -0
- package/dist/shared/lib/bytes/bytes.d.ts.map +1 -0
- package/dist/shared/lib/bytes/bytes.js +48 -0
- package/dist/shared/lib/bytes/bytes.js.map +1 -0
- package/dist/shared/lib/bytes/index.d.ts +3 -0
- package/dist/shared/lib/bytes/index.d.ts.map +1 -0
- package/dist/shared/lib/bytes/index.js +2 -0
- package/dist/shared/lib/bytes/index.js.map +1 -0
- package/dist/shared/lib/clock/clock.d.ts +29 -0
- package/dist/shared/lib/clock/clock.d.ts.map +1 -0
- package/dist/shared/lib/clock/clock.js +85 -0
- package/dist/shared/lib/clock/clock.js.map +1 -0
- package/dist/shared/lib/clock/index.d.ts +3 -0
- package/dist/shared/lib/clock/index.d.ts.map +1 -0
- package/dist/shared/lib/clock/index.js +2 -0
- package/dist/shared/lib/clock/index.js.map +1 -0
- package/dist/shared/lib/cookies/index.d.ts +3 -0
- package/dist/shared/lib/cookies/index.d.ts.map +1 -0
- package/dist/shared/lib/cookies/index.js +2 -0
- package/dist/shared/lib/cookies/index.js.map +1 -0
- package/dist/shared/lib/cookies/set-cookie.d.ts +22 -0
- package/dist/shared/lib/cookies/set-cookie.d.ts.map +1 -0
- package/dist/shared/lib/cookies/set-cookie.js +89 -0
- package/dist/shared/lib/cookies/set-cookie.js.map +1 -0
- package/dist/shared/lib/envelope/envelope.d.ts +50 -0
- package/dist/shared/lib/envelope/envelope.d.ts.map +1 -0
- package/dist/shared/lib/envelope/envelope.js +111 -0
- package/dist/shared/lib/envelope/envelope.js.map +1 -0
- package/dist/shared/lib/envelope/index.d.ts +3 -0
- package/dist/shared/lib/envelope/index.d.ts.map +1 -0
- package/dist/shared/lib/envelope/index.js +2 -0
- package/dist/shared/lib/envelope/index.js.map +1 -0
- package/dist/shared/lib/errors/index.d.ts +3 -0
- package/dist/shared/lib/errors/index.d.ts.map +1 -0
- package/dist/shared/lib/errors/index.js +2 -0
- package/dist/shared/lib/errors/index.js.map +1 -0
- package/dist/shared/lib/errors/wirestage-error.d.ts +28 -0
- package/dist/shared/lib/errors/wirestage-error.d.ts.map +1 -0
- package/dist/shared/lib/errors/wirestage-error.js +16 -0
- package/dist/shared/lib/errors/wirestage-error.js.map +1 -0
- package/dist/shared/lib/id/id.d.ts +10 -0
- package/dist/shared/lib/id/id.d.ts.map +1 -0
- package/dist/shared/lib/id/id.js +26 -0
- package/dist/shared/lib/id/id.js.map +1 -0
- package/dist/shared/lib/id/index.d.ts +2 -0
- package/dist/shared/lib/id/index.d.ts.map +1 -0
- package/dist/shared/lib/id/index.js +2 -0
- package/dist/shared/lib/id/index.js.map +1 -0
- package/dist/shared/lib/logger/index.d.ts +3 -0
- package/dist/shared/lib/logger/index.d.ts.map +1 -0
- package/dist/shared/lib/logger/index.js +2 -0
- package/dist/shared/lib/logger/index.js.map +1 -0
- package/dist/shared/lib/logger/logger.d.ts +46 -0
- package/dist/shared/lib/logger/logger.d.ts.map +1 -0
- package/dist/shared/lib/logger/logger.js +67 -0
- package/dist/shared/lib/logger/logger.js.map +1 -0
- package/dist/shared/lib/match/index.d.ts +3 -0
- package/dist/shared/lib/match/index.d.ts.map +1 -0
- package/dist/shared/lib/match/index.js +2 -0
- package/dist/shared/lib/match/index.js.map +1 -0
- package/dist/shared/lib/match/url-matcher.d.ts +27 -0
- package/dist/shared/lib/match/url-matcher.d.ts.map +1 -0
- package/dist/shared/lib/match/url-matcher.js +88 -0
- package/dist/shared/lib/match/url-matcher.js.map +1 -0
- package/dist/sse.d.ts +3 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +3 -0
- package/dist/sse.js.map +1 -0
- package/dist/webrtc.d.ts +3 -0
- package/dist/webrtc.d.ts.map +1 -0
- package/dist/webrtc.js +3 -0
- package/dist/webrtc.js.map +1 -0
- package/dist/websocket.d.ts +3 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +3 -0
- package/dist/websocket.js.map +1 -0
- package/dist/widgets/stage/index.d.ts +3 -0
- package/dist/widgets/stage/index.d.ts.map +1 -0
- package/dist/widgets/stage/index.js +2 -0
- package/dist/widgets/stage/index.js.map +1 -0
- package/dist/widgets/stage/lib/attached-context.d.ts +10 -0
- package/dist/widgets/stage/lib/attached-context.d.ts.map +1 -0
- package/dist/widgets/stage/lib/attached-context.js +2 -0
- package/dist/widgets/stage/lib/attached-context.js.map +1 -0
- package/dist/widgets/stage/lib/create-stage.d.ts +12 -0
- package/dist/widgets/stage/lib/create-stage.d.ts.map +1 -0
- package/dist/widgets/stage/lib/create-stage.js +248 -0
- package/dist/widgets/stage/lib/create-stage.js.map +1 -0
- package/dist/widgets/stage/lib/http-router.d.ts +35 -0
- package/dist/widgets/stage/lib/http-router.d.ts.map +1 -0
- package/dist/widgets/stage/lib/http-router.js +455 -0
- package/dist/widgets/stage/lib/http-router.js.map +1 -0
- package/dist/widgets/stage/lib/page-host.d.ts +36 -0
- package/dist/widgets/stage/lib/page-host.d.ts.map +1 -0
- package/dist/widgets/stage/lib/page-host.js +240 -0
- package/dist/widgets/stage/lib/page-host.js.map +1 -0
- package/dist/widgets/stage/lib/page-runtime.d.ts +93 -0
- package/dist/widgets/stage/lib/page-runtime.d.ts.map +1 -0
- package/dist/widgets/stage/lib/page-runtime.js +247 -0
- package/dist/widgets/stage/lib/page-runtime.js.map +1 -0
- package/dist/widgets/stage/lib/reads.d.ts +21 -0
- package/dist/widgets/stage/lib/reads.d.ts.map +1 -0
- package/dist/widgets/stage/lib/reads.js +97 -0
- package/dist/widgets/stage/lib/reads.js.map +1 -0
- package/dist/widgets/stage/lib/response-stream.d.ts +9 -0
- package/dist/widgets/stage/lib/response-stream.d.ts.map +1 -0
- package/dist/widgets/stage/lib/response-stream.js +56 -0
- package/dist/widgets/stage/lib/response-stream.js.map +1 -0
- package/dist/widgets/stage/lib/socket-router.d.ts +25 -0
- package/dist/widgets/stage/lib/socket-router.d.ts.map +1 -0
- package/dist/widgets/stage/lib/socket-router.js +204 -0
- package/dist/widgets/stage/lib/socket-router.js.map +1 -0
- package/dist/widgets/stage/model/stage.d.ts +86 -0
- package/dist/widgets/stage/model/stage.d.ts.map +1 -0
- package/dist/widgets/stage/model/stage.js +2 -0
- package/dist/widgets/stage/model/stage.js.map +1 -0
- package/package.json +140 -5
- package/src/app/playwright/index.ts +7 -0
- package/src/app/playwright/lib/fixture.ts +201 -0
- package/src/connect.ts +6 -0
- package/src/entities/frame/@x/plugin.ts +8 -0
- package/src/entities/frame/index.ts +19 -0
- package/src/entities/frame/lib/filter.ts +58 -0
- package/src/entities/frame/lib/payload.ts +42 -0
- package/src/entities/frame/lib/snapshot.ts +105 -0
- package/src/entities/frame/lib/timeline.ts +147 -0
- package/src/entities/frame/model/frame.ts +191 -0
- package/src/entities/plugin/index.ts +36 -0
- package/src/entities/plugin/lib/define-plugin.ts +12 -0
- package/src/entities/plugin/lib/named.ts +21 -0
- package/src/entities/plugin/model/attachment.ts +18 -0
- package/src/entities/plugin/model/http.ts +147 -0
- package/src/entities/plugin/model/page.ts +110 -0
- package/src/entities/plugin/model/plugin.ts +96 -0
- package/src/entities/plugin/model/socket.ts +108 -0
- package/src/entities/plugin/model/stream.ts +43 -0
- package/src/features/connect/index.ts +23 -0
- package/src/features/connect/lib/calls.ts +58 -0
- package/src/features/connect/lib/client.ts +203 -0
- package/src/features/connect/lib/create-connect.ts +164 -0
- package/src/features/connect/lib/faults.ts +132 -0
- package/src/features/connect/lib/protocol.ts +321 -0
- package/src/features/connect/lib/record.ts +48 -0
- package/src/features/connect/lib/recorder.ts +306 -0
- package/src/features/connect/lib/rules.ts +385 -0
- package/src/features/connect/lib/serve.ts +114 -0
- package/src/features/connect/lib/status-of.ts +20 -0
- package/src/features/connect/lib/stubs.ts +282 -0
- package/src/features/connect/lib/universal.ts +100 -0
- package/src/features/connect/model/types.ts +305 -0
- package/src/features/rest/index.ts +23 -0
- package/src/features/rest/lib/calls.ts +31 -0
- package/src/features/rest/lib/create-rest.ts +169 -0
- package/src/features/rest/lib/path.ts +70 -0
- package/src/features/rest/lib/reply.ts +74 -0
- package/src/features/rest/model/types.ts +113 -0
- package/src/features/sse/index.ts +10 -0
- package/src/features/sse/lib/create-sse.ts +128 -0
- package/src/features/sse/lib/encode.ts +28 -0
- package/src/features/sse/model/types.ts +66 -0
- package/src/features/webrtc/index.ts +6 -0
- package/src/features/webrtc/lib/create-webrtc.ts +149 -0
- package/src/features/webrtc/lib/rtc-page-module.ts +189 -0
- package/src/features/webrtc/lib/to-frame.ts +63 -0
- package/src/features/webrtc/model/types.ts +80 -0
- package/src/features/websocket/index.ts +15 -0
- package/src/features/websocket/lib/create-websocket.ts +41 -0
- package/src/features/websocket/lib/mock.ts +114 -0
- package/src/features/websocket/lib/proxy.ts +141 -0
- package/src/features/websocket/lib/wire.ts +78 -0
- package/src/features/websocket/model/types.ts +130 -0
- package/src/index.ts +111 -0
- package/src/playwright.ts +8 -0
- package/src/rest.ts +2 -0
- package/src/shared/api/http-server/index.ts +2 -0
- package/src/shared/api/http-server/listen.ts +71 -0
- package/src/shared/api/playwright/index.ts +17 -0
- package/src/shared/api/playwright/ports.ts +145 -0
- package/src/shared/api/stream-server/index.ts +7 -0
- package/src/shared/api/stream-server/stream-server.ts +246 -0
- package/src/shared/lib/async/arrivals.ts +91 -0
- package/src/shared/lib/async/async-queue.ts +101 -0
- package/src/shared/lib/async/deferred.ts +38 -0
- package/src/shared/lib/async/index.ts +11 -0
- package/src/shared/lib/async/run-all.ts +19 -0
- package/src/shared/lib/bytes/bytes.ts +53 -0
- package/src/shared/lib/bytes/index.ts +9 -0
- package/src/shared/lib/clock/clock.ts +114 -0
- package/src/shared/lib/clock/index.ts +2 -0
- package/src/shared/lib/cookies/index.ts +2 -0
- package/src/shared/lib/cookies/set-cookie.ts +105 -0
- package/src/shared/lib/envelope/envelope.ts +133 -0
- package/src/shared/lib/envelope/index.ts +9 -0
- package/src/shared/lib/errors/index.ts +5 -0
- package/src/shared/lib/errors/wirestage-error.ts +50 -0
- package/src/shared/lib/id/id.ts +29 -0
- package/src/shared/lib/id/index.ts +1 -0
- package/src/shared/lib/logger/index.ts +12 -0
- package/src/shared/lib/logger/logger.ts +126 -0
- package/src/shared/lib/match/index.ts +6 -0
- package/src/shared/lib/match/url-matcher.ts +107 -0
- package/src/sse.ts +2 -0
- package/src/webrtc.ts +2 -0
- package/src/websocket.ts +2 -0
- package/src/widgets/stage/index.ts +9 -0
- package/src/widgets/stage/lib/attached-context.ts +10 -0
- package/src/widgets/stage/lib/create-stage.ts +305 -0
- package/src/widgets/stage/lib/http-router.ts +620 -0
- package/src/widgets/stage/lib/page-host.ts +375 -0
- package/src/widgets/stage/lib/page-runtime.ts +314 -0
- package/src/widgets/stage/lib/reads.ts +128 -0
- package/src/widgets/stage/lib/response-stream.ts +66 -0
- package/src/widgets/stage/lib/socket-router.ts +271 -0
- package/src/widgets/stage/model/stage.ts +108 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { WirestageError } from "../../lib/errors/index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Start listening and return a handle whose `close` really is immediate.
|
|
4
|
+
* `server.close()` alone waits for every keep-alive and streaming connection to
|
|
5
|
+
* end on its own — a held-open stream would stall test teardown until the
|
|
6
|
+
* runner's timeout.
|
|
7
|
+
*
|
|
8
|
+
* Takes a `net.Server`, which http, https and http2 servers all are.
|
|
9
|
+
*/
|
|
10
|
+
export async function listen(server, options) {
|
|
11
|
+
const host = options.host ?? "127.0.0.1";
|
|
12
|
+
const sockets = new Set();
|
|
13
|
+
server.on("connection", (socket) => {
|
|
14
|
+
sockets.add(socket);
|
|
15
|
+
socket.once("close", () => sockets.delete(socket));
|
|
16
|
+
});
|
|
17
|
+
await new Promise((resolve, reject) => {
|
|
18
|
+
const onListening = () => {
|
|
19
|
+
server.off("error", onError);
|
|
20
|
+
resolve();
|
|
21
|
+
};
|
|
22
|
+
const onError = (error) => {
|
|
23
|
+
server.off("listening", onListening);
|
|
24
|
+
reject(error.code === "EADDRINUSE"
|
|
25
|
+
? new WirestageError("INVALID_STATE", `${options.name}: ${host}:${options.port} is already in use`, { cause: error, details: { host, port: options.port } })
|
|
26
|
+
: error);
|
|
27
|
+
};
|
|
28
|
+
server.once("listening", onListening);
|
|
29
|
+
server.once("error", onError);
|
|
30
|
+
server.listen(options.port ?? 0, host);
|
|
31
|
+
});
|
|
32
|
+
const port = server.address().port;
|
|
33
|
+
return {
|
|
34
|
+
// An IPv6 literal goes in brackets, or the port reads as part of it.
|
|
35
|
+
url: `${options.protocol}://${host.includes(":") ? `[${host}]` : host}:${port}`,
|
|
36
|
+
port,
|
|
37
|
+
close: () => new Promise((resolve) => {
|
|
38
|
+
for (const socket of sockets)
|
|
39
|
+
socket.destroy();
|
|
40
|
+
server.close(() => resolve());
|
|
41
|
+
}),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=listen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"listen.js","sourceRoot":"","sources":["../../../../src/shared/api/http-server/listen.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAkB3D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC3B,MAAc,EACd,OAAsB;IAEtB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAc,EAAE,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,WAAW,GAAG,GAAG,EAAE;YACxB,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC;QACX,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,CAAC,KAA4B,EAAE,EAAE;YAChD,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM,CACL,KAAK,CAAC,IAAI,KAAK,YAAY;gBAC1B,CAAC,CAAC,IAAI,cAAc,CAClB,eAAe,EACf,GAAG,OAAO,CAAC,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,IAAI,oBAAoB,EAC5D,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CACvD;gBACF,CAAC,CAAC,KAAK,CACR,CAAC;QACH,CAAC,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IACH,MAAM,IAAI,GAAI,MAAM,CAAC,OAAO,EAAkB,CAAC,IAAI,CAAC;IACpD,OAAO;QACN,qEAAqE;QACrE,GAAG,EAAE,GAAG,OAAO,CAAC,QAAQ,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE;QAC/E,IAAI;QACJ,KAAK,EAAE,GAAG,EAAE,CACX,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAC7B,KAAK,MAAM,MAAM,IAAI,OAAO;gBAAE,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/B,CAAC,CAAC;KACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export type { BindingSourcePort, ContextPort, ContinueOptions, CookieJarPort, CookiePort, FramePort, FulfillOptions, HeaderMap, PagePort, RequestPort, ResponsePort, RouteHandler, RoutePort, UrlPredicate, WebSocketRoutePort, } from "./ports.js";
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/api/playwright/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,aAAa,EACb,UAAU,EACV,SAAS,EACT,cAAc,EACd,SAAS,EACT,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,kBAAkB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared/api/playwright/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The slice of Playwright the library drives, as structural types.
|
|
3
|
+
*
|
|
4
|
+
* Real Playwright objects satisfy these as they are — `tests/types` proves it
|
|
5
|
+
* against the pinned version — so the public API takes a `BrowserContext` and
|
|
6
|
+
* hands it inward unchanged. Inside, everything depends on the ports, never on
|
|
7
|
+
* Playwright, which is what lets the unit suite cover every branch with
|
|
8
|
+
* hand-written fakes instead of a browser.
|
|
9
|
+
*/
|
|
10
|
+
import type { CookieInit } from "../../lib/cookies/index.js";
|
|
11
|
+
export type HeaderMap = Readonly<Record<string, string>>;
|
|
12
|
+
export interface FramePort {
|
|
13
|
+
evaluate<R>(pageFunction: (arg: any) => R | Promise<R>, arg?: unknown): Promise<R>;
|
|
14
|
+
}
|
|
15
|
+
export interface PagePort {
|
|
16
|
+
/** The main frame and every iframe: page hooks run in each of them. */
|
|
17
|
+
frames(): FramePort[];
|
|
18
|
+
isClosed(): boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface ResponsePort {
|
|
21
|
+
status(): number;
|
|
22
|
+
headers(): HeaderMap;
|
|
23
|
+
body(): Promise<Buffer>;
|
|
24
|
+
}
|
|
25
|
+
export interface RequestPort {
|
|
26
|
+
url(): string;
|
|
27
|
+
method(): string;
|
|
28
|
+
/** Playwright already lower-cases these names. */
|
|
29
|
+
headers(): HeaderMap;
|
|
30
|
+
/**
|
|
31
|
+
* Every header, including the ones `headers()` leaves out (cookies, and
|
|
32
|
+
* headers the network stack adds such as `last-event-id`).
|
|
33
|
+
*/
|
|
34
|
+
allHeaders(): Promise<HeaderMap>;
|
|
35
|
+
postDataBuffer(): Buffer | null;
|
|
36
|
+
resourceType(): string;
|
|
37
|
+
/** Throws for requests a service worker makes; callers must guard it. */
|
|
38
|
+
frame(): {
|
|
39
|
+
page(): PagePort;
|
|
40
|
+
};
|
|
41
|
+
response(): Promise<ResponsePort | null>;
|
|
42
|
+
failure(): {
|
|
43
|
+
errorText: string;
|
|
44
|
+
} | null;
|
|
45
|
+
}
|
|
46
|
+
export interface FulfillOptions {
|
|
47
|
+
readonly status?: number;
|
|
48
|
+
readonly headers?: Record<string, string>;
|
|
49
|
+
readonly body?: string | Buffer;
|
|
50
|
+
}
|
|
51
|
+
export interface ContinueOptions {
|
|
52
|
+
readonly url?: string;
|
|
53
|
+
readonly method?: string;
|
|
54
|
+
readonly headers?: Record<string, string>;
|
|
55
|
+
readonly postData?: string | Buffer;
|
|
56
|
+
}
|
|
57
|
+
export interface RoutePort {
|
|
58
|
+
request(): RequestPort;
|
|
59
|
+
fulfill(options: FulfillOptions): Promise<void>;
|
|
60
|
+
continue(options?: ContinueOptions): Promise<void>;
|
|
61
|
+
fallback(): Promise<void>;
|
|
62
|
+
abort(errorCode?: string): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
export type RouteHandler = (route: RoutePort, request: RequestPort) => Promise<void>;
|
|
65
|
+
export type UrlPredicate = (url: URL) => boolean;
|
|
66
|
+
export interface WebSocketRoutePort {
|
|
67
|
+
url(): string;
|
|
68
|
+
onMessage(handler: (message: string | Buffer) => unknown): void;
|
|
69
|
+
onClose(handler: (code: number | undefined, reason: string | undefined) => unknown): void;
|
|
70
|
+
send(message: string | Buffer): void;
|
|
71
|
+
close(options?: {
|
|
72
|
+
code?: number;
|
|
73
|
+
reason?: string;
|
|
74
|
+
}): Promise<void>;
|
|
75
|
+
connectToServer(): WebSocketRoutePort;
|
|
76
|
+
}
|
|
77
|
+
export interface BindingSourcePort {
|
|
78
|
+
readonly page: PagePort;
|
|
79
|
+
}
|
|
80
|
+
export interface CookiePort {
|
|
81
|
+
readonly name: string;
|
|
82
|
+
readonly value: string;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* The cookie jar of a browser context: all a drive client needs of one, so
|
|
86
|
+
* that is all it is given.
|
|
87
|
+
*/
|
|
88
|
+
export interface CookieJarPort {
|
|
89
|
+
cookies(urls?: string | string[]): Promise<CookiePort[]>;
|
|
90
|
+
/**
|
|
91
|
+
* Optional so a fake may omit it; every real BrowserContext has it. Drive
|
|
92
|
+
* clients keep the cookies a response sets here, the way Playwright's own
|
|
93
|
+
* request context does.
|
|
94
|
+
*/
|
|
95
|
+
addCookies?(cookies: CookieInit[]): Promise<void>;
|
|
96
|
+
}
|
|
97
|
+
export interface ContextPort extends CookieJarPort {
|
|
98
|
+
/** Required here: a context always has it, and a plugin's jar calls it. */
|
|
99
|
+
addCookies(cookies: CookieInit[]): Promise<void>;
|
|
100
|
+
route(url: UrlPredicate, handler: RouteHandler): Promise<unknown>;
|
|
101
|
+
unroute(url: UrlPredicate, handler?: RouteHandler): Promise<void>;
|
|
102
|
+
routeWebSocket(url: UrlPredicate, handler: (route: WebSocketRoutePort) => unknown): Promise<void>;
|
|
103
|
+
addInitScript(script: {
|
|
104
|
+
content: string;
|
|
105
|
+
}): Promise<unknown>;
|
|
106
|
+
exposeBinding(name: string, binding: (source: BindingSourcePort, message: unknown) => unknown): Promise<unknown>;
|
|
107
|
+
pages(): PagePort[];
|
|
108
|
+
/** Optional so a fake may omit it; every real BrowserContext has it. */
|
|
109
|
+
grantPermissions?(permissions: string[], options?: {
|
|
110
|
+
origin?: string;
|
|
111
|
+
}): Promise<void>;
|
|
112
|
+
on(event: "close", listener: () => void): unknown;
|
|
113
|
+
on(event: "requestfinished" | "requestfailed", listener: (request: RequestPort) => void): unknown;
|
|
114
|
+
off(event: "close", listener: () => void): unknown;
|
|
115
|
+
off(event: "requestfinished" | "requestfailed", listener: (request: RequestPort) => void): unknown;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../../src/shared/api/playwright/ports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The slice of Playwright the library drives, as structural types.
|
|
3
|
+
*
|
|
4
|
+
* Real Playwright objects satisfy these as they are — `tests/types` proves it
|
|
5
|
+
* against the pinned version — so the public API takes a `BrowserContext` and
|
|
6
|
+
* hands it inward unchanged. Inside, everything depends on the ports, never on
|
|
7
|
+
* Playwright, which is what lets the unit suite cover every branch with
|
|
8
|
+
* hand-written fakes instead of a browser.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=ports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../../src/shared/api/playwright/ports.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/shared/api/stream-server/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,aAAa,GACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/shared/api/stream-server/index.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type IncomingMessage, type ServerResponse } from "node:http";
|
|
2
|
+
import type { ScopedLogger } from "../../lib/logger/index.js";
|
|
3
|
+
export type NodeHandler = (request: IncomingMessage, response: ServerResponse) => void | Promise<void>;
|
|
4
|
+
export interface StreamSession {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
/** Where the browser's request is redirected to. Single use. */
|
|
7
|
+
readonly url: string;
|
|
8
|
+
/** Forget the session if the redirect never arrives. */
|
|
9
|
+
dispose(): void;
|
|
10
|
+
}
|
|
11
|
+
export interface StreamServerOptions {
|
|
12
|
+
/** Key and certificate for pages served over https. */
|
|
13
|
+
readonly tls?: {
|
|
14
|
+
readonly key: string | Buffer;
|
|
15
|
+
readonly cert: string | Buffer;
|
|
16
|
+
};
|
|
17
|
+
readonly host?: string;
|
|
18
|
+
readonly log?: ScopedLogger;
|
|
19
|
+
}
|
|
20
|
+
export interface StreamServer {
|
|
21
|
+
/**
|
|
22
|
+
* Register a handler and return the URL to redirect one request to.
|
|
23
|
+
* `secure` is whether the page's request was https: Playwright only lets
|
|
24
|
+
* `route.continue` change the URL within the same scheme.
|
|
25
|
+
*/
|
|
26
|
+
open(handler: NodeHandler, options: {
|
|
27
|
+
readonly secure: boolean;
|
|
28
|
+
}): Promise<StreamSession>;
|
|
29
|
+
/** Stop every listener and refuse further sessions. */
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
readonly sessions: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* A local server for responses that must stay open — server streams, SSE —
|
|
35
|
+
* which `route.fulfill` cannot express because it takes the whole body at
|
|
36
|
+
* once. A stub answers by redirecting the browser's request here, and the
|
|
37
|
+
* handler then writes to a real socket at whatever pace the test drives.
|
|
38
|
+
*
|
|
39
|
+
* It starts lazily on the first session, so a suite that never streams never
|
|
40
|
+
* opens a port, and adds a port whenever the ones it has are full.
|
|
41
|
+
*/
|
|
42
|
+
export declare function createStreamServer(options?: StreamServerOptions): StreamServer;
|
|
43
|
+
//# sourceMappingURL=stream-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-server.d.ts","sourceRoot":"","sources":["../../../../src/shared/api/stream-server/stream-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAG9D,MAAM,MAAM,WAAW,GAAG,CACzB,OAAO,EAAE,eAAe,EACxB,QAAQ,EAAE,cAAc,KACpB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAE1B,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,OAAO,IAAI,IAAI,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IACnC,uDAAuD;IACvD,QAAQ,CAAC,GAAG,CAAC,EAAE;QACd,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;QAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;KAC/B,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC5B;;;;OAIG;IACH,IAAI,CACH,OAAO,EAAE,WAAW,EACpB,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;KAAE,GACnC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1B,uDAAuD;IACvD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAuCD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,GAAE,mBAAwB,GAC/B,YAAY,CA8Hd"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import { createServer as createHttpServer, } from "node:http";
|
|
2
|
+
import { createServer as createHttpsServer } from "node:https";
|
|
3
|
+
import { WirestageError } from "../../lib/errors/index.js";
|
|
4
|
+
import { randomToken } from "../../lib/id/index.js";
|
|
5
|
+
import { listen } from "../http-server/index.js";
|
|
6
|
+
const PATH = "/__wirestage/";
|
|
7
|
+
/**
|
|
8
|
+
* Headers a browser script may read on a response from another origin. The
|
|
9
|
+
* redirect makes the stream server a different origin from the page as far
|
|
10
|
+
* as CORS is concerned in some engines, and connect-web reads these.
|
|
11
|
+
*/
|
|
12
|
+
const EXPOSED_HEADERS = [
|
|
13
|
+
"grpc-status",
|
|
14
|
+
"grpc-message",
|
|
15
|
+
"grpc-status-details-bin",
|
|
16
|
+
"grpc-encoding",
|
|
17
|
+
"connect-protocol-version",
|
|
18
|
+
"content-encoding",
|
|
19
|
+
"content-type",
|
|
20
|
+
].join(", ");
|
|
21
|
+
/**
|
|
22
|
+
* Open responses one listener carries. A browser keeps at most six
|
|
23
|
+
* connections to one host and port, and an open stream holds its connection
|
|
24
|
+
* for as long as it lives: the seventh would wait for one of the six to end,
|
|
25
|
+
* which in a test is never. Four leaves room for the preflights the browser
|
|
26
|
+
* sends on the same connection pool.
|
|
27
|
+
*/
|
|
28
|
+
const STREAMS_PER_LISTENER = 4;
|
|
29
|
+
/**
|
|
30
|
+
* A local server for responses that must stay open — server streams, SSE —
|
|
31
|
+
* which `route.fulfill` cannot express because it takes the whole body at
|
|
32
|
+
* once. A stub answers by redirecting the browser's request here, and the
|
|
33
|
+
* handler then writes to a real socket at whatever pace the test drives.
|
|
34
|
+
*
|
|
35
|
+
* It starts lazily on the first session, so a suite that never streams never
|
|
36
|
+
* opens a port, and adds a port whenever the ones it has are full.
|
|
37
|
+
*/
|
|
38
|
+
export function createStreamServer(options = {}) {
|
|
39
|
+
const secure = options.tls !== undefined;
|
|
40
|
+
const sessions = new Map();
|
|
41
|
+
const listeners = new Set();
|
|
42
|
+
let closed = false;
|
|
43
|
+
const release = (id, session) => {
|
|
44
|
+
if (sessions.delete(id))
|
|
45
|
+
session.listener.open -= 1;
|
|
46
|
+
};
|
|
47
|
+
const onRequest = (request, response) => {
|
|
48
|
+
allowCors(request, response);
|
|
49
|
+
if (request.method === "OPTIONS") {
|
|
50
|
+
response.writeHead(204);
|
|
51
|
+
response.end();
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const id = request.url?.startsWith(PATH)
|
|
55
|
+
? request.url.slice(PATH.length)
|
|
56
|
+
: "";
|
|
57
|
+
const session = sessions.get(id);
|
|
58
|
+
if (session === undefined) {
|
|
59
|
+
response.writeHead(404);
|
|
60
|
+
response.end();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// One request per session: a client that reconnects goes through the
|
|
64
|
+
// page's route again and gets a session of its own. The session keeps
|
|
65
|
+
// its place on the listener until the response is over.
|
|
66
|
+
sessions.delete(id);
|
|
67
|
+
response.once("close", () => {
|
|
68
|
+
session.listener.open -= 1;
|
|
69
|
+
});
|
|
70
|
+
Promise.resolve()
|
|
71
|
+
.then(() => session.handler(request, response))
|
|
72
|
+
.catch((error) => {
|
|
73
|
+
// A write into a connection the client closed, or a test cut, is
|
|
74
|
+
// the expected end of a stream, not a failure worth an error line.
|
|
75
|
+
if (response.destroyed) {
|
|
76
|
+
options.log?.debug("stream ended by a closed connection", { session: id }, error);
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
options.log?.error("stream handler failed", { session: id }, error);
|
|
80
|
+
if (!response.headersSent)
|
|
81
|
+
response.writeHead(500);
|
|
82
|
+
response.end();
|
|
83
|
+
});
|
|
84
|
+
};
|
|
85
|
+
/** A listener with room, starting another when the rest are full. */
|
|
86
|
+
const listenerWithRoom = () => {
|
|
87
|
+
for (const listener of listeners)
|
|
88
|
+
if (listener.open < STREAMS_PER_LISTENER)
|
|
89
|
+
return listener;
|
|
90
|
+
const listener = {
|
|
91
|
+
listening: listen(options.tls === undefined
|
|
92
|
+
? createHttpServer(onRequest)
|
|
93
|
+
: createHttpsServer(options.tls, onRequest), {
|
|
94
|
+
name: "wirestage stream server",
|
|
95
|
+
protocol: secure ? "https" : "http",
|
|
96
|
+
host: options.host,
|
|
97
|
+
}),
|
|
98
|
+
open: 0,
|
|
99
|
+
};
|
|
100
|
+
listeners.add(listener);
|
|
101
|
+
// A listener that could not start must not be offered again.
|
|
102
|
+
listener.listening.catch(() => listeners.delete(listener));
|
|
103
|
+
return listener;
|
|
104
|
+
};
|
|
105
|
+
return {
|
|
106
|
+
async open(handler, { secure: pageIsSecure }) {
|
|
107
|
+
if (closed)
|
|
108
|
+
throw new WirestageError("CLOSED", "the stream server is closed: the stage was disposed while a stream was being opened");
|
|
109
|
+
if (pageIsSecure !== secure)
|
|
110
|
+
throw new WirestageError("UNSUPPORTED", pageIsSecure
|
|
111
|
+
? "a live stream on an https page needs `streamServer.tls`: Playwright only redirects a request to a URL with the same scheme"
|
|
112
|
+
: "the stream server was given TLS but the page is http; drop `streamServer.tls` for http pages", { details: { pageIsSecure, serverIsSecure: secure } });
|
|
113
|
+
const listener = listenerWithRoom();
|
|
114
|
+
const session = { handler, listener };
|
|
115
|
+
const id = randomToken();
|
|
116
|
+
listener.open += 1;
|
|
117
|
+
sessions.set(id, session);
|
|
118
|
+
try {
|
|
119
|
+
const { url } = await listener.listening;
|
|
120
|
+
return {
|
|
121
|
+
id,
|
|
122
|
+
url: `${url}${PATH}${id}`,
|
|
123
|
+
dispose: () => release(id, session),
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
catch (error) {
|
|
127
|
+
release(id, session);
|
|
128
|
+
throw error;
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
async close() {
|
|
132
|
+
closed = true;
|
|
133
|
+
sessions.clear();
|
|
134
|
+
const stopping = [...listeners];
|
|
135
|
+
listeners.clear();
|
|
136
|
+
await Promise.all(stopping.map((listener) => listener.listening.then((listening) => listening.close(),
|
|
137
|
+
// It never started; there is nothing to stop.
|
|
138
|
+
() => undefined)));
|
|
139
|
+
},
|
|
140
|
+
get sessions() {
|
|
141
|
+
return sessions.size;
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function allowCors(request, response) {
|
|
146
|
+
const origin = request.headers.origin;
|
|
147
|
+
if (origin === undefined)
|
|
148
|
+
return;
|
|
149
|
+
response.setHeader("access-control-allow-origin", origin);
|
|
150
|
+
response.setHeader("vary", "origin");
|
|
151
|
+
response.setHeader("access-control-allow-credentials", "true");
|
|
152
|
+
response.setHeader("access-control-allow-methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS");
|
|
153
|
+
response.setHeader("access-control-allow-headers", request.headers["access-control-request-headers"] ?? "*");
|
|
154
|
+
response.setHeader("access-control-expose-headers", EXPOSED_HEADERS);
|
|
155
|
+
// Private Network Access: a page on a public origin must be told the
|
|
156
|
+
// loopback stream server agrees to be reached, or Chromium refuses.
|
|
157
|
+
if (request.headers["access-control-request-private-network"] === "true")
|
|
158
|
+
response.setHeader("access-control-allow-private-network", "true");
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=stream-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-server.js","sourceRoot":"","sources":["../../../../src/shared/api/stream-server/stream-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Clock } from "../clock/index.js";
|
|
2
|
+
export interface ArrivalWaitOptions {
|
|
3
|
+
/** Milliseconds to wait. Defaults to the value given at creation. */
|
|
4
|
+
readonly timeout?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface Arrivals<T> {
|
|
7
|
+
push(item: T): void;
|
|
8
|
+
/**
|
|
9
|
+
* The next item `next` has not returned yet, waiting for one if needed.
|
|
10
|
+
* Items that arrived before the call count: a test that asks for the stream
|
|
11
|
+
* the page opened during `goto` must not miss it by asking too late.
|
|
12
|
+
*/
|
|
13
|
+
next(options?: ArrivalWaitOptions): Promise<T>;
|
|
14
|
+
readonly items: readonly T[];
|
|
15
|
+
readonly latest: T | undefined;
|
|
16
|
+
}
|
|
17
|
+
export interface ArrivalsOptions {
|
|
18
|
+
readonly clock: Clock;
|
|
19
|
+
/** Names the thing being waited for in the TIMEOUT message. */
|
|
20
|
+
readonly label: string;
|
|
21
|
+
readonly timeout?: number;
|
|
22
|
+
/**
|
|
23
|
+
* What the waiter knows about why nothing arrived, added to the TIMEOUT
|
|
24
|
+
* message: "the page never asked" and "it asked, and the answer got
|
|
25
|
+
* lost" call for different fixes.
|
|
26
|
+
*/
|
|
27
|
+
readonly hint?: () => string | undefined;
|
|
28
|
+
}
|
|
29
|
+
/** Things that show up over time — connections, calls, messages — and a way to await the next. */
|
|
30
|
+
export declare function createArrivals<T>(options: ArrivalsOptions): Arrivals<T>;
|
|
31
|
+
//# sourceMappingURL=arrivals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrivals.d.ts","sourceRoot":"","sources":["../../../../src/shared/lib/async/arrivals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,WAAW,kBAAkB;IAClC,qEAAqE;IACrE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IAC1B,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IACpB;;;;OAIG;IACH,IAAI,CAAC,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,SAAS,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAC;CACzC;AAED,kGAAkG;AAClG,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,GAAG,QAAQ,CAAC,CAAC,CAAC,CAwDvE"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { WirestageError } from "../errors/index.js";
|
|
2
|
+
/** Things that show up over time — connections, calls, messages — and a way to await the next. */
|
|
3
|
+
export function createArrivals(options) {
|
|
4
|
+
const items = [];
|
|
5
|
+
let cursor = 0;
|
|
6
|
+
const waiters = new Set();
|
|
7
|
+
const defaultTimeout = options.timeout ?? 5_000;
|
|
8
|
+
/** Resolves true on the next push, false when `ms` pass first. */
|
|
9
|
+
const pushedWithin = async (ms) => {
|
|
10
|
+
const abort = new AbortController();
|
|
11
|
+
let resolvePushed;
|
|
12
|
+
const pushed = new Promise((resolve) => {
|
|
13
|
+
resolvePushed = resolve;
|
|
14
|
+
});
|
|
15
|
+
const wake = () => resolvePushed(true);
|
|
16
|
+
waiters.add(wake);
|
|
17
|
+
const expired = options.clock
|
|
18
|
+
.sleep(ms, abort.signal)
|
|
19
|
+
.then(() => false)
|
|
20
|
+
.catch(() => true);
|
|
21
|
+
const result = await Promise.race([pushed, expired]);
|
|
22
|
+
waiters.delete(wake);
|
|
23
|
+
abort.abort();
|
|
24
|
+
return result;
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
push(item) {
|
|
28
|
+
items.push(item);
|
|
29
|
+
for (const wake of [...waiters])
|
|
30
|
+
wake();
|
|
31
|
+
},
|
|
32
|
+
async next(waitOptions = {}) {
|
|
33
|
+
const timeout = waitOptions.timeout ?? defaultTimeout;
|
|
34
|
+
const deadline = options.clock.now() + timeout;
|
|
35
|
+
// A loop, not a single wait: two callers woken by one push race for
|
|
36
|
+
// one item, and the loser has to go back to waiting.
|
|
37
|
+
for (;;) {
|
|
38
|
+
if (cursor < items.length)
|
|
39
|
+
return items[cursor++];
|
|
40
|
+
const remaining = deadline - options.clock.now();
|
|
41
|
+
if (remaining <= 0 || !(await pushedWithin(remaining))) {
|
|
42
|
+
if (cursor < items.length)
|
|
43
|
+
return items[cursor++];
|
|
44
|
+
const hint = options.hint?.();
|
|
45
|
+
throw new WirestageError("TIMEOUT", `no ${options.label} arrived within ${timeout} ms (${items.length} seen so far)${hint === undefined ? "" : `; ${hint}`}`, { details: { label: options.label, timeout, seen: items.length } });
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
get items() {
|
|
50
|
+
return items;
|
|
51
|
+
},
|
|
52
|
+
get latest() {
|
|
53
|
+
return items.at(-1);
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=arrivals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arrivals.js","sourceRoot":"","sources":["../../../../src/shared/lib/async/arrivals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface AsyncQueue<T> extends AsyncIterable<T> {
|
|
2
|
+
/**
|
|
3
|
+
* Queue a value. Resolves once the consumer has taken it and come back
|
|
4
|
+
* for the next — for a stream being written, once the value is on the
|
|
5
|
+
* wire. Rejects with `CLOSED` when the queue was closed first, or when
|
|
6
|
+
* the consumer went away before getting through the value.
|
|
7
|
+
*/
|
|
8
|
+
push(value: T): Promise<void>;
|
|
9
|
+
/** End iteration once the queued values are consumed. */
|
|
10
|
+
close(): void;
|
|
11
|
+
/** End iteration with `reason` once the queued values are consumed. */
|
|
12
|
+
fail(reason: unknown): void;
|
|
13
|
+
readonly closed: boolean;
|
|
14
|
+
/** Values pushed but not consumed yet. */
|
|
15
|
+
readonly size: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A single-consumer queue that a test pushes into and a stream implementation
|
|
19
|
+
* iterates. Values pushed before the consumer starts are kept, so a test may
|
|
20
|
+
* queue the first messages before the page has even opened the stream.
|
|
21
|
+
*/
|
|
22
|
+
export declare function createAsyncQueue<T>(): AsyncQueue<T>;
|
|
23
|
+
//# sourceMappingURL=async-queue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"async-queue.d.ts","sourceRoot":"","sources":["../../../../src/shared/lib/async/async-queue.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,UAAU,CAAC,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtD;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,yDAAyD;IACzD,KAAK,IAAI,IAAI,CAAC;IACd,uEAAuE;IACvE,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACtB;AAOD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CAsEnD"}
|