request-iframe 0.0.6 → 0.1.1

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.
Files changed (95) hide show
  1. package/README.CN.md +220 -21
  2. package/README.md +221 -24
  3. package/esm/api/client.js +80 -0
  4. package/esm/api/server.js +61 -0
  5. package/esm/constants/index.js +289 -0
  6. package/esm/constants/messages.js +157 -0
  7. package/esm/core/client-server.js +294 -0
  8. package/esm/core/client.js +873 -0
  9. package/esm/core/request.js +27 -0
  10. package/esm/core/response.js +459 -0
  11. package/esm/core/server.js +776 -0
  12. package/esm/index.js +21 -0
  13. package/esm/interceptors/index.js +122 -0
  14. package/esm/message/channel.js +182 -0
  15. package/esm/message/dispatcher.js +418 -0
  16. package/esm/message/index.js +2 -0
  17. package/esm/stream/file-stream.js +289 -0
  18. package/esm/stream/index.js +44 -0
  19. package/esm/stream/readable-stream.js +539 -0
  20. package/esm/stream/stream-core.js +204 -0
  21. package/esm/stream/types.js +1 -0
  22. package/esm/stream/writable-stream.js +836 -0
  23. package/esm/types/index.js +1 -0
  24. package/esm/utils/ack.js +36 -0
  25. package/esm/utils/cache.js +147 -0
  26. package/esm/utils/cookie.js +352 -0
  27. package/esm/utils/debug.js +521 -0
  28. package/esm/utils/error.js +27 -0
  29. package/esm/utils/index.js +180 -0
  30. package/esm/utils/origin.js +30 -0
  31. package/esm/utils/path-match.js +148 -0
  32. package/esm/utils/protocol.js +157 -0
  33. package/library/api/client.d.ts.map +1 -1
  34. package/library/api/client.js +13 -5
  35. package/library/api/server.d.ts.map +1 -1
  36. package/library/api/server.js +6 -1
  37. package/library/constants/index.d.ts +59 -4
  38. package/library/constants/index.d.ts.map +1 -1
  39. package/library/constants/index.js +67 -9
  40. package/library/constants/messages.d.ts +8 -1
  41. package/library/constants/messages.d.ts.map +1 -1
  42. package/library/constants/messages.js +8 -1
  43. package/library/core/client-server.d.ts +7 -15
  44. package/library/core/client-server.d.ts.map +1 -1
  45. package/library/core/client-server.js +56 -44
  46. package/library/core/client.d.ts +4 -1
  47. package/library/core/client.d.ts.map +1 -1
  48. package/library/core/client.js +74 -31
  49. package/library/core/response.d.ts +21 -3
  50. package/library/core/response.d.ts.map +1 -1
  51. package/library/core/response.js +55 -7
  52. package/library/core/server.d.ts +34 -3
  53. package/library/core/server.d.ts.map +1 -1
  54. package/library/core/server.js +191 -21
  55. package/library/message/channel.d.ts +6 -0
  56. package/library/message/channel.d.ts.map +1 -1
  57. package/library/message/channel.js +2 -1
  58. package/library/message/dispatcher.d.ts +32 -0
  59. package/library/message/dispatcher.d.ts.map +1 -1
  60. package/library/message/dispatcher.js +131 -1
  61. package/library/stream/file-stream.d.ts +4 -0
  62. package/library/stream/file-stream.d.ts.map +1 -1
  63. package/library/stream/file-stream.js +61 -33
  64. package/library/stream/index.d.ts.map +1 -1
  65. package/library/stream/index.js +2 -0
  66. package/library/stream/readable-stream.d.ts +30 -11
  67. package/library/stream/readable-stream.d.ts.map +1 -1
  68. package/library/stream/readable-stream.js +368 -73
  69. package/library/stream/stream-core.d.ts +65 -0
  70. package/library/stream/stream-core.d.ts.map +1 -0
  71. package/library/stream/stream-core.js +211 -0
  72. package/library/stream/types.d.ts +203 -3
  73. package/library/stream/types.d.ts.map +1 -1
  74. package/library/stream/writable-stream.d.ts +59 -13
  75. package/library/stream/writable-stream.d.ts.map +1 -1
  76. package/library/stream/writable-stream.js +647 -197
  77. package/library/types/index.d.ts +70 -4
  78. package/library/types/index.d.ts.map +1 -1
  79. package/library/utils/ack.d.ts +2 -0
  80. package/library/utils/ack.d.ts.map +1 -0
  81. package/library/utils/ack.js +44 -0
  82. package/library/utils/debug.js +1 -1
  83. package/library/utils/index.d.ts +1 -0
  84. package/library/utils/index.d.ts.map +1 -1
  85. package/library/utils/index.js +19 -2
  86. package/library/utils/origin.d.ts +14 -0
  87. package/library/utils/origin.d.ts.map +1 -0
  88. package/library/utils/origin.js +35 -0
  89. package/package.json +30 -7
  90. package/react/README.md +16 -0
  91. package/react/esm/index.js +284 -0
  92. package/react/library/index.d.ts +1 -1
  93. package/react/library/index.d.ts.map +1 -1
  94. package/react/library/index.js +3 -3
  95. package/react/package.json +24 -2
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACd,QAAQ,EAGR,mBAAmB,EACnB,eAAe,EACf,aAAa,EAEb,aAAa,EACb,eAAe,EAChB,MAAM,UAAU,CAAC;AASlB,OAAO,EACL,yBAAyB,EACzB,0BAA0B,EAG3B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAa5D,OAAO,EAGL,oBAAoB,EAEpB,oBAAoB,EACpB,iBAAiB,EAClB,MAAM,WAAW,CAAC;AAGnB;;GAEG;AACH,MAAM,WAAW,aAAc,SAAQ,eAAe;IACpD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,cAAc,CAAC,EAAE,aAAa,CAAC;IAC/B,cAAc,CAAC,EAAE,eAAe,CAAC;CAClC;AAED;;GAEG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB,EAAE,oBAAoB;IACvF,yBAAyB;IACzB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAEpB,YAAY;;;MAGjB;IAEF,SAAgB,YAAY,EAAE,MAAM,CAAC;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAA8E;IAE/G,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAE7C,uCAAuC;IACvC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAE5C,oCAAoC;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAgB;IAEhD;;;;OAIG;IACH,OAAO,CAAC,YAAY,CAAkC;IAEtD;;;;OAIG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwD;IAEvF;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAC,CAAS;gBAG/B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,yBAAyB,EACjC,OAAO,CAAC,EAAE,aAAa,EACvB,UAAU,CAAC,EAAE,MAAM;IAoCrB;;OAEG;IACI,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI;IAIhG;;OAEG;IACI,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAO/C,WAAW,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI;IAKtC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IA+B7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAO1B;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAIhC;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IA4BpB;;OAEG;IACI,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAmEvB,IAAI,CAAC,CAAC,GAAG,GAAG,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,GAAG,EACV,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAgD3B;;OAEG;IACU,QAAQ,CAAC,CAAC,GAAG,GAAG,EAC3B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAC7B,OAAO,CAAC,EAAE,cAAc,GAAG;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,GACzF,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAuB3B;;;OAGG;IACU,UAAU,CAAC,CAAC,GAAG,GAAG,EAC7B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,oBAAoB,EAC5B,OAAO,CAAC,EAAE,cAAc,GACvB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAgD3B;;OAEG;IACH,OAAO,CAAC,YAAY;IA6WpB;;OAEG;IACI,SAAS,IAAI,yBAAyB;IAI7C;;OAEG;IACH,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED;;;OAGG;IACI,WAAW,IAAI,OAAO;IAI7B;;OAEG;IACI,IAAI,IAAI,IAAI;IAInB;;OAEG;IACI,KAAK,IAAI,IAAI;IAIpB;;OAEG;IACI,OAAO,IAAI,IAAI;IAetB;;;OAGG;IACI,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAOxD;;;;OAIG;IACI,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIjE;;;;;OAKG;IACI,SAAS,CACd,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,IAAI,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,IAAI;IAgBP;;;;OAIG;IACI,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAItD;;OAEG;IACI,YAAY,IAAI,IAAI;CAG5B"}
@@ -27,6 +27,7 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
27
27
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
28
28
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
29
29
  var _utils = require("../utils");
30
+ var _ack = require("../utils/ack");
30
31
  var _interceptors = require("../interceptors");
31
32
  var _constants = require("../constants");
32
33
  var _stream = require("../stream");
@@ -74,6 +75,17 @@ class RequestIframeClientImpl {
74
75
  this.server = server;
75
76
  this.secretKey = options === null || options === void 0 ? void 0 : options.secretKey;
76
77
 
78
+ // Provide fallback target for auto-ack (useful when MessageEvent.source is missing in tests)
79
+ this.server.messageDispatcher.setFallbackTarget(this.targetWindow, this.targetOrigin);
80
+
81
+ // Build origin validator (incoming messages)
82
+ if (options !== null && options !== void 0 && options.validateOrigin) {
83
+ this.originValidator = (origin, data, context) => options.validateOrigin(origin, data, context);
84
+ } else if (options !== null && options !== void 0 && options.allowedOrigins) {
85
+ var matcher = options.allowedOrigins;
86
+ this.originValidator = origin => (0, _utils.matchOrigin)(origin, matcher);
87
+ }
88
+
77
89
  // Set default timeout configuration
78
90
  this.defaultAckTimeout = (_options$ackTimeout = options === null || options === void 0 ? void 0 : options.ackTimeout) !== null && _options$ackTimeout !== void 0 ? _options$ackTimeout : _constants.DefaultTimeout.ACK;
79
91
  this.defaultTimeout = (_options$timeout = options === null || options === void 0 ? void 0 : options.timeout) !== null && _options$timeout !== void 0 ? _options$timeout : _constants.DefaultTimeout.REQUEST;
@@ -86,8 +98,8 @@ class RequestIframeClientImpl {
86
98
  this.initialHeaders = options === null || options === void 0 ? void 0 : options.headers;
87
99
 
88
100
  // Register stream message processing callback
89
- this.server.setStreamCallback(data => {
90
- this.dispatchStreamMessage(data);
101
+ this.server.setStreamCallback((data, context) => {
102
+ this.dispatchStreamMessage(data, context);
91
103
  });
92
104
  }
93
105
 
@@ -116,11 +128,29 @@ class RequestIframeClientImpl {
116
128
  /**
117
129
  * Dispatch stream message to corresponding handler
118
130
  */
119
- dispatchStreamMessage(data) {
131
+ dispatchStreamMessage(data, context) {
132
+ // Validate origin for stream messages (stream_data/stream_end/stream_error/stream_cancel)
133
+ if (context) {
134
+ if (this.originValidator) {
135
+ try {
136
+ if (!this.originValidator(context.origin, data, context)) {
137
+ return;
138
+ }
139
+ } catch (_unused) {
140
+ return;
141
+ }
142
+ } else if (this.targetOrigin !== _constants.OriginConstant.ANY && context.origin !== this.targetOrigin) {
143
+ return;
144
+ }
145
+ }
120
146
  var body = data.body;
121
147
  if (!body || !body.streamId) return;
122
148
  var handler = this.streamHandlers.get(body.streamId);
123
149
  if (handler) {
150
+ if (context && !context.handledBy) {
151
+ context.accepted = true;
152
+ context.handledBy = this.id;
153
+ }
124
154
  // Extract message type (remove stream_ prefix)
125
155
  var messageType = data.type.replace('stream_', '');
126
156
  handler(_objectSpread(_objectSpread({}, body), {}, {
@@ -219,7 +249,11 @@ class RequestIframeClientImpl {
219
249
  }
220
250
  this.server._registerPendingRequest(requestId, data => {
221
251
  if (done) return;
222
- if (data.type === _constants.MessageType.PONG) {
252
+ if (data.type === _constants.MessageType.ACK || data.type === _constants.MessageType.PONG) {
253
+ // Remember server's creatorId as target server ID for future requests
254
+ if (data.creatorId && !this._targetServerId) {
255
+ this._targetServerId = data.creatorId;
256
+ }
223
257
  done = true;
224
258
  cleanup();
225
259
  resolve(true);
@@ -229,7 +263,7 @@ class RequestIframeClientImpl {
229
263
  done = true;
230
264
  cleanup();
231
265
  resolve(false);
232
- }, this.targetOrigin);
266
+ }, this.targetOrigin, this.originValidator);
233
267
  timeoutId = setTimeout(() => {
234
268
  if (done) return;
235
269
  done = true;
@@ -238,7 +272,10 @@ class RequestIframeClientImpl {
238
272
  }, this.defaultAckTimeout);
239
273
 
240
274
  // Send ping via MessageDispatcher
241
- this.server.messageDispatcher.sendMessage(this.targetWindow, this.targetOrigin, _constants.MessageType.PING, requestId);
275
+ this.server.messageDispatcher.sendMessage(this.targetWindow, this.targetOrigin, _constants.MessageType.PING, requestId, {
276
+ requireAck: true,
277
+ targetId: this._targetServerId
278
+ });
242
279
  });
243
280
  }
244
281
  send(path, body, options) {
@@ -380,6 +417,9 @@ class RequestIframeClientImpl {
380
417
  targetOrigin: _this3.targetOrigin,
381
418
  secretKey: _this3.secretKey,
382
419
  channel: _this3.server.messageDispatcher.getChannel(),
420
+ registerStreamHandler: _this3.registerStreamHandler.bind(_this3),
421
+ unregisterStreamHandler: _this3.unregisterStreamHandler.bind(_this3),
422
+ heartbeat: () => _this3.isConnect(),
383
423
  clientId: _this3.id,
384
424
  targetId
385
425
  });
@@ -413,6 +453,10 @@ class RequestIframeClientImpl {
413
453
  timeout = _processedConfig$time === void 0 ? this.defaultTimeout : _processedConfig$time,
414
454
  _processedConfig$asyn = processedConfig.asyncTimeout,
415
455
  asyncTimeout = _processedConfig$asyn === void 0 ? this.defaultAsyncTimeout : _processedConfig$asyn,
456
+ _processedConfig$requ3 = processedConfig.requireAck,
457
+ requireAck = _processedConfig$requ3 === void 0 ? true : _processedConfig$requ3,
458
+ streamTimeout = processedConfig.streamTimeout,
459
+ ack = processedConfig.ack,
416
460
  _processedConfig$retu = processedConfig.returnData,
417
461
  returnData = _processedConfig$retu === void 0 ? this.defaultReturnData : _processedConfig$retu;
418
462
  return new Promise((resolve, reject) => {
@@ -486,6 +530,10 @@ class RequestIframeClientImpl {
486
530
 
487
531
  // Received ACK: server has received request
488
532
  if (data.type === _constants.MessageType.ACK) {
533
+ // Optional ack match (ignore mismatched ACK)
534
+ if (ack !== undefined && !(0, _ack.isAckMatch)(ack, data.ack)) {
535
+ return;
536
+ }
489
537
  // Remember server's creatorId as target server ID for future requests
490
538
  if (data.creatorId && !this._targetServerId) {
491
539
  this._targetServerId = data.creatorId;
@@ -514,6 +562,7 @@ class RequestIframeClientImpl {
514
562
  var streamBody = data.body;
515
563
  var streamId = streamBody.streamId;
516
564
  var streamType = streamBody.type || _constants.StreamType.DATA;
565
+ var streamMode = streamBody.mode;
517
566
  var streamChunked = (_streamBody$chunked = streamBody.chunked) !== null && _streamBody$chunked !== void 0 ? _streamBody$chunked : true;
518
567
  var streamMetadata = streamBody.metadata;
519
568
  var autoResolve = (_streamBody$autoResol = streamBody.autoResolve) !== null && _streamBody$autoResol !== void 0 ? _streamBody$autoResol : false;
@@ -523,6 +572,10 @@ class RequestIframeClientImpl {
523
572
  var _readableStream = new _stream.IframeFileReadableStream(streamId, requestId, this, {
524
573
  chunked: streamChunked,
525
574
  metadata: streamMetadata,
575
+ secretKey: this.secretKey,
576
+ idleTimeout: streamTimeout,
577
+ heartbeat: () => this.isConnect(),
578
+ mode: streamMode,
526
579
  filename: streamMetadata === null || streamMetadata === void 0 ? void 0 : streamMetadata.filename,
527
580
  mimeType: streamMetadata === null || streamMetadata === void 0 ? void 0 : streamMetadata.mimeType,
528
581
  size: streamMetadata === null || streamMetadata === void 0 ? void 0 : streamMetadata.size
@@ -579,8 +632,12 @@ class RequestIframeClientImpl {
579
632
  // Non-file stream: create regular readable stream
580
633
  var readableStream = new _stream.IframeReadableStream(streamId, requestId, this, {
581
634
  type: streamType,
635
+ mode: streamMode,
582
636
  chunked: streamChunked,
583
- metadata: streamMetadata
637
+ metadata: streamMetadata,
638
+ secretKey: this.secretKey,
639
+ idleTimeout: streamTimeout,
640
+ heartbeat: () => this.isConnect()
584
641
  });
585
642
  var resp = {
586
643
  data: undefined,
@@ -612,17 +669,6 @@ class RequestIframeClientImpl {
612
669
  this._targetServerId = data.creatorId;
613
670
  }
614
671
 
615
- // If server requires acknowledgment, send received message
616
- if (data.requireAck) {
617
- // Check if target window is still available before sending
618
- if ((0, _utils.isWindowAvailable)(this.targetWindow)) {
619
- this.server.messageDispatcher.sendMessage(this.targetWindow, this.targetOrigin, _constants.MessageType.RECEIVED, requestId, {
620
- path: requestPath,
621
- targetId: data.creatorId
622
- });
623
- }
624
- }
625
-
626
672
  // Parse and save server-set cookies (from Set-Cookie header)
627
673
  if (data.headers && data.headers[_constants.HttpHeader.SET_COOKIE]) {
628
674
  var setCookies = data.headers[_constants.HttpHeader.SET_COOKIE];
@@ -660,15 +706,6 @@ class RequestIframeClientImpl {
660
706
  if (data.creatorId && !this._targetServerId) {
661
707
  this._targetServerId = data.creatorId;
662
708
  }
663
-
664
- // If server requires acknowledgment, send received message
665
- if (data.requireAck) {
666
- // Window check is handled in MessageDispatcher
667
- this.server.messageDispatcher.sendMessage(this.targetWindow, this.targetOrigin, _constants.MessageType.RECEIVED, requestId, {
668
- path: requestPath,
669
- targetId: data.creatorId
670
- });
671
- }
672
709
  fail(new _utils.RequestIframeError({
673
710
  message: ((_data$error = data.error) === null || _data$error === void 0 ? void 0 : _data$error.message) || _constants.Messages.REQUEST_FAILED,
674
711
  code: ((_data$error2 = data.error) === null || _data$error2 === void 0 ? void 0 : _data$error2.code) || _constants.ErrorCode.REQUEST_ERROR,
@@ -688,10 +725,14 @@ class RequestIframeClientImpl {
688
725
  config: processedConfig,
689
726
  requestId
690
727
  }));
691
- }, this.targetOrigin);
728
+ }, this.targetOrigin, this.originValidator);
692
729
 
693
- // Set ACK timeout
694
- setAckTimeout();
730
+ // Set ACK timeout (delivery stage). If disabled, start request timeout immediately.
731
+ if (requireAck === false) {
732
+ setRequestTimeout();
733
+ } else {
734
+ setAckTimeout();
735
+ }
695
736
 
696
737
  // Get cookies matching request path and merge with user-provided cookies (user-provided takes precedence)
697
738
  var pathMatchedCookies = this._cookieStore.getForPath(requestPath);
@@ -703,7 +744,9 @@ class RequestIframeClientImpl {
703
744
  body,
704
745
  headers: mergedHeaders,
705
746
  cookies: mergedCookies,
706
- targetId
747
+ targetId,
748
+ requireAck,
749
+ ack
707
750
  };
708
751
  if (extraPayload !== null && extraPayload !== void 0 && extraPayload.streamId) {
709
752
  payload.streamId = extraPayload.streamId;
@@ -4,7 +4,8 @@ import { MessageChannel } from '../message';
4
4
  /**
5
5
  * Callback waiting for client acknowledgment
6
6
  */
7
- type AckCallback = (received: boolean) => void;
7
+ type AckCallback = (received: boolean, ack?: any) => void;
8
+ type OnSentCallback = () => void;
8
9
  /**
9
10
  * ServerResponse implementation
10
11
  */
@@ -17,13 +18,22 @@ export declare class ServerResponseImpl implements ServerResponse {
17
18
  private readonly targetWindow;
18
19
  private readonly targetOrigin;
19
20
  private readonly channel;
21
+ private readonly registerStreamHandler?;
22
+ private readonly unregisterStreamHandler?;
23
+ private readonly heartbeat?;
20
24
  /** Target client ID (usually the creatorId of the original request) */
21
25
  private readonly targetId?;
22
26
  /** Server instance ID (for creatorId in responses) */
23
27
  private readonly serverId?;
24
28
  private onAckCallback?;
29
+ private onSentCallback?;
25
30
  _sent: boolean;
26
- constructor(requestId: string, path: string, secretKey: string | undefined, targetWindow: Window, targetOrigin: string, channel: MessageChannel, serverId?: string, targetId?: string);
31
+ constructor(requestId: string, path: string, secretKey: string | undefined, targetWindow: Window, targetOrigin: string, channel: MessageChannel, serverId?: string, targetId?: string, options?: {
32
+ registerStreamHandler?: (streamId: string, handler: (data: any) => void) => void;
33
+ unregisterStreamHandler?: (streamId: string) => void;
34
+ heartbeat?: () => Promise<boolean>;
35
+ onSent?: OnSentCallback;
36
+ });
27
37
  /**
28
38
  * Send message via channel
29
39
  */
@@ -48,7 +58,15 @@ export declare class ServerResponseImpl implements ServerResponse {
48
58
  /**
49
59
  * Trigger client acknowledgment callback
50
60
  */
51
- _triggerAck(received: boolean): void;
61
+ _triggerAck(received: boolean, ack?: any): void;
62
+ /**
63
+ * Mark response as sent (and trigger onSent callback once).
64
+ */
65
+ private markSent;
66
+ /**
67
+ * Internal: mark as sent for manual error responses.
68
+ */
69
+ _markSent(): void;
52
70
  /**
53
71
  * Internal method: send raw data (used by send after type detection)
54
72
  */
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/core/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAoD,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAI5C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAE/C;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IAChD,UAAU,EAAE,MAAM,CAAiB;IACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAM;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,aAAa,CAAC,CAAc;IAC7B,KAAK,UAAS;gBAGnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,EACvB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM;IAYnB;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;OAEG;IACI,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAIrD;;OAEG;IACI,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAO3C;;OAEG;IACH,OAAO,CAAC,QAAQ;IA+DhB;;;;;OAKG;IACU,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAiC9D,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlD,QAAQ,CACnB,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAC7B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC;IAoDnB;;;OAGG;IACU,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB7D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAKpC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAwBhE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc;IAMpE,MAAM,CACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc;IA4BV,WAAW,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc;CAkBlB"}
1
+ {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/core/response.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAGvF,OAAO,EAAE,oBAAoB,EAAoD,MAAM,WAAW,CAAC;AACnG,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAK5C;;GAEG;AACH,KAAK,WAAW,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;AAC1D,KAAK,cAAc,GAAG,MAAM,IAAI,CAAC;AAEjC;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IAChD,UAAU,EAAE,MAAM,CAAiB;IACnC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAM;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAA2D;IAClG,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAA6B;IACtE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAyB;IACpD,uEAAuE;IACvE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,sDAAsD;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAS;IACnC,OAAO,CAAC,aAAa,CAAC,CAAc;IACpC,OAAO,CAAC,cAAc,CAAC,CAAiB;IACjC,KAAK,UAAS;gBAGnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,cAAc,EACvB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QACR,qBAAqB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAC;QACjF,uBAAuB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QACrD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,CAAC,EAAE,cAAc,CAAC;KACzB;IAgBH;;OAEG;IACH,OAAO,CAAC,WAAW;IAKnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAKjB;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAQjC;;OAEG;IACI,iBAAiB,CAAC,QAAQ,EAAE,WAAW,GAAG,IAAI;IAIrD;;OAEG;IACI,WAAW,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,IAAI;IAOtD;;OAEG;IACH,OAAO,CAAC,QAAQ;IAUhB;;OAEG;IACI,SAAS,IAAI,IAAI;IAIxB;;OAEG;IACH,OAAO,CAAC,QAAQ;IAmFhB;;;;;OAKG;IACU,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAiC9D,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAIlD,QAAQ,CACnB,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,EAC7B,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,OAAO,CAAC;IAoDnB;;;OAGG;IACU,UAAU,CAAC,MAAM,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAwB7D,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAKpC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAwBhE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc;IAMpE,MAAM,CACX,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc;IA4BV,WAAW,CAChB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,aAAa,GACtB,cAAc;CAkBlB"}
@@ -17,6 +17,7 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
17
17
  var _utils = require("../utils");
18
18
  var _constants = require("../constants");
19
19
  var _stream = require("../stream");
20
+ var _ack2 = require("../utils/ack");
20
21
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
21
22
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
22
23
  /**
@@ -27,7 +28,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
27
28
  * ServerResponse implementation
28
29
  */
29
30
  class ServerResponseImpl {
30
- constructor(requestId, path, secretKey, targetWindow, targetOrigin, channel, serverId, targetId) {
31
+ constructor(requestId, path, secretKey, targetWindow, targetOrigin, channel, serverId, targetId, options) {
31
32
  (0, _defineProperty2.default)(this, "statusCode", _constants.HttpStatus.OK);
32
33
  (0, _defineProperty2.default)(this, "headers", {});
33
34
  (0, _defineProperty2.default)(this, "_sent", false);
@@ -39,6 +40,10 @@ class ServerResponseImpl {
39
40
  this.channel = channel;
40
41
  this.serverId = serverId;
41
42
  this.targetId = targetId;
43
+ this.registerStreamHandler = options === null || options === void 0 ? void 0 : options.registerStreamHandler;
44
+ this.unregisterStreamHandler = options === null || options === void 0 ? void 0 : options.unregisterStreamHandler;
45
+ this.heartbeat = options === null || options === void 0 ? void 0 : options.heartbeat;
46
+ this.onSentCallback = options === null || options === void 0 ? void 0 : options.onSent;
42
47
  }
43
48
 
44
49
  /**
@@ -89,21 +94,50 @@ class ServerResponseImpl {
89
94
  /**
90
95
  * Trigger client acknowledgment callback
91
96
  */
92
- _triggerAck(received) {
97
+ _triggerAck(received, ack) {
93
98
  if (this.onAckCallback) {
94
- this.onAckCallback(received);
99
+ this.onAckCallback(received, ack);
95
100
  this.onAckCallback = undefined;
96
101
  }
97
102
  }
98
103
 
104
+ /**
105
+ * Mark response as sent (and trigger onSent callback once).
106
+ */
107
+ markSent() {
108
+ if (this._sent) return;
109
+ this._sent = true;
110
+ if (this.onSentCallback) {
111
+ var cb = this.onSentCallback;
112
+ this.onSentCallback = undefined;
113
+ cb();
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Internal: mark as sent for manual error responses.
119
+ */
120
+ _markSent() {
121
+ this.markSent();
122
+ }
123
+
99
124
  /**
100
125
  * Internal method: send raw data (used by send after type detection)
101
126
  */
102
127
  _sendRaw(data, options) {
103
- var _options$requireAck;
128
+ var _options$requireAck, _ack;
104
129
  if (this._sent) return Promise.resolve(false);
105
- this._sent = true;
130
+ this.markSent();
106
131
  var requireAck = (_options$requireAck = options === null || options === void 0 ? void 0 : options.requireAck) !== null && _options$requireAck !== void 0 ? _options$requireAck : false;
132
+ /**
133
+ * When requireAck is enabled, attach a unique ack payload by default so ACK can be
134
+ * unambiguously associated with this send.
135
+ *
136
+ * NOTE: ack is an internal reserved field (not part of public API).
137
+ */
138
+ var expectedAck = (_ack = options === null || options === void 0 ? void 0 : options.ack) !== null && _ack !== void 0 ? _ack : requireAck ? {
139
+ id: (0, _utils.generateRequestId)()
140
+ } : undefined;
107
141
  try {
108
142
  // If acknowledgment not required, send directly and return true
109
143
  if (!requireAck) {
@@ -125,7 +159,17 @@ class ServerResponseImpl {
125
159
  // Acknowledgment required, wait for client response
126
160
  return new Promise((resolve, reject) => {
127
161
  try {
128
- this._setOnAckCallback(resolve);
162
+ this._setOnAckCallback((received, receivedAckMeta) => {
163
+ if (!received) {
164
+ resolve(false);
165
+ return;
166
+ }
167
+ if (expectedAck !== undefined && !(0, _ack2.isAckMatch)(expectedAck, receivedAckMeta)) {
168
+ resolve(false);
169
+ return;
170
+ }
171
+ resolve(true);
172
+ });
129
173
  this.sendMessage((0, _utils.createPostMessage)(_constants.MessageType.RESPONSE, this.requestId, {
130
174
  path: this.path,
131
175
  secretKey: this.secretKey,
@@ -134,6 +178,7 @@ class ServerResponseImpl {
134
178
  statusText: (0, _constants.getStatusText)(this.statusCode),
135
179
  headers: this.headers,
136
180
  requireAck: true,
181
+ ack: expectedAck,
137
182
  role: _constants.MessageRole.SERVER,
138
183
  creatorId: this.serverId,
139
184
  targetId: this.targetId
@@ -317,7 +362,7 @@ class ServerResponseImpl {
317
362
  }
318
363
  return _context4.abrupt("return");
319
364
  case 1:
320
- _this3._sent = true;
365
+ _this3.markSent();
321
366
 
322
367
  // Window check is handled in MessageDispatcher when stream sends messages
323
368
 
@@ -328,6 +373,9 @@ class ServerResponseImpl {
328
373
  targetOrigin: _this3.targetOrigin,
329
374
  secretKey: _this3.secretKey,
330
375
  channel: _this3.channel,
376
+ registerStreamHandler: _this3.registerStreamHandler,
377
+ unregisterStreamHandler: _this3.unregisterStreamHandler,
378
+ heartbeat: _this3.heartbeat,
331
379
  serverId: _this3.serverId,
332
380
  targetId: _this3.targetId
333
381
  });
@@ -1,4 +1,4 @@
1
- import { ServerHandler, RequestIframeServer, Middleware, PathMatcher } from '../types';
1
+ import type { ServerHandler, RequestIframeServer, Middleware, PathMatcher, OriginMatcher, OriginValidator } from '../types';
2
2
  import { MessageDispatcher, VersionValidator } from '../message';
3
3
  /**
4
4
  * Server configuration options
@@ -12,8 +12,21 @@ export interface ServerOptions {
12
12
  ackTimeout?: number;
13
13
  /** Protocol version validator (optional, uses built-in validator by default) */
14
14
  versionValidator?: VersionValidator;
15
+ /** Allowed origins for incoming messages */
16
+ allowedOrigins?: OriginMatcher;
17
+ /** Custom origin validator (higher priority than allowedOrigins) */
18
+ validateOrigin?: OriginValidator;
15
19
  /** Whether to automatically open when creating the server. Default is true. */
16
20
  autoOpen?: boolean;
21
+ /**
22
+ * Max concurrent in-flight requests per client (per origin + creatorId).
23
+ * Used to mitigate message explosion caused by abnormal code or attacks.
24
+ */
25
+ maxConcurrentRequestsPerClient?: number;
26
+ /** Advanced: auto-ack echo limit for ack.meta length (internal). */
27
+ autoAckMaxMetaLength?: number;
28
+ /** Advanced: auto-ack echo limit for ack.id length (internal). */
29
+ autoAckMaxIdLength?: number;
17
30
  }
18
31
  /**
19
32
  * RequestIframeServer implementation
@@ -27,8 +40,13 @@ export declare class RequestIframeServerImpl implements RequestIframeServer {
27
40
  private readonly versionValidator;
28
41
  private readonly handlers;
29
42
  private readonly middlewares;
43
+ private readonly originValidator?;
44
+ private readonly maxConcurrentRequestsPerClient;
45
+ private readonly inFlightByClientKey;
30
46
  /** Responses waiting for client acknowledgment */
31
47
  private readonly pendingAcks;
48
+ /** Pending pings waiting for client PONG (server -> client heartbeat) */
49
+ private readonly pendingPongs;
32
50
  /** Pending requests waiting for client stream_start (streamId present) */
33
51
  private readonly pendingStreamRequests;
34
52
  /** Stream message handlers (streamId -> handler) for client→server streams */
@@ -38,6 +56,17 @@ export declare class RequestIframeServerImpl implements RequestIframeServer {
38
56
  /** Whether it is open */
39
57
  private _isOpen;
40
58
  constructor(options?: ServerOptions);
59
+ /**
60
+ * Check whether an incoming message origin is allowed.
61
+ */
62
+ private isOriginAllowed;
63
+ /**
64
+ * Build a per-client key used for concurrency limiting.
65
+ * We intentionally include origin to prevent cross-origin collisions.
66
+ */
67
+ private getClientKey;
68
+ private incInFlight;
69
+ private decInFlight;
41
70
  /**
42
71
  * Open message processing (register message handlers)
43
72
  */
@@ -65,10 +94,12 @@ export declare class RequestIframeServerImpl implements RequestIframeServer {
65
94
  * Handle ping message
66
95
  */
67
96
  private handlePing;
97
+ private handlePong;
98
+ private pingClient;
68
99
  /**
69
- * Handle received acknowledgment
100
+ * Handle ACK (receipt confirmation for responses when requireAck === true).
70
101
  */
71
- private handleReceived;
102
+ private handleAck;
72
103
  /** Get secretKey */
73
104
  get secretKey(): string | undefined;
74
105
  /** Get the underlying MessageDispatcher */
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,aAAa,EACb,mBAAmB,EACnB,UAAU,EACV,WAAW,EACZ,MAAM,UAAU,CAAC;AAKlB,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAkB,MAAM,YAAY,CAAC;AAiDjF;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,2BAA2B;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,+EAA+E;IAC/E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,mBAAmB;IACjE,yBAAyB;IACzB,SAAgB,EAAE,EAAE,MAAM,CAAC;IAE3B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoC;IAC7D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwB;IAEpD,kDAAkD;IAClD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiC;IAE7D,0EAA0E;IAC1E,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA2C;IAEjF,8EAA8E;IAC9E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwD;IAEvF,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAyB;IAEvD,yBAAyB;IACzB,OAAO,CAAC,OAAO,CAAS;gBAEL,OAAO,CAAC,EAAE,aAAa;IAgB1C;;OAEG;IACI,IAAI,IAAI,IAAI;IAMnB;;OAEG;IACI,KAAK,IAAI,IAAI;IASpB;;OAEG;IACH,IAAW,MAAM,IAAI,OAAO,CAE3B;IAED;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAkDxB,qEAAqE;IACrE,OAAO,CAAC,iBAAiB;IAkHzB,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAsB1B;;OAEG;IACH,OAAO,CAAC,UAAU;IAYlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAStB,oBAAoB;IACpB,IAAW,SAAS,IAAI,MAAM,GAAG,SAAS,CAEzC;IAED,2CAA2C;IAC3C,IAAW,iBAAiB,IAAI,iBAAiB,CAEhD;IAED,OAAO,CAAC,kBAAkB;IAoC1B,OAAO,CAAC,mBAAmB;IA4B3B;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAuBnB;;OAEG;IACH,OAAO,CAAC,aAAa;IA2IrB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAanB,GAAG,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IACjC,GAAG,CAAC,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAepD,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,IAAI;IAU3D,OAAO,CAAC,cAAc;IA4Cf,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAYlC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC;IAUjE;;OAEG;IACI,OAAO,IAAI,IAAI;CAgBvB"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/core/server.ts"],"names":[],"mappings":"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"}