@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,58 @@
|
|
|
1
|
+
import { WirestageError } from "../../../shared/lib/errors/index.js";
|
|
2
|
+
import { globSource } from "../../../shared/lib/match/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* `/rooms/:id/files/*` against a URL's path, or — for a pattern that starts
|
|
5
|
+
* with a scheme — against origin plus path. The glob is the one every other
|
|
6
|
+
* pattern of the library takes (`*` one segment, `**` any number, none
|
|
7
|
+
* included, `{a,b}` either), plus `:name` params. The query never takes
|
|
8
|
+
* part: a route for `/search` should answer `/search?q=x`.
|
|
9
|
+
*/
|
|
10
|
+
export function compilePath(path, baseURL) {
|
|
11
|
+
if (path instanceof RegExp)
|
|
12
|
+
return {
|
|
13
|
+
match(url) {
|
|
14
|
+
path.lastIndex = 0;
|
|
15
|
+
const found = path.exec(url.pathname);
|
|
16
|
+
return found === null ? undefined : { ...found.groups };
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
if (path.includes("?"))
|
|
20
|
+
// It would compile, and then never match anything.
|
|
21
|
+
throw new WirestageError("INVALID_ARGUMENT", `route "${path}" names a query, and a route matches the path alone: drop the "?…" and check \`request.query\` in the resolver or in \`match\``);
|
|
22
|
+
const full = joinBase(baseURL, path);
|
|
23
|
+
const absolute = /^[a-z][a-z\d+.-]*:\/\//i.test(full);
|
|
24
|
+
const { source, params: keys } = globSource(full, { params: true });
|
|
25
|
+
const pattern = new RegExp(`^${source}/?$`);
|
|
26
|
+
return {
|
|
27
|
+
match(url) {
|
|
28
|
+
const subject = absolute ? `${url.origin}${url.pathname}` : url.pathname;
|
|
29
|
+
const found = pattern.exec(subject);
|
|
30
|
+
if (found === null)
|
|
31
|
+
return undefined;
|
|
32
|
+
const params = {};
|
|
33
|
+
keys.forEach((key, index) => {
|
|
34
|
+
params[key] = decode(found[index + 1]);
|
|
35
|
+
});
|
|
36
|
+
return params;
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* A path segment, percent-decoded. A malformed escape is kept as it came:
|
|
42
|
+
* this runs for every request of the context, and must not throw for one
|
|
43
|
+
* odd URL.
|
|
44
|
+
*/
|
|
45
|
+
function decode(segment) {
|
|
46
|
+
try {
|
|
47
|
+
return decodeURIComponent(segment);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return segment;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function joinBase(baseURL, path) {
|
|
54
|
+
if (baseURL === undefined || /^[a-z][a-z\d+.-]*:\/\//i.test(path))
|
|
55
|
+
return path;
|
|
56
|
+
return `${baseURL.replace(/\/+$/, "")}/${path.replace(/^\/+/, "")}`;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=path.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/path.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAQhE;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAC1B,IAAc,EACd,OAA2B;IAE3B,IAAI,IAAI,YAAY,MAAM;QACzB,OAAO;YACN,KAAK,CAAC,GAAG;gBACR,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;gBACnB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACtC,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YACzD,CAAC;SACD,CAAC;IACH,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrB,mDAAmD;QACnD,MAAM,IAAI,cAAc,CACvB,kBAAkB,EAClB,UAAU,IAAI,gIAAgI,CAC9I,CAAC;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,IAAI,MAAM,KAAK,CAAC,CAAC;IAC5C,OAAO;QACN,KAAK,CAAC,GAAG;YACR,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,IAAI;gBAAE,OAAO,SAAS,CAAC;YACrC,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBAC3B,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAW,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QACf,CAAC;KACD,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,MAAM,CAAC,OAAe;IAC9B,IAAI,CAAC;QACJ,OAAO,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,OAAO,CAAC;IAChB,CAAC;AACF,CAAC;AAED,SAAS,QAAQ,CAAC,OAA2B,EAAE,IAAY;IAC1D,IAAI,OAAO,KAAK,SAAS,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;QAChE,OAAO,IAAI,CAAC;IACb,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { AbortErrorCode } from "../../../entities/plugin/index.js";
|
|
2
|
+
import type { RestReply } from "../model/types.js";
|
|
3
|
+
export interface ReplyInit {
|
|
4
|
+
readonly status?: number;
|
|
5
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
6
|
+
}
|
|
7
|
+
/** A JSON body. A bigint field (protobuf int64) is written as a string. */
|
|
8
|
+
export declare function json(value: unknown, init?: ReplyInit): RestReply;
|
|
9
|
+
export declare function text(value: string, init?: ReplyInit): RestReply;
|
|
10
|
+
export declare function bytes(value: Uint8Array, init?: ReplyInit & {
|
|
11
|
+
readonly contentType?: string;
|
|
12
|
+
}): RestReply;
|
|
13
|
+
/** No body. 204 unless `status` says otherwise. */
|
|
14
|
+
export declare function empty(init?: ReplyInit): RestReply;
|
|
15
|
+
/**
|
|
16
|
+
* Decline to answer: the request goes on to the next route that matches it,
|
|
17
|
+
* and to the real server when there is none. A route that only watches —
|
|
18
|
+
* `route.next()`, `route.requests` — answers with this.
|
|
19
|
+
*/
|
|
20
|
+
export declare function passthrough(): RestReply;
|
|
21
|
+
/** Fail the request at the network level, as a dropped connection would. */
|
|
22
|
+
export declare function abort(error?: AbortErrorCode): RestReply;
|
|
23
|
+
/** Answer `reply`, `ms` later. (Not named `then`, so a reply never looks like a thenable.) */
|
|
24
|
+
export declare function delay(ms: number, reply: RestReply): RestReply;
|
|
25
|
+
//# sourceMappingURL=reply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reply.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/lib/reply.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,WAAW,SAAS;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACpD;AAiBD,2EAA2E;AAC3E,wBAAgB,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,SAAc,GAAG,SAAS,CASpE;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,SAAS,CAEnE;AAED,wBAAgB,KAAK,CACpB,KAAK,EAAE,UAAU,EACjB,IAAI,GAAE,SAAS,GAAG;IAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACtD,SAAS,CAOX;AAED,mDAAmD;AACnD,wBAAgB,KAAK,CAAC,IAAI,GAAE,SAAc,GAAG,SAAS,CAErD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,IAAI,SAAS,CAEvC;AAED,4EAA4E;AAC5E,wBAAgB,KAAK,CAAC,KAAK,GAAE,cAAyB,GAAG,SAAS,CAEjE;AAED,8FAA8F;AAC9F,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,SAAS,CAE7D"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
const response = (body, contentType, init, defaultStatus) => ({
|
|
2
|
+
kind: "response",
|
|
3
|
+
status: init.status ?? defaultStatus,
|
|
4
|
+
headers: {
|
|
5
|
+
...(contentType === undefined ? {} : { "content-type": contentType }),
|
|
6
|
+
...init.headers,
|
|
7
|
+
},
|
|
8
|
+
...(body === undefined ? {} : { body }),
|
|
9
|
+
});
|
|
10
|
+
/** A JSON body. A bigint field (protobuf int64) is written as a string. */
|
|
11
|
+
export function json(value, init = {}) {
|
|
12
|
+
return response(JSON.stringify(value, (_key, v) => typeof v === "bigint" ? v.toString() : v), "application/json", init, 200);
|
|
13
|
+
}
|
|
14
|
+
export function text(value, init = {}) {
|
|
15
|
+
return response(value, "text/plain; charset=utf-8", init, 200);
|
|
16
|
+
}
|
|
17
|
+
export function bytes(value, init = {}) {
|
|
18
|
+
return response(value, init.contentType ?? "application/octet-stream", init, 200);
|
|
19
|
+
}
|
|
20
|
+
/** No body. 204 unless `status` says otherwise. */
|
|
21
|
+
export function empty(init = {}) {
|
|
22
|
+
return response(undefined, undefined, init, 204);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Decline to answer: the request goes on to the next route that matches it,
|
|
26
|
+
* and to the real server when there is none. A route that only watches —
|
|
27
|
+
* `route.next()`, `route.requests` — answers with this.
|
|
28
|
+
*/
|
|
29
|
+
export function passthrough() {
|
|
30
|
+
return { kind: "passthrough" };
|
|
31
|
+
}
|
|
32
|
+
/** Fail the request at the network level, as a dropped connection would. */
|
|
33
|
+
export function abort(error = "failed") {
|
|
34
|
+
return { kind: "abort", error };
|
|
35
|
+
}
|
|
36
|
+
/** Answer `reply`, `ms` later. (Not named `then`, so a reply never looks like a thenable.) */
|
|
37
|
+
export function delay(ms, reply) {
|
|
38
|
+
return { kind: "delay", ms, reply };
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=reply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reply.js","sourceRoot":"","sources":["../../../../src/features/rest/lib/reply.ts"],"names":[],"mappings":"AAQA,MAAM,QAAQ,GAAG,CAChB,IAAqC,EACrC,WAA+B,EAC/B,IAAe,EACf,aAAqB,EACT,EAAE,CAAC,CAAC;IAChB,IAAI,EAAE,UAAU;IAChB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa;IACpC,OAAO,EAAE;QACR,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC;QACrE,GAAG,IAAI,CAAC,OAAO;KACf;IACD,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;CACvC,CAAC,CAAC;AAEH,2EAA2E;AAC3E,MAAM,UAAU,IAAI,CAAC,KAAc,EAAE,OAAkB,EAAE;IACxD,OAAO,QAAQ,CACd,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAU,EAAE,EAAE,CAC1C,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CACxC,EACD,kBAAkB,EAClB,IAAI,EACJ,GAAG,CACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAa,EAAE,OAAkB,EAAE;IACvD,OAAO,QAAQ,CAAC,KAAK,EAAE,2BAA2B,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,KAAK,CACpB,KAAiB,EACjB,OAAsD,EAAE;IAExD,OAAO,QAAQ,CACd,KAAK,EACL,IAAI,CAAC,WAAW,IAAI,0BAA0B,EAC9C,IAAI,EACJ,GAAG,CACH,CAAC;AACH,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,KAAK,CAAC,OAAkB,EAAE;IACzC,OAAO,QAAQ,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW;IAC1B,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AAChC,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,KAAK,CAAC,QAAwB,QAAQ;IACrD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AACjC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,KAAK,CAAC,EAAU,EAAE,KAAgB;IACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { Frame } from "../../../entities/frame/index.js";
|
|
2
|
+
import type { AbortErrorCode, HttpRequestView } from "../../../entities/plugin/index.js";
|
|
3
|
+
import type { UrlMatcher } from "../../../shared/lib/match/index.js";
|
|
4
|
+
export type RestMethod = "GET" | "POST" | "PUT" | "PATCH" | "DELETE" | "HEAD" | "OPTIONS";
|
|
5
|
+
export interface RestOptions {
|
|
6
|
+
/** A path prefix (`/api/v1`) or an origin (`https://api.example.test`) routes are relative to. */
|
|
7
|
+
readonly baseURL?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Record requests that no route answers, with their real responses.
|
|
10
|
+
* `true` records everything under `baseURL`. A request a route does
|
|
11
|
+
* answer is recorded by that route, not twice.
|
|
12
|
+
*/
|
|
13
|
+
readonly record?: boolean | UrlMatcher;
|
|
14
|
+
}
|
|
15
|
+
export interface RestRequest extends HttpRequestView {
|
|
16
|
+
/** `:name` segments of the matched path. */
|
|
17
|
+
readonly params: Readonly<Record<string, string>>;
|
|
18
|
+
readonly query: URLSearchParams;
|
|
19
|
+
}
|
|
20
|
+
/** What a resolver answers. Build one with the helpers: `json`, `text`, `abort`, ... */
|
|
21
|
+
export type RestReply = {
|
|
22
|
+
readonly kind: "response";
|
|
23
|
+
readonly status: number;
|
|
24
|
+
readonly headers: Readonly<Record<string, string>>;
|
|
25
|
+
readonly body?: Uint8Array | string;
|
|
26
|
+
} | {
|
|
27
|
+
readonly kind: "passthrough";
|
|
28
|
+
} | {
|
|
29
|
+
readonly kind: "abort";
|
|
30
|
+
readonly error: AbortErrorCode;
|
|
31
|
+
} | {
|
|
32
|
+
readonly kind: "delay";
|
|
33
|
+
readonly ms: number;
|
|
34
|
+
readonly reply: RestReply;
|
|
35
|
+
};
|
|
36
|
+
export type RestResolver = RestReply | ((request: RestRequest) => RestReply | Promise<RestReply>);
|
|
37
|
+
export interface RestRouteOptions {
|
|
38
|
+
readonly times?: number;
|
|
39
|
+
readonly match?: (request: RestRequest) => boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface RestRoute {
|
|
42
|
+
/** Requests this route answered. */
|
|
43
|
+
readonly hits: number;
|
|
44
|
+
readonly requests: readonly RestRequest[];
|
|
45
|
+
/** The next request this route answers (or answered and nobody took). */
|
|
46
|
+
next(options?: {
|
|
47
|
+
readonly timeout?: number;
|
|
48
|
+
}): Promise<RestRequest>;
|
|
49
|
+
remove(): Promise<void>;
|
|
50
|
+
}
|
|
51
|
+
export interface RestCall {
|
|
52
|
+
readonly correlation: string;
|
|
53
|
+
readonly method: string;
|
|
54
|
+
readonly url: string;
|
|
55
|
+
readonly request: Frame;
|
|
56
|
+
readonly response: Frame | undefined;
|
|
57
|
+
/** The HTTP status; undefined for an aborted or unfinished request. */
|
|
58
|
+
readonly status: number | undefined;
|
|
59
|
+
}
|
|
60
|
+
export type RestPath = string | RegExp;
|
|
61
|
+
export interface RestApi {
|
|
62
|
+
on(method: RestMethod | "*", path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
|
|
63
|
+
get(path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
|
|
64
|
+
post(path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
|
|
65
|
+
put(path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
|
|
66
|
+
patch(path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
|
|
67
|
+
delete(path: RestPath, resolver: RestResolver, options?: RestRouteOptions): Promise<RestRoute>;
|
|
68
|
+
/** Recorded REST exchanges, oldest first. */
|
|
69
|
+
calls(filter?: {
|
|
70
|
+
readonly method?: string;
|
|
71
|
+
readonly path?: RestPath;
|
|
72
|
+
}): Promise<RestCall[]>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/features/rest/model/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/features/rest/model/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,YAAY,EACX,MAAM,EACN,aAAa,EACb,MAAM,EACN,QAAQ,EACR,gBAAgB,EAChB,OAAO,GACP,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/sse/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type WirePlugin } from "../../../entities/plugin/index.js";
|
|
2
|
+
import type { SseApi } from "../model/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Server-sent events: answer an EventSource (or a fetch reading an event
|
|
5
|
+
* stream) with a response the test writes one event at a time, with clean
|
|
6
|
+
* ends and cuts that exercise the client's reconnect.
|
|
7
|
+
*/
|
|
8
|
+
export declare function sse(): WirePlugin<"sse", SseApi>;
|
|
9
|
+
//# sourceMappingURL=create-sse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-sse.d.ts","sourceRoot":"","sources":["../../../../src/features/sse/lib/create-sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,UAAU,EACf,MAAM,mCAAmC,CAAC;AAK3C,OAAO,KAAK,EAAE,MAAM,EAA2B,MAAM,mBAAmB,CAAC;AAGzE;;;;GAIG;AACH,wBAAgB,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CA+G/C"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { definePlugin, } from "../../../entities/plugin/index.js";
|
|
2
|
+
import { createArrivals, } from "../../../shared/lib/async/index.js";
|
|
3
|
+
import { encodeSseEvent } from "./encode.js";
|
|
4
|
+
/**
|
|
5
|
+
* Server-sent events: answer an EventSource (or a fetch reading an event
|
|
6
|
+
* stream) with a response the test writes one event at a time, with clean
|
|
7
|
+
* ends and cuts that exercise the client's reconnect.
|
|
8
|
+
*/
|
|
9
|
+
export function sse() {
|
|
10
|
+
return definePlugin({
|
|
11
|
+
name: "sse",
|
|
12
|
+
scope: "Sse",
|
|
13
|
+
setup(context) {
|
|
14
|
+
const { name } = context;
|
|
15
|
+
const api = {
|
|
16
|
+
async stream(url, streamOptions = {}) {
|
|
17
|
+
/** Requests the stub answered: each should become a connection. */
|
|
18
|
+
let taken = 0;
|
|
19
|
+
const connections = createArrivals({
|
|
20
|
+
clock: context.clock,
|
|
21
|
+
label: "SSE connection",
|
|
22
|
+
// The stub answered, yet no connection came of it: the
|
|
23
|
+
// redirect to the stream server is what went missing.
|
|
24
|
+
hint: () => taken > connections.items.length
|
|
25
|
+
? `${taken - connections.items.length} request(s) matched but never reached the local stream server — see "Live streams" in docs/troubleshooting.md`
|
|
26
|
+
: undefined,
|
|
27
|
+
});
|
|
28
|
+
const rule = await context.http.add({
|
|
29
|
+
protocol: name,
|
|
30
|
+
label: `sse ${String(url)}`,
|
|
31
|
+
url,
|
|
32
|
+
...(streamOptions.times === undefined
|
|
33
|
+
? {}
|
|
34
|
+
: { times: streamOptions.times }),
|
|
35
|
+
...(streamOptions.match === undefined
|
|
36
|
+
? {}
|
|
37
|
+
: { match: streamOptions.match }),
|
|
38
|
+
handle(view) {
|
|
39
|
+
taken += 1;
|
|
40
|
+
return {
|
|
41
|
+
type: "stream",
|
|
42
|
+
open(stream) {
|
|
43
|
+
stream.head(streamOptions.status ?? 200, {
|
|
44
|
+
"content-type": "text/event-stream; charset=utf-8",
|
|
45
|
+
"cache-control": "no-cache",
|
|
46
|
+
connection: "keep-alive",
|
|
47
|
+
...streamOptions.headers,
|
|
48
|
+
});
|
|
49
|
+
// An EventSource opens on the headers, before any event.
|
|
50
|
+
stream.flush();
|
|
51
|
+
let sent = 0;
|
|
52
|
+
const connection = {
|
|
53
|
+
request: view,
|
|
54
|
+
lastEventId: stream.requestHeaders["last-event-id"],
|
|
55
|
+
get sent() {
|
|
56
|
+
return sent;
|
|
57
|
+
},
|
|
58
|
+
async send(event) {
|
|
59
|
+
const chunk = encodeSseEvent(event);
|
|
60
|
+
await stream.write(chunk);
|
|
61
|
+
sent += 1;
|
|
62
|
+
context.timeline.append({
|
|
63
|
+
protocol: name,
|
|
64
|
+
kind: "event",
|
|
65
|
+
direction: "in",
|
|
66
|
+
endpoint: view.url.pathname,
|
|
67
|
+
source: "stub",
|
|
68
|
+
data: chunk,
|
|
69
|
+
value: event,
|
|
70
|
+
correlation: view.correlation,
|
|
71
|
+
context: view.context,
|
|
72
|
+
...(view.page === undefined ? {} : { page: view.page }),
|
|
73
|
+
});
|
|
74
|
+
},
|
|
75
|
+
end: () => stream.end(),
|
|
76
|
+
async cut() {
|
|
77
|
+
stream.cut();
|
|
78
|
+
},
|
|
79
|
+
closed: stream.closed,
|
|
80
|
+
};
|
|
81
|
+
if (streamOptions.retry !== undefined)
|
|
82
|
+
void stream
|
|
83
|
+
.write(`retry: ${streamOptions.retry}\n\n`)
|
|
84
|
+
.catch(() => { });
|
|
85
|
+
connections.push(connection);
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
get hits() {
|
|
92
|
+
return rule.hits;
|
|
93
|
+
},
|
|
94
|
+
next: (waitOptions) => connections.next(waitOptions),
|
|
95
|
+
get connections() {
|
|
96
|
+
return connections.items;
|
|
97
|
+
},
|
|
98
|
+
async broadcast(event) {
|
|
99
|
+
for (const connection of connections.items)
|
|
100
|
+
await connection.send(event).catch(() => { });
|
|
101
|
+
},
|
|
102
|
+
remove: () => rule.remove(),
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
async events(filter = {}) {
|
|
106
|
+
await context.sync();
|
|
107
|
+
return context.timeline.frames({
|
|
108
|
+
protocol: name,
|
|
109
|
+
kind: "event",
|
|
110
|
+
...(filter.endpoint === undefined
|
|
111
|
+
? {}
|
|
112
|
+
: { endpoint: filter.endpoint }),
|
|
113
|
+
});
|
|
114
|
+
},
|
|
115
|
+
};
|
|
116
|
+
return { api };
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=create-sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-sse.js","sourceRoot":"","sources":["../../../../src/features/sse/lib/create-sse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { SseEvent } from "../model/types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Encode one event in the text/event-stream format. Multi-line data becomes
|
|
4
|
+
* several `data:` lines — a single line with an embedded newline would end
|
|
5
|
+
* the field early and the client would see half the payload.
|
|
6
|
+
*/
|
|
7
|
+
export declare function encodeSseEvent(event: SseEvent | string): string;
|
|
8
|
+
//# sourceMappingURL=encode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.d.ts","sourceRoot":"","sources":["../../../../src/features/sse/lib/encode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,MAAM,CAa/D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Encode one event in the text/event-stream format. Multi-line data becomes
|
|
3
|
+
* several `data:` lines — a single line with an embedded newline would end
|
|
4
|
+
* the field early and the client would see half the payload.
|
|
5
|
+
*/
|
|
6
|
+
export function encodeSseEvent(event) {
|
|
7
|
+
if (typeof event === "string")
|
|
8
|
+
return `${dataLines(event)}\n`;
|
|
9
|
+
let out = "";
|
|
10
|
+
if (event.comment !== undefined)
|
|
11
|
+
for (const line of event.comment.split(/\r?\n/))
|
|
12
|
+
out += `: ${line}\n`;
|
|
13
|
+
if (event.event !== undefined)
|
|
14
|
+
out += `event: ${event.event}\n`;
|
|
15
|
+
if (event.id !== undefined)
|
|
16
|
+
out += `id: ${event.id}\n`;
|
|
17
|
+
if (event.retry !== undefined)
|
|
18
|
+
out += `retry: ${event.retry}\n`;
|
|
19
|
+
if (event.data !== undefined)
|
|
20
|
+
out += dataLines(typeof event.data === "string" ? event.data : JSON.stringify(event.data));
|
|
21
|
+
return `${out}\n`;
|
|
22
|
+
}
|
|
23
|
+
function dataLines(text) {
|
|
24
|
+
return text
|
|
25
|
+
.split(/\r?\n/)
|
|
26
|
+
.map((line) => `data: ${line}\n`)
|
|
27
|
+
.join("");
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=encode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encode.js","sourceRoot":"","sources":["../../../../src/features/sse/lib/encode.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAwB;IACtD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;IAC9D,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;YAAE,GAAG,IAAI,KAAK,IAAI,IAAI,CAAC;IACvE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,IAAI,UAAU,KAAK,CAAC,KAAK,IAAI,CAAC;IAChE,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS;QAAE,GAAG,IAAI,OAAO,KAAK,CAAC,EAAE,IAAI,CAAC;IACvD,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,IAAI,UAAU,KAAK,CAAC,KAAK,IAAI,CAAC;IAChE,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS;QAC3B,GAAG,IAAI,SAAS,CACf,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CACxE,CAAC;IACH,OAAO,GAAG,GAAG,IAAI,CAAC;AACnB,CAAC;AAED,SAAS,SAAS,CAAC,IAAY;IAC9B,OAAO,IAAI;SACT,KAAK,CAAC,OAAO,CAAC;SACd,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,IAAI,CAAC;SAChC,IAAI,CAAC,EAAE,CAAC,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import type { Frame } from "../../../entities/frame/index.js";
|
|
2
|
+
import type { HttpRequestView, StreamEnd } from "../../../entities/plugin/index.js";
|
|
3
|
+
import type { UrlMatcher } from "../../../shared/lib/match/index.js";
|
|
4
|
+
/** One server-sent event. A non-string `data` is sent as JSON. */
|
|
5
|
+
export interface SseEvent {
|
|
6
|
+
readonly data?: unknown;
|
|
7
|
+
readonly event?: string;
|
|
8
|
+
readonly id?: string;
|
|
9
|
+
/** Reconnection delay the client should use, in milliseconds. */
|
|
10
|
+
readonly retry?: number;
|
|
11
|
+
/** A `:` comment line, e.g. a keep-alive. */
|
|
12
|
+
readonly comment?: string;
|
|
13
|
+
}
|
|
14
|
+
/** How a connection ended. `cancelled` means the page closed it. */
|
|
15
|
+
export type SseEnd = StreamEnd;
|
|
16
|
+
export interface SseConnection {
|
|
17
|
+
readonly request: HttpRequestView;
|
|
18
|
+
/**
|
|
19
|
+
* The `Last-Event-ID` the client reconnected with. Read off the request the
|
|
20
|
+
* stream server received: the browser's network stack adds it after
|
|
21
|
+
* Playwright's route has seen the request, so `request.headers` lacks it.
|
|
22
|
+
*/
|
|
23
|
+
readonly lastEventId: string | undefined;
|
|
24
|
+
/** Events written so far. */
|
|
25
|
+
readonly sent: number;
|
|
26
|
+
/** Write an event. A string is sent as `data`. Resolves once written. */
|
|
27
|
+
send(event: SseEvent | string): Promise<void>;
|
|
28
|
+
/** Close cleanly; EventSource will reconnect after its retry delay. */
|
|
29
|
+
end(): Promise<void>;
|
|
30
|
+
/** Reset the connection, as a network drop would. */
|
|
31
|
+
cut(): Promise<void>;
|
|
32
|
+
readonly closed: Promise<SseEnd>;
|
|
33
|
+
}
|
|
34
|
+
export interface SseStreamOptions {
|
|
35
|
+
readonly times?: number;
|
|
36
|
+
readonly status?: number;
|
|
37
|
+
readonly headers?: Readonly<Record<string, string>>;
|
|
38
|
+
/** Sent before anything else: the client's reconnection delay. */
|
|
39
|
+
readonly retry?: number;
|
|
40
|
+
readonly match?: (request: HttpRequestView) => boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface SseStub {
|
|
43
|
+
/** Requests this stub answered. */
|
|
44
|
+
readonly hits: number;
|
|
45
|
+
/** The next connection the page opens (or opened and nobody took). */
|
|
46
|
+
next(options?: {
|
|
47
|
+
readonly timeout?: number;
|
|
48
|
+
}): Promise<SseConnection>;
|
|
49
|
+
readonly connections: readonly SseConnection[];
|
|
50
|
+
/** Send to every open connection. */
|
|
51
|
+
broadcast(event: SseEvent | string): Promise<void>;
|
|
52
|
+
remove(): Promise<void>;
|
|
53
|
+
}
|
|
54
|
+
export interface SseApi {
|
|
55
|
+
/** Answer matching requests with an event stream the test drives. */
|
|
56
|
+
stream(url: UrlMatcher, options?: SseStreamOptions): Promise<SseStub>;
|
|
57
|
+
/** Events sent so far, oldest first. */
|
|
58
|
+
events(filter?: {
|
|
59
|
+
readonly endpoint?: string | RegExp;
|
|
60
|
+
}): Promise<Frame[]>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/features/sse/model/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kCAAkC,CAAC;AAC9D,OAAO,KAAK,EACX,eAAe,EACf,SAAS,EACT,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAErE,kEAAkE;AAClE,MAAM,WAAW,QAAQ;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,oEAAoE;AACpE,MAAM,MAAM,MAAM,GAAG,SAAS,CAAC;AAE/B,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IACzC,6BAA6B;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,IAAI,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,uEAAuE;IACvE,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,qDAAqD;IACrD,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACpD,kEAAkE;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;CACvD;AAED,MAAM,WAAW,OAAO;IACvB,mCAAmC;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACtE,QAAQ,CAAC,WAAW,EAAE,SAAS,aAAa,EAAE,CAAC;IAC/C,qCAAqC;IACrC,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,MAAM;IACtB,qEAAqE;IACrE,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,wCAAwC;IACxC,MAAM,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;CAC3E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/features/sse/model/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/features/webrtc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,YAAY,EACX,YAAY,EACZ,SAAS,EACT,aAAa,GACb,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/features/webrtc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type WirePlugin } from "../../../entities/plugin/index.js";
|
|
2
|
+
import type { WebRtcApi, WebRtcOptions } from "../model/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* WebRTC data channels: record what the page sends and receives, drop
|
|
5
|
+
* messages on one channel while it stays open, and inject messages as the
|
|
6
|
+
* remote peer.
|
|
7
|
+
*/
|
|
8
|
+
export declare function webrtc(options?: WebRtcOptions): WirePlugin<"webrtc", WebRtcApi>;
|
|
9
|
+
//# sourceMappingURL=create-webrtc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-webrtc.d.ts","sourceRoot":"","sources":["../../../../src/features/webrtc/lib/create-webrtc.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,UAAU,EACf,MAAM,mCAAmC,CAAC;AAG3C,OAAO,KAAK,EAIX,SAAS,EACT,aAAa,EACb,MAAM,mBAAmB,CAAC;AAO3B;;;;GAIG;AACH,wBAAgB,MAAM,CACrB,OAAO,GAAE,aAAkB,GACzB,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CA0HjC"}
|