@aiszlab/relax 1.5.3 → 1.5.5
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/dist/class-name/index.cjs +9 -0
- package/dist/class-name/index.d.ts +2 -0
- package/dist/class-name/index.mjs +2 -0
- package/dist/class-name/normalize.cjs +32 -0
- package/dist/class-name/normalize.d.ts +2 -0
- package/dist/class-name/normalize.mjs +30 -0
- package/dist/{utils/clsx.cjs → class-name/stringify.cjs} +9 -9
- package/dist/{utils/clsx.d.ts → class-name/stringify.d.ts} +1 -1
- package/dist/{utils/clsx.mjs → class-name/stringify.mjs} +9 -9
- package/dist/dom/clipboard.cjs +26 -0
- package/dist/dom/clipboard.mjs +24 -0
- package/dist/dom/index.cjs +2 -0
- package/dist/dom/index.d.ts +2 -0
- package/dist/dom/index.mjs +1 -0
- package/dist/fetch-event-source/fetch.cjs +142 -0
- package/dist/fetch-event-source/fetch.d.ts +42 -0
- package/dist/fetch-event-source/fetch.mjs +139 -0
- package/dist/fetch-event-source/index.cjs +7 -0
- package/dist/fetch-event-source/index.d.ts +2 -0
- package/dist/fetch-event-source/index.mjs +1 -0
- package/dist/fetch-event-source/parse.cjs +182 -0
- package/dist/fetch-event-source/parse.d.ts +36 -0
- package/dist/fetch-event-source/parse.mjs +178 -0
- package/dist/hooks/use-event-source.cjs +20 -0
- package/dist/hooks/use-event-source.d.ts +6 -0
- package/dist/hooks/use-event-source.mjs +18 -0
- package/dist/hooks/use-local-storage-state.cjs +2 -2
- package/dist/hooks/use-local-storage-state.d.ts +2 -2
- package/dist/hooks/use-local-storage-state.mjs +2 -2
- package/dist/hooks/use-raf.cjs +2 -4
- package/dist/hooks/use-raf.mjs +2 -4
- package/dist/hooks/use-session-storage-state.cjs +2 -2
- package/dist/hooks/use-session-storage-state.d.ts +2 -2
- package/dist/hooks/use-session-storage-state.mjs +2 -2
- package/dist/hooks/use-storage-state.cjs +7 -7
- package/dist/hooks/use-storage-state.d.ts +2 -2
- package/dist/hooks/use-storage-state.mjs +7 -7
- package/dist/index.cjs +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +8 -15
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _slicedToArray = require('@babel/runtime/helpers/slicedToArray');
|
|
4
|
+
var _createForOfIteratorHelper = require('@babel/runtime/helpers/createForOfIteratorHelper');
|
|
5
|
+
var isString = require('../is/is-string.cjs');
|
|
6
|
+
|
|
7
|
+
function normalize() {
|
|
8
|
+
var values = new Set();
|
|
9
|
+
for (var _len = arguments.length, classNames = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
10
|
+
classNames[_key] = arguments[_key];
|
|
11
|
+
}
|
|
12
|
+
for (var _i = 0, _classNames2 = classNames; _i < _classNames2.length; _i++) {
|
|
13
|
+
var _classNames = _classNames2[_i];
|
|
14
|
+
if (!isString.isString(_classNames)) return;
|
|
15
|
+
var _iterator = _createForOfIteratorHelper(_classNames.matchAll(/\S+/g)),
|
|
16
|
+
_step;
|
|
17
|
+
try {
|
|
18
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
19
|
+
var _step$value = _slicedToArray(_step.value, 1),
|
|
20
|
+
className = _step$value[0];
|
|
21
|
+
values.add(className);
|
|
22
|
+
}
|
|
23
|
+
} catch (err) {
|
|
24
|
+
_iterator.e(err);
|
|
25
|
+
} finally {
|
|
26
|
+
_iterator.f();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return Array.from(values);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
exports.normalize = normalize;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
|
|
2
|
+
import _createForOfIteratorHelper from '@babel/runtime/helpers/createForOfIteratorHelper';
|
|
3
|
+
import { isString } from '../is/is-string.mjs';
|
|
4
|
+
|
|
5
|
+
function normalize() {
|
|
6
|
+
var values = new Set();
|
|
7
|
+
for (var _len = arguments.length, classNames = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
8
|
+
classNames[_key] = arguments[_key];
|
|
9
|
+
}
|
|
10
|
+
for (var _i = 0, _classNames2 = classNames; _i < _classNames2.length; _i++) {
|
|
11
|
+
var _classNames = _classNames2[_i];
|
|
12
|
+
if (!isString(_classNames)) return;
|
|
13
|
+
var _iterator = _createForOfIteratorHelper(_classNames.matchAll(/\S+/g)),
|
|
14
|
+
_step;
|
|
15
|
+
try {
|
|
16
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
17
|
+
var _step$value = _slicedToArray(_step.value, 1),
|
|
18
|
+
className = _step$value[0];
|
|
19
|
+
values.add(className);
|
|
20
|
+
}
|
|
21
|
+
} catch (err) {
|
|
22
|
+
_iterator.e(err);
|
|
23
|
+
} finally {
|
|
24
|
+
_iterator.f();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return Array.from(values);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export { normalize };
|
|
@@ -8,28 +8,28 @@ var isString = require('../is/is-string.cjs');
|
|
|
8
8
|
var isVoid = require('../is/is-void.cjs');
|
|
9
9
|
|
|
10
10
|
var _toClassNames = function toClassNames(_classNames) {
|
|
11
|
-
if (isVoid.isVoid(_classNames) || isBoolean.isBoolean(_classNames)) return
|
|
12
|
-
if (isString.isString(_classNames) || isNumber.isNumber(_classNames)) return [_classNames.toString()];
|
|
11
|
+
if (isVoid.isVoid(_classNames) || isBoolean.isBoolean(_classNames)) return new Set();
|
|
12
|
+
if (isString.isString(_classNames) || isNumber.isNumber(_classNames)) return new Set([_classNames.toString()]);
|
|
13
13
|
if (isArray.isArray(_classNames)) {
|
|
14
14
|
return _classNames.reduce(function (classNames, item) {
|
|
15
|
-
return classNames.
|
|
16
|
-
},
|
|
15
|
+
return classNames.union(_toClassNames(item));
|
|
16
|
+
}, new Set());
|
|
17
17
|
}
|
|
18
18
|
return Object.entries(_classNames).reduce(function (classNames, _ref) {
|
|
19
19
|
var _ref2 = _slicedToArray(_ref, 2),
|
|
20
20
|
className = _ref2[0],
|
|
21
21
|
isValid = _ref2[1];
|
|
22
22
|
if (isValid) {
|
|
23
|
-
classNames.
|
|
23
|
+
classNames.add(className);
|
|
24
24
|
}
|
|
25
25
|
return classNames;
|
|
26
|
-
},
|
|
26
|
+
}, new Set());
|
|
27
27
|
};
|
|
28
|
-
var
|
|
28
|
+
var stringify = function stringify() {
|
|
29
29
|
for (var _len = arguments.length, _classNames = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
30
30
|
_classNames[_key] = arguments[_key];
|
|
31
31
|
}
|
|
32
|
-
return _toClassNames(_classNames).join(" ");
|
|
32
|
+
return Array.from(_toClassNames(_classNames)).join(" ");
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
exports.
|
|
35
|
+
exports.stringify = stringify;
|
|
@@ -6,28 +6,28 @@ import { isString } from '../is/is-string.mjs';
|
|
|
6
6
|
import { isVoid } from '../is/is-void.mjs';
|
|
7
7
|
|
|
8
8
|
var _toClassNames = function toClassNames(_classNames) {
|
|
9
|
-
if (isVoid(_classNames) || isBoolean(_classNames)) return
|
|
10
|
-
if (isString(_classNames) || isNumber(_classNames)) return [_classNames.toString()];
|
|
9
|
+
if (isVoid(_classNames) || isBoolean(_classNames)) return new Set();
|
|
10
|
+
if (isString(_classNames) || isNumber(_classNames)) return new Set([_classNames.toString()]);
|
|
11
11
|
if (isArray(_classNames)) {
|
|
12
12
|
return _classNames.reduce(function (classNames, item) {
|
|
13
|
-
return classNames.
|
|
14
|
-
},
|
|
13
|
+
return classNames.union(_toClassNames(item));
|
|
14
|
+
}, new Set());
|
|
15
15
|
}
|
|
16
16
|
return Object.entries(_classNames).reduce(function (classNames, _ref) {
|
|
17
17
|
var _ref2 = _slicedToArray(_ref, 2),
|
|
18
18
|
className = _ref2[0],
|
|
19
19
|
isValid = _ref2[1];
|
|
20
20
|
if (isValid) {
|
|
21
|
-
classNames.
|
|
21
|
+
classNames.add(className);
|
|
22
22
|
}
|
|
23
23
|
return classNames;
|
|
24
|
-
},
|
|
24
|
+
}, new Set());
|
|
25
25
|
};
|
|
26
|
-
var
|
|
26
|
+
var stringify = function stringify() {
|
|
27
27
|
for (var _len = arguments.length, _classNames = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
28
28
|
_classNames[_key] = arguments[_key];
|
|
29
29
|
}
|
|
30
|
-
return _toClassNames(_classNames).join(" ");
|
|
30
|
+
return Array.from(_toClassNames(_classNames)).join(" ");
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
-
export {
|
|
33
|
+
export { stringify };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _regeneratorRuntime = require('@babel/runtime/helpers/regeneratorRuntime');
|
|
4
|
+
var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
|
|
5
|
+
|
|
6
|
+
var clipboard = /*#__PURE__*/function () {
|
|
7
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(value) {
|
|
8
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
9
|
+
while (1) switch (_context.prev = _context.next) {
|
|
10
|
+
case 0:
|
|
11
|
+
_context.next = 2;
|
|
12
|
+
return navigator.clipboard.writeText(value);
|
|
13
|
+
case 2:
|
|
14
|
+
return _context.abrupt("return", _context.sent);
|
|
15
|
+
case 3:
|
|
16
|
+
case "end":
|
|
17
|
+
return _context.stop();
|
|
18
|
+
}
|
|
19
|
+
}, _callee);
|
|
20
|
+
}));
|
|
21
|
+
return function clipboard(_x) {
|
|
22
|
+
return _ref.apply(this, arguments);
|
|
23
|
+
};
|
|
24
|
+
}();
|
|
25
|
+
|
|
26
|
+
exports.clipboard = clipboard;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import _regeneratorRuntime from '@babel/runtime/helpers/regeneratorRuntime';
|
|
2
|
+
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
|
|
3
|
+
|
|
4
|
+
var clipboard = /*#__PURE__*/function () {
|
|
5
|
+
var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(value) {
|
|
6
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
7
|
+
while (1) switch (_context.prev = _context.next) {
|
|
8
|
+
case 0:
|
|
9
|
+
_context.next = 2;
|
|
10
|
+
return navigator.clipboard.writeText(value);
|
|
11
|
+
case 2:
|
|
12
|
+
return _context.abrupt("return", _context.sent);
|
|
13
|
+
case 3:
|
|
14
|
+
case "end":
|
|
15
|
+
return _context.stop();
|
|
16
|
+
}
|
|
17
|
+
}, _callee);
|
|
18
|
+
}));
|
|
19
|
+
return function clipboard(_x) {
|
|
20
|
+
return _ref.apply(this, arguments);
|
|
21
|
+
};
|
|
22
|
+
}();
|
|
23
|
+
|
|
24
|
+
export { clipboard };
|
package/dist/dom/index.cjs
CHANGED
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
var scrollTo = require('./scroll-to.cjs');
|
|
4
4
|
var contains = require('./contains.cjs');
|
|
5
|
+
var clipboard = require('./clipboard.cjs');
|
|
5
6
|
|
|
6
7
|
|
|
7
8
|
|
|
8
9
|
exports.scrollTo = scrollTo.scrollTo;
|
|
9
10
|
exports.contains = contains.contains;
|
|
11
|
+
exports.clipboard = clipboard.clipboard;
|
package/dist/dom/index.d.ts
CHANGED
package/dist/dom/index.mjs
CHANGED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var _regeneratorRuntime = require('@babel/runtime/helpers/regeneratorRuntime');
|
|
4
|
+
var _asyncToGenerator = require('@babel/runtime/helpers/asyncToGenerator');
|
|
5
|
+
var _objectSpread = require('@babel/runtime/helpers/objectSpread2');
|
|
6
|
+
var _objectWithoutProperties = require('@babel/runtime/helpers/objectWithoutProperties');
|
|
7
|
+
var parse = require('./parse.cjs');
|
|
8
|
+
|
|
9
|
+
var _excluded = ["signal", "headers", "onopen", "onmessage", "onclose", "onerror", "openWhenHidden"];
|
|
10
|
+
var EventStreamContentType = "text/event-stream";
|
|
11
|
+
var DefaultRetryInterval = 1000;
|
|
12
|
+
var LastEventId = "last-event-id";
|
|
13
|
+
function fetchEventSource(input, _ref) {
|
|
14
|
+
var inputSignal = _ref.signal,
|
|
15
|
+
inputHeaders = _ref.headers,
|
|
16
|
+
inputOnOpen = _ref.onopen,
|
|
17
|
+
onmessage = _ref.onmessage,
|
|
18
|
+
onclose = _ref.onclose,
|
|
19
|
+
onerror = _ref.onerror,
|
|
20
|
+
openWhenHidden = _ref.openWhenHidden,
|
|
21
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
22
|
+
return new Promise(function (resolve, reject) {
|
|
23
|
+
// make a copy of the input headers since we may modify it below:
|
|
24
|
+
var headers = _objectSpread({}, inputHeaders);
|
|
25
|
+
if (!headers.accept) {
|
|
26
|
+
headers.accept = EventStreamContentType;
|
|
27
|
+
}
|
|
28
|
+
var curRequestController;
|
|
29
|
+
function onVisibilityChange() {
|
|
30
|
+
curRequestController.abort(); // close existing request on every visibility change
|
|
31
|
+
if (!document.hidden) {
|
|
32
|
+
create(); // page is now visible again, recreate request.
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (!openWhenHidden) {
|
|
36
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
37
|
+
}
|
|
38
|
+
var retryInterval = DefaultRetryInterval;
|
|
39
|
+
var retryTimer = 0;
|
|
40
|
+
function dispose() {
|
|
41
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
42
|
+
window.clearTimeout(retryTimer);
|
|
43
|
+
curRequestController.abort();
|
|
44
|
+
}
|
|
45
|
+
// if the incoming signal aborts, dispose resources and resolve:
|
|
46
|
+
inputSignal === null || inputSignal === void 0 || inputSignal.addEventListener("abort", function () {
|
|
47
|
+
dispose();
|
|
48
|
+
resolve(); // don't waste time constructing/logging errors
|
|
49
|
+
});
|
|
50
|
+
var onopen = inputOnOpen !== null && inputOnOpen !== void 0 ? inputOnOpen : defaultOnOpen;
|
|
51
|
+
function create() {
|
|
52
|
+
return _create.apply(this, arguments);
|
|
53
|
+
}
|
|
54
|
+
function _create() {
|
|
55
|
+
_create = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
56
|
+
var response, _onerror, interval;
|
|
57
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
58
|
+
while (1) switch (_context.prev = _context.next) {
|
|
59
|
+
case 0:
|
|
60
|
+
curRequestController = new AbortController();
|
|
61
|
+
_context.prev = 1;
|
|
62
|
+
_context.next = 4;
|
|
63
|
+
return fetch(input, _objectSpread(_objectSpread({}, rest), {}, {
|
|
64
|
+
headers: headers,
|
|
65
|
+
signal: curRequestController.signal
|
|
66
|
+
}));
|
|
67
|
+
case 4:
|
|
68
|
+
response = _context.sent;
|
|
69
|
+
_context.next = 7;
|
|
70
|
+
return onopen(response);
|
|
71
|
+
case 7:
|
|
72
|
+
_context.next = 9;
|
|
73
|
+
return parse.getBytes(response.body, parse.getLines(parse.getMessages(function (id) {
|
|
74
|
+
if (id) {
|
|
75
|
+
// store the id and send it back on the next retry:
|
|
76
|
+
headers[LastEventId] = id;
|
|
77
|
+
} else {
|
|
78
|
+
// don't send the last-event-id header anymore:
|
|
79
|
+
delete headers[LastEventId];
|
|
80
|
+
}
|
|
81
|
+
}, function (retry) {
|
|
82
|
+
retryInterval = retry;
|
|
83
|
+
}, onmessage)));
|
|
84
|
+
case 9:
|
|
85
|
+
onclose === null || onclose === void 0 || onclose();
|
|
86
|
+
dispose();
|
|
87
|
+
resolve();
|
|
88
|
+
_context.next = 17;
|
|
89
|
+
break;
|
|
90
|
+
case 14:
|
|
91
|
+
_context.prev = 14;
|
|
92
|
+
_context.t0 = _context["catch"](1);
|
|
93
|
+
if (!curRequestController.signal.aborted) {
|
|
94
|
+
// if we haven't aborted the request ourselves:
|
|
95
|
+
try {
|
|
96
|
+
// check if we need to retry:
|
|
97
|
+
interval = (_onerror = onerror === null || onerror === void 0 ? void 0 : onerror(_context.t0)) !== null && _onerror !== void 0 ? _onerror : retryInterval;
|
|
98
|
+
window.clearTimeout(retryTimer);
|
|
99
|
+
retryTimer = window.setTimeout(create, interval);
|
|
100
|
+
} catch (innerErr) {
|
|
101
|
+
// we should not retry anymore:
|
|
102
|
+
dispose();
|
|
103
|
+
reject(innerErr);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
case 17:
|
|
107
|
+
case "end":
|
|
108
|
+
return _context.stop();
|
|
109
|
+
}
|
|
110
|
+
}, _callee, null, [[1, 14]]);
|
|
111
|
+
}));
|
|
112
|
+
return _create.apply(this, arguments);
|
|
113
|
+
}
|
|
114
|
+
create();
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
function defaultOnOpen(_x) {
|
|
118
|
+
return _defaultOnOpen.apply(this, arguments);
|
|
119
|
+
}
|
|
120
|
+
function _defaultOnOpen() {
|
|
121
|
+
_defaultOnOpen = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(response) {
|
|
122
|
+
var contentType;
|
|
123
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
124
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
125
|
+
case 0:
|
|
126
|
+
contentType = response.headers.get("content-type");
|
|
127
|
+
if (contentType !== null && contentType !== void 0 && contentType.startsWith(EventStreamContentType)) {
|
|
128
|
+
_context2.next = 3;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
throw new Error("Expected content-type to be ".concat(EventStreamContentType, ", Actual: ").concat(contentType));
|
|
132
|
+
case 3:
|
|
133
|
+
case "end":
|
|
134
|
+
return _context2.stop();
|
|
135
|
+
}
|
|
136
|
+
}, _callee2);
|
|
137
|
+
}));
|
|
138
|
+
return _defaultOnOpen.apply(this, arguments);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
exports.EventStreamContentType = EventStreamContentType;
|
|
142
|
+
exports.fetchEventSource = fetchEventSource;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { EventSourceMessage } from "./parse";
|
|
2
|
+
export declare const EventStreamContentType = "text/event-stream";
|
|
3
|
+
export interface FetchEventSourceInit extends RequestInit {
|
|
4
|
+
/**
|
|
5
|
+
* The request headers. FetchEventSource only supports the Record<string,string> format.
|
|
6
|
+
*/
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
/**
|
|
9
|
+
* Called when a response is received. Use this to validate that the response
|
|
10
|
+
* actually matches what you expect (and throw if it doesn't.) If not provided,
|
|
11
|
+
* will default to a basic validation to ensure the content-type is text/event-stream.
|
|
12
|
+
*/
|
|
13
|
+
onopen?: (response: Response) => Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Called when a message is received. NOTE: Unlike the default browser
|
|
16
|
+
* EventSource.onmessage, this callback is called for _all_ events,
|
|
17
|
+
* even ones with a custom `event` field.
|
|
18
|
+
*/
|
|
19
|
+
onmessage?: (ev: EventSourceMessage) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Called when a response finishes. If you don't expect the server to kill
|
|
22
|
+
* the connection, you can throw an exception here and retry using onerror.
|
|
23
|
+
*/
|
|
24
|
+
onclose?: () => void;
|
|
25
|
+
/**
|
|
26
|
+
* Called when there is any error making the request / processing messages /
|
|
27
|
+
* handling callbacks etc. Use this to control the retry strategy: if the
|
|
28
|
+
* error is fatal, rethrow the error inside the callback to stop the entire
|
|
29
|
+
* operation. Otherwise, you can return an interval (in milliseconds) after
|
|
30
|
+
* which the request will automatically retry (with the last-event-id).
|
|
31
|
+
* If this callback is not specified, or it returns undefined, fetchEventSource
|
|
32
|
+
* will treat every error as retriable and will try again after 1 second.
|
|
33
|
+
*/
|
|
34
|
+
onerror?: (err: any) => number | null | undefined | void;
|
|
35
|
+
/**
|
|
36
|
+
* If true, will keep the request open even if the document is hidden.
|
|
37
|
+
* By default, fetchEventSource will close the request and reopen it
|
|
38
|
+
* automatically when the document becomes visible again.
|
|
39
|
+
*/
|
|
40
|
+
openWhenHidden?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export declare function fetchEventSource(input: RequestInfo, { signal: inputSignal, headers: inputHeaders, onopen: inputOnOpen, onmessage, onclose, onerror, openWhenHidden, ...rest }: FetchEventSourceInit): Promise<void>;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import _regeneratorRuntime from '@babel/runtime/helpers/regeneratorRuntime';
|
|
2
|
+
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';
|
|
3
|
+
import _objectSpread from '@babel/runtime/helpers/objectSpread2';
|
|
4
|
+
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
|
|
5
|
+
import { getBytes, getLines, getMessages } from './parse.mjs';
|
|
6
|
+
|
|
7
|
+
var _excluded = ["signal", "headers", "onopen", "onmessage", "onclose", "onerror", "openWhenHidden"];
|
|
8
|
+
var EventStreamContentType = "text/event-stream";
|
|
9
|
+
var DefaultRetryInterval = 1000;
|
|
10
|
+
var LastEventId = "last-event-id";
|
|
11
|
+
function fetchEventSource(input, _ref) {
|
|
12
|
+
var inputSignal = _ref.signal,
|
|
13
|
+
inputHeaders = _ref.headers,
|
|
14
|
+
inputOnOpen = _ref.onopen,
|
|
15
|
+
onmessage = _ref.onmessage,
|
|
16
|
+
onclose = _ref.onclose,
|
|
17
|
+
onerror = _ref.onerror,
|
|
18
|
+
openWhenHidden = _ref.openWhenHidden,
|
|
19
|
+
rest = _objectWithoutProperties(_ref, _excluded);
|
|
20
|
+
return new Promise(function (resolve, reject) {
|
|
21
|
+
// make a copy of the input headers since we may modify it below:
|
|
22
|
+
var headers = _objectSpread({}, inputHeaders);
|
|
23
|
+
if (!headers.accept) {
|
|
24
|
+
headers.accept = EventStreamContentType;
|
|
25
|
+
}
|
|
26
|
+
var curRequestController;
|
|
27
|
+
function onVisibilityChange() {
|
|
28
|
+
curRequestController.abort(); // close existing request on every visibility change
|
|
29
|
+
if (!document.hidden) {
|
|
30
|
+
create(); // page is now visible again, recreate request.
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (!openWhenHidden) {
|
|
34
|
+
document.addEventListener("visibilitychange", onVisibilityChange);
|
|
35
|
+
}
|
|
36
|
+
var retryInterval = DefaultRetryInterval;
|
|
37
|
+
var retryTimer = 0;
|
|
38
|
+
function dispose() {
|
|
39
|
+
document.removeEventListener("visibilitychange", onVisibilityChange);
|
|
40
|
+
window.clearTimeout(retryTimer);
|
|
41
|
+
curRequestController.abort();
|
|
42
|
+
}
|
|
43
|
+
// if the incoming signal aborts, dispose resources and resolve:
|
|
44
|
+
inputSignal === null || inputSignal === void 0 || inputSignal.addEventListener("abort", function () {
|
|
45
|
+
dispose();
|
|
46
|
+
resolve(); // don't waste time constructing/logging errors
|
|
47
|
+
});
|
|
48
|
+
var onopen = inputOnOpen !== null && inputOnOpen !== void 0 ? inputOnOpen : defaultOnOpen;
|
|
49
|
+
function create() {
|
|
50
|
+
return _create.apply(this, arguments);
|
|
51
|
+
}
|
|
52
|
+
function _create() {
|
|
53
|
+
_create = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
54
|
+
var response, _onerror, interval;
|
|
55
|
+
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
56
|
+
while (1) switch (_context.prev = _context.next) {
|
|
57
|
+
case 0:
|
|
58
|
+
curRequestController = new AbortController();
|
|
59
|
+
_context.prev = 1;
|
|
60
|
+
_context.next = 4;
|
|
61
|
+
return fetch(input, _objectSpread(_objectSpread({}, rest), {}, {
|
|
62
|
+
headers: headers,
|
|
63
|
+
signal: curRequestController.signal
|
|
64
|
+
}));
|
|
65
|
+
case 4:
|
|
66
|
+
response = _context.sent;
|
|
67
|
+
_context.next = 7;
|
|
68
|
+
return onopen(response);
|
|
69
|
+
case 7:
|
|
70
|
+
_context.next = 9;
|
|
71
|
+
return getBytes(response.body, getLines(getMessages(function (id) {
|
|
72
|
+
if (id) {
|
|
73
|
+
// store the id and send it back on the next retry:
|
|
74
|
+
headers[LastEventId] = id;
|
|
75
|
+
} else {
|
|
76
|
+
// don't send the last-event-id header anymore:
|
|
77
|
+
delete headers[LastEventId];
|
|
78
|
+
}
|
|
79
|
+
}, function (retry) {
|
|
80
|
+
retryInterval = retry;
|
|
81
|
+
}, onmessage)));
|
|
82
|
+
case 9:
|
|
83
|
+
onclose === null || onclose === void 0 || onclose();
|
|
84
|
+
dispose();
|
|
85
|
+
resolve();
|
|
86
|
+
_context.next = 17;
|
|
87
|
+
break;
|
|
88
|
+
case 14:
|
|
89
|
+
_context.prev = 14;
|
|
90
|
+
_context.t0 = _context["catch"](1);
|
|
91
|
+
if (!curRequestController.signal.aborted) {
|
|
92
|
+
// if we haven't aborted the request ourselves:
|
|
93
|
+
try {
|
|
94
|
+
// check if we need to retry:
|
|
95
|
+
interval = (_onerror = onerror === null || onerror === void 0 ? void 0 : onerror(_context.t0)) !== null && _onerror !== void 0 ? _onerror : retryInterval;
|
|
96
|
+
window.clearTimeout(retryTimer);
|
|
97
|
+
retryTimer = window.setTimeout(create, interval);
|
|
98
|
+
} catch (innerErr) {
|
|
99
|
+
// we should not retry anymore:
|
|
100
|
+
dispose();
|
|
101
|
+
reject(innerErr);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
case 17:
|
|
105
|
+
case "end":
|
|
106
|
+
return _context.stop();
|
|
107
|
+
}
|
|
108
|
+
}, _callee, null, [[1, 14]]);
|
|
109
|
+
}));
|
|
110
|
+
return _create.apply(this, arguments);
|
|
111
|
+
}
|
|
112
|
+
create();
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
function defaultOnOpen(_x) {
|
|
116
|
+
return _defaultOnOpen.apply(this, arguments);
|
|
117
|
+
}
|
|
118
|
+
function _defaultOnOpen() {
|
|
119
|
+
_defaultOnOpen = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(response) {
|
|
120
|
+
var contentType;
|
|
121
|
+
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
122
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
123
|
+
case 0:
|
|
124
|
+
contentType = response.headers.get("content-type");
|
|
125
|
+
if (contentType !== null && contentType !== void 0 && contentType.startsWith(EventStreamContentType)) {
|
|
126
|
+
_context2.next = 3;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
throw new Error("Expected content-type to be ".concat(EventStreamContentType, ", Actual: ").concat(contentType));
|
|
130
|
+
case 3:
|
|
131
|
+
case "end":
|
|
132
|
+
return _context2.stop();
|
|
133
|
+
}
|
|
134
|
+
}, _callee2);
|
|
135
|
+
}));
|
|
136
|
+
return _defaultOnOpen.apply(this, arguments);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
export { EventStreamContentType, fetchEventSource };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { fetchEventSource } from './fetch.mjs';
|