anys-web 1.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 +201 -0
- package/README.md +52 -0
- package/cjs/index.js +23 -0
- package/cjs/recorder-plugin.js +163 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/package.json +40 -0
- package/src/index.js +16 -0
- package/src/recorder-plugin.js +161 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
4
|
+
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
6
|
+
|
|
7
|
+
1. Definitions.
|
|
8
|
+
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
11
|
+
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright 2023 tangshuang
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
package/README.md
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Anys Web
|
|
2
|
+
|
|
3
|
+
Compose anys web features together.
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm i anys-web
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```html
|
|
12
|
+
<script src="https://unpkg.com/anys-web"></script>
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```js
|
|
18
|
+
import { create } from 'anys-web';
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```html
|
|
22
|
+
<script>
|
|
23
|
+
const { create } = window.anys;
|
|
24
|
+
</script>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## API
|
|
28
|
+
|
|
29
|
+
**create**
|
|
30
|
+
|
|
31
|
+
Create an Anys instance which compose many features together, the plugins used:
|
|
32
|
+
|
|
33
|
+
- AnysStoreOfflinePlugin
|
|
34
|
+
- AnysMonitorUrlPlugin
|
|
35
|
+
- AnysMonitorWindowSizePlugin
|
|
36
|
+
- AnysMonitorDOMMutationPlugin
|
|
37
|
+
- AnysIdentifyPlugin
|
|
38
|
+
- AnysMonitorAjaxPlugin
|
|
39
|
+
- AnysMonitorInputEventPlugin
|
|
40
|
+
- AnysMonitorMouseEventPlugin
|
|
41
|
+
- AnysMonitorWindowActivityPlugin
|
|
42
|
+
- AnysMonitorTouchEventPlugin
|
|
43
|
+
- AnysMonitorScrollEventPlugin
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
```js
|
|
47
|
+
const anys = create({
|
|
48
|
+
reportUrl: '/api/report',
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Here you will have `anys.plugins.recorder`.
|
package/cjs/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.create = void 0;
|
|
7
|
+
var _anys = require("anys");
|
|
8
|
+
var _recorderPlugin = require("./recorder-plugin.js");
|
|
9
|
+
const {
|
|
10
|
+
currentScript
|
|
11
|
+
} = document;
|
|
12
|
+
const create = (options = {}) => new _anys.Anys({
|
|
13
|
+
plugins: {
|
|
14
|
+
recorder: _recorderPlugin.AnysRecorderPlugin
|
|
15
|
+
},
|
|
16
|
+
namespace: 'AnysTracer',
|
|
17
|
+
autoReport: false,
|
|
18
|
+
...options
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
// remove current script, so that we will not collect it in snapshot
|
|
22
|
+
exports.create = create;
|
|
23
|
+
currentScript.parentNode.removeChild(currentScript);
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.AnysRecorderPlugin = void 0;
|
|
7
|
+
var _anysShared = require("anys-shared");
|
|
8
|
+
var _anysWebPluginMonitorAjax = require("anys-web-plugin-monitor-ajax");
|
|
9
|
+
var _anysWebPluginIdentify = require("anys-web-plugin-identify");
|
|
10
|
+
var _anysWebPluginMonitorInputEvent = require("anys-web-plugin-monitor-input-event");
|
|
11
|
+
var _anysWebPluginMonitorMouseEvent = require("anys-web-plugin-monitor-mouse-event");
|
|
12
|
+
var _anysWebPluginMonitorWindowActivity = require("anys-web-plugin-monitor-window-activity");
|
|
13
|
+
var _anysWebPluginMonitorUrl = require("anys-web-plugin-monitor-url");
|
|
14
|
+
var _anysWebPluginMonitorTouchEvent = require("anys-web-plugin-monitor-touch-event");
|
|
15
|
+
var _anysWebPluginStoreOffline = require("anys-web-plugin-store-offline");
|
|
16
|
+
var _anysWebPluginMonitorDomMutation = require("anys-web-plugin-monitor-dom-mutation");
|
|
17
|
+
var _anysWebPluginMonitorWindowSize = require("anys-web-plugin-monitor-window-size");
|
|
18
|
+
var _anysWebPluginMonitorScrollEvent = require("anys-web-plugin-monitor-scroll-event");
|
|
19
|
+
function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
|
|
20
|
+
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
|
|
21
|
+
let AnysRecorderPlugin = /*#__PURE__*/function (_AnysPlugin) {
|
|
22
|
+
_inheritsLoose(AnysRecorderPlugin, _AnysPlugin);
|
|
23
|
+
function AnysRecorderPlugin(anys, [offlineLogger, urlMonitor, windowSizeMonitor, DOMMutationMonitor]) {
|
|
24
|
+
var _this;
|
|
25
|
+
_this = _AnysPlugin.call(this, anys) || this;
|
|
26
|
+
_this.offlineLogger = offlineLogger;
|
|
27
|
+
_this.urlMonitor = urlMonitor;
|
|
28
|
+
_this.windowSizeMonitor = windowSizeMonitor;
|
|
29
|
+
_this.DOMMutationMonitor = DOMMutationMonitor;
|
|
30
|
+
// cache for trace logs to be send by beacon
|
|
31
|
+
_this.cache = {};
|
|
32
|
+
return _this;
|
|
33
|
+
}
|
|
34
|
+
var _proto = AnysRecorderPlugin.prototype;
|
|
35
|
+
_proto.options = function options() {
|
|
36
|
+
const isSupportTouch = ('ontouchend' in document);
|
|
37
|
+
return {
|
|
38
|
+
touch: isSupportTouch,
|
|
39
|
+
mouse: !isSupportTouch,
|
|
40
|
+
click: false,
|
|
41
|
+
mousedown: true,
|
|
42
|
+
mousemove: true,
|
|
43
|
+
mouseup: true,
|
|
44
|
+
autoReport: false,
|
|
45
|
+
reportUrl: new Error('[Anys]: options.reportUrl is required!'),
|
|
46
|
+
reportInterval: 10000,
|
|
47
|
+
reportParams: null
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
_proto.registerAutoReport = function registerAutoReport() {
|
|
51
|
+
const {
|
|
52
|
+
clientId
|
|
53
|
+
} = this.anys;
|
|
54
|
+
const autoReportWhenRefreshTraceId = ({
|
|
55
|
+
prev
|
|
56
|
+
}) => {
|
|
57
|
+
// report previous trace logs
|
|
58
|
+
this.anys.report([{
|
|
59
|
+
key: 'client',
|
|
60
|
+
value: clientId
|
|
61
|
+
}, {
|
|
62
|
+
key: 'trace',
|
|
63
|
+
value: prev
|
|
64
|
+
}]);
|
|
65
|
+
|
|
66
|
+
// clear cache
|
|
67
|
+
this.cache = {};
|
|
68
|
+
|
|
69
|
+
// record new information
|
|
70
|
+
this.urlMonitor.recordUrl();
|
|
71
|
+
this.windowSizeMonitor.recordSize();
|
|
72
|
+
this.DOMMutationMonitor.recordSnapshot();
|
|
73
|
+
};
|
|
74
|
+
this.anys.on('refreshTraceId', autoReportWhenRefreshTraceId);
|
|
75
|
+
const timer = setInterval(() => {
|
|
76
|
+
this.anys.report();
|
|
77
|
+
this.cache = {};
|
|
78
|
+
}, this.anys.options.reportInterval);
|
|
79
|
+
let isUnloaded = 0;
|
|
80
|
+
const sendBeaconWhenBeforeUnload = () => {
|
|
81
|
+
if (isUnloaded) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
isUnloaded = 1;
|
|
85
|
+
const ids = Object.keys(this.cache);
|
|
86
|
+
const logs = Object.values(this.cache);
|
|
87
|
+
if (ids.length) {
|
|
88
|
+
this.offlineLogger.remove(ids); // async may not executed
|
|
89
|
+
navigator.sendBeacon(this.anys.options.reportUrl, JSON.stringify(logs));
|
|
90
|
+
this.cache = {};
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
window.addEventListener('beforeunload', sendBeaconWhenBeforeUnload);
|
|
94
|
+
window.addEventListener('pagehide', sendBeaconWhenBeforeUnload); // 兼容微信浏览器
|
|
95
|
+
window.addEventListener('unload', sendBeaconWhenBeforeUnload);
|
|
96
|
+
const addCacheWhenWriteLog = ({
|
|
97
|
+
id,
|
|
98
|
+
data
|
|
99
|
+
}) => {
|
|
100
|
+
this.cache[id] = data;
|
|
101
|
+
};
|
|
102
|
+
this.anys.on('writeOfflineLog', addCacheWhenWriteLog);
|
|
103
|
+
return () => {
|
|
104
|
+
this.anys.off('refreshTraceId', autoReportWhenRefreshTraceId);
|
|
105
|
+
this.anys.off('writeOfflineLog', addCacheWhenWriteLog);
|
|
106
|
+
// @ts-ignore
|
|
107
|
+
clearInterval(timer);
|
|
108
|
+
window.removeEventListener('beforeunload', sendBeaconWhenBeforeUnload);
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* define read here, so that recorder will not send other plugins 'read' output
|
|
114
|
+
* @param {*} message
|
|
115
|
+
* @returns
|
|
116
|
+
*/;
|
|
117
|
+
_proto.read = function read(message) {
|
|
118
|
+
return this.offlineLogger.read(message);
|
|
119
|
+
};
|
|
120
|
+
_proto.send = function send(logs) {
|
|
121
|
+
const groups = [];
|
|
122
|
+
let i = 0;
|
|
123
|
+
logs.forEach(item => {
|
|
124
|
+
groups[i] = groups[i] || [];
|
|
125
|
+
groups[i].push(item);
|
|
126
|
+
if (groups[i].length > 200) {
|
|
127
|
+
i++;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
groups.forEach(data => {
|
|
131
|
+
const items = [];
|
|
132
|
+
const ids = [];
|
|
133
|
+
data.forEach(item => {
|
|
134
|
+
const {
|
|
135
|
+
_id,
|
|
136
|
+
...info
|
|
137
|
+
} = item;
|
|
138
|
+
ids.push(_id);
|
|
139
|
+
items.push(info);
|
|
140
|
+
});
|
|
141
|
+
if (!items.length) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const {
|
|
145
|
+
reportUrl,
|
|
146
|
+
reportParams
|
|
147
|
+
} = this.anys.options;
|
|
148
|
+
const url = reportParams ? (0, _anysShared.replaceUrlSearch)(reportUrl, reportParams) : reportUrl;
|
|
149
|
+
(0, _anysShared.ajaxPost)(url, items).then(() => {
|
|
150
|
+
this.offlineLogger.remove(ids);
|
|
151
|
+
ids.forEach(id => {
|
|
152
|
+
delete this.cache[id];
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
_proto.auth = function auth(info) {
|
|
158
|
+
this.anys.options.reportParams = Object.assign(this.anys.options.reportParams || {}, info);
|
|
159
|
+
};
|
|
160
|
+
return AnysRecorderPlugin;
|
|
161
|
+
}(_anysShared.AnysPlugin);
|
|
162
|
+
exports.AnysRecorderPlugin = AnysRecorderPlugin;
|
|
163
|
+
AnysRecorderPlugin.dependencies = [_anysWebPluginStoreOffline.AnysStoreOfflinePlugin, _anysWebPluginMonitorUrl.AnysMonitorUrlPlugin, _anysWebPluginMonitorWindowSize.AnysMonitorWindowSizePlugin, _anysWebPluginMonitorDomMutation.AnysMonitorDOMMutationPlugin, _anysWebPluginIdentify.AnysIdentifyPlugin, _anysWebPluginMonitorAjax.AnysMonitorAjaxPlugin, _anysWebPluginMonitorInputEvent.AnysMonitorInputEventPlugin, _anysWebPluginMonitorMouseEvent.AnysMonitorMouseEventPlugin, _anysWebPluginMonitorWindowActivity.AnysMonitorWindowActivityPlugin, _anysWebPluginMonitorTouchEvent.AnysMonitorTouchEventPlugin, _anysWebPluginMonitorScrollEvent.AnysMonitorScrollEventPlugin];
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(()=>{var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};(()=>{"use strict";function n(e){return Array.isArray(e)}function r(e,t){return"function"==typeof e&&(!t||!function(e,t){if("function"!=typeof e)return!1;if(e===Symbol)return!1;if(!e.prototype)return!1;const n=e+"",r=n.slice(n.indexOf("{")+1,n.lastIndexOf("}")).trim(),o=0===n.indexOf("class "),i="[native code]"===r,s=o||i;if(t>=4)return s;const c=r.replace(/function.*?\{.*?\}/gm,"").replace(/return/gm,"").replace(/\n+/gm,";").replace(/\s+/gm,"").replace(/;;/gm,";"),a=/^_classCallCheck\(this,/.test(c),u=/^\(.*?_classCallCheck.*?\)\(this,/.test(c),h=/^[0-9a-zA-Z_;!?:]*?\(this,/.test(c),d=s||a||u||h;if(3==t)return d;const p=Object.getOwnPropertyDescriptors(e.prototype),l=!!Object.keys(p).filter((e=>"constructor"!==e)).length,f=d||l;if(2==t)return f;const m=0===c.indexOf("this.")||c.indexOf(";this.")>-1||c.indexOf("=this;")>-1,y=f||m;if(1==t)return y;return!0}(e,2))}function o(e=16){const t="0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ";let n="";for(let r=0;r<e;r++)n+=t.charAt(Math.floor(Math.random()*t.length));return n}function i(e,t,r){return r?(()=>{const n=Object.getOwnPropertyDescriptors(e);Object.keys(n).forEach((r=>{const o=n[r],{get:i,set:s,enumerable:c,configurable:a,writable:u}=o;(c||i||s||a&&u)&&t(o,r,e)}))})():(()=>{if(n(e))e.forEach(t);else{Object.keys(e).forEach((n=>{const r=e[n];t(r,n,e)}))}})()}e.r(t),e.d(t,{create:()=>C});Symbol("Proxy");let s=function(){function e(t){this.$events=[];const s=(c=this,Object.getPrototypeOf(c).constructor);var c;const{filters:a=[],plugins:u=[],...h}={...e.defaultOptions,...s.defaultOptions||{}},{filters:d=[],plugins:p=[],defines:l=[],...f}=t||{},m={},y=[],v={},g=p&&!n(p)&&"object"==typeof p,b=g?Object.values(p):n(p)?p:[],w=g?Object.keys(p).map((e=>({key:e,value:p[e]}))):[],O=[...u,...b],E=e=>{e.forEach((e=>{const t=e.dependencies||[];t.forEach((e=>{O.unshift(e)})),E(t)}))};E(O);const L=O.filter(((e,t)=>t===O.indexOf(e))),j=[],_={};L.forEach((e=>{const t=w.find((t=>t.value===e))?.key;if(t&&_[t])return void(t=>{const n=`[Anys]: plugin named '${t}' has been registered`;_[t]instanceof e?console.debug(n,e,_):console.error(n,e,_)})(t);const n=(e.dependencies||[]).map((e=>j.find((t=>t instanceof e)))),r=new e(this,n);r.options&&Object.assign(m,r.options()),r.filters&&y.push(...r.filters()),r.defines&&Object.assign(v,r.defines()),j.push(r),t&&(_[t]=r)})),this.$plugins=j,this.plugins=_,this.options={...h,...m,...f},this.filters=[...a,...y,...d];const x=Object.values(this.options).find((e=>e&&e instanceof Error));if(x)throw x;const P={...v,...l};this.definitions=P,this.clientId=P.client?P.client():o(8),this.traceId=P.trace?P.trace():o(8),this.requestId=o(8);const I={};Object.defineProperties(I,function(e,t){if(n(e))return e.map(t);{const n={};return i(e,((r,o)=>{n[o]=t(r,o,e)})),n}}(P,(e=>({get:r(e)?e:()=>e,enumerable:!0,configurable:!0})))),Object.defineProperties(I,{client:{get:()=>this.clientId,enumerable:!0,configurable:!0},trace:{get:()=>this.traceId,enumerable:!0,configurable:!0},request:{get:()=>this.requestId,enumerable:!0,configurable:!0}}),this.$basicLog=I,this.invoke("init"),this.options.autoStart&&this.start()}var t=e.prototype;return t.define=function(e,t){Object.defineProperty(this.$basicLog,e,{get:t,enumerable:!0,configurable:!0})},t.on=function(e,t){this.$events.push([e,t])},t.off=function(e,t){this.$events.forEach(((n,r)=>{n[0]===e&&n[1]===t&&this.$events.splice(r,1)}))},t.emit=function(e,...t){this.$events.forEach((n=>{n[0]!==e&&"*"!==n[0]||n[1](...t)}))},t.invoke=function(e,...t){for(let n=0,o=this.$plugins.length;n<o;n+=1){const o=this.$plugins[n];o[e]&&(r(o[e])&&o[e](...t))}},t.refreshTraceId=function(){const e=this.traceId;this.traceId=this.definitions.trace?this.definitions.trace():o(8),this.emit("refreshTraceId",{prev:e,next:this.traceId})},t.refreshRequestId=function(){const e=this.requestId;this.requestId=o(8),this.emit("refreshRequestId",{prev:e,next:this.requestId})},t.start=function(){this.invoke("start"),this.emit("start")},t.write=function(e){setTimeout((()=>{const t={...this.$basicLog,...e},{filters:n}=this;for(let e=0,r=n.length;e<r;e+=1){if(!(0,n[e])(t))return}this.invoke("write",t),this.emit("write",t),this.options.autoReport&&this.report()}),0)},t.report=function(e){return new Promise(((t,o)=>{setTimeout((()=>{this.emit("report",e);const i=[],s=[],c=[],a=[],u=(...e)=>e.reduce(((e,t)=>r(t)?e.then(t):e),Promise.resolve()),h=(e,t)=>Promise.all(e.map((e=>u((()=>e(t))))));for(let t=0,n=this.$plugins.length;t<n;t+=1){const n=this.$plugins[t];if(r(n.read)&&r(n.send)){const t=u((()=>n.read(e)),(e=>e&&Promise.resolve(n.send(e)).then((()=>e))),(e=>e&&r(n.complete)&&n.complete(e)));i.push(t)}else r(n.read)?s.push(n.read.bind(n)):r(n.send)&&c.push(n.send.bind(n)),r(n.complete)&&a.push(n.complete.bind(n))}const d=u((()=>h(s,e)),(e=>{const t=[];return e.forEach((e=>n(e)&&e.length&&t.push(...e))),this.emit("read",t),t}),(e=>{if(e.length)return this.emit("send",e),h(c,e).then((()=>e))}),(e=>{if(e)return this.emit("complete",e),h(a,e)})),p=Promise.all(i);Promise.all([d,p]).then(t,o)}),0)}))},t.stop=function(){this.invoke("stop"),this.emit("stop")},e}();function c(e,t){if(e.indexOf("?")<0){const n=Object.keys(t).map((e=>`${e}=${t[e]}`)).join("&"),[r,o]=e.split("#");return r+"?"+n+(o?"#"+o:"")}const[n,r]=e.split("?"),[o,i]=r.split("#"),s=o.split("&").map((e=>e.split("="))).reduce(((e,[t,n])=>({...e,[t]:n})),{});Object.assign(s,t);return n+"?"+Object.keys(s).map((e=>`${e}=${s[e]}`)).join("&")+(i?"#"+i:"")}s.defaultOptions={autoStart:!0,autoReport:!0};let a=function(){function e(e){this.anys=e,this.$effects={}}var t=e.prototype;return t.start=function(){if(!this.options)return;const e=this.options(),t=Object.keys(e),n=e=>{const t=`register${e.replace(e[0],e[0].toUpperCase())}`;if(this[t]){const n=this[t]();this.$effects[e]=n}},r=this.anys.options;t.forEach((e=>{r[e]&&n(e)}))},t.stop=function(){if(!this.options)return;const e=this.options(),t=Object.keys(e),n=this.anys.options;t.forEach((e=>{const t=this.$effects[e];n[e]&&t&&t(),this.$effects[e]=null}))},e}(),u=function(){function e(){this.$events=[]}var t=e.prototype;return t.on=function(e,t){this.$events.push([e,t])},t.emit=function(e,...t){this.$events.forEach((([n,r])=>{e===n&&r(...t)}))},t.off=function(e,t){this.$events.forEach((([n,r],o)=>{e===n&&r===t&&this.$events.splice(o,1)}))},e}();function h(e,t){return h=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},h(e,t)}const d=new u;!function(){const e=window.XMLHttpRequest;window.__XMLHttpRequest=e,window.XMLHttpRequest=function(){const t=new e,n={open:t.open,send:t.send},r={name:o(4)},i=e=>{const{name:n,url:o,method:i}=r;let s,c;t.responseType&&"text"!==t.responseType?"json"===t.responseType&&(s=t.response,c="json"):(s=t.responseText.toString(),c="text"),d.emit("xhr",{type:e,time:Date.now(),name:`xhr_${n}`,url:o,detail:{status:t.status,method:i,responseType:c,response:s||void 0}})},s=()=>{4===t.readyState&&(2===Math.floor(t.status/100)?i("xhr.ok"):i("xhr.fail"))};return Object.defineProperty(t,"open",{get:()=>(e,o,i=!0,...s)=>{const c={method:e,url:o};d.emit("request",c),Object.assign(r,{...c,async:i}),t.onreadystatechange&&(n.onreadystatechange=t.onreadystatechange);const{open:a}=n;return a.call(t,c.method,c.url,i,...s)},configurable:!0}),Object.defineProperty(t,"send",{get:()=>e=>{const{send:o}=n,{async:i}=r;Object.assign(r,{body:e}),(()=>{const{name:e,url:t,method:n,async:o,body:i}=r;d.emit("xhr",{type:"xhr.req",time:Date.now(),name:`xhr_${e}`,url:t,detail:{method:n,async:o,body:i}})})();const c=o.call(t,e);return i||s(),c},configurable:!0}),t.addEventListener("error",(()=>{i("xhr.err")})),t.addEventListener("readystatechange",(e=>{s()})),t}}(),function(){const e=window.fetch;window.__fetch=e,window.fetch=function(t,n={}){const{method:r,body:i}=n,s=o(4);d.emit("fetch",{type:"fetch.init",time:Date.now(),name:`fetch_${s}`,url:t,detail:{body:i,method:r}});const c={method:r,url:t};return d.emit("request",c),Promise.resolve().then((()=>e(c.url,n))).then((e=>{const{status:n}=e;return 2===Math.floor(n/100)?new Proxy(e,{get:(o,i)=>"json"===i||"text"===i?()=>e[i]().then((e=>(d.emit("fetch",{type:"fetch.ok",time:Date.now(),name:`fetch_${s}`,url:t,detail:{status:n,data:e,method:r}}),e))):"function"==typeof e[i]?e[i].bind(e):e[i]}):(d.emit("fetch",{type:"fetch.fail",time:Date.now(),name:`fetch_${s}`,url:t,detail:{status:n,method:r}}),e)}),(e=>{let n;if(e instanceof Error){const{name:t,message:o}=e;n={method:r,type:t,err:o}}else n={method:r,err:e};d.emit("fetch",{type:"fetch.err",time:Date.now(),name:`fetch_${s}`,url:t,detail:n})}))}}();let p=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,h(t,n);var o=r.prototype;return o.options=function(){return{xhr:!0,fetch:!0,ajaxResponse:!0,patchRequestId:!0}},o.registerXhr=function(){const e=e=>{this.anys.options.ajaxResponse||"xhr.ok"!==e.type||delete e.detail.response,this.anys.write(e)};return d.on("xhr",e),()=>d.off("xhr",e)},o.registerFetch=function(){const e=e=>{this.anys.options.ajaxResponse||"fetch.ok"!==e.type||delete e.detail.data,this.anys.write(e)};return d.on("fetch",e),()=>d.off("fetch",e)},o.registerPatchRequestId=function(){const e=e=>{const{url:t}=e,{traceId:n,requestId:r}=this.anys,o=c(t,{_request_id:n+r});e.url=o};return d.on("request",e),()=>d.off("request",e)},r}(a),l=function(){function e(e){this.anys=e}var t=e.prototype;return t.options=function(){return{namespace:new Error("[Anys]: options.namespace is required!")}},t.defines=function(){return{client:this.defineClientId.bind(this),trace:this.defineTraceId.bind(this)}},t.defineClientId=function(){const{namespace:e}=this.anys.options,t=`Anys.${e}.clientId`;let n=localStorage.getItem(t);return n||(n=o(8),sessionStorage.setItem(t,n)),n},t.defineTraceId=function(){const{namespace:e}=this.anys.options,t=`Anys.${e}.traceId`,n=o(8);return sessionStorage.setItem(t,n),n},e}();function f(e,t=document.documentElement){const{nodeName:n,path:r}=e;if(r)return r;if("BODY"===n||"HTML"===n||"HEAD"===n)return n;const o=[];let i=e,s=e.parentNode;const c=e=>{const{nodeName:t,parentNode:n}=e;if(!n)return-1;return[].filter.call(n.childNodes,(e=>e.nodeName===t)).indexOf(e)};if("#"===n[0]){const t=c(e);o.push(`${n}:${t}`),i=s,s=i.parentNode}for(;s&&i!==t;){const{nodeName:e}=i;if("BODY"===e||"HTML"===e||"HEAD"===e)o.push(e);else{const t=c(i);o.push(`${e.toLowerCase()}:${t}`)}i=s,s=i.parentNode}return o.reverse(),o.join("/")}function m(e,t){return m=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},m(e,t)}let y=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,m(t,n);var o=r.prototype;return o.options=function(){return{input:!0}},o.registerInput=function(){const e=e=>t=>{const{target:n,type:r,inputType:o,data:i}=t;if("insertCompositionText"===o)return;if("compositionend"===r&&!i)return;const{tagName:s,value:c}=n;if(n.getAttribute("anys-ignore"))return;const a=n.getAttribute("type"),u=e({tagName:s,value:c,type:a,target:n});if(!u)return;const h={type:"input",time:Date.now(),el:f(n),detail:u};this.anys.write(h)},t=e((({tagName:e,value:t,type:n})=>"INPUT"===e&&"radio"!==n&&"checkbox"!==n&&"password"!==n?{value:t,type:n}:"INPUT"===e&&"password"===n?{value:"***",type:n}:"TEXTAREA"===e?{value:t,type:"textarea"}:void 0)),n=e((({tagName:e,value:t,type:n})=>"SELECT"===e?{value:t,type:"select"}:"INPUT"!==e||"radio"!==n&&"checkbox"!==n?void 0:{value:t,type:n})),r=e((({tagName:e,value:t,type:n})=>"TEXTAREA"===e?{value:t,type:"textarea"}:"INPUT"===e?{value:t,type:n}:void 0));return document.addEventListener("input",t,!0),document.addEventListener("compositionend",t,!0),document.addEventListener("change",n,!0),document.addEventListener("paste",r,!0),()=>{document.removeEventListener("input",t),document.removeEventListener("compositionend",t),document.removeEventListener("change",n),document.removeEventListener("paste",r)}},r}(a);function v(e,t){return v=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},v(e,t)}let g=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,v(t,n);var o=r.prototype;return o.options=function(){return{mouse:!("ontouchend"in document),click:!0,mousemove:!1,mousedown:!1,mouseup:!1,wheel:!1,contextmenu:!1}},o.addEventListener=function(e){if(!this.anys.options.mouse)return;const t=this.createThrottleListener((t=>{const{innerWidth:n,innerHeight:r}=window,{target:o,button:i,pageX:s,pageY:c}=t;return{type:e,time:Date.now(),detail:{e:f(o),w:n,h:r,x:s,y:c,button:i}}}));return document.addEventListener(e,t,!0),()=>document.removeEventListener(e,t)},o.registerClick=function(){return this.addEventListener("click")},o.registerMousemove=function(){return this.addEventListener("mousemove")},o.registerMouseup=function(){return this.addEventListener("mouseup")},o.registerMousedown=function(){return this.addEventListener("mousedown")},o.registerContextmenu=function(){return this.addEventListener("contextmenu")},o.registerWheel=function(){if(!this.anys.options.mouse)return;const e="wheel",t=this.createThrottleListener((t=>{const{target:n,deltaX:r,deltaY:o,deltaZ:i,deltaMode:s}=t;return{type:e,time:Date.now(),detail:{e:f(n),deltaX:r,deltaY:o,deltaZ:i,mode:s}}}));return document.addEventListener(e,t),()=>document.removeEventListener(e,t)},o.createThrottleListener=function(e){let t=0;return n=>{if(t)return;const r=e(n);requestAnimationFrame((()=>{this.anys.write(r),t=0})),t=1}},r}(a);function b(e,t){return b=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},b(e,t)}const w={type:"window_activity.enter",time:Date.now()};let O=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,b(t,n);var o=r.prototype;return o.options=function(){return{activity:!0,deadTimeout:0}},o.init=function(){this.anys.options.activity&&this.anys.write(w)},o.registerActivity=function(){const e=()=>{if("hidden"===document.visibilityState){const e={type:"window_activity.focusout",time:Date.now()};this.anys.write(e)}else{const e={type:"window_activity.focusin",time:Date.now()};this.anys.write(e)}},t=()=>{const e={type:"window_activity.unload",time:Date.now()};this.anys.write(e)};return window.addEventListener("beforeunload",t,!0),document.addEventListener("visibilitychange",e,!0),()=>{window.removeEventListener("beforeunload",t),document.removeEventListener("visibilitychange",e)}},o.registerDeadTimeout=function(){const{deadTimeout:e}=this.anys.options;if(!e)return;let t;const n=()=>{clearTimeout(t),t=setTimeout((()=>{const e={type:"window_activity.dead",time:Date.now()};this.anys.write(e)}),e)};return document.addEventListener("keydown",n,!0),document.addEventListener("mousedown",n,!0),document.addEventListener("touchstart",n,!0),document.addEventListener("touchmove",n,!0),document.addEventListener("mousemove",n,!0),document.addEventListener("scroll",n,!0),window.addEventListener("resize",n,!0),()=>{document.removeEventListener("keydown",n),document.removeEventListener("mousedown",n),document.removeEventListener("touchstart",n),document.removeEventListener("touchmove",n),document.removeEventListener("mousemove",n),document.removeEventListener("scroll",n),window.removeEventListener("resize",n)}},r}(a);function E(e,t){return E=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},E(e,t)}let L=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,E(t,n);var o=r.prototype;return o.options=function(){return{url:!0}},o.registerUrl=function(){const e=()=>{this.recordUrl()};return window.addEventListener("hashchange",e),window.addEventListener("popstate",e),this.recordUrl(),()=>{window.removeEventListener("hashchange",e),window.removeEventListener("popstate",e)}},o.recordUrl=function(){const e=window.location.href,t=new URL(e),n=t.pathname.replace(/^([^/])/,"/$1"),r={type:"url",time:Date.now(),url:e,detail:{uri:n+(t.search?`?${t.search}`:""),path:n,protocol:t.protocol.replace(":",""),host:t.hostname,port:t.port,search:t.search,hash:t.hash.replace("#","")}};this.anys.write(r)},r}(a);function j(e,t){return j=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},j(e,t)}let _=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,j(t,n);var o=r.prototype;return o.options=function(){const e="ontouchend"in document;return{touch:e,touchstart:e,touchend:e,touchmove:e}},o.addEventListener=function(e){if(!this.anys.options.touch)return;let t=0;const n=n=>{if(t)return;const{innerWidth:r,innerHeight:o}=window,{target:i,identifier:s,force:c,pageX:a,pageY:u}=n,h={type:e,time:Date.now(),detail:{e:f(i),width:r,height:o,x:a,y:u,identifier:s,force:c}};requestAnimationFrame((()=>{this.anys.write(h),t=0})),t=1};return document.addEventListener(e,n,!0),()=>document.removeEventListener(e,n)},o.registerTouchmove=function(){return this.addEventListener("touchmove")},o.registerTouchend=function(){return this.addEventListener("touchend")},o.registerTouchstart=function(){return this.addEventListener("touchstart")},r}(a),x=function(){function e(){this.queue=[],this.status=0}return e.prototype.push=function(e){let t,n;const r=new Promise(((e,r)=>{t=e,n=r})),o={runner:e,resolve:t,reject:n};this.queue.push(o);const i=()=>{setTimeout((()=>{if(!this.queue.length)return void(this.status=0);const{runner:e,resolve:t,reject:n}=this.queue.shift();e().then(t,n).finally(i)}),0),this.status=1};return this.status||i(),r},e}(),P=function(){function e(e={}){let{name:t,version:n=1,stores:r}=e;const o=!t;t||(t="__indb__"),r&&Array.isArray(r)&&r.length||(r=[{name:"__indb__",isKv:!0}]),this.cache={},this.connection=null,this.name=t,this.version=n,this.stores=r;const i=indexedDB.open(t,n);if(i.onupgradeneeded=e=>{const t=e.target.result,n=Array.from(t.objectStoreNames),o=[];r.forEach((r=>{let i=null;if(n.indexOf(r.name)>-1)i=e.target.transaction.objectStore(r.name);else{const e=r.isKv?"key":r.primaryKeyPath,n=!r.isKv&&r.autoIncrement;i=t.createObjectStore(r.name,{keyPath:e,autoIncrement:n})}const s=i.indexNames;s&&s.length&&Array.from(s).forEach((e=>i.deleteIndex(e))),r.indexes&&r.indexes.length&&r.indexes.forEach((e=>{i.createIndex(e.name,e.keyPath||e.name,{unique:e.unique,multiEntry:Array.isArray(e.keyPath)})})),o.push(r.name)})),n&&n.forEach((e=>{-1===o.indexOf(e)&&t.deleteObjectStore(e)}))},i.onblocked=e=>{console.error(q(new Error("indexedDB "+t+" is blocked")))},o)return this.use(t)}var t=e.prototype;return t.connect=function(){return new Promise(((e,t)=>{const n=indexedDB.open(this.name,this.version);n.onerror=e=>{t(q(e))},n.onsuccess=t=>{e(t.target.result)}}))},t.use=function(e){const t=this.stores.find((t=>t.name===e));if(!t)throw new Error(`[InDB]: store ${e} is not existing.`);if(this.cache[e])return this.cache[e];const n=new I({db:this,store:t});return t.isKv&&Object.defineProperties(n,{key:{value:e=>n.keys().then((t=>t&&t[e]))},getItem:{value:e=>n.get(e).then((e=>e&&e.value))},setItem:{value:(e,t)=>n.put({key:e,value:t})},removeItem:{value:e=>n.delete(e)}}),this.cache[e]=n,n},t.close=function(){return this.cache=null,this.stores=null,this.connect().then((e=>{e.close()}))},e.deleteDatabase=function(e){return new Promise(((t,n)=>{const r=indexedDB.deleteDatabase(e);r.onsuccess=()=>{t()},r.onerror=e=>{n(e)}}))},e.databases=function(){return indexedDB.databases()},e}();let I=function(){function e(e={}){const{store:t,db:n}=e;if("object"!=typeof t||!t.name||"string"!=typeof t.name)throw new Error("[InDBStore]: options.store should be a store config object.");if(!(n instanceof P))throw new Error("[InDBStore]: options.db should be an instanceof InDB.");this.db=n,this.store=t,this.name=t.name,this.primaryKeyPath=t.isKv?"key":t.primaryKeyPath,this._queue=[]}var t=e.prototype;return t.transaction=function(e=!1){const t=()=>{const t=this.name,n=e?"readwrite":"readonly",r=this.db.connection;return(r?Promise.resolve(r):this.db.connect()).then((e=>{this.db.connection=e;const r=e.transaction(t,n),o=()=>{this.db.connection=null,this._queue.shift()};return r.oncomplete=o,r.onabort=o,r.onerror=o,r}))},n=this._queue[this._queue.length-1],r=n?n.then((()=>t())):t();return this._queue.push(r),r},t.objectStore=function(e=!1){const t=this.name;return this.transaction(e).then((e=>e.objectStore(t)))},t.cursor=function(e){const{index:t,range:n,direction:r,onTouch:o,onDone:i,onError:s,writable:c=!1}=e;return this.objectStore(c).then((e=>{const c=t?e.index(t):e,a=c.openCursor(n,r);a.onsuccess=e=>{const t=e.target.result;t?o(t,c):i(t,c)},a.onerror=e=>{s(q(e))}}))},t.request=function(e,t={}){const{writable:n=!1}=t;return new Promise(((t,r)=>{this.objectStore(n).then((n=>{const o=e(n);o.onsuccess=e=>{const n=e.target.result;t(n)},o.onerror=e=>{r(q(e))}}))}))},t.iterate=function(e,t={}){const{index:n,range:r,writable:o=!1,direction:i="next"}=t;return new Promise(((t,s)=>{this.cursor({index:n,range:r,writable:o,direction:i,onTouch:(n,r)=>{e(n,(()=>n.continue()),(()=>{r.transaction.commit(),t()}))},onDone:()=>{t()},onError:e=>{s(e)}})}))},t.batch=function(e,t={}){const{writable:n=!0}=t;return this.transaction(n).then((t=>{const n=this.name,r=[],o=t.objectStore(n);return e.forEach((e=>{const t=new Promise(((t,n)=>{const r=e(o);r.onsuccess=e=>{const n=e.target.result;t(n)},r.onerror=e=>{n(q(e))}}));r.push(t)})),Promise.all(r)}))},t.get=function(e){if(!Array.isArray(e))return this.request((t=>t.get(e)));const t=e.map((e=>t=>t.get(e)));return this.batch(t,{writable:!1})},t.keys=function(){const e=this.primaryKeyPath,t=[];return this.each((n=>{const r=A(n,e);t.push(r)})).then((()=>t))},t.all=function(){const e=[];return this.each((t=>{e.push(t)})).then((()=>e))},t.count=function(){return this.request((e=>e.count()))},t.each=function(e){return this.iterate(((t,n)=>{const r=t.value;e(r),n()}))},t.reverse=function(e){return this.iterate(((t,n)=>{const r=t.value;e(r),n()}),{direction:"prev"})},t.some=function(e=10,t=0){return new Promise(((n,r)=>{const o=[];let i,s=0,c=t,a=t+e;t<0&&(i="prev",e=Math.min(e,-t),c=-(t+e)||0,a=c+e),this.iterate(((e,t,n)=>{s<c?(s++,t()):s<a?(o.push(e.value),s++,t()):n()}),{direction:i}).then((()=>{t<0&&o.reverse(),n(o)})).catch(r)}))},t.first=function(){return this.some(1).then((e=>e[0]))},t.last=function(){return this.some(1,-1).then((e=>e[0]))},t.find=function(e,t){return this.request((n=>n.index(e).get(t)))},t.query=function(e,t,n){const r=function(){switch(n){case">":return IDBKeyRange.lowerBound(t,!0);case">=":return IDBKeyRange.lowerBound(t);case"<":return IDBKeyRange.upperBound(t,!0);case"<=":return IDBKeyRange.upperBound(t);case"%":case"!=":case"in":return;default:return IDBKeyRange.only(t)}}(),o=[];return new Promise(((i,s)=>{this.cursor({index:e,range:r,onTouch:(e,r)=>{const i=e.value,s=A(i,r.keyPath);"!="===n?s!==t&&o.push(i):"%"===n?"string"==typeof s&&s.indexOf(t)>-1&&o.push(i):"in"===n?Array.isArray(t)&&t.indexOf(s)>-1&&o.push(i):o.push(i),e.continue()},onDone:()=>{i(o)},onError:e=>{s(e)}})}))},t.select=function(...e){const t=this.store.indexes||[],n={};t.forEach((e=>{const{name:t,keyPath:r}=e;n[t]=r}));const r=function(e,t,n){if(void 0===e)return!1;switch(n){case">":return e>t;case">=":return e>=t;case"<":return e<t;case"<=":return e<=t;case"!=":return e!==t;case"%":return"string"==typeof e&&e.indexOf(t)>-1;case"in":return Array.isArray(t)&&t.indexOf(e)>-1;default:return e===t}},o=function(e,t,n){if(!t.length&&!n.length)return!1;for(let n=0,o=t.length;n<o;n++){const{keyPath:o,value:i,compare:s}=t[n],c=A(e,o);if(!r(c,i,s))return!1}if(!n.length)return!0;for(let t=0,o=n.length;t<o;t++){const{keyPath:o,value:i,compare:s}=n[t],c=A(e,o);if(r(c,i,s))return!0}return!1},i=[];e.forEach((e=>{const t=[],r=[];for(let o=0,i=e.length;o<i;o++){const{key:i,value:s,compare:c,optional:a}=e[o],u=n[i]||i;a?t.push({keyPath:u,value:s,compare:c}):r.push({keyPath:u,value:s,compare:c})}i.push([r,t])}));const s=[];return this.each((e=>{(e=>{for(let t=0,n=i.length;t<n;t++){const[n,r]=i[t];if(o(e,n,r))return!0}return!1})(e)&&s.push(e)})).then((()=>s))},t.add=function(e,t){if(Array.isArray(e)){const n=e;if(n.length<2)return this.add(e[0],t);const r=n.map((e=>n=>n.add(e,t)));return this.batch(r)}return e?this.request((n=>n.add(e,t)),{writable:!0}):Promise.resolve()},t.put=function(e,t){if(Array.isArray(e)){const n=e;if(n.length<2)return this.put(n[0],t);const r=n.map((e=>n=>n.put(e,t)));return this.batch(r)}return e?this.request((n=>n.put(e,t)),{writable:!0}):Promise.resolve()},t.delete=function(e){if(Array.isArray(e)){const t=e;if(t.length<2)return this.delete(t[0]);const n=t.map((e=>t=>t.delete(e)));return this.batch(n)}return e?this.request((t=>t.delete(e)),{writable:!0}):Promise.resolve()},t.remove=function(e){const t=this.primaryKeyPath;if(Array.isArray(e)){const n=e;if(n.length<2)return this.remove(n[0]);const r=n.map((e=>{const n=A(e,t);return e=>e.delete(n)}));return this.batch(r)}if(!e)return Promise.resolve();const n=A(e,t);return n?this.delete(n):Promise.resolve()},t.clear=function(){return this.request((e=>e.clear()),{writable:!0})},e}();function A(e,t){if(null==t)return;if(Array.isArray(t)){for(let n=0,r=t.length;n<r;n++){const r=A(e,t[n]);if(void 0!==r)return r}return}let n=function(e){return e.toString().split(/\.|\[|\]/).filter((e=>!!e))}(t);if(!n.length)return e;let r=e;for(let e=0,t=n.length;e<t;e++){let t=n[e];if(void 0===r[t])return;r=r[t]}return r}function q(e){const{message:t}=e;return e.message=-1===t.indexOf("[IndexedDB]")?"[IndexedDB]: "+t:t,e}let T=function(){function e(e){this.anys=e}var t=e.prototype;return t.options=function(){return{namespace:new Error("[Anys]: options.namespace is required!"),autoReport:!1,expireTime:1728e5}},t.init=function(){const e="anyslogs",t=new P({name:this.anys.options.namespace,version:1,stores:[{name:e,primaryKeyPath:"_id",autoIncrement:!0}]});this.db=t.use(e),this.queue=new x;const{expireTime:n}=this.anys.options;if(n){let e=0;const t=setInterval((()=>{this.queue.push((()=>this.db.some(100,e))).then((r=>{if(!r.length)return void clearInterval(t);const o=Date.now(),i=[];r.forEach((e=>{const{_id:t,time:r}=e;o-r>n&&i.push(t)})),i.length&&this.queue.push((()=>this.db.delete(i))),e+=100,e-=i.length}))}),1e4)}},t.write=function(e){this.queue.push((()=>this.db.add(e))).then((t=>{this.anys.emit("writeOfflineLog",{id:t,data:e})}))},t.read=function(e){if(e){if(!Array.isArray(e))return;if(e.some((e=>!e.key)))return}else e=[{key:"client",value:this.anys.clientId},{key:"trace",value:this.anys.traceId}];return this.select(e)},t.select=function(e){return this.queue.push((()=>this.db.select(e)))},t.remove=function(e){return this.queue.push((()=>this.db.delete(e))).catch((()=>{}))},e}();function k(e,t){return k=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},k(e,t)}let D=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,k(t,n);var o=r.prototype;return o.options=function(){return{mutation:!0}},o.registerMutation=function(){const e=this.createObserver((e=>{const t={type:"mutation",time:Date.now(),detail:e};this.anys.write(t)}));return window.addEventListener("load",(()=>{e.observe(document,{characterData:!0,attributes:!0,childList:!0,subtree:!0}),this.recordSnapshot(),S(document.documentElement)})),()=>{e.disconnect()}},o.recordSnapshot=function(){const e=function(){const{name:e,publicId:t,systemId:n}=document.doctype,r={name:e,publicId:t,systemId:n},o=$(document.documentElement.innerHTML),i={},s=document.querySelector("html");for(let{name:e,value:t}of s.attributes)i[e]=t;const c=function(){const e=document.querySelectorAll("input, textarea, select"),t=[];return Array.from(e).forEach((e=>{const n=f(e),r="password"===e.type?"***":e.value;t.push({el:n,value:r})})),t}();return{doctype:r,attrs:i,html:o,values:c}}(),t=window.location.href,n=new URL(t),r=n.pathname.replace(/^([^/])/,"/$1");this.anys.write({type:"snapshot",time:Date.now(),url:{uri:r+(n.search?`?${n.search}`:""),path:r,protocol:n.protocol.replace(":",""),host:n.hostname,port:n.port,search:n.search,hash:n.hash.replace("#","")},detail:e})},o.createObserver=function(e){const t=new MutationObserver((t=>{const n=[];[...t].reverse().forEach((e=>{const{type:t,target:r,attributeName:o,oldValue:i}=e;if(!(e=>{if(e.hasAttribute?.("anys-ignore"))return!0;let t=e.parentNode;for(;t;){if(t.hasAttribute?.("anys-ignore"))return!0;t=t.parentNode}return!1})(r)){if("attributes"===t){if(r.getAttribute(o)===i)return;if(n.find((e=>e.type===t&&e.target===r&&e.attributeName===o)))return}else if("characterData"===t){const e=r.data;if(e===i)return;if(n.find((n=>n.type===t&&n.target===r&&n.target.data===e)))return}n.push(e)}})),n.reverse();const r=[];n.forEach((e=>{const{type:t,target:n,attributeName:o,oldValue:i}=e,s=n.path||f(n),c=e=>f(e).replace(s+"/","");if("attributes"===t){const e=n.getAttribute(o),t=i;r.push({type:"attribute",target:s,name:o,next:e,prev:t})}else if("characterData"===t){const e=n.data,t=i;r.push({type:"text",target:s,next:e,prev:t})}else if("childList"===t){if("TEXTAREA"===n.nodeName)return;const{removedNodes:t,addedNodes:o,previousSibling:i,nextSibling:a}=e,u=[],h=Array.from(t).map((e=>{if(document.body.contains(e))return void u.push({node:e,path:f(e)});const t=e.path?c(e):null,n=i?f(i):null,r=a?f(a):null,o={};return t?o.node=t:(o.before=n,o.after=r),o})).filter(Boolean),d=[],p=Array.from(o).map((e=>{const t=e.nextSibling?c(e.nextSibling):null,n=u.find((t=>t.node===e));if(n)return void d.push({node:n.path,sibling:t});const r="#text"===e.nodeName,o="#comment"===e.nodeName,i=r?e.data:null,s=o?e.data:null;return{text:i,html:r||o?null:$(e.outerHTML),comment:s,sibling:t}})).filter(Boolean);r.push({type:"children",target:s,remove:h,insert:p,move:d}),S(n)}})),e(r)}));return S(document),t},r}(a);function S(e){if(e!==document){const t=f(e);e.path=t}const t=e.childNodes;Array.from(t).forEach((e=>{S(e)}))}function $(e){return e.replace(/<script([^]*?)>([^]*?)<\/script>/gm,"<noscript$1></noscript>").replace(/<noscript([^]*?)>([^]*?)<\/noscript>/gm,"<noscript$1></noscript>").replace(/<link([^]*?)as="script"([^]*?)>/g,"<link$1$2>").replace(/\n\n*\s*\n*\n/gm,"\n")}function M(e,t){return M=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},M(e,t)}let N=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,M(t,n);var o=r.prototype;return o.options=function(){return{size:!0}},o.createRecordLog=function(){const{innerWidth:e,innerHeight:t}=window;return{type:"window_size",time:Date.now(),detail:{width:e,height:t}}},o.registerSize=function(){let e;const t=()=>{clearTimeout(e);const t=this.createRecordLog();e=setTimeout((()=>{this.anys.write(t)}),100)};return this.recordSize(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},o.recordSize=function(){const e=this.createRecordLog();this.anys.write(e)},r}(a);function R(e,t){return R=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},R(e,t)}let B=function(e){var t,n;function r(){return e.apply(this,arguments)||this}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,R(t,n);var o=r.prototype;return o.options=function(){return{scroll:!0}},o.registerScroll=function(){let e=0;const t=t=>{if(e)return;const{target:n,bubbles:r}=t;let o;if(r){const{scrollX:e,scrollY:t}=window;o={type:"window_scroll",time:Date.now(),detail:{scrollX:e,scrollY:t}}}else{const{scrollLeft:e,scrollTop:t}=n;o={type:"scroll",time:Date.now(),target:f(n),detail:{scrollLeft:e,scrollTop:t}}}requestAnimationFrame((()=>{this.anys.write(o),e=0})),e=1};return window.addEventListener("scroll",t,!0),()=>{window.removeEventListener("scroll",t)}},r}(a);function K(e,t){return K=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},K(e,t)}let U=function(e){var t,n;function r(t,[n,r,o,i]){var s;return(s=e.call(this,t)||this).offlineLogger=n,s.urlMonitor=r,s.windowSizeMonitor=o,s.DOMMutationMonitor=i,s.cache={},s}n=e,(t=r).prototype=Object.create(n.prototype),t.prototype.constructor=t,K(t,n);var o=r.prototype;return o.options=function(){const e="ontouchend"in document;return{touch:e,mouse:!e,click:!1,mousedown:!0,mousemove:!0,mouseup:!0,autoReport:!1,reportUrl:new Error("[Anys]: options.reportUrl is required!"),reportInterval:1e4,reportParams:null}},o.registerAutoReport=function(){const{clientId:e}=this.anys,t=({prev:t})=>{this.anys.report([{key:"client",value:e},{key:"trace",value:t}]),this.cache={},this.urlMonitor.recordUrl(),this.windowSizeMonitor.recordSize(),this.DOMMutationMonitor.recordSnapshot()};this.anys.on("refreshTraceId",t);const n=setInterval((()=>{this.anys.report(),this.cache={}}),this.anys.options.reportInterval);let r=0;const o=()=>{if(r)return;r=1;const e=Object.keys(this.cache),t=Object.values(this.cache);e.length&&(this.offlineLogger.remove(e),navigator.sendBeacon(this.anys.options.reportUrl,JSON.stringify(t)),this.cache={})};window.addEventListener("beforeunload",o),window.addEventListener("pagehide",o),window.addEventListener("unload",o);const i=({id:e,data:t})=>{this.cache[e]=t};return this.anys.on("writeOfflineLog",i),()=>{this.anys.off("refreshTraceId",t),this.anys.off("writeOfflineLog",i),clearInterval(n),window.removeEventListener("beforeunload",o)}},o.read=function(e){return this.offlineLogger.read(e)},o.send=function(e){const t=[];let n=0;e.forEach((e=>{t[n]=t[n]||[],t[n].push(e),t[n].length>200&&n++})),t.forEach((e=>{const t=[],n=[];if(e.forEach((e=>{const{_id:r,...o}=e;n.push(r),t.push(o)})),!t.length)return;const{reportUrl:r,reportParams:o}=this.anys.options;(function(e,t){return new Promise(((n,r)=>{const o=new(window.__XMLHttpRequest||window.XMLHttpRequest);o.open("POST",e,!0),o.onreadystatechange=function(){4==o.readyState&&(200==o.status?n(o.responseText):r(new Error(`[Anys]: ajax post fail with status ${o.status}`)))},o.onerror=r,o.send(JSON.stringify(t))}))})(o?c(r,o):r,t).then((()=>{this.offlineLogger.remove(n),n.forEach((e=>{delete this.cache[e]}))}))}))},o.auth=function(e){this.anys.options.reportParams=Object.assign(this.anys.options.reportParams||{},e)},r}(a);U.dependencies=[T,L,N,D,l,p,y,g,O,_,B];const{currentScript:X}=document,C=(e={})=>new s({plugins:{recorder:U},namespace:"AnysTracer",autoReport:!1,...e});X.parentNode.removeChild(X)})();var n=anys="undefined"==typeof anys?{}:anys;for(var r in t)n[r]=t[r];t.__esModule&&Object.defineProperty(n,"__esModule",{value:!0})})();
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://anys/webpack/bootstrap","webpack://anys/webpack/runtime/define property getters","webpack://anys/webpack/runtime/hasOwnProperty shorthand","webpack://anys/webpack/runtime/make namespace object","webpack://anys/../../node_modules/ts-fns/es/is.js","webpack://anys/../../node_modules/ts-fns/es/string.js","webpack://anys/../../node_modules/ts-fns/es/object.js","webpack://anys/../anys/src/index.js","webpack://anys/../../node_modules/ts-fns/es/class.js","webpack://anys/../@shared/src/url-parser.js","webpack://anys/../@shared/src/plugin.js","webpack://anys/../@shared/src/evt.js","webpack://anys/../anys-web-plugin-monitor-ajax/src/index.js","webpack://anys/../anys-web-plugin-identify/src/index.js","webpack://anys/../@shared/src/dom-path.js","webpack://anys/../anys-web-plugin-monitor-input-event/src/index.js","webpack://anys/../anys-web-plugin-monitor-mouse-event/src/index.js","webpack://anys/../anys-web-plugin-monitor-window-activity/src/index.js","webpack://anys/../anys-web-plugin-monitor-url/src/index.js","webpack://anys/../anys-web-plugin-monitor-touch-event/src/index.js","webpack://anys/../@shared/src/async-queue.js","webpack://anys/../anys-web-plugin-store-offline/node_modules/indb/es/index.js","webpack://anys/../anys-web-plugin-store-offline/src/index.js","webpack://anys/../anys-web-plugin-monitor-dom-mutation/src/index.js","webpack://anys/../anys-web-plugin-monitor-window-size/src/index.js","webpack://anys/../anys-web-plugin-monitor-scroll-event/src/index.js","webpack://anys/./src/recorder-plugin.js","webpack://anys/../@shared/src/ajax.js","webpack://anys/./src/index.js"],"sourcesContent":["// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { unionArray } from './array.js'\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isUndefined(value) {\n return typeof value === 'undefined'\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isNull(value) {\n return value === null\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isNullish(value) {\n return isUndefined(value) || isNull(value)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isNone(value) {\n return isNullish(value) || isNaN(value)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isArray(value) {\n return Array.isArray(value)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isObject(value) {\n return value && typeof value === 'object' && value.constructor === Object\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isDate(value) {\n return isInstanceOf(value, Date)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isString(value) {\n return typeof value === 'string'\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isNumber(value) {\n return typeof value === 'number' && !isNaN(value)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isNaN(value) {\n return typeof value === 'number' && Number.isNaN(value)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isSymbol(value) {\n return typeof value === 'symbol'\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isFinite(value) {\n return typeof value === 'number' && Number.isFinite(value)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isInfinite(value) {\n return typeof value === 'number' && !Number.isNaN(value) && !Number.isFinite(value)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isBoolean(value) {\n return value === true || value === false\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isNumeric(value) {\n return isString(value) && /^\\-{0,1}[0-9]+\\.{0,1}([0-9]+){0,1}$/.test(value)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isBlob(value) {\n return isInstanceOf(value, Blob)\n || (\n value\n && typeof value.size === 'number'\n && typeof value.type === 'string'\n )\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isFile(value) {\n return isInstanceOf(value, File)\n || (\n isBlob(value)\n && (typeof value.lastModifiedDate === 'object' || typeof value.lastModified === 'number')\n && typeof value.name === 'string'\n )\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isFormData(value) {\n return isInstanceOf(value, FormData)\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isEmpty(value) {\n if (isNone(value) || value === '' || isNaN(value)) {\n return true\n }\n else if (isArray(value)) {\n return value.length === 0\n }\n else if (isObject(value)) {\n return Object.getOwnPropertyNames(value).length === 0\n }\n else {\n return false\n }\n}\n\n/**\n * @param {any} value\n * @param {boolean} [isStrict] where Constructor is to return false\n * @returns {boolean}\n */\nexport function isFunction(value, isStrict) {\n if (typeof value !== 'function') {\n return false\n }\n return isStrict ? !isConstructor(value, 2) : true\n}\n\n/**\n * judge whether a value is a Constructor\n * @param {any} f\n * @param {number} [strict] strict level\n * - 4: should must be one of native code, native class\n * - 3: can be babel transformed class\n * - 2: can be some function whose prototype has more than one properties\n * - 1: can be some function which has this inside\n * - 0: can be some function which has prototype\n * @returns {boolean}\n */\nexport function isConstructor(f, strict) {\n if (typeof f !== 'function') {\n return false\n }\n\n if (f === Symbol) {\n return false\n }\n\n // bond function && arrow function\n if (!f.prototype) {\n return false\n }\n\n const entire = f + ''\n const fnBody = entire.slice(entire.indexOf(\"{\") + 1, entire.lastIndexOf(\"}\")).trim()\n\n // native class definition\n const isNativeClass = entire.indexOf('class ') === 0\n // std lib: String, Number...\n const isNativeSTD = fnBody === `[native code]`\n\n const level4 = isNativeClass || isNativeSTD\n if (strict >= 4) {\n return level4\n }\n\n const topCtx = fnBody.replace(/function.*?\\{.*?\\}/gm, '')\n .replace(/return/gm, '')\n .replace(/\\n+/gm, ';')\n .replace(/\\s+/gm, '')\n .replace(/;;/gm, ';')\n // babel transformed class, begin with '_classCallCheck(this,', may by minified by compile tool\n const isBabelTransformedClass = /^_classCallCheck\\(this,/.test(topCtx)\n // @babel/plugin-transform-runtime '(0, _classCallCheck2[\"default\"])(this,'\n const isBabelRuntimeTransformedClass = /^\\(.*?_classCallCheck.*?\\)\\(this,/.test(topCtx)\n // webpack minified\n const isBabelTransformedMinifiedClass = /^[0-9a-zA-Z_;!?:]*?\\(this,/.test(topCtx)\n\n const level3 = level4 || isBabelTransformedClass || isBabelRuntimeTransformedClass || isBabelTransformedMinifiedClass\n if (strict == 3) {\n return level3\n }\n\n // there are some properties on f.prototype\n const protos = Object.getOwnPropertyDescriptors(f.prototype)\n const keys = Object.keys(protos).filter(item => item !== 'constructor')\n const hasProtos = !!keys.length\n\n const level2 = level3 || hasProtos\n if (strict == 2) {\n return level2\n }\n\n // function() { this.name = 'xx' }\n const hasThisInside = topCtx.indexOf('this.') === 0 || topCtx.indexOf(';this.') > -1 || topCtx.indexOf('=this;') > -1\n\n const level1 = level2 || hasThisInside\n if (strict == 1) {\n return level1\n }\n\n return true\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isTruthy(value) {\n return !!value\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isFalsy(value) {\n return !value\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isEqual(val1, val2) {\n const equal = (obj1, obj2) => {\n const keys1 = Object.getOwnPropertyNames(obj1)\n const keys2 = Object.getOwnPropertyNames(obj2)\n const keys = unionArray(keys1, keys2)\n\n for (let i = 0, len = keys.length; i < len; i ++) {\n const key = keys[i]\n\n if (!inArray(key, keys1)) {\n return false\n }\n if (!inArray(key, keys2)) {\n return false\n }\n\n const value1 = obj1[key]\n const value2 = obj2[key]\n if (!isEqual(value1, value2)) {\n return false\n }\n }\n\n return true\n }\n\n if (isObject(val1) && isObject(val2)) {\n return equal(val1, val2)\n }\n else if (isArray(val1) && isArray(val2)) {\n return equal(val1, val2)\n }\n else {\n return val1 === val2\n }\n}\n\n/**\n * @param {any} a\n * @param {any} b\n * @returns {boolean}\n */\nexport function isLt(a, b) {\n return a < b\n}\n\n/**\n * @param {any} a\n * @param {any} b\n * @returns {boolean}\n */\nexport function isLte(a, b) {\n return a <= b\n}\n\n/**\n * @param {any} a\n * @param {any} b\n * @returns {boolean}\n */\nexport function isGt(a, b) {\n return a > b\n}\n\n/**\n * @param {any} a\n * @param {any} b\n * @returns {boolean}\n */\nexport function isGte(a, b) {\n return a >= b\n}\n\n/**\n * @param {any} value\n * @returns {boolean}\n */\nexport function isPromise(value) {\n return isInstanceOf(value, Promise)\n || (\n value\n && (typeof value === 'object' || typeof value === 'function')\n && typeof value.then === 'function'\n )\n}\n\n/**\n * @param {any} value\n * @param {any} Constructor\n * @param {boolean} [isStrict]\n * @returns {boolean}\n */\nexport function isInstanceOf(value, Constructor, isStrict) {\n if (!value || typeof value !== 'object') {\n return false\n }\n if (isStrict) {\n return value.constructor === Constructor\n }\n else {\n return value instanceof Constructor\n }\n}\n\n/**\n * @param {any} SubConstructor\n * @param {any} Constructor\n * @param {boolean} [isStrict]\n * @returns {boolean}\n */\nexport function isInheritedOf(SubConstructor, Constructor, isStrict) {\n if (typeof SubConstructor !== 'function') {\n return false\n }\n\n const ins = SubConstructor.prototype\n if (!ins) {\n return false\n }\n\n return isInstanceOf(ins, Constructor, isStrict)\n}\n\n/**\n * check wether a property is the given object's own property,\n * it will check:\n * - only string properties (except symbol properties, different from hasOwnKey),\n * - only enumerable properties;\n * @param {string} key\n * @param {object} obj\n * @param {boolean} [own] use hasOwnKey to check\n * @returns {boolean}\n */\nexport function inObject(key, obj, own) {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n if (own) {\n return hasOwnKey(obj, key)\n }\n\n return typeof key !== 'symbol' && Object.prototype.propertyIsEnumerable.call(obj, key)\n}\n\n/**\n * check wether a property is the given object's own property,\n * as default, it will check:\n * - both string and symbol properties (different from inObject),\n * - both enumerable and non-enumerable properties;\n * @param {object|array} obj\n * @param {string} key\n * @param {boolean} [enumerable]\n * @returns {boolean}\n */\n export function hasOwnKey(obj, key) {\n if (!obj || typeof obj !== 'object') {\n return false\n }\n\n return Object.prototype.hasOwnProperty.call(obj, key)\n}\n\n/**\n * @param {any} item\n * @param {array} arr\n * @returns {boolean}\n */\nexport function inArray(item, arr) {\n return isArray(arr) && arr.includes(item)\n}\n\n/**\n * @param {object} objA\n * @param {object} objB\n * @param {number} deepth how many deepth to check\n */\nexport function isShallowEqual(objA, objB, deepth){\n if(objA === objB) {\n return true\n }\n\n // not object. number, string, boolean, null\n if(!(typeof objA === 'object' && objA !== null) || !(typeof objB === 'object' && objB !== null)) {\n return false\n }\n\n // object vs. array\n if ([objA, objB].filter(item => isArray(item)).length === 1) {\n return false\n }\n\n const keysA = Object.keys(objA).sort()\n const keysB = Object.keys(objB).sort()\n\n if (keysA.length !== keysB.length) {\n return false\n }\n\n for (let i = 0; i < keysA.length; i ++) {\n const keyA = keysA[i]\n const keyB = keysB[i]\n\n if (keyA !== keyB) {\n return false\n }\n\n const key = keyA\n\n if (objA[key] !== objB[key]) {\n if (deepth && typeof objA[key] === 'object' && typeof objB[key] === 'object') {\n if (!isShallowEqual(objA[key], objB[key], deepth - 1)) {\n return false\n }\n }\n else {\n return false\n }\n }\n }\n\n return true\n}\n\nexport function isOneInArray(items, arr) {\n return arr.some(one => items.includes(one))\n}\n\nexport function isAllInArray(items, arr) {\n return !arr.some(one => !items.includes(one))\n}\n","import { createArray } from './array.js'\n\n// the order could never be changed, becuase we use it for number convertion\nexport function getAllChars() {\n return '0123456789abcdefghigklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ'\n}\n\n/**\n * @param {string} input\n * @param {string} separator\n * @param {array} segments\n * @param {boolean} alignright\n * @returns {string}\n */\nexport function formatString(input, separator, segments, alignright) {\n if (typeof input !== 'string' || !input) {\n return ''\n }\n if (typeof separator !== 'string' || !separator) {\n return input\n }\n if (!segments) {\n return input\n }\n\n let letters = input.split('')\n\n if (alignright) {\n letters.reverse()\n }\n\n let points = Array.isArray(segments) ? [].concat(segments) : [segments]\n let result = []\n let count = points[0]\n\n for (let i = 0, len = letters.length; i < len; i ++) {\n if (typeof segments === 'number') {\n if (i > 0 && i % count === 0) {\n result.push(separator)\n }\n }\n else if (Array.isArray(segments) && points.length) {\n if (i > 0 && i % count === 0) {\n result.push(separator)\n points.shift()\n count += points.length ? points[0] : 0\n }\n }\n\n let char = letters[i]\n result.push(char)\n }\n\n if (alignright) {\n result.reverse()\n }\n\n let output = result.join('')\n return output\n}\n\n/**\n * @param {string} str\n * @param {number} len\n * @param {boolean} pad\n * @returns {string}\n */\nexport function padLeft(str, len, pad) {\n if (str.length >= len) {\n return str\n }\n\n let diff = len - str.length\n let letters = createArray(pad, diff)\n\n return letters.join('') + str\n}\n\n/**\n * @param {string} str\n * @param {number} len\n * @param {boolean} pad\n * @returns {string}\n */\nexport function padRight(str, len, pad) {\n if (str.length >= len) {\n return str\n }\n\n let diff = len - str.length\n let letters = createArray(pad, diff)\n\n return str + letters.join('')\n}\n\n/**\n * @param {string} str\n * @returns {string}\n */\nexport function getStringHash(str) {\n let hash = 5381\n let i = str.length\n\n while(i) {\n hash = (hash * 33) ^ str.charCodeAt(--i)\n }\n\n return hash >>> 0\n}\n\n/**\n * @param {number} len\n * @returns {string}\n */\nexport function createRandomString(len = 16) {\n const CHARS = getAllChars()\n let text = ''\n for (let i = 0; i < len; i++) {\n text += CHARS.charAt(Math.floor(Math.random() * CHARS.length))\n }\n return text\n}\n\n// https://github.com/gillesruppert/node-interpolate/blob/master/lib/interpolate.js\n/**\n * @param {string} template\n * @param {object} data\n * @param {object} [opts]\n * @returns {string}\n */\nexport function interpolate(template, data, opts) {\n let regex,\n lDel,\n rDel,\n delLen,\n lDelLen,\n delimiter,\n // For escaping strings to go in regex\n regexEscape = /([$\\^\\\\\\/()|?+*\\[\\]{}.\\-])/g;\n\n opts = opts || {};\n\n delimiter = opts.delimiter || '{}';\n delLen = delimiter.length;\n lDelLen = Math.ceil(delLen / 2);\n // escape delimiters for regex\n lDel = delimiter.substr(0, lDelLen).replace(regexEscape, \"\\\\$1\");\n rDel = delimiter.substr(lDelLen, delLen).replace(regexEscape, \"\\\\$1\") || lDel;\n\n // construct the new regex\n regex = new RegExp(lDel + \"[^\" + lDel + rDel + \"]+\" + rDel, \"g\");\n\n return template.replace(regex, function (placeholder) {\n let key = placeholder.slice(lDelLen, -lDelLen),\n keyParts = key.split(\".\"),\n val,\n i = 0,\n len = keyParts.length;\n\n if (key in data) {\n // need to be backwards compatible with \"flattened\" data.\n val = data[key];\n }\n else {\n // look up the chain\n val = data;\n for (; i < len; i++) {\n if (keyParts[i] in val) {\n val = val[ keyParts[i] ];\n } else {\n return placeholder;\n }\n }\n }\n return val;\n });\n}\n","import { getStringHash } from './string.js'\nimport { isArray, isObject, isFile, isDate, isFunction, inArray, isSymbol, inObject, isUndefined, hasOwnKey } from './is.js'\nimport { decideby } from './syntax.js'\n\n/**\n * @param {any} obj\n */\nexport function clone(obj) {\n const parents = []\n const clone = function(origin) {\n if (!isObject(origin) && !isArray(origin)) {\n return origin\n }\n\n const result = isArray(origin) ? [] : {}\n const keys = Object.keys(origin)\n\n parents.push({ origin, result })\n\n for (let i = 0, len = keys.length; i < len; i ++) {\n const key = keys[i]\n const value = origin[key]\n const referer = parents.find(item => item.origin === value)\n\n if (referer) {\n result[key] = referer.result\n }\n else {\n result[key] = clone(value)\n }\n }\n\n return result\n }\n\n const result = clone(obj)\n return result\n}\n\n/**\n * Deep extend an object\n * @param {object} obj1\n * @param {object} obj2\n * @param {0|1|2} [mixArr] 0: extend array as object, 1: push into array, 2: replace all items\n * @returns {object}\n */\nexport function extend(obj1, obj2, mixArr = 0) {\n const exists = []\n const extend = (obj1, obj2) => {\n each(obj2, (value, key) => {\n const originalValue = obj1[key]\n\n // check whether extended\n const exist = exists.find(item => item.e === value)\n if (exist) {\n if (originalValue === exist.o) {\n return\n }\n if (!originalValue || typeof originalValue !== 'object') {\n obj1[key] = exist.o\n return\n }\n }\n\n if (isObject(originalValue)) {\n if (isObject(value) || isArray(value)) {\n extend(originalValue, value, mixArr)\n }\n else {\n obj1[key] = value\n }\n }\n else if (isArray(originalValue)) {\n if (isObject(value)) {\n if (mixArr === 0 || mixArr === 1) {\n extend(originalValue, value, mixArr)\n }\n else if (mixArr === 2) {\n originalValue.length = 0\n extend(originalValue, value, mixArr)\n }\n else {\n obj1[key] = value\n }\n }\n else if (isArray(value)) {\n if (mixArr === 0) {\n extend(originalValue, value, mixArr)\n }\n else if (mixArr === 1) {\n originalValue.push(...value)\n }\n else if (mixArr === 2) {\n originalValue.length = 0\n originalValue.push(...value)\n }\n else {\n obj1[key] = value\n }\n }\n else {\n obj1[key] = value\n }\n }\n else {\n obj1[key] = value\n }\n })\n\n // record this pair\n exists.push({\n o: obj1, // original\n e: obj2, // extend by this\n })\n\n return obj1\n }\n return extend(obj1, obj2)\n}\n\n/**\n * @param {object} obj1\n * @param {object} obj2\n * @param {boolean} [concatArray]\n * @returns {object}\n */\nexport function merge(obj1, obj2, concatArray = true) {\n obj1 = clone(obj1)\n\n if (!isArray(obj2) && !isObject(obj2)) {\n return isArray(obj1) && isObject(obj1) ? obj1 : null\n }\n\n obj2 = clone(obj2)\n\n if (!isArray(obj1) && !isObject(obj1)) {\n return isArray(obj2) && isObject(obj2) ? obj2 : null\n }\n\n const exists = []\n const merge = (obj1, obj2) => {\n if (isArray(obj1)) {\n if (isArray(obj2) && concatArray) {\n return [...obj1, ...obj2]\n }\n }\n\n const result = obj1\n const keys = Object.keys(obj2)\n keys.forEach((key) => {\n const oldValue = obj1[key]\n const newValue = obj2[key]\n\n if (isObject(newValue) || isArray(newValue)) {\n const index = exists.indexOf(newValue)\n if (index === -1) {\n exists.push(newValue)\n }\n else if (!isArray(oldValue) && !isObject(oldValue)) {\n result[key] = newValue\n return\n }\n }\n\n if (isObject(newValue) || isArray(newValue)) {\n if (isObject(oldValue) || isArray(oldValue)) {\n result[key] = merge(oldValue, newValue)\n }\n else {\n result[key] = newValue\n }\n }\n else {\n result[key] = newValue\n }\n })\n return result\n }\n\n return merge(obj1, obj2)\n}\n\n/**\n * @param {object} obj\n * @returns {string}\n */\nexport function stringify(obj) {\n const exists = [obj]\n const used = []\n const stringifyObjectByKeys = (obj) => {\n if (isArray(obj)) {\n let items = obj.map((item) => {\n if (item && typeof item === 'object') {\n return stringifyObjectByKeys(item)\n }\n else {\n return JSON.stringify(item)\n }\n })\n let str = '[' + items.join(',') + ']'\n return str\n }\n\n let str = '{'\n let keys = Object.keys(obj)\n let total = keys.length\n keys.sort()\n keys.forEach((key, i) => {\n let value = obj[key]\n str += key + ':'\n\n if (value && typeof value === 'object') {\n let index = exists.indexOf(value)\n if (index > -1) {\n str += '#' + index\n used.push(index)\n }\n else {\n exists.push(value)\n const num = exists.length - 1\n str += '#' + num + stringifyObjectByKeys(value)\n }\n }\n else {\n str += JSON.stringify(value)\n }\n\n if (i < total - 1) {\n str += ','\n }\n })\n str += '}'\n return str\n }\n let str = stringifyObjectByKeys(obj)\n\n exists.forEach((item, i) => {\n if (!used.includes(i)) {\n str = str.replace(new RegExp(`:#${i}`, 'g'), ':')\n }\n })\n\n if (used.includes(0)) {\n str = '#0' + str\n }\n\n return str\n}\n\n/**\n * @param {object} obj\n * @returns {string}\n */\nexport function getObjectHash(obj) {\n if (typeof obj !== 'object') {\n return\n }\n\n let str = stringify(obj)\n let hash = getStringHash(str)\n return hash\n}\n\n/**\n * @param {object} obj\n * @param {string} key\n * @param {object|function} value\n * @returns {object}\n */\nexport function define(obj, key, value) {\n if (isFunction(value)) {\n return Object.defineProperty(obj, key, { get: value })\n }\n else if (isObject(value)) {\n if (hasOwnKey(value, 'enumerable') || hasOwnKey(value, 'configurable')) {\n return Object.defineProperty(obj, key, value)\n }\n else if ((isFunction(value.set) && isFunction(value.get))) {\n return Object.defineProperty(obj, key, value)\n }\n else if (hasOwnKey(value, 'value')) {\n return Object.defineProperty(obj, key, value)\n }\n else {\n return Object.defineProperty(obj, key, { value })\n }\n }\n else {\n return Object.defineProperty(obj, key, { value })\n }\n}\n\n/**\n * @param {object|array} obj\n * @param {function} [determine]\n * @returns {object}\n */\nexport function flat(obj, determine) {\n const flat = (input, path = '', result = {}) => {\n if (isArray(input)) {\n input.forEach((item, i) => flat(item, `${path}[${i}]`, result))\n return result\n }\n else if (input && typeof input === 'object' && !isFile(input) && !isDate(input)) {\n if (isFunction(determine) && !determine(input)) {\n result[path] = input\n return result\n }\n\n each(input, (value, key) => {\n flat(value, !path ? key : `${path}[${key}]`, result)\n })\n return result\n }\n else {\n result[path] = input\n return result\n }\n }\n return flat(obj)\n}\n\n/**\n * @param {object|array} obj\n * @param {function} fn\n * @param {boolean} descriptor\n * @returns {object|array}\n */\nexport function each(obj, fn, descriptor) {\n const withDescriptor = () => {\n const descriptors = Object.getOwnPropertyDescriptors(obj)\n const keys = Object.keys(descriptors)\n keys.forEach((key) => {\n const descriptor = descriptors[key]\n const { get, set, enumerable, configurable, writable } = descriptor\n if (enumerable || (get || set) || (configurable && writable)) {\n fn(descriptor, key, obj)\n }\n })\n }\n\n const withIterator = () => {\n if (isArray(obj)) {\n obj.forEach(fn)\n }\n else {\n const keys = Object.keys(obj)\n keys.forEach((key) => {\n const value = obj[key]\n fn(value, key, obj)\n })\n }\n }\n\n return descriptor ? withDescriptor() : withIterator()\n}\n\n/**\n * @param {object|array} obj\n * @param {function} fn\n * @returns {object}\n */\nexport function map(obj, fn) {\n if (isArray(obj)) {\n return obj.map(fn)\n }\n else {\n const result = {}\n each(obj, (value, key) => {\n result[key] = fn(value, key, obj)\n })\n return result\n }\n}\n\n/**\n * @param {object|array} obj\n * @param {function} fn\n * @returns {object}\n */\nexport function filter(obj, fn) {\n if (isArray(obj)) {\n return obj.filter(fn)\n }\n else {\n const result = {}\n each(obj, (value, key) => {\n const bool = fn(value, key, obj)\n if (!bool) {\n return\n }\n result[key] = value\n })\n return result\n }\n}\n\n/**\n * @param {object|array} obj\n * @param {function} fn\n */\nexport function iterate(obj, fn) {\n if (isArray(obj)) {\n for (let i = 0, len = obj.length; i < len; i ++) {\n const item = obj[i]\n const res = fn(item, i, obj)\n if (!isUndefined(res)) {\n return res\n }\n }\n }\n else {\n const keys = Object.keys(obj)\n for (let i = 0, len = keys.length; i < len; i ++) {\n const key = keys[i]\n const value = obj[key]\n const res = fn(value, key, obj)\n if (!isUndefined(res)) {\n return res\n }\n }\n }\n}\n\n/**\n * @param {object|array} obj\n * @param {function} fn\n */\nexport function find(obj, fn) {\n return iterate(obj, (value, key) => {\n const res = fn(value, key, obj)\n if (res) {\n return value\n }\n })\n}\n\n/**\n * @param {object} obj\n * @param {array} keys\n * @returns {object}\n */\nexport function extract(obj, keys) {\n const results = {}\n keys.forEach((key) => {\n if (hasOwnKey(obj, key)) {\n results[key] = obj[key]\n }\n })\n return results\n}\n\n/**\n * deep freeze\n * @param {object} o\n * @returns {object}\n */\nexport function freeze(o) {\n\tif (!Object.freeze) {\n\t\treturn o\n\t}\n\n\tObject.freeze(o)\n\n\tObject.getOwnPropertyNames(o).forEach((prop) => {\n\t\tconst v = o[prop]\n\t\tif (\n\t\t\tObject.prototype.hasOwnProperty.call(o, prop)\n\t\t\t&& v !== null\n\t\t\t&& (typeof v === 'object' || typeof v === 'function')\n\t\t\t&& !Object.isFrozen(v)\n\t\t) {\n\t\t\tfreeze(v)\n\t\t}\n\t})\n\n\treturn o\n}\n\n/**\n * create a reactive object.\n * it will change your original data\n * @param {object|array} origin\n * @param {object} options\n * @param {function} options.get to modify output value of each node, receive (keyPath, reactiveValue), reactiveValue is a reactive object/array as if, keyPath is an array which catains keys in path\n * @param {function} options.set to modify input value of each node, receive (keyPath, nextValue), nextValue is the given passed value, the return value will be transformed to be reactive object/array as if\n * @param {function} options.dispatch to notify change with keyPath, receive (keypath, next, prev), it will be called after value is set into\n * @param {function} options.writable whether be able to change value, return false to disable writable, default is true\n * @param {function} options.disable return true to disable create nest reactive on this node\n * @returns {object|array}\n * @example\n * const some = {\n * body: {\n * hand: true,\n * foot: true,\n * },\n * }\n * const a = createReactive(some, {\n * get(keyPath, value) {\n * if (keyPath.join('.') === 'body.hand') {\n * return value.toString()\n * }\n * else {\n * return value\n * }\n * },\n * set(keyPath, value) {},\n * dispatch({\n * keyPath,\n * value, // receive value\n * input, // getter output\n * next, // created reactive\n * prev, // current reactive\n * }, force) {},\n * })\n *\n * a !== some // reactive object !== object\n * a.body !== some.body // reactive object !== object\n * a.body.hand !== some.body.hand // true !== 'true'\n * a.body.foot == some.body.foot // true == true\n *\n * a.body.hand = false // now a.body.hand is 'false', a string\n * some.body.hand === false // original data changed\n */\nexport function createReactive(origin, options = {}) {\n const { get, set, del, dispatch, writable, disable, receive } = options\n\n const create = (origin, parents = []) => {\n if (!isObject(origin) && !isArray(origin)) {\n return origin\n }\n\n if (isFunction(disable) && disable(parents, origin)) {\n return origin\n }\n\n let output = null\n if (isObject(origin)) {\n output = createObject(origin, parents)\n }\n else {\n output = createArray(origin, parents)\n }\n\n return output\n }\n\n const createObject = (origin, parents = []) => {\n const media = {}\n const reactive = {}\n\n const setValue = (key, value, trigger) => {\n const keyPath = [...parents, key]\n\n if (Object.isFrozen(origin)) {\n const active = create(value, keyPath)\n return active\n }\n\n const prev = origin[key]\n const invalid = media[key]\n const input = isFunction(set) ? set(keyPath, value) : value\n\n let active\n let next\n if (inObject(key, media) && (\n value === prev\n || value === invalid\n || input === prev\n || input === invalid\n )) {\n // origin property is changed any where else\n if ((typeof prev !== 'object' || prev === null) && prev !== invalid) {\n next = prev\n active = prev\n }\n else if (invalid && typeof invalid === 'object' && invalid.$$_ORIGIN !== prev) {\n next = prev\n active = create(prev, keyPath)\n }\n else {\n next = prev\n active = invalid\n }\n }\n else {\n next = input\n active = create(next, keyPath)\n }\n\n origin[key] = next\n media[key] = active\n\n if (trigger && isFunction(dispatch)) {\n dispatch({\n keyPath,\n value,\n next, active,\n prev, invalid,\n })\n }\n\n return active\n }\n\n const delValue = (key, trigger) => {\n const keyPath = [...parents, key]\n const prev = origin[key]\n const invalid = media[key]\n\n if (isFunction(del)) {\n del(keyPath)\n }\n\n delete reactive[key]\n delete media[key]\n delete origin[key]\n\n if (trigger && isFunction(dispatch)) {\n const none = void 0\n dispatch({\n keyPath,\n value: none,\n next: none,\n active: none,\n prev, invalid,\n }, isUndefined(prev))\n }\n }\n\n const put = (key, value, trigger) => {\n const keyPath = [...parents, key]\n\n Object.defineProperty(reactive, key, {\n get: () => {\n const active = media[key]\n const output = isFunction(get) ? get(keyPath, active) : active\n return output\n },\n set: (value) => {\n if (isFunction(receive)) {\n receive(keyPath, value)\n }\n\n if (Object.isFrozen(origin)) {\n return media[key]\n }\n\n if (isFunction(writable) && !writable(keyPath, value)) {\n return media[key]\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(media, key)\n if (descriptor) {\n if (!('value' in descriptor)) {\n if ('set' in descriptor) {\n origin[key] = value\n }\n return value\n }\n if (!descriptor.writable) {\n return descriptor.value\n }\n }\n\n const active = setValue(key, value, true)\n return active\n },\n enumerable: true,\n configurable: true,\n })\n\n // initialize the current value at the first time\n const active = setValue(key, value, trigger)\n return active\n }\n\n each(origin, (descriptor, key) => {\n if ('value' in descriptor) {\n const value = descriptor.value\n put(key, value)\n }\n else {\n Object.defineProperty(media, key, descriptor)\n }\n }, true)\n\n Object.defineProperties(reactive, {\n $get: {\n value: key => reactive[key],\n },\n $set: {\n value: (key, value) => {\n const keyPath = [...parents, key]\n\n if (isFunction(receive)) {\n receive(keyPath, value)\n }\n\n if (Object.isFrozen(origin)) {\n return media[key]\n }\n\n if (isFunction(writable) && !writable(keyPath)) {\n return media[key]\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(media, key)\n if (descriptor) {\n if (!('value' in descriptor)) {\n if ('set' in descriptor) {\n origin[key] = value\n }\n return value\n }\n if (!descriptor.writable) {\n return descriptor.value\n }\n }\n\n const active = inObject(key, reactive) ? setValue(key, value, true) : put(key, value, true)\n return active\n },\n },\n $del: {\n value: (key) => {\n const keyPath = [...parents, key]\n\n if (isFunction(receive)) {\n receive(keyPath)\n }\n\n if (Object.isFrozen(origin)) {\n return false\n }\n\n if (isFunction(writable) && !writable(keyPath)) {\n return false\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(media, key)\n if (!descriptor) {\n return false\n }\n if (!descriptor.configurable) {\n return false\n }\n\n delValue(key, true)\n return true\n },\n },\n $$_ORIGIN: {\n get: () => origin,\n },\n })\n\n return reactive\n }\n\n const createArray = (origin, parents = []) => {\n const media = []\n const reactive = []\n\n const setValue = (i, value, trigger) => {\n const keyPath = [...parents, i]\n\n if (Object.isFrozen(origin)) {\n const active = create(value, keyPath)\n return active\n }\n\n const prev = origin[i]\n const invalid = media[i]\n const input = isFunction(set) ? set(keyPath, value) : value\n\n let active\n let next\n if (inObject(i, media) && (\n value === prev\n || value === invalid\n || input === prev\n || input === invalid\n )) {\n // origin property is changed any where else\n if ((typeof prev !== 'object' || prev === null) && prev !== invalid) {\n next = prev\n active = prev\n }\n else if (invalid && typeof invalid === 'object' && invalid.$$_ORIGIN !== prev) {\n next = prev\n active = create(prev, keyPath)\n }\n else {\n next = prev\n active = invalid\n }\n }\n else {\n next = input\n active = create(next, keyPath)\n }\n\n origin[i] = next\n media[i] = active\n\n if (trigger && isFunction(dispatch)) {\n dispatch({\n keyPath,\n value,\n next, active,\n prev, invalid,\n })\n }\n\n return active\n }\n\n // fill items into output array\n // start and end, where to start and end\n // items, original data to use\n const shuffle = (start, end) => {\n for (let i = start; i <= end; i ++) {\n const keyPath = [...parents, i]\n\n Object.defineProperty(reactive, i, {\n get: () => {\n const active = media[i]\n const output = isFunction(get) ? get(keyPath, active) : active\n return output\n },\n set: (value) => {\n if (isFunction(writable) && !writable(keyPath, value)) {\n return media[i]\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(media, i)\n if (descriptor) {\n if (!('value' in descriptor)) {\n if ('set' in descriptor) {\n origin[i] = value\n }\n return value\n }\n if (!descriptor.writable) {\n return descriptor.value\n }\n }\n\n const active = setValue(i, value, true)\n return active\n },\n enumerable: true,\n configurable: true,\n })\n\n // initialize\n setValue(i, origin[i])\n }\n\n // make sure the no use items are removed\n if (media.length > origin.length) {\n media.length = origin.length\n }\n if (reactive.length > media.length) {\n reactive.length = media.length\n }\n }\n\n // change array prototype methods\n const modify = (fn) => ({\n value: function(...args) {\n const nonAs = () => {\n if (fn === 'push' || fn === 'unshift') {\n return media.length\n }\n else if (fn === 'splice') {\n return []\n }\n else if (fn === 'shift') {\n return media[0]\n }\n else if (fn === 'pop') {\n return media[media.length - 1]\n }\n else if (fn === 'insert' || fn === 'remove') {\n return -1\n }\n else {\n return media\n }\n }\n\n if (isFunction(receive)) {\n receive(parents, origin, fn, args)\n }\n\n if (Object.isFrozen(origin)) {\n return nonAs()\n }\n\n if (isFunction(writable) && !writable(parents, origin)) {\n return nonAs()\n }\n\n // a hook to modify args for array push, shift inputs\n if (inObject(fn, options) && isFunction(options[fn])) {\n const res = options[fn](parents, args)\n // when return false, it means don't change the value\n if (res === false) {\n return nonAs()\n }\n // when return array, use it as new args\n if (isArray(res)) {\n args = res\n }\n // when return object, switch to another method\n else if (isObject(res)) {\n const { to, args: newArgs } = res\n fn = to\n args = newArgs\n }\n }\n\n let output = null\n\n // deal with original data\n const operate = () => {\n const before = origin.length\n output = Array.prototype[fn].apply(origin, args)\n const after = origin.length\n return [after, before]\n }\n\n if (fn === 'push') {\n const [after, before] = operate()\n output = after\n media.length = after\n reactive.length = after\n shuffle(before - 1, after - 1)\n }\n else if (fn === 'unshift') {\n const [after] = operate()\n output = after\n media.length = after\n reactive.length = after\n shuffle(0, after - 1)\n }\n else if (fn === 'splice') {\n const [after] = operate()\n\n const [start, len, ...items] = args\n output = media.slice(start, start + len)\n\n media.length = after\n reactive.length = after\n\n if (!items.length) {\n shuffle(start, after - 1)\n }\n else if (len === items.length) {\n shuffle(start, start + len - 1)\n }\n else {\n shuffle(start, after - 1)\n }\n }\n else if (fn === 'shift') {\n const [after] = operate()\n output = media[0]\n media.length = after\n reactive.length = after\n shuffle(0, after - 1)\n }\n else if (fn === 'pop') {\n const [after] = operate()\n output = media[media.length - 1]\n media.length = after\n reactive.length = after\n }\n else if (fn === 'fill') {\n const [, before] = operate()\n const [, start = 0, end = before] = args\n output = media\n shuffle(start, end - 1)\n }\n else if (fn === 'insert') {\n if (args.length < 1) {\n return -1\n }\n else if (args.length < 2) {\n const [item] = args\n output = origin.length\n Array.prototype.push.call(origin, item)\n shuffle(output, output)\n }\n else {\n const [item, before] = args\n const beforeIndex = decideby(() => {\n const mediaIndex = media.indexOf(before)\n if (mediaIndex > -1) {\n return mediaIndex\n }\n\n const originIndex = origin.indexOf(before)\n return originIndex\n })\n\n if (beforeIndex < 0) {\n return -1\n }\n\n Array.prototype.splice.call(origin, beforeIndex, 0, item)\n shuffle(beforeIndex, origin.length - 1)\n output = beforeIndex\n }\n }\n else if (fn === 'remove') {\n if (args.length < 1) {\n return -1\n }\n else {\n const [item] = args\n const index = decideby(() => {\n const mediaIndex = media.indexOf(item)\n if (mediaIndex > -1) {\n return mediaIndex\n }\n\n const originIndex = origin.indexOf(item)\n return originIndex\n })\n\n if (index < 0) {\n return index\n }\n\n Array.prototype.splice.call(origin, index, 1)\n Array.prototype.splice.call(media, index, 1)\n shuffle(index, origin.length - 1)\n output = index\n }\n }\n else {\n operate()\n output = media\n }\n\n if (isFunction(dispatch)) {\n dispatch({\n keyPath: parents,\n value: origin,\n next: origin,\n active: reactive,\n prev: origin,\n invalid: reactive,\n fn,\n result: output,\n }, true)\n }\n\n return output\n },\n })\n\n Object.defineProperties(reactive, {\n push: modify('push'),\n unshift: modify('unshift'),\n splice: modify('splice'),\n pop: modify('pop'),\n shift: modify('shift'),\n sort: modify('sort'),\n reverse: modify('reverse'),\n fill: modify('fill'),\n insert: modify('insert'),\n remove: modify('remove'),\n $$_ORIGIN: {\n get: () => origin,\n },\n })\n\n shuffle(0, origin.length - 1)\n\n return reactive\n }\n\n const output = create(origin)\n return output\n}\n\nconst ProxySymbol = Symbol('Proxy')\n/**\n * create a proxy object.\n * it will change your original data\n * @param {object|array} origin\n * @param {object} options\n * @param {function} options.get to modify output value of each node, receive (keyPath, proxiedValue), proxiedValue is a reactive object/array as if, keyPath is an array which catains keys in path\n * @param {function} options.set to modify input value of each node, receive (keyPath, nextValue), nextValue is the given passed value, the return value will be transformed to be reactive object/array as if\n * @param {function} options.dispatch to notify change with keyPath, receive (keypath, next, prev), it will be called after value is set into\n * @param {function} options.writable whether be able to change value, return false to disable writable, default is true\n * @returns {Proxy}\n * @example\n * const some = {\n * body: {\n * hand: true,\n * foot: true,\n * },\n * }\n * const a = createProxy(some, {\n * get(keyPath, value) {\n * if (keyPath.join('.') === 'body.hand') {\n * return value.toString()\n * }\n * else {\n * return value\n * }\n * },\n * set(keyPath, value) {},\n * dispatch(keyPath, next, current) {},\n * })\n *\n * a !== some // proxy object !== object\n * a.body !== some.body // proxy object !== object\n * a.body.hand !== some.body.hand // true !== 'true'\n * a.body.foot == some.body.foot // true == true\n *\n * a.body.hand = false // now a.body.hand is 'false', a string\n * some.body.hand === false // some.body.hand changes to false\n */\nexport function createProxy(origin, options = {}) {\n const { get, set, del, dispatch, writable, disable, receive, extensible, enumerable } = options\n\n const create = (origin, parents = []) => {\n if (!isObject(origin) && !isArray(origin)) {\n return origin\n }\n\n if (isFunction(disable) && disable(parents, origin)) {\n return origin\n }\n\n let output = null\n if (isObject(origin)) {\n output = createObject(origin, parents)\n }\n else {\n output = createArray(origin, parents)\n }\n\n return output\n }\n\n const createObject = (origin, parents = []) => {\n const media = {}\n const proxy = new Proxy(media, {\n get: (target, key, receiver) => {\n // get original property value\n if (isSymbol(key) && key === ProxySymbol) {\n return origin\n }\n\n // primitive property\n // such as 'a' + obj, and obj[Symbol.toPrimitive](hint) defined\n if (isSymbol(key) && getSymbolContent(key).indexOf('Symbol.') === 0) {\n return Reflect.get(target, key, receiver)\n }\n\n const active = Reflect.get(target, key, receiver)\n\n // here should be noticed\n // a Symbol key will not to into `get` option function\n if (isFunction(get) && !isSymbol(key)) {\n const keyPath = [...parents, key]\n const output = get(keyPath, active)\n return output\n }\n else {\n return active\n }\n },\n set: (target, key, value, receiver) => {\n const keyPath = [...parents, key]\n\n if (isFunction(receive)) {\n receive(keyPath, value)\n }\n\n if (Object.isFrozen(origin)) {\n return true\n }\n\n if (isFunction(writable) && !writable(keyPath, value)) {\n return true\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(media, key)\n if (descriptor) {\n if (!('value' in descriptor)) {\n if ('set' in descriptor) {\n origin[key] = value\n }\n return true\n }\n if (!descriptor.writable) {\n return true\n }\n }\n\n const prev = origin[key]\n const invalid = media[key]\n const input = isFunction(set) ? set(keyPath, value) : value\n\n let active\n let next\n if (inObject(key, media) && (\n value === prev\n || value === invalid\n || input === prev\n || input === invalid\n )) {\n next = prev\n active = invalid\n }\n else {\n next = input\n active = create(next, keyPath)\n }\n\n origin[key] = next\n Reflect.set(target, key, active, receiver)\n\n if (isFunction(dispatch)) {\n dispatch({\n keyPath,\n value,\n next, active,\n prev, invalid,\n })\n }\n\n return true\n },\n deleteProperty: (target, key) => {\n const keyPath = [...parents, key]\n\n if (isFunction(receive)) {\n receive(keyPath)\n }\n\n if (Object.isFrozen(origin)) {\n return true\n }\n\n if (isFunction(writable) && !writable(keyPath)) {\n return true\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(media, key)\n if (!descriptor) {\n return true\n }\n if (!descriptor.configurable) {\n return true\n }\n\n const prev = origin[key]\n const invalid = media[key]\n\n if (isFunction(del) && !isSymbol(key)) {\n del(keyPath)\n }\n\n delete origin[key]\n Reflect.deleteProperty(target, key)\n\n if (isFunction(dispatch)) {\n const none = undefined\n dispatch({\n keyPath,\n value: none,\n next: none,\n active: none,\n prev, invalid,\n }, !isUndefined(prev))\n }\n\n return true\n },\n has(target, key) {\n if (isFunction(enumerable)) {\n const keyPath = [...parents, key]\n return enumerable(keyPath)\n }\n return key in target\n },\n isExtensible() {\n const keyPath = [...parents]\n if (isFunction(extensible)) {\n return extensible(keyPath)\n }\n return true\n },\n })\n\n each(origin, (descriptor, key) => {\n if ('value' in descriptor) {\n const value = descriptor.value\n const keyPath = [...parents, key]\n\n if (Object.isFrozen(origin)) {\n media[key] = create(value, keyPath)\n }\n else {\n const needRewrite = isFunction(set) && !isSymbol(key)\n const next = needRewrite ? set(keyPath, value) : value\n\n if (needRewrite) {\n origin[key] = next\n }\n\n media[key] = create(next, keyPath)\n }\n }\n else {\n Object.defineProperty(media, key, descriptor)\n }\n }, true)\n\n return proxy\n }\n\n const createArray = (origin, parents = []) => {\n const media = []\n const proxy = new Proxy(media, {\n get: (target, key, receiver) => {\n // get original property value\n if (isSymbol(key) && key === ProxySymbol) {\n return origin\n }\n\n // primitive property\n // such as 'a' + obj, and obj[Symbol.toPrimitive](hint) defined\n if (isSymbol(key) && getSymbolContent(key).indexOf('Symbol.') === 0) {\n return Reflect.get(target, key, receiver)\n }\n\n // array primitive operation\n const methods = [\n // the following 3 lines will change the array's length\n // the following 1 line will return the new length\n 'push', 'unshift',\n // the following 1 line will return the spliced items array\n 'splice',\n // the following 1 line will return the removed item value\n 'shift', 'pop',\n // the following 1 line will return the changed original array\n 'sort', 'reverse', 'fill',\n // provided method\n 'insert', 'remove',\n ]\n if (inArray(key, methods)) {\n return (...args) => {\n const nonAs = () => {\n if (key === 'push' || key === 'unshift') {\n return origin.length\n }\n else if (key === 'splice') {\n return []\n }\n else if (key === 'shift') {\n return media[0]\n }\n else if (key === 'pop') {\n return media[origin.length - 1]\n }\n else if (key === 'insert') {\n return -1\n }\n else {\n return media\n }\n }\n\n if (isFunction(receive)) {\n receive(parents, origin, key, args)\n }\n\n if (Object.isFrozen(origin)) {\n return nonAs()\n }\n\n if (isFunction(writable) && !writable(parents, origin)) {\n return nonAs()\n }\n\n // a hook to modify args for array push, shift inputs\n if (inObject(key, options) && isFunction(options[key])) {\n const res = options[key](parents, args)\n // when return false, it means don't change the value\n if (res === false) {\n return nonAs()\n }\n // when return array, use it as new args\n if (isArray(res)) {\n args = res\n }\n // when return object, switch to another method\n else if (isObject(res)) {\n const { to, args: newArgs } = res\n key = to\n args = newArgs\n }\n }\n\n const max = origin.length\n let output = null\n\n // create sub children\n if (key === 'push') {\n // change original data\n Array.prototype[key].apply(origin, args)\n\n const medias = args.map((item, i) => {\n const index = max + i\n return create(item, [...parents, index])\n })\n output = Array.prototype.push.apply(media, medias)\n }\n else if (key === 'splice') {\n // change original data\n Array.prototype[key].apply(origin, args)\n\n const [start, len, ...items] = args\n if (!items.length) {\n output = Array.prototype.splice.call(media, start, len)\n }\n else if (len === items.length) {\n const medias = items.map((item, i) => {\n const index = start + i\n return create(item, [...parents, index])\n })\n const params = [start, len, ...medias]\n output = Array.prototype.splice.apply(media, params)\n }\n // the ones which are right in media will be changed\n else {\n output = media.slice(start, start + len)\n\n const items = origin.slice(start)\n const medias = items.map((item, i) => {\n const index = start + i\n return create(item, [...parents, index])\n })\n const params = [start, origin.length, ...medias]\n Array.prototype.splice.apply(media, params)\n }\n }\n else if (key === 'fill') {\n // change original data\n Array.prototype[key].apply(origin, args)\n\n const [item, start = 0, end = max] = args\n const items = []\n for (let i = start; i < end; i ++) {\n items.push(create(item, [...parents, i]))\n }\n const params = [start, end - start, items]\n Array.prototype.splice.apply(media, params)\n output = media\n }\n else if (key === 'insert') {\n if (args.length < 1) {\n return -1\n }\n else if (args.length < 2) {\n const [item] = args\n output = origin.length\n Array.prototype.push.call(origin, item)\n Array.prototype.push.call(media, item)\n }\n else {\n const [item, before] = args\n const beforeIndex = decideby(() => {\n const mediaIndex = media.indexOf(before)\n if (mediaIndex > -1) {\n return mediaIndex\n }\n\n const originIndex = origin.indexOf(before)\n return originIndex\n })\n\n if (beforeIndex < 0) {\n return -1\n }\n\n Array.prototype.splice.call(origin, beforeIndex, 0, item)\n Array.prototype.splice.call(media, beforeIndex, 0, item)\n output = beforeIndex\n }\n }\n else if (key === 'remove') {\n const [item] = args\n const index = decideby(() => {\n const mediaIndex = media.indexOf(item)\n if (mediaIndex > -1) {\n return mediaIndex\n }\n\n const originIndex = origin.indexOf(item)\n return originIndex\n })\n\n if (index < 0) {\n return index\n }\n\n Array.prototype.splice.call(origin, index, 1)\n Array.prototype.splice.call(media, index, 1)\n output = index\n }\n else {\n // change original data\n Array.prototype[key].apply(origin, args)\n output = Array.prototype[key].apply(media, args)\n }\n\n if (isFunction(dispatch)) {\n dispatch({\n keyPath: parents,\n value: origin,\n next: origin,\n active: proxy,\n prev: origin,\n invalid: proxy,\n fn: key,\n result: output,\n }, true)\n }\n\n return output\n }\n }\n\n const keyPath = [...parents, key]\n const active = Reflect.get(target, key, receiver)\n\n // here should be noticed\n // a Symbol key will not to into `get` option function\n if (isFunction(get) && !isSymbol(key)) {\n const output = get(keyPath, active)\n return output\n }\n else {\n return active\n }\n },\n set: (target, key, value, receiver) => {\n const keyPath = [...parents, key]\n\n if (isFunction(receive)) {\n receive(keyPath, value)\n }\n\n if (Object.isFrozen(origin)) {\n return true\n }\n\n if (isFunction(writable) && !writable(keyPath, value)) {\n return true\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(media, key)\n if (descriptor) {\n if (!('value' in descriptor)) {\n if ('set' in descriptor) {\n origin[key] = value\n }\n return true\n }\n if (!descriptor.writable) {\n return true\n }\n }\n\n // operate like media.length = 0\n if (key === 'length') {\n if (isFunction(writable) && !writable(parents, origin)) {\n return true\n }\n\n origin.length = value\n media.length = value\n\n if (isFunction(dispatch)) {\n dispatch({\n keyPath: parents,\n value: origin,\n next: origin,\n prev: origin,\n active: proxy,\n }, true)\n }\n\n return true\n }\n\n const prev = origin[key]\n const invalid = media[key]\n const input = isFunction(set) ? set(keyPath, value) : value\n\n let active\n let next\n if (inObject(key, media) && (\n value === prev\n || value === invalid\n || input === prev\n || input === invalid\n )) {\n next = prev\n active = invalid\n }\n else {\n next = input\n active = create(next, keyPath)\n }\n\n origin[key] = next\n Reflect.set(target, key, active, receiver)\n\n if (isFunction(dispatch)) {\n dispatch({\n keyPath,\n value,\n next, active,\n prev, invalid,\n })\n }\n\n return true\n },\n deleteProperty: (target, key) => {\n const keyPath = [...parents, key]\n\n if (isFunction(receive)) {\n receive(keyPath)\n }\n\n if (Object.isFrozen(origin)) {\n return true\n }\n\n if (isFunction(writable) && !writable(keyPath)) {\n return true\n }\n\n const descriptor = Object.getOwnPropertyDescriptor(media, key)\n if (!descriptor) {\n return true\n }\n if (!descriptor.configurable) {\n return true\n }\n\n const prev = origin[key]\n const invalid = media[key]\n\n if (isFunction(del) && !isSymbol(key)) {\n del(keyPath)\n }\n\n delete origin[key]\n Reflect.deleteProperty(target, key)\n\n if (isFunction(dispatch)) {\n const none = undefined\n dispatch({\n keyPath,\n value: none,\n next: none,\n active: none,\n prev, invalid,\n }, !isUndefined(prev))\n }\n\n return true\n },\n has(target, key) {\n if (inArray(key, ['remove', 'insert'])) {\n return true\n }\n if (isFunction(enumerable)) {\n const keyPath = [...parents, key]\n return enumerable(keyPath)\n }\n return key in target\n },\n isExtensible() {\n if (isFunction(extensible)) {\n const keyPath = [...parents]\n return extensible(keyPath)\n }\n return true\n },\n })\n\n each(origin, (descriptor, i) => {\n if ('value' in descriptor) {\n const value = descriptor.value\n const keyPath = [...parents, i]\n\n if (Object.isFrozen(origin)) {\n media[i] = create(value, keyPath)\n }\n else {\n const needRewrite = isFunction(set) && !isSymbol(i)\n const next = needRewrite ? set(keyPath, value) : value\n\n if (needRewrite) {\n origin[i] = next\n }\n\n media[i] = create(next, keyPath)\n }\n }\n else {\n Object.defineProperty(media, key, descriptor)\n }\n }, true)\n\n return proxy\n }\n\n const output = create(origin)\n return output\n}\n\n/**\n * determine whether an object is a Proxy\n * @param {any} value\n * @returns {boolean}\n */\nexport function isProxy(value) {\n return !!(value && value[ProxySymbol])\n}\n\n/**\n * refine the original value from a Proxy\n * @param {object} obj\n * @returns {any}\n */\nexport function refineProxy(obj) {\n return obj ? obj[ProxySymbol] : void 0\n}\n\n/**\n * get the string of a symbol\n * @param {symbol} symb\n * @returns {string}\n */\nexport function getSymbolContent(symb) {\n if (symb.description) {\n return symb.description\n }\n const str = symb.toString()\n return str.substring(7, str.length - 1)\n}\n\n/**\n * convert an object to an entry array\n * @param {object} obj\n * @returns {array[]}\n */\nexport function toEntries(obj) {\n const keys = Object.keys(obj)\n return keys.map(key => [key, obj[key]])\n}\n\n/**\n * conver an entry/key-value array to an object\n * @param {array[] | object[]} entries\n * @param {boolean} kv\n * @returns {object}\n */\nexport function fromEntries(entries, kv = false) {\n const obj = {}\n entries.forEach((item) => {\n if (kv) {\n const { key, value } = item\n obj[key] = value\n }\n else {\n const [key, value] = item\n obj[key] = value\n }\n })\n return obj\n}\n","import {\n getConstructorOf,\n createRandomString,\n map,\n isFunction,\n isArray,\n} from 'ts-fns';\n\nexport class Anys {\n constructor(options) {\n this.$events = [];\n\n const Constructor = getConstructorOf(this);\n\n const {\n filters: defaultFilters = [],\n plugins: defaultPluings = [],\n ...defaultOptions\n } = {\n ...Anys.defaultOptions,\n ...(Constructor.defaultOptions || {}),\n };\n\n const {\n filters: givenFilters = [],\n plugins: givenPluings = [],\n defines: givenDefines = [],\n ...givenOptions\n } = options || {};\n\n /**\n * generate this.$plugins, this.options, this.filters\n * these should be generated when constrcutor processing\n */\n\n const pluginOptions = {};\n const pluginFilters = [];\n const pluginDefines = {};\n\n const isGivenPluginsMapping = givenPluings && !isArray(givenPluings) && typeof givenPluings === 'object';\n const givenPluingList = isGivenPluginsMapping ? Object.values(givenPluings) : isArray(givenPluings) ? givenPluings : [];\n const givenPluginMapping = isGivenPluginsMapping ? Object.keys(givenPluings).map((key) => ({ key, value: givenPluings[key] })) : [];\n\n // create a plugin list which is sorted be dependence direction\n const pluginsDraft = [...defaultPluings, ...givenPluingList];\n const mergePluginDeps = (pluginList) => {\n pluginList.forEach((Plugin) => {\n const depPlugins = Plugin.dependencies || [];\n depPlugins.forEach((dep) => {\n pluginsDraft.unshift(dep);\n });\n mergePluginDeps(depPlugins);\n });\n };\n mergePluginDeps(pluginsDraft);\n const pluginList = pluginsDraft.filter((item, i) => i === pluginsDraft.indexOf(item));\n\n const plugins = [];\n const pluginSet = {};\n pluginList.forEach((Plugin) => {\n const warnExist = (name) => {\n const msg = `[Anys]: plugin named '${name}' has been registered`;\n if (!(pluginSet[name] instanceof Plugin)) {\n console.error(msg, Plugin, pluginSet);\n }\n else {\n console.debug(msg, Plugin, pluginSet);\n }\n }\n\n const localName = givenPluginMapping.find(item => item.value === Plugin)?.key;\n if (localName && pluginSet[localName]) {\n warnExist(localName);\n return;\n }\n\n // const { displayName } = Plugin;\n // if (displayName && pluginSet[displayName]) {\n // warnExist(displayName);\n // return;\n // }\n\n const deps = (Plugin.dependencies || [])\n .map((P) => plugins.find((item) => item instanceof P));\n const plugin = new Plugin(this, deps);\n if (plugin.options) {\n Object.assign(pluginOptions, plugin.options());\n }\n if (plugin.filters) {\n pluginFilters.push(...plugin.filters());\n }\n if (plugin.defines) {\n Object.assign(pluginDefines, plugin.defines());\n }\n plugins.push(plugin);\n\n // if (displayName) {\n // pluginSet[displayName] = plugin;\n // }\n\n if (localName) {\n pluginSet[localName] = plugin;\n }\n });\n\n this.$plugins = plugins;\n this.plugins = pluginSet;\n this.options = { ...defaultOptions, ...pluginOptions, ...givenOptions };\n this.filters = [...defaultFilters, ...pluginFilters, ...givenFilters];\n\n /**\n * check required options which is not passed\n */\n const optionValues = Object.values(this.options);\n const requiredOption = optionValues.find((item) => item && item instanceof Error);\n if (requiredOption) {\n throw requiredOption;\n }\n\n /**\n * init log basic properties\n * clientId, traceId, requestId are special\n */\n\n const definitions = {\n ...pluginDefines,\n ...givenDefines,\n };\n\n this.definitions = definitions;\n this.clientId = definitions.client ? definitions.client() : createRandomString(8);\n this.traceId = definitions.trace ? definitions.trace() : createRandomString(8);\n this.requestId = createRandomString(8);\n\n const basicLog = {};\n Object.defineProperties(basicLog, map(definitions, (define) => ({\n get: isFunction(define) ? define : () => define,\n enumerable: true,\n configurable: true,\n })));\n Object.defineProperties(basicLog, {\n client: {\n get: () => this.clientId,\n enumerable: true,\n configurable: true,\n },\n trace: {\n get: () => this.traceId,\n enumerable: true,\n configurable: true,\n },\n request: {\n get: () => this.requestId,\n enumerable: true,\n configurable: true,\n },\n });\n this.$basicLog = basicLog;\n\n /**\n * setup instance\n */\n\n this.invoke('init');\n\n if (this.options.autoStart) {\n this.start();\n }\n }\n\n define(key, get) {\n Object.defineProperty(this.$basicLog, key, {\n get,\n enumerable: true,\n configurable: true,\n });\n }\n\n on(event, callback) {\n this.$events.push([event, callback]);\n }\n\n off(event, callback) {\n this.$events.forEach((item, i) => {\n if (item[0] === event && item[1] === callback) {\n this.$events.splice(i, 1);\n }\n });\n }\n\n emit(event, ...args) {\n this.$events.forEach((item) => {\n if (item[0] === event || item[0] === '*') {\n item[1](...args);\n }\n });\n }\n\n invoke(type, ...args) {\n for (let i = 0, len = this.$plugins.length; i < len; i += 1) {\n const plugin = this.$plugins[i];\n if (!plugin[type]) {\n continue;\n }\n if (!isFunction(plugin[type])) {\n continue;\n }\n plugin[type](...args);\n }\n }\n\n refreshTraceId() {\n const prevTraceId = this.traceId;\n this.traceId = this.definitions.trace ? this.definitions.trace() : createRandomString(8);\n this.emit('refreshTraceId', { prev: prevTraceId, next: this.traceId });\n }\n\n refreshRequestId() {\n const prevRequestId = this.requestId;\n this.requestId = createRandomString(8);\n this.emit('refreshRequestId', { prev: prevRequestId, next: this.requestId });\n }\n\n start() {\n this.invoke('start');\n this.emit('start');\n }\n\n write(log) {\n setTimeout(() => {\n const data = { ...this.$basicLog, ...log };\n // check wheather the log can be write into\n const { filters } = this;\n for (let i = 0, len = filters.length; i < len; i += 1) {\n const filter = filters[i];\n if (!filter(data)) {\n return;\n }\n }\n\n this.invoke('write', data);\n this.emit('write', data);\n\n if (this.options.autoReport) {\n this.report();\n }\n }, 0);\n }\n\n report(message) {\n return new Promise((resolve, reject) => {\n setTimeout(() => {\n this.emit('report', message);\n\n const defers = [];\n\n const readers = [];\n const senders = [];\n const completers = [];\n\n const toAsync = (...fns) => fns.reduce((deferer, fn) => isFunction(fn) ? deferer.then(fn) : deferer, Promise.resolve());\n const runAsyncAll = (fns, param) => Promise.all(fns.map(fn => toAsync(() => fn(param))));\n\n for (let i = 0, len = this.$plugins.length; i < len; i += 1) {\n const plugin = this.$plugins[i];\n if (isFunction(plugin.read) && isFunction(plugin.send)) {\n const defer = toAsync(\n () => plugin.read(message),\n (data) => data && Promise.resolve(plugin.send(data)).then(() => data),\n (data) => data && isFunction(plugin.complete) && plugin.complete(data),\n );\n defers.push(defer);\n }\n else {\n if (isFunction(plugin.read)) {\n readers.push(plugin.read.bind(plugin));\n }\n else if (isFunction(plugin.send)) {\n senders.push(plugin.send.bind(plugin));\n }\n if (isFunction(plugin.complete)) {\n completers.push(plugin.complete.bind(plugin));\n }\n }\n }\n\n const readSend = toAsync(\n () => runAsyncAll(readers, message),\n (groups) => {\n const data = [];\n groups.forEach((logs) => isArray(logs) && logs.length && data.push(...logs));\n this.emit('read', data);\n return data;\n },\n (data) => {\n if (!data.length) {\n return;\n }\n this.emit('send', data);\n return runAsyncAll(senders, data).then(() => data);\n },\n (data) => {\n if (!data) {\n return;\n }\n this.emit('complete', data);\n return runAsyncAll(completers, data);\n },\n );\n\n const selfReport = Promise.all(defers);\n\n Promise.all([readSend, selfReport]).then(resolve, reject);\n }, 0);\n });\n }\n\n stop() {\n this.invoke('stop');\n this.emit('stop');\n }\n\n static defaultOptions = {\n /**\n * whether start plugins automaticly\n */\n autoStart: true,\n /**\n * auto send logs to server side,\n * if false, you should must invoke .send to report manually\n */\n autoReport: true,\n };\n}\n","import { each, define } from './object.js'\nimport { inObject } from './is.js'\n\n/**\n * @param {any} ins\n * @returns {boolean}\n */\nexport function getConstructorOf(ins) {\n return Object.getPrototypeOf(ins).constructor\n}\n\n/**\n * Create a new Child any which is inherited from Parent any\n * @param {any} Parent\n * @param {object} proptotypes\n * @param {object} statics\n * @returns {any}\n */\nexport function inherit(Parent, proptotypes, statics) {\n class Child extends Parent {}\n\n const name = Object.getOwnPropertyDescriptor(Parent, 'name')\n define(Child, 'name', {\n ...name,\n configurable: true,\n })\n\n if (proptotypes) {\n Object.assign(Child.prototype, proptotypes)\n Child.prototype.constructor = Child\n }\n\n each(Parent, (descriptor, key) => {\n if (statics && inObject(key, statics, true)) {\n return\n }\n define(Child, key, descriptor)\n }, true)\n\n if (statics) {\n each(statics, (descriptor, key) => {\n define(Child, key, descriptor)\n }, true)\n }\n\n return Child\n}\n\n/**\n * mix Extend into Source, (notice: will override Source)\n * @param {any} Source\n * @param {any} Extend\n * @param {any}\n */\nexport function mixin(Source, Extend) {\n each(Extend, (descriptor, key) => {\n define(Source, key, descriptor)\n }, true)\n\n each(Extend.prototype, (descriptor, key) => {\n if (key === 'constructor') {\n return\n }\n define(Source.prototype, key, descriptor)\n }, true)\n\n return Source\n}\n","export function replaceUrlSearch(url, params) {\n const index = url.indexOf('?');\n if (index < 0) {\n const search = Object.keys(params)\n .map((key) => `${key}=${params[key]}`)\n .join('&');\n const [path, hash] = url.split('#');\n return path + '?' + search + (hash ? '#' + hash : '');\n }\n\n const [path, right] = url.split('?');\n const [search, hash] = right.split('#');\n\n const origin = search.split('&')\n .map((item) => item.split('='))\n .reduce((map, [key, value]) => ({ ...map, [key]: value }), {});\n Object.assign(origin, params);\n\n const newSearch = Object.keys(origin).map((key) => `${key}=${origin[key]}`).join('&');\n return path + '?' + newSearch + (hash ? '#' + hash : '');\n}\n","export class AnysPlugin {\n constructor(anys) {\n this.anys = anys;\n this.$effects = {};\n }\n\n start() {\n // @ts-ignore\n if (!this.options) {\n return;\n }\n\n // @ts-ignore\n const options = this.options();\n const keys = Object.keys(options);\n const affect = (name) => {\n const methodName = `register${name.replace(name[0], name[0].toUpperCase())}`;\n if (this[methodName]) {\n const revoke = this[methodName]();\n this.$effects[name] = revoke;\n }\n };\n\n const stch = this.anys.options;\n keys.forEach((key) => {\n if (stch[key]) {\n affect(key);\n }\n });\n }\n\n stop() {\n // @ts-ignore\n if (!this.options) {\n return;\n }\n\n // @ts-ignore\n const options = this.options();\n const keys = Object.keys(options);\n const stch = this.anys.options;\n\n keys.forEach((key) => {\n const revoke = this.$effects[key];\n if (stch[key] && revoke) {\n revoke();\n }\n this.$effects[key] = null;\n });\n }\n}\n","export class Evt {\n constructor() {\n this.$events = [];\n }\n\n on(event, callback) {\n this.$events.push([event, callback]);\n }\n\n emit(event, ...args) {\n this.$events.forEach(([eventName, callback]) => {\n if (event === eventName) {\n callback(...args);\n }\n });\n }\n\n off(event, callback) {\n this.$events.forEach(([eventName, eventCall], i) => {\n if (event === eventName && eventCall === callback) {\n this.$events.splice(i, 1);\n }\n });\n }\n}\n","import { Evt, AnysPlugin, replaceUrlSearch } from 'anys-shared';\nimport { createRandomString } from 'ts-fns';\n\nconst evt = new Evt();\n\n// eslint-disable-next-line func-names\n(function () {\n const OXHR = window.XMLHttpRequest;\n // @ts-ignore\n // eslint-disable-next-line no-underscore-dangle\n window.__XMLHttpRequest = OXHR;\n // @ts-ignore\n // eslint-disable-next-line func-names\n window.XMLHttpRequest = function () {\n const xhr = new OXHR();\n const overmap = {\n open: xhr.open,\n send: xhr.send,\n };\n const info = {\n name: createRandomString(4),\n };\n\n const recordSend = () => {\n const {\n name, url, method, async, body,\n } = info;\n evt.emit('xhr', {\n type: 'xhr.req',\n time: Date.now(),\n name: `xhr_${name}`,\n url,\n detail: {\n method,\n async,\n body,\n },\n });\n };\n\n const recordData = (type) => {\n const {\n name, url, method,\n } = info;\n\n let response;\n let responseType;\n if (!xhr.responseType || xhr.responseType === 'text') {\n response = xhr.responseText.toString();\n responseType = 'text';\n } else if (xhr.responseType === 'json') {\n response = xhr.response;\n responseType = 'json';\n }\n\n // other type are not allowed\n evt.emit('xhr', {\n type,\n time: Date.now(),\n name: `xhr_${name}`,\n url,\n detail: {\n status: xhr.status,\n method,\n responseType,\n response: response || undefined,\n },\n });\n };\n\n const recordResponse = () => {\n if (xhr.readyState !== 4) {\n return;\n }\n if (Math.floor(xhr.status / 100) === 2) {\n recordData('xhr.ok');\n } else {\n recordData('xhr.fail');\n }\n };\n\n const recordError = () => {\n recordData('xhr.err');\n };\n\n Object.defineProperty(xhr, 'open', {\n get: () => (method, url, async = true, ...args) => {\n const request = { method, url };\n evt.emit('request', request);\n Object.assign(info, { ...request, async });\n if (xhr.onreadystatechange) {\n overmap.onreadystatechange = xhr.onreadystatechange;\n }\n const { open } = overmap;\n return open.call(xhr, request.method, request.url, async, ...args);\n },\n configurable: true,\n });\n\n Object.defineProperty(xhr, 'send', {\n get: () => (body) => {\n const { send } = overmap;\n const { async } = info;\n Object.assign(info, { body });\n recordSend();\n const res = send.call(xhr, body);\n if (!async) {\n recordResponse();\n }\n return res;\n },\n configurable: true,\n });\n\n xhr.addEventListener('error', () => {\n recordError();\n });\n\n xhr.addEventListener('readystatechange', (e) => {\n // readystatechange event only triggered in async mode,\n // so we do not need to check whether in async mode\n recordResponse();\n });\n\n return xhr;\n };\n}());\n\n// eslint-disable-next-line func-names\n(function () {\n const ofetch = window.fetch;\n // @ts-ignore\n // eslint-disable-next-line no-underscore-dangle\n window.__fetch = ofetch;\n // @ts-ignore\n // eslint-disable-next-line func-names\n window.fetch = function (url, config = {}) {\n const { method, body } = config;\n const name = createRandomString(4);\n evt.emit('fetch', {\n type: 'fetch.init',\n time: Date.now(),\n name: `fetch_${name}`,\n url,\n detail: { body, method },\n });\n\n const request = { method, url };\n evt.emit('request', request);\n\n return Promise.resolve().then(() => ofetch(request.url, config)).then((res) => {\n const { status } = res;\n if (Math.floor(status / 100) === 2) {\n return new Proxy(res, {\n get(_, key) {\n if (key === 'json' || key === 'text') {\n return () => res[key]().then((data) => {\n evt.emit('fetch', {\n type: 'fetch.ok',\n time: Date.now(),\n name: `fetch_${name}`,\n url,\n detail: {\n status,\n data,\n method,\n },\n });\n return data;\n });\n }\n return typeof res[key] === 'function' ? res[key].bind(res) : res[key];\n },\n });\n }\n\n evt.emit('fetch', {\n type: 'fetch.fail',\n time: Date.now(),\n name: `fetch_${name}`,\n url,\n detail: {\n status,\n method,\n },\n });\n return res;\n }, (err) => {\n let detail;\n if (err instanceof Error) {\n const { name: type, message } = err;\n detail = {\n method,\n type,\n err: message,\n };\n } else {\n detail = {\n method,\n err,\n };\n }\n evt.emit('fetch', {\n type: 'fetch.err',\n time: Date.now(),\n name: `fetch_${name}`,\n url,\n detail,\n });\n });\n };\n}());\n\nexport class AnysMonitorAjaxPlugin extends AnysPlugin {\n options() {\n return {\n xhr: true,\n fetch: true,\n ajaxResponse: true,\n patchRequestId: true,\n };\n }\n\n registerXhr() {\n const listener = (log) => {\n if (!this.anys.options.ajaxResponse && log.type === 'xhr.ok') {\n delete log.detail.response;\n }\n this.anys.write(log);\n };\n evt.on('xhr', listener);\n return () => evt.off('xhr', listener);\n }\n\n registerFetch() {\n const listener = (log) => {\n if (!this.anys.options.ajaxResponse && log.type === 'fetch.ok') {\n delete log.detail.data;\n }\n this.anys.write(log);\n };\n evt.on('fetch', listener);\n return () => evt.off('fetch', listener);\n }\n\n registerPatchRequestId() {\n const listener = (info) => {\n const { url } = info;\n const { traceId, requestId } = this.anys;\n const newUrl = replaceUrlSearch(url, { _request_id: traceId + requestId });\n info.url = newUrl;\n }\n evt.on('request', listener);\n return () => evt.off('request', listener);\n }\n}\n","import { createRandomString } from 'ts-fns';\n\nexport class AnysIdentifyPlugin {\n constructor(anys) {\n this.anys = anys;\n }\n\n options() {\n return {\n namespace: new Error('[Anys]: options.namespace is required!'),\n };\n }\n\n defines() {\n return {\n client: this.defineClientId.bind(this),\n trace: this.defineTraceId.bind(this),\n };\n }\n\n defineClientId() {\n const { namespace } = this.anys.options;\n const key = `Anys.${namespace}.clientId`;\n let clientId = localStorage.getItem(key);\n if (!clientId) {\n clientId = createRandomString(8);\n sessionStorage.setItem(key, clientId);\n }\n return clientId;\n }\n\n defineTraceId() {\n const { namespace } = this.anys.options;\n const key = `Anys.${namespace}.traceId`;\n const traceId = createRandomString(8);\n // update each time when invoke refreshTraceId\n sessionStorage.setItem(key, traceId);\n return traceId;\n }\n}\n","export function getPath(node, root = document.documentElement) {\n const { nodeName, path: nodePath } = node;\n\n if (nodePath) {\n return nodePath;\n }\n\n if (nodeName === 'BODY' || nodeName === 'HTML' || nodeName === 'HEAD') {\n return nodeName;\n }\n\n const path = [];\n\n let current = node;\n let parent = node.parentNode;\n\n const findIndex = (node) => {\n const { nodeName, parentNode } = node;\n // the node is not in document\n if (!parentNode) {\n return -1;\n }\n const siblings = [].filter.call(parentNode.childNodes, item => item.nodeName === nodeName);\n const index = siblings.indexOf(node);\n return index;\n };\n\n if (nodeName[0] === '#') {\n const index = findIndex(node);\n path.push(`${nodeName}:${index}`);\n current = parent;\n parent = current.parentNode;\n }\n\n while (parent) {\n if (current === root) {\n break;\n }\n const { nodeName } = current;\n if (nodeName === 'BODY' || nodeName === 'HTML' || nodeName === 'HEAD') {\n path.push(nodeName);\n }\n else {\n const index = findIndex(current);\n path.push(`${nodeName.toLowerCase()}:${index}`);\n }\n current = parent;\n parent = current.parentNode;\n }\n path.reverse();\n return path.join('/');\n}\n\nexport function findNode(selector, root = document) {\n if (!selector) {\n return root;\n }\n\n // HTML, BODY, HEAD\n if (/^[A-Z]+$/.test(selector)) {\n return root.querySelector(selector);\n }\n\n const path = selector.split('/');\n const items = path.map(item => item.split(':'));\n\n const el = items.reduce((target, [name, index]) => {\n if (!target) {\n return null;\n }\n\n if (/^[A-Z]+$/.test(name)) {\n return target.querySelector(name);\n }\n\n if (+index < 0) {\n return null;\n }\n\n const siblings = [].filter.call(target.childNodes, child => child.nodeName.toLowerCase() === name);\n const sibling = siblings[index];\n return sibling;\n }, root);\n\n if (!el) {\n return null;\n }\n\n return el;\n}\n","import { AnysPlugin, getPath } from 'anys-shared';\n\nexport class AnysMonitorInputEventPlugin extends AnysPlugin {\n options() {\n return {\n input: true,\n };\n }\n\n registerInput() {\n const extract = (filter) => (e) => {\n const {\n target, type, inputType, data,\n } = e;\n\n if (inputType === 'insertCompositionText') {\n return;\n }\n\n if (type === 'compositionend' && !data) {\n return;\n }\n\n const { tagName, value } = target;\n\n // ignore input when set anys-ignore attribute\n if (target.getAttribute('anys-ignore')) {\n return;\n }\n\n const elInput = target.getAttribute('type');\n\n const detailData = filter({ tagName, value, type: elInput, target });\n if (!detailData) {\n return;\n }\n\n const log = {\n type: 'input',\n time: Date.now(),\n el: getPath(target),\n detail: detailData,\n };\n this.anys.write(log);\n };\n\n const listenInput = extract(({ tagName, value, type }) => {\n if (tagName === 'INPUT' && type !== 'radio' && type !== 'checkbox' && type !== 'password') {\n return { value, type };\n }\n\n if (tagName === 'INPUT' && type === 'password') {\n return { value: '***', type };\n }\n\n if (tagName === 'TEXTAREA') {\n return { value, type: 'textarea' };\n }\n });\n\n const listenChange = extract(({ tagName, value, type }) => {\n if (tagName === 'SELECT') {\n return { value, type: 'select' };\n }\n\n if (tagName === 'INPUT' && (type === 'radio' || type === 'checkbox')) {\n return { value, type };\n }\n });\n\n const listenPaste = extract(({ tagName, value, type }) => {\n if (tagName === 'TEXTAREA') {\n return { value, type: 'textarea' };\n }\n\n if (tagName === 'INPUT') {\n return { value, type };\n }\n });\n\n document.addEventListener('input', listenInput, true);\n document.addEventListener('compositionend', listenInput, true);\n document.addEventListener('change', listenChange, true);\n document.addEventListener('paste', listenPaste, true);\n\n return () => {\n document.removeEventListener('input', listenInput);\n document.removeEventListener('compositionend', listenInput);\n document.removeEventListener('change', listenChange);\n document.removeEventListener('paste', listenPaste);\n };\n }\n}\n","import { AnysPlugin, getPath } from 'anys-shared';\n\nexport class AnysMonitorMouseEventPlugin extends AnysPlugin {\n options() {\n const isSupportTouch = 'ontouchend' in document;\n return {\n mouse: !isSupportTouch,\n click: true,\n mousemove: false,\n mousedown: false,\n mouseup: false,\n wheel: false,\n contextmenu: false,\n };\n }\n\n addEventListener(event) {\n if (!this.anys.options.mouse) {\n return;\n }\n\n const listener = this.createThrottleListener((e) => {\n const { innerWidth, innerHeight } = window;\n const {\n target, button,\n pageX, pageY,\n } = e;\n const log = {\n type: event,\n time: Date.now(),\n detail: {\n e: getPath(target),\n w: innerWidth,\n h: innerHeight,\n x: pageX,\n y: pageY,\n button,\n },\n };\n return log;\n });\n document.addEventListener(event, listener, true);\n return () => document.removeEventListener(event, listener);\n }\n\n registerClick() {\n return this.addEventListener('click');\n }\n\n registerMousemove() {\n return this.addEventListener('mousemove');\n }\n\n registerMouseup() {\n return this.addEventListener('mouseup');\n }\n\n registerMousedown() {\n return this.addEventListener('mousedown');\n }\n\n registerContextmenu() {\n return this.addEventListener('contextmenu');\n }\n\n registerWheel() {\n if (!this.anys.options.mouse) {\n return;\n }\n\n const type = 'wheel';\n const listener = this.createThrottleListener((e) => {\n const {\n target,\n deltaX,\n deltaY,\n deltaZ,\n deltaMode,\n } = e;\n const log = {\n type,\n time: Date.now(),\n detail: {\n e: getPath(target),\n deltaX,\n deltaY,\n deltaZ,\n mode: deltaMode,\n },\n };\n return log;\n });\n document.addEventListener(type, listener);\n return () => document.removeEventListener(type, listener);\n }\n\n createThrottleListener(createLog) {\n let ticking = 0;\n const listener = (e) => {\n if (ticking) {\n return;\n }\n const log = createLog(e);\n requestAnimationFrame(() => {\n this.anys.write(log);\n ticking = 0;\n });\n\n ticking = 1;\n };\n return listener;\n }\n}\n","import { AnysPlugin } from 'anys-shared';\n\nconst enterLog = {\n type: 'window_activity.enter',\n time: Date.now(),\n};\n\nexport class AnysMonitorWindowActivityPlugin extends AnysPlugin {\n options() {\n return {\n activity: true,\n deadTimeout: 0,\n };\n }\n\n init() {\n if (this.anys.options.activity) {\n // 一进来就记录\n this.anys.write(enterLog);\n }\n }\n\n registerActivity() {\n const onvisibilitychange = () => {\n if (document.visibilityState === 'hidden') {\n const log = {\n type: 'window_activity.focusout',\n time: Date.now(),\n };\n this.anys.write(log);\n } else {\n const log = {\n type: 'window_activity.focusin',\n time: Date.now(),\n };\n this.anys.write(log);\n }\n };\n\n // TODO 此时立即就要卸载了,应该尝试阻塞一下\n const onunload = () => {\n const log = {\n type: 'window_activity.unload',\n time: Date.now(),\n };\n this.anys.write(log);\n };\n\n window.addEventListener('beforeunload', onunload, true);\n document.addEventListener('visibilitychange', onvisibilitychange, true);\n\n return () => {\n window.removeEventListener('beforeunload', onunload);\n document.removeEventListener('visibilitychange', onvisibilitychange);\n };\n }\n\n registerDeadTimeout() {\n const { deadTimeout } = this.anys.options;\n if (!deadTimeout) {\n return;\n }\n\n let timer;\n const listener = () => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n const log = {\n type: 'window_activity.dead',\n time: Date.now(),\n };\n this.anys.write(log);\n\n // @ts-ignore\n }, deadTimeout);\n };\n\n document.addEventListener('keydown', listener, true);\n document.addEventListener('mousedown', listener, true);\n document.addEventListener('touchstart', listener, true);\n document.addEventListener('touchmove', listener, true);\n document.addEventListener('mousemove', listener, true);\n document.addEventListener('scroll', listener, true);\n window.addEventListener('resize', listener, true);\n\n return () => {\n document.removeEventListener('keydown', listener);\n document.removeEventListener('mousedown', listener);\n document.removeEventListener('touchstart', listener);\n document.removeEventListener('touchmove', listener);\n document.removeEventListener('mousemove', listener);\n document.removeEventListener('scroll', listener);\n window.removeEventListener('resize', listener);\n };\n }\n}\n","import { AnysPlugin } from 'anys-shared';\n\nexport class AnysMonitorUrlPlugin extends AnysPlugin {\n options() {\n return {\n url: true,\n };\n }\n\n registerUrl() {\n const listener = () => {\n this.recordUrl();\n };\n\n window.addEventListener('hashchange', listener);\n window.addEventListener('popstate', listener);\n\n // 一启动就记录一次\n this.recordUrl();\n\n return () => {\n window.removeEventListener('hashchange', listener);\n window.removeEventListener('popstate', listener);\n };\n }\n\n recordUrl() {\n const url = window.location.href;\n const a = new URL(url);\n const path = a.pathname.replace(/^([^/])/, '/$1');\n const log = {\n type: 'url',\n time: Date.now(),\n url,\n detail: {\n uri: path + (a.search ? `?${a.search}` : ''),\n path,\n protocol: a.protocol.replace(':', ''),\n host: a.hostname,\n port: a.port,\n search: a.search,\n hash: a.hash.replace('#', ''),\n },\n };\n this.anys.write(log);\n }\n}\n","import { AnysPlugin, getPath } from 'anys-shared';\n\nexport class AnysMonitorTouchEventPlugin extends AnysPlugin {\n options() {\n const isSupportTouch = 'ontouchend' in document;\n return {\n touch: isSupportTouch,\n touchstart: isSupportTouch,\n touchend: isSupportTouch,\n touchmove: isSupportTouch,\n };\n }\n\n addEventListener(event) {\n if (!this.anys.options.touch) {\n return;\n }\n\n let ticking = 0;\n\n const listener = (e) => {\n if (ticking) {\n return;\n }\n\n const { innerWidth, innerHeight } = window;\n const {\n target, identifier, force,\n pageX, pageY,\n } = e;\n const log = {\n type: event,\n time: Date.now(),\n detail: {\n e: getPath(target),\n width: innerWidth,\n height: innerHeight,\n x: pageX,\n y: pageY,\n identifier,\n force,\n },\n };\n\n requestAnimationFrame(() => {\n this.anys.write(log);\n ticking = 0;\n });\n\n ticking = 1;\n };\n\n document.addEventListener(event, listener, true);\n\n return () => document.removeEventListener(event, listener);\n }\n\n registerTouchmove() {\n return this.addEventListener('touchmove');\n }\n\n registerTouchend() {\n return this.addEventListener('touchend');\n }\n\n registerTouchstart() {\n return this.addEventListener('touchstart');\n }\n}\n","export class AsyncQueue {\n constructor() {\n this.queue = [];\n this.status = 0;\n }\n\n push(runner) {\n let resolve; let\n reject;\n const defer = new Promise((rs, rj) => {\n resolve = rs;\n reject = rj;\n });\n const item = {\n runner,\n resolve,\n reject,\n };\n this.queue.push(item);\n\n const run = () => {\n setTimeout(() => {\n if (!this.queue.length) {\n this.status = 0;\n return;\n }\n\n const { runner: fn, resolve: rs, reject: rj } = this.queue.shift();\n fn().then(rs, rj).finally(run);\n }, 0);\n this.status = 1;\n };\n\n if (!this.status) {\n run();\n }\n\n return defer;\n }\n}\n","export class InDB {\n\t/**\n\t * InDB\n\t * @param {object} [options]\n\t * @param {string} [options.name] database name\n\t * @param {number} [options.version] database version\n\t * @param {object[]} [options.stores]\n\t * @param {string} [options.stores[].name] store name\n\t * @param {string} [options.stores[].primaryKeyPath] store primary keyPath\n\t * @param {boolean} [options.stores[].autoIncrement] is store primary keyPath autoIncrement, if true, primary key will be number\n\t * @param {boolean} [options.stores[].isKv] is store set to be Key-Value mode, if true, the store will have Storage methods, and `primaryKeyPath` `autoIncrement` not working\n\t * @param {object[]} [options.stores[].indexes]\n\t * @param {string} [options.stores[].indexes[].name] index name\n\t * @param {string} [options.stores[].indexes[].keyPath] index keyPath\n\t * @param {boolean} [options.stores[].indexes[].unique] should index value be unique\n\t * @returns\n\t */\n\tconstructor(options = {}) {\n\t\tlet { name, version = 1, stores } = options\n\t\tconst asStorage = !name\n\n\t\tif (!name) {\n\t\t\tname = '__indb__'\n\t\t}\n\n\t\tif (!stores || !Array.isArray(stores) || !stores.length) {\n\t\t\tstores = [\n\t\t\t\t{\n\t\t\t\t\tname: '__indb__',\n\t\t\t\t\tisKv: true,\n\t\t\t\t},\n\t\t\t]\n\t\t}\n\n\t\tthis.cache = {}\n\t\tthis.connection = null\n\n\t\tthis.name = name\n\t\tthis.version = version\n\t\tthis.stores = stores\n\n\t\t// update database structure\n\t\tconst request = indexedDB.open(name, version)\n\t\trequest.onupgradeneeded = (e) => {\n\t\t\t// @ts-ignore\n\t\t\tconst db = e.target.result\n\t\t\tconst existStoreNames = Array.from(db.objectStoreNames)\n\t\t\tconst passStoreNames = []\n\n\t\t\tstores.forEach((item) => {\n\t\t\t\tlet objectStore = null\n\t\t\t\tif (existStoreNames.indexOf(item.name) > -1) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tobjectStore = e.target.transaction.objectStore(item.name)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tconst keyPath = item.isKv ? 'key' : item.primaryKeyPath\n\t\t\t\t\tconst autoIncrement = item.isKv ? false : item.autoIncrement\n\t\t\t\t\tobjectStore = db.createObjectStore(item.name, { keyPath, autoIncrement })\n\t\t\t\t}\n\n\t\t\t\t// delete old indexes\n\t\t\t\tconst indexNames = objectStore.indexNames\n\t\t\t\tif (indexNames && indexNames.length) {\n\t\t\t\t\tArray.from(indexNames).forEach((item) => objectStore.deleteIndex(item))\n\t\t\t\t}\n\n\t\t\t\t// add new indexes\n\t\t\t\tif (item.indexes && item.indexes.length) {\n\t\t\t\t\titem.indexes.forEach((item) => {\n\t\t\t\t\t\tobjectStore.createIndex(item.name, item.keyPath || item.name, { unique: item.unique, multiEntry: Array.isArray(item.keyPath) })\n\t\t\t\t\t})\n\t\t\t\t}\n\n\t\t\t\tpassStoreNames.push(item.name)\n\t\t\t})\n\n\t\t\t// delete objectStores which is not in config information\n\t\t\t// notice, developers should backup data firstly\n\t\t\tif (existStoreNames) {\n\t\t\t\texistStoreNames.forEach((item) => {\n\t\t\t\t\tif (passStoreNames.indexOf(item) === -1) {\n\t\t\t\t\t\tdb.deleteObjectStore(item)\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t}\n\t\t}\n\t\trequest.onblocked = (e) => {\n\t\t\tconsole.error(modifyError(new Error('indexedDB ' + name + ' is blocked')))\n\t\t}\n\n\t\t// use as a storage like:\n\t\t// const store = new InDB()\n\t\t// store.setItem('key', 'value')\n\t\tif (asStorage) {\n\t\t\t// @ts-ignore\n\t\t\treturn this.use(name)\n\t\t}\n\t}\n\n\tconnect() {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst request = indexedDB.open(this.name, this.version)\n\t\t\trequest.onerror = (e) => {\n\t\t\t\treject(modifyError(e))\n\t\t\t}\n\t\t\trequest.onsuccess = (e) => {\n\t\t\t\t// @ts-ignore\n\t\t\t\tresolve(e.target.result)\n\t\t\t}\n\t\t})\n\t}\n\n\t/**\n\t *\n\t * @param {string} name\n\t * @returns {InDBStore}\n\t */\n\tuse(name) {\n\t\tconst currentStore = this.stores.find(item => item.name === name)\n\n\t\tif (!currentStore) {\n\t\t\tthrow new Error(`[InDB]: store ${name} is not existing.`)\n\t\t}\n\n\t\t// use connected store\n\t\tif (this.cache[name]) {\n\t\t\treturn this.cache[name]\n\t\t}\n\n\t\tconst store = new InDBStore({\n\t\t\tdb: this,\n\t\t\tstore: currentStore,\n\t\t})\n\n\t\t// if it is a key-value store, append special methods\n\t\tif (currentStore.isKv) {\n\t\t\tObject.defineProperties(store, {\n\t\t\t\tkey: {\n\t\t\t\t\tvalue: i => store.keys().then(keys => keys && keys[i]),\n\t\t\t\t},\n\t\t\t\tgetItem: {\n\t\t\t\t\tvalue: key => store.get(key).then(obj => obj && obj.value),\n\t\t\t\t},\n\t\t\t\tsetItem: {\n\t\t\t\t\tvalue: (key, value) => store.put({ key, value }),\n\t\t\t\t},\n\t\t\t\tremoveItem: {\n\t\t\t\t\tvalue: key => store.delete(key),\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\n\t\tthis.cache[name] = store\n\n\t\treturn store\n\t}\n\n\tclose() {\n\t\tthis.cache = null\n\t\tthis.stores = null\n\n\t\treturn this.connect().then((db) => {\n\t\t\tdb.close()\n\t\t})\n\t}\n\n\tstatic deleteDatabase(name) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst request = indexedDB.deleteDatabase(name)\n\t\t\trequest.onsuccess = () => {\n\t\t\t\tresolve()\n\t\t\t}\n\t\t\trequest.onerror = (e) => {\n\t\t\t\treject(e)\n\t\t\t}\n\t\t})\n\t}\n\n\tstatic databases() {\n\t\treturn indexedDB.databases()\n\t}\n}\n\nexport default InDB\n\nclass InDBStore {\n\tconstructor(options = {}) {\n\t\tconst { store, db } = options\n\n\t\tif (typeof store !== 'object' || !store.name || typeof store.name !== 'string') {\n\t\t\tthrow new Error(`[InDBStore]: options.store should be a store config object.`)\n\t\t}\n\n\t\tif (!(db instanceof InDB)) {\n\t\t\tthrow new Error(`[InDBStore]: options.db should be an instanceof InDB.`)\n\t\t}\n\n\t\tthis.db = db\n\n\t\tthis.store = store\n\t\tthis.name = store.name\n\t\tthis.primaryKeyPath = store.isKv ? 'key' : store.primaryKeyPath\n\n\t\tthis._queue = []\n\t}\n\n\ttransaction(writable = false) {\n\t\tconst create = () => {\n\t\t\tconst name = this.name\n\t\t\tconst mode = writable ? 'readwrite' : 'readonly'\n\n\t\t\t// share the same connection\n\t\t\tconst connection = this.db.connection\n\t\t\tconst deferer = connection ? Promise.resolve(connection) : this.db.connect()\n\t\t\treturn deferer.then((db) => {\n\t\t\t\tthis.db.connection = db\n\t\t\t\tconst tx = db.transaction(name, mode)\n\t\t\t\tconst disconnect = () => {\n\t\t\t\t\tthis.db.connection = null\n\t\t\t\t\tthis._queue.shift()\n\t\t\t\t}\n\t\t\t\ttx.oncomplete = disconnect\n\t\t\t\ttx.onabort = disconnect\n\t\t\t\ttx.onerror = disconnect\n\t\t\t\treturn tx\n\t\t\t})\n\t\t}\n\n\t\tconst latest = this._queue[this._queue.length - 1]\n\t\tconst deferer = latest ? latest.then(() => create()) : create()\n\t\tthis._queue.push(deferer)\n\t\treturn deferer\n\t}\n\n\tobjectStore(writable = false) {\n\t\tconst name = this.name\n\t\treturn this.transaction(writable).then(tx => tx.objectStore(name))\n\t}\n\n\tcursor(options) {\n\t\tconst { index, range, direction, onTouch, onDone, onError, writable = false } = options\n\t\treturn this.objectStore(writable).then((objectStore) => {\n\t\t\tconst owner = index ? objectStore.index(index) : objectStore\n\t\t\tconst request = owner.openCursor(range, direction)\n\t\t\trequest.onsuccess = (e) => {\n\t\t\t\tconst cursor = e.target.result\n\t\t\t\tif (cursor) {\n\t\t\t\t\tonTouch(cursor, owner)\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tonDone(cursor, owner)\n\t\t\t\t}\n\t\t\t}\n\t\t\trequest.onerror = (e) => {\n\t\t\t\tonError(modifyError(e))\n\t\t\t}\n\t\t})\n\t}\n\n\trequest(fn, options = {}) {\n\t\tconst { writable = false } = options\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.objectStore(writable).then((objectStore) => {\n\t\t\t\tconst request = fn(objectStore)\n\t\t\t\trequest.onsuccess = (e) => {\n\t\t\t\t\tconst result = e.target.result\n\t\t\t\t\tresolve(result)\n\t\t\t\t}\n\t\t\t\trequest.onerror = (e) => {\n\t\t\t\t\treject(modifyError(e))\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n\n\titerate(fn, options = {}) {\n\t\tconst { index, range, writable = false, direction = 'next' } = options\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.cursor({\n\t\t\t\tindex,\n\t\t\t\trange,\n\t\t\t\twritable,\n\t\t\t\tdirection,\n\t\t\t\tonTouch: (cursor, owner) => {\n\t\t\t\t\tconst next = () => cursor.continue()\n\t\t\t\t\tconst stop = () => {\n\t\t\t\t\t\t// should commit when writable is true\n\t\t\t\t\t\towner.transaction.commit()\n\t\t\t\t\t\tresolve()\n\t\t\t\t\t}\n\t\t\t\t\tfn(cursor, next, stop)\n\t\t\t\t},\n\t\t\t\tonDone: () => {\n\t\t\t\t\tresolve()\n\t\t\t\t},\n\t\t\t\tonError: (e) => {\n\t\t\t\t\treject(e)\n\t\t\t\t},\n\t\t\t})\n\t\t})\n\t}\n\n\tbatch(fns, options = {}) {\n\t\tconst { writable = true } = options\n\t\treturn this.transaction(writable).then((tx) => {\n\t\t\tconst name = this.name\n\t\t\tconst promises = []\n\t\t\tconst objectStore = tx.objectStore(name)\n\t\t\tfns.forEach((fn) => {\n\t\t\t\tconst deferer = new Promise((resolve, reject) => {\n\t\t\t\t\tconst request = fn(objectStore)\n\t\t\t\t\trequest.onsuccess = (e) => {\n\t\t\t\t\t\tconst result = e.target.result\n\t\t\t\t\t\tresolve(result)\n\t\t\t\t\t}\n\t\t\t\t\trequest.onerror = (e) => {\n\t\t\t\t\t\treject(modifyError(e))\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tpromises.push(deferer)\n\t\t\t})\n\t\t\treturn Promise.all(promises)\n\t\t})\n\t}\n\n\t// ==========================================\n\n\t/**\n\t *\n\t * @param {string} key\n\t * @returns\n\t */\n\tget(key) {\n\t\t// single key\n\t\tif (!Array.isArray(key)) {\n\t\t\treturn this.request(objectStore => objectStore.get(key))\n\t\t}\n\n\t\t// multiple keys\n\t\tconst keys = key\n\t\tconst fns = keys.map(key => objectStore => objectStore.get(key))\n\t\treturn this.batch(fns, { writable: false })\n\t}\n\n\tkeys() {\n\t\tconst keyPath = this.primaryKeyPath\n\t\tconst results = []\n\t\treturn this.each((obj) => {\n\t\t\tconst key = parse(obj, keyPath)\n\t\t\tresults.push(key)\n\t\t}).then(() => {\n\t\t\treturn results\n\t\t})\n\t}\n\n\tall() {\n\t\tconst results = []\n\t\treturn this.each((obj) => {\n\t\t\tresults.push(obj)\n\t\t}).then(() => {\n\t\t\treturn results\n\t\t})\n\t}\n\n\tcount() {\n\t\treturn this.request(objectStore => objectStore.count())\n\t}\n\n\t// ==========================================\n\n\teach(fn) {\n\t\treturn this.iterate((cursor, next) => {\n\t\t\tconst obj = cursor.value\n\t\t\tfn(obj)\n\t\t\tnext()\n\t\t})\n\t}\n\n\treverse(fn) {\n\t\treturn this.iterate((cursor, next) => {\n\t\t\tconst obj = cursor.value\n\t\t\tfn(obj)\n\t\t\tnext()\n\t\t}, { direction: 'prev' })\n\t}\n\n\tsome(count = 10, offset = 0) {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst results = []\n\t\t\tlet i = 0\n\t\t\tlet start = offset\n\t\t\tlet end = offset + count\n\t\t\tlet direction\n\n\t\t\t// offset < 0, means begining from the latest item,\n\t\t\t// for example, offset = -1, means begining from the last item\n\t\t\tif (offset < 0) {\n\t\t\t\tdirection = 'prev'\n\t\t\t\tcount = Math.min(count, -offset)\n\t\t\t\tstart = -(offset + count) || 0\n\t\t\t\tend = start + count\n\t\t\t}\n\n\t\t\tthis.iterate((cursor, next, stop) => {\n\t\t\t\tif (i < start) {\n\t\t\t\t\ti ++\n\t\t\t\t\tnext()\n\t\t\t\t}\n\t\t\t\telse if (i < end) {\n\t\t\t\t\tresults.push(cursor.value)\n\t\t\t\t\ti ++\n\t\t\t\t\tnext()\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tstop()\n\t\t\t\t}\n\t\t\t}, { direction }).then(() => {\n\t\t\t\tif (offset < 0) {\n\t\t\t\t\tresults.reverse()\n\t\t\t\t}\n\t\t\t\tresolve(results)\n\t\t\t}).catch(reject)\n\t\t})\n\t}\n\n\tfirst() {\n\t\treturn this.some(1).then(items => items[0])\n\t}\n\n\tlast() {\n\t\treturn this.some(1, -1).then(items => items[0])\n\t}\n\n\t// =========================\n\n\t/**\n\t * find a record with given index\n\t * @param {string} key index name\n\t * @param {*} value\n\t * @returns\n\t */\n\tfind(key, value) {\n\t\treturn this.request(objectStore => objectStore.index(key).get(value))\n\t}\n\t/**\n\t * query several records with given index and compare condition\n\t * @param {string} key index name\n\t * @param {*} value\n\t * @param {string} [compare]\n\t * @returns\n\t */\n\tquery(key, value, compare) {\n\t\tconst range = (function() {\n\t\t\tswitch (compare) {\n\t\t\t\tcase '>':\n\t\t\t\t\treturn IDBKeyRange.lowerBound(value, true)\n\t\t\t\tcase '>=':\n\t\t\t\t\treturn IDBKeyRange.lowerBound(value)\n\t\t\t\tcase '<':\n\t\t\t\t\treturn IDBKeyRange.upperBound(value, true)\n\t\t\t\tcase '<=':\n\t\t\t\t\treturn IDBKeyRange.upperBound(value)\n\t\t\t\tcase '%':\n\t\t\t\tcase '!=':\n\t\t\t\tcase 'in':\n\t\t\t\t\treturn undefined\n\t\t\t\tdefault:\n\t\t\t\t\treturn IDBKeyRange.only(value)\n\t\t\t}\n\t\t}())\n\n\t\tconst results = []\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.cursor({\n\t\t\t\tindex: key,\n\t\t\t\trange,\n\t\t\t\tonTouch: (cursor, owner) => {\n\t\t\t\t\tconst targetObj = cursor.value\n\t\t\t\t\tconst keyPath = owner.keyPath\n\t\t\t\t\tconst targetValue = parse(targetObj, keyPath)\n\n\t\t\t\t\tif (compare === '!=') {\n\t\t\t\t\t\tif (targetValue !== value) {\n\t\t\t\t\t\t\tresults.push(targetObj)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (compare === '%') {\n\t\t\t\t\t\tif (typeof targetValue == 'string' && targetValue.indexOf(value) > -1) {\n\t\t\t\t\t\t\tresults.push(targetObj)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (compare === 'in') {\n\t\t\t\t\t\tif (Array.isArray(value) && value.indexOf(targetValue) > -1) {\n\t\t\t\t\t\t\tresults.push(targetObj)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tresults.push(targetObj)\n\t\t\t\t\t}\n\n\t\t\t\t\tcursor.continue()\n\t\t\t\t},\n\t\t\t\tonDone: () => {\n\t\t\t\t\tresolve(results)\n\t\t\t\t},\n\t\t\t\tonError: (e) => {\n\t\t\t\t\treject(e)\n\t\t\t\t},\n\t\t\t})\n\t\t})\n\t}\n\n\t/**\n\t * query several records with conditions,\n\t * notice that, it works with iterator not with index.\n\t * @param {...object[]} rules\n\t * @param {string} rules[][].key index name or any keyPath.\n\t * @param {*} rules[][].value\n\t * @param {string=} rules[][].compare\n\t * @param {boolean=} rules[][].optional whether this condition is optional\n\t * @returns\n\t */\n\tselect(...rules) {\n\t\tconst currentStore = this.store\n\t\tconst indexes = currentStore.indexes || []\n\t\tconst indexesMapping = {}\n\t\tindexes.forEach((item) => {\n\t\t\tconst { name, keyPath } = item\n\t\t\tindexesMapping[name] = keyPath\n\t\t})\n\n\t\tconst compareAandB = function(a, b, compare) {\n\t\t\tif (a === undefined) {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tswitch (compare) {\n\t\t\t\tcase '>':\n\t\t\t\t\treturn a > b\n\t\t\t\tcase '>=':\n\t\t\t\t\treturn a >= b\n\t\t\t\tcase '<':\n\t\t\t\t\treturn a < b\n\t\t\t\tcase '<=':\n\t\t\t\t\treturn a <= b\n\t\t\t\tcase '!=':\n\t\t\t\t\treturn a !== b\n\t\t\t\tcase '%':\n\t\t\t\t\treturn typeof a === 'string' && a.indexOf(b) > -1\n\t\t\t\tcase 'in':\n\t\t\t\t\treturn Array.isArray(b) && b.indexOf(a) > -1\n\t\t\t\tdefault:\n\t\t\t\t\treturn a === b\n\t\t\t}\n\t\t}\n\n\t\tconst determine = function(obj, and_conditions, or_conditions) {\n\t\t\tif (!and_conditions.length && !or_conditions.length) {\n\t\t\t\treturn false\n\t\t\t}\n\n\t\t\tfor (let i = 0, len = and_conditions.length; i < len; i ++) {\n\t\t\t\tconst { keyPath, value, compare } = and_conditions[i]\n\t\t\t\tconst current = parse(obj, keyPath)\n\t\t\t\tif (!compareAandB(current, value, compare)) {\n\t\t\t\t\treturn false\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!or_conditions.length) {\n\t\t\t\treturn true\n\t\t\t}\n\n\t\t\tfor (let i = 0, len = or_conditions.length; i < len; i ++) {\n\t\t\t\tconst { keyPath, value, compare } = or_conditions[i]\n\t\t\t\tconst current = parse(obj, keyPath)\n\t\t\t\tif (compareAandB(current, value, compare)) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn false\n\t\t}\n\n\t\tconst groups = []\n\t\trules.forEach((conditions) => {\n\t\t\tconst or_conditions = []\n\t\t\tconst and_conditions = []\n\t\t\tfor (let i = 0, len = conditions.length; i < len; i ++) {\n\t\t\t\tconst { key, value, compare, optional } = conditions[i]\n\t\t\t\tconst keyPath = indexesMapping[key] || key // if there is not such index, use original key as keyPath\n\t\t\t\tif (optional) {\n\t\t\t\t\tor_conditions.push({ keyPath, value, compare })\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tand_conditions.push({ keyPath, value, compare })\n\t\t\t\t}\n\t\t\t}\n\t\t\tgroups.push([and_conditions, or_conditions])\n\t\t})\n\n\t\tconst isOk = (obj) => {\n\t\t\tfor (let i = 0, len = groups.length; i < len; i ++) {\n\t\t\t\tconst [and_conditions, or_conditions] = groups[i]\n\t\t\t\tconst res = determine(obj, and_conditions, or_conditions)\n\t\t\t\tif (res) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false\n\t\t}\n\n\t\tconst results = []\n\t\treturn this.each((obj) => {\n\t\t\tif (isOk(obj)) {\n\t\t\t\tresults.push(obj)\n\t\t\t}\n\t\t}).then(() => {\n\t\t\treturn results\n\t\t})\n\t}\n\n\t// =====================================\n\n\t/**\n\t * add a record into store\n\t * @param {*} obj\n\t * @param {string} [key]\n\t * @returns\n\t */\n\tadd(obj, key) {\n\t\tif (Array.isArray(obj)) {\n\t\t\tconst objs = obj\n\t\t\tif (objs.length < 2) {\n\t\t\t\treturn this.add(obj[0], key)\n\t\t\t}\n\n\t\t\tconst fns = objs.map(obj => objectStore => objectStore.add(obj, key))\n\t\t\treturn this.batch(fns)\n\t\t}\n\n\t\tif (!obj) {\n\t\t\treturn Promise.resolve()\n\t\t}\n\n\t\treturn this.request(objectStore => objectStore.add(obj, key), { writable: true })\n\t}\n\n\t/**\n\t *\n\t * @param {*} obj\n\t * @param {string} [key] if not pass, primaryKey will read from obj\n\t * @returns\n\t */\n\tput(obj, key) {\n\t\tif (Array.isArray(obj)) {\n\t\t\tconst objs = obj\n\t\t\tif (objs.length < 2) {\n\t\t\t\treturn this.put(objs[0], key)\n\t\t\t}\n\n\t\t\tconst fns = objs.map(obj => objectStore => objectStore.put(obj, key))\n\t\t\treturn this.batch(fns)\n\t\t}\n\n\t\tif (!obj) {\n\t\t\treturn Promise.resolve()\n\t\t}\n\n\t\treturn this.request(objectStore => objectStore.put(obj, key), { writable: true })\n\t}\n\n\tdelete(key) {\n\t\tif (Array.isArray(key)) {\n\t\t\tconst keys = key\n\t\t\tif (keys.length < 2) {\n\t\t\t\treturn this.delete(keys[0])\n\t\t\t}\n\n\t\t\tconst fns = keys.map(key => objectStore => objectStore.delete(key))\n\t\t\treturn this.batch(fns)\n\t\t}\n\n\t\tif (!key) {\n\t\t\treturn Promise.resolve()\n\t\t}\n\n\t\treturn this.request(objectStore => objectStore.delete(key), { writable: true })\n\t}\n\n\tremove(obj) {\n\t\tconst keyPath = this.primaryKeyPath\n\n\t\tif (Array.isArray(obj)) {\n\t\t\tconst objs = obj\n\t\t\tif (objs.length < 2) {\n\t\t\t\treturn this.remove(objs[0])\n\t\t\t}\n\n\t\t\tconst fns = objs.map(obj => {\n\t\t\t\tconst key = parse(obj, keyPath)\n\t\t\t\treturn objectStore => objectStore.delete(key)\n\t\t\t})\n\t\t\treturn this.batch(fns)\n\t\t}\n\n\t\tif (!obj) {\n\t\t\treturn Promise.resolve()\n\t\t}\n\n\t\tconst key = parse(obj, keyPath)\n\t\tif (!key) {\n\t\t\treturn Promise.resolve()\n\t\t}\n\n\t\treturn this.delete(key)\n\t}\n\n\tclear() {\n\t\treturn this.request(objectStore => objectStore.clear(), { writable: true })\n\t}\n}\n\nfunction makeKeyChain(path) {\n\tlet chain = path.toString().split(/\\.|\\[|\\]/).filter(item => !!item)\n\treturn chain\n}\n\nfunction parse(obj, path) {\n\tif (typeof path === 'undefined' || path === null) {\n\t return;\n\t}\n\n\tif (Array.isArray(path)) {\n\t for (let i = 0, len = path.length; i < len; i ++) {\n\t\tconst item = path[i]\n\t\tconst res = parse(obj, item)\n\t\tif (res !== undefined) {\n\t\t return res\n\t\t}\n\t }\n\t return\n\t}\n\n\tlet chain = makeKeyChain(path)\n\n\tif (!chain.length) {\n\t return obj\n\t}\n\n\tlet target = obj\n\tfor (let i = 0, len = chain.length; i < len; i ++) {\n\t let key = chain[i]\n\t if (target[key] === undefined) {\n\t\treturn\n\t }\n\t target = target[key]\n\t}\n\treturn target\n}\n\nfunction modifyError(e) {\n\tconst { message } = e\n\te.message = message.indexOf('[IndexedDB]') === -1 ? '[IndexedDB]: ' + message : message\n\treturn e\n}\n","import { AsyncQueue } from 'anys-shared';\nimport { InDB } from 'indb/es/index.js';\n\nexport class AnysStoreOfflinePlugin {\n constructor(anys) {\n this.anys = anys;\n }\n\n options() {\n return {\n namespace: new Error('[Anys]: options.namespace is required!'),\n /**\n * offline log will close autoReport as default,\n * developers should must invoke anys.send to send logs to server side during\n * which should use this.[offlineLogger].select to pick logs,\n * and this.[offlineLogger].remove to clear logs\n */\n autoReport: false,\n /**\n * a offline log will be delete after how long time,\n * default 2 day (48 hours)\n */\n expireTime: 3600000 * 48,\n };\n }\n\n init() {\n const storeName = 'anyslogs';\n const idb = new InDB({\n name: this.anys.options.namespace,\n version: 1,\n stores: [\n {\n name: storeName,\n primaryKeyPath: '_id',\n autoIncrement: true,\n },\n ],\n });\n this.db = idb.use(storeName);\n this.queue = new AsyncQueue();\n\n /**\n * clear logs which should be delete from db\n */\n const { expireTime } = this.anys.options;\n if (expireTime) {\n let offset = 0;\n const timer = setInterval(() => {\n this.queue\n .push(() => this.db.some(100, offset))\n .then((logs) => {\n if (!logs.length) {\n clearInterval(timer);\n return;\n }\n const curr = Date.now();\n const ids = [];\n logs.forEach((log) => {\n const { _id, time } = log;\n if (curr - time > expireTime) {\n ids.push(_id);\n }\n });\n if (ids.length) {\n this.queue.push(() => this.db.delete(ids));\n }\n offset += 100;\n offset -= ids.length;\n });\n }, 10000);\n }\n }\n\n write(data) {\n this.queue\n .push(() => this.db.add(data))\n .then((id) => {\n this.anys.emit('writeOfflineLog', { id, data });\n });\n }\n\n /**\n * select records from db\n * anys.report([\n * { key: 'time', value: Date.now() - 3600000, compare: '>' },\n * { key: 'trace', value: 'xxx' },\n * ]);\n * https://github.com/tangshuang/indb#select\n * @param {Array} message\n * @returns\n */\n read(message) {\n if (!message) {\n message = [\n { key: 'client', value: this.anys.clientId },\n { key: 'trace', value: this.anys.traceId },\n ];\n }\n else if (!Array.isArray(message)) {\n return;\n }\n else if (message.some(item => !item.key)) {\n return;\n }\n return this.select(message);\n }\n\n /**\n * select records from db\n * https://github.com/tangshuang/indb#select\n * @param {Array} conditions\n * @returns\n */\n select(conditions) {\n return this.queue.push(() => this.db.select(conditions));\n }\n\n /**\n * delete records from db\n * @param {number|Array<number>} ids\n * @returns\n */\n remove(ids) {\n return this.queue.push(() => this.db.delete(ids)).catch(() => {});\n }\n}\n","import { AnysPlugin, getPath, tryRun } from 'anys-shared';\n\n/**\n * window.frames['iframeId']\n */\n\nexport class AnysMonitorDOMMutationPlugin extends AnysPlugin {\n options() {\n return {\n mutation: true,\n };\n }\n\n registerMutation() {\n const observer = this.createObserver((logs) => {\n const log = {\n type: 'mutation',\n time: Date.now(),\n detail: logs,\n };\n this.anys.write(log);\n });\n\n // record after loaded\n window.addEventListener('load', () => {\n observer.observe(document, {\n characterData: true,\n attributes: true,\n childList: true,\n subtree: true,\n });\n this.recordSnapshot();\n buildPath(document.documentElement);\n });\n\n return () => {\n observer.disconnect();\n };\n }\n\n recordSnapshot() {\n const snapshot = createSnapshot();\n\n const url = window.location.href;\n const a = new URL(url);\n const path = a.pathname.replace(/^([^/])/, '/$1');\n\n this.anys.write({\n type: 'snapshot',\n time: Date.now(),\n url: {\n uri: path + (a.search ? `?${a.search}` : ''),\n path,\n protocol: a.protocol.replace(':', ''),\n host: a.hostname,\n port: a.port,\n search: a.search,\n hash: a.hash.replace('#', ''),\n },\n detail: snapshot,\n });\n }\n\n createObserver(callback) {\n const isInIgnore = (node) => {\n if (node.hasAttribute?.('anys-ignore')) {\n return true;\n }\n\n let parent = node.parentNode;\n while (parent) {\n if (parent.hasAttribute?.('anys-ignore')) {\n return true;\n }\n parent = parent.parentNode;\n }\n\n return false;\n };\n\n const observer = new MutationObserver((inputs) => {\n /**\n * @type any[]\n */\n const mutations = [];\n const changes = [...inputs].reverse();\n changes.forEach((item) => {\n const { type, target, attributeName, oldValue } = item;\n\n // ignore nodes which are special\n if (isInIgnore(target)) {\n return;\n }\n\n if (type === 'attributes') {\n // @ts-ignore\n const next = target.getAttribute(attributeName);\n if (next === oldValue) {\n return;\n }\n if (mutations.find(item => item.type === type && item.target === target && item.attributeName === attributeName)) {\n return;\n }\n }\n else if (type === 'characterData') {\n // @ts-ignore\n const next = target.data;\n if (next === oldValue) {\n return;\n }\n if (mutations.find(item => item.type === type && item.target === target && item.target.data === next)) {\n return;\n }\n }\n\n mutations.push(item);\n });\n mutations.reverse();\n\n /**\n * records as logs\n */\n\n const logs = [];\n mutations.forEach((mutation) => {\n const { type, target, attributeName, oldValue } = mutation;\n const targetPath = target.path || getPath(target);\n const getRelativePath = (someNode) => {\n const somePath = getPath(someNode);\n return somePath.replace(targetPath + '/', '');\n };\n\n if (type === 'attributes') {\n const next = target.getAttribute(attributeName);\n const prev = oldValue;\n logs.push({\n type: 'attribute',\n target: targetPath,\n name: attributeName,\n next,\n prev,\n });\n }\n else if (type === 'characterData') {\n const next = target.data;\n const prev = oldValue;\n logs.push({\n type: 'text',\n target: targetPath,\n next,\n prev,\n });\n }\n else if (type === 'childList') {\n // ignore textarea inside changes\n if (target.nodeName === 'TEXTAREA') {\n return;\n }\n\n const { removedNodes, addedNodes, previousSibling, nextSibling } = mutation;\n\n const movedNodes = [];\n const remove = Array.from(removedNodes)\n .map((node) => {\n // move node\n if (document.body.contains(node)) {\n movedNodes.push({\n node,\n path: getPath(node),\n });\n return;\n }\n\n // when a node is removed after inserted immediately,\n // it will be treated as moved as previous\n\n // path relative to target\n const nodePath = node.path ? getRelativePath(node) : null;\n const before = previousSibling ? getPath(previousSibling) : null;\n const after = nextSibling ? getPath(nextSibling) : null;\n const patch = {};\n if (nodePath) {\n patch.node = nodePath;\n }\n else {\n patch.before = before;\n patch.after = after;\n }\n return patch;\n })\n .filter(Boolean);\n const move = [];\n const insert = Array.from(addedNodes)\n .map((node) => {\n // we SHOULD MUST read nextSibling's path sibling we invoke buildPath\n const sibling = node.nextSibling ? getRelativePath(node.nextSibling) : null;\n\n // move node\n // when a node is inserted and moved immediately, it will go through\n // insert -> remove -> insert\n // we treat it as\n // insert -> move\n // when remove, we create movedNode.path, so here we get it as expected\n // if a node is removed after inserted immediately but not inserted, we drop it\n const movedNode = movedNodes.find(item => item.node === node);\n if (movedNode) {\n move.push({\n node: movedNode.path,\n sibling,\n });\n return;\n }\n\n const isText = node.nodeName === '#text';\n const isComment = node.nodeName === '#comment';\n\n const text = isText ? node.data : null;\n const comment = isComment ? node.data : null;\n const html = isText || isComment ? null : clearHtml(node.outerHTML);\n\n return {\n text,\n html,\n comment,\n sibling,\n };\n })\n .filter(Boolean);\n\n logs.push({\n type: 'children',\n target: targetPath,\n remove,\n insert,\n move,\n });\n\n // rebuild node and its children's path\n buildPath(target);\n }\n });\n\n // record mutation logs\n callback(logs);\n });\n\n // build all nodes' path\n buildPath(document);\n\n return observer;\n }\n}\n\nfunction buildPath(node) {\n if (node !== document) {\n const path = getPath(node);\n node.path = path;\n }\n\n const children = node.childNodes;\n Array.from(children).forEach((el) => {\n buildPath(el);\n });\n}\n\nfunction clearHtml(html) {\n return html\n // noscript\n .replace(/<script([^]*?)>([^]*?)<\\/script>/gm, '<noscript$1></noscript>')\n .replace(/<noscript([^]*?)>([^]*?)<\\/noscript>/gm, '<noscript$1></noscript>')\n // // remove script\n // .replace(/<script([^]*?)>([^]*?)<\\/script>/gm, '')\n // remove preload script\n .replace(/<link([^]*?)as=\"script\"([^]*?)>/g, '<link$1$2>')\n .replace(/\\n\\n*\\s*\\n*\\n/gm, '\\n');\n}\n\nfunction createFormSnapshot() {\n const forms = document.querySelectorAll('input, textarea, select');\n const data = [];\n Array.from(forms).forEach((el) => {\n const target = getPath(el);\n // @ts-ignore\n const value = el.type === 'password' ? '***' : el.value;\n data.push({ el: target, value });\n });\n return data;\n}\n\nexport function createSnapshot() {\n const { name, publicId, systemId } = document.doctype;\n const doctype = { name, publicId, systemId };\n\n const content = document.documentElement.innerHTML;\n const html = clearHtml(content);\n\n const attrs = {};\n const el = document.querySelector('html');\n for (let { name, value } of el.attributes) {\n attrs[name] = value;\n }\n\n const values = createFormSnapshot();\n\n return { doctype, attrs, html, values };\n}\n","import { AnysPlugin } from 'anys-shared';\n\nexport class AnysMonitorWindowSizePlugin extends AnysPlugin {\n options() {\n return {\n size: true,\n };\n }\n\n createRecordLog() {\n const { innerWidth: width, innerHeight: height } = window;\n const log = {\n type: 'window_size',\n time: Date.now(),\n detail: { width, height },\n };\n return log;\n }\n\n registerSize() {\n let request;\n\n const listen = () => {\n clearTimeout(request);\n\n const log = this.createRecordLog();\n request = setTimeout(() => {\n this.anys.write(log);\n }, 100);\n };\n\n // 一启动就记录一次\n this.recordSize();\n\n window.addEventListener('resize', listen);\n\n return () => {\n window.removeEventListener('resize', listen);\n };\n }\n\n recordSize() {\n const log = this.createRecordLog();\n this.anys.write(log);\n }\n}\n","import { AnysPlugin, getPath } from 'anys-shared';\n\nexport class AnysMonitorScrollEventPlugin extends AnysPlugin {\n options() {\n return {\n scroll: true,\n };\n }\n\n registerScroll() {\n let ticking = 0;\n\n const listen = (e) => {\n if (ticking) {\n return;\n }\n\n const { target, bubbles } = e;\n let log;\n if (bubbles) {\n const { scrollX, scrollY } = window;\n log = {\n type: 'window_scroll',\n time: Date.now(),\n detail: { scrollX, scrollY },\n };\n }\n else {\n const { scrollLeft, scrollTop } = target;\n log = {\n type: 'scroll',\n time: Date.now(),\n target: getPath(target),\n detail: { scrollLeft, scrollTop },\n };\n }\n\n requestAnimationFrame(() => {\n this.anys.write(log);\n ticking = 0;\n });\n\n ticking = 1;\n };\n\n window.addEventListener('scroll', listen, true);\n\n return () => {\n window.removeEventListener('scroll', listen);\n };\n }\n}\n","import { AnysPlugin, ajaxPost, replaceUrlSearch } from 'anys-shared';\nimport { AnysMonitorAjaxPlugin } from 'anys-web-plugin-monitor-ajax';\nimport { AnysIdentifyPlugin } from 'anys-web-plugin-identify';\nimport { AnysMonitorInputEventPlugin } from 'anys-web-plugin-monitor-input-event';\nimport { AnysMonitorMouseEventPlugin } from 'anys-web-plugin-monitor-mouse-event';\nimport { AnysMonitorWindowActivityPlugin } from 'anys-web-plugin-monitor-window-activity';\nimport { AnysMonitorUrlPlugin } from 'anys-web-plugin-monitor-url';\nimport { AnysMonitorTouchEventPlugin } from 'anys-web-plugin-monitor-touch-event';\nimport { AnysStoreOfflinePlugin } from 'anys-web-plugin-store-offline';\nimport { AnysMonitorDOMMutationPlugin } from 'anys-web-plugin-monitor-dom-mutation';\nimport { AnysMonitorWindowSizePlugin } from 'anys-web-plugin-monitor-window-size';\nimport { AnysMonitorScrollEventPlugin } from 'anys-web-plugin-monitor-scroll-event';\n\nexport class AnysRecorderPlugin extends AnysPlugin {\n static dependencies = [\n AnysStoreOfflinePlugin,\n AnysMonitorUrlPlugin,\n AnysMonitorWindowSizePlugin,\n AnysMonitorDOMMutationPlugin,\n AnysIdentifyPlugin,\n AnysMonitorAjaxPlugin,\n AnysMonitorInputEventPlugin,\n AnysMonitorMouseEventPlugin,\n AnysMonitorWindowActivityPlugin,\n AnysMonitorTouchEventPlugin,\n AnysMonitorScrollEventPlugin,\n ];\n\n constructor(anys, [offlineLogger, urlMonitor, windowSizeMonitor, DOMMutationMonitor]) {\n super(anys);\n this.offlineLogger = offlineLogger;\n this.urlMonitor = urlMonitor;\n this.windowSizeMonitor = windowSizeMonitor;\n this.DOMMutationMonitor = DOMMutationMonitor;\n // cache for trace logs to be send by beacon\n this.cache = {};\n }\n\n options() {\n const isSupportTouch = 'ontouchend' in document;\n return {\n touch: isSupportTouch,\n mouse: !isSupportTouch,\n click: false,\n mousedown: true,\n mousemove: true,\n mouseup: true,\n autoReport: false,\n reportUrl: new Error('[Anys]: options.reportUrl is required!'),\n reportInterval: 10000,\n reportParams: null,\n };\n }\n\n registerAutoReport() {\n const { clientId } = this.anys;\n const autoReportWhenRefreshTraceId = ({ prev }) => {\n // report previous trace logs\n this.anys.report([\n { key: 'client', value: clientId },\n { key: 'trace', value: prev },\n ]);\n\n // clear cache\n this.cache = {};\n\n // record new information\n this.urlMonitor.recordUrl();\n this.windowSizeMonitor.recordSize();\n this.DOMMutationMonitor.recordSnapshot();\n };\n this.anys.on('refreshTraceId', autoReportWhenRefreshTraceId);\n\n const timer = setInterval(() => {\n this.anys.report();\n this.cache = {};\n }, this.anys.options.reportInterval);\n\n let isUnloaded = 0;\n const sendBeaconWhenBeforeUnload = () => {\n if (isUnloaded) {\n return;\n }\n isUnloaded = 1;\n\n const ids = Object.keys(this.cache);\n const logs = Object.values(this.cache);\n if (ids.length) {\n this.offlineLogger.remove(ids); // async may not executed\n navigator.sendBeacon(this.anys.options.reportUrl, JSON.stringify(logs));\n this.cache = {};\n }\n };\n window.addEventListener('beforeunload', sendBeaconWhenBeforeUnload);\n window.addEventListener('pagehide', sendBeaconWhenBeforeUnload); // 兼容微信浏览器\n window.addEventListener('unload', sendBeaconWhenBeforeUnload);\n\n const addCacheWhenWriteLog = ({ id, data }) => {\n this.cache[id] = data;\n };\n this.anys.on('writeOfflineLog', addCacheWhenWriteLog);\n\n return () => {\n this.anys.off('refreshTraceId', autoReportWhenRefreshTraceId);\n this.anys.off('writeOfflineLog', addCacheWhenWriteLog);\n // @ts-ignore\n clearInterval(timer);\n window.removeEventListener('beforeunload', sendBeaconWhenBeforeUnload);\n };\n }\n\n /**\n * define read here, so that recorder will not send other plugins 'read' output\n * @param {*} message\n * @returns\n */\n read(message) {\n return this.offlineLogger.read(message);\n }\n\n send(logs) {\n const groups = [];\n let i = 0;\n\n logs.forEach((item) => {\n groups[i] = groups[i] || [];\n groups[i].push(item);\n if (groups[i].length > 200) {\n i ++;\n }\n });\n\n groups.forEach((data) => {\n const items = [];\n const ids = [];\n\n data.forEach((item) => {\n const { _id, ...info } = item;\n ids.push(_id);\n items.push(info);\n });\n\n if (!items.length) {\n return;\n }\n\n const { reportUrl, reportParams } = this.anys.options;\n const url = reportParams ? replaceUrlSearch(reportUrl, reportParams) : reportUrl;\n ajaxPost(url, items).then(() => {\n this.offlineLogger.remove(ids);\n ids.forEach((id) => {\n delete this.cache[id];\n });\n });\n });\n }\n\n auth(info) {\n this.anys.options.reportParams = Object.assign(this.anys.options.reportParams || {}, info);\n }\n}\n","export function ajaxPost(url, data) {\n return new Promise((resolve, reject) => {\n // @ts-ignore\n const XHR = window.__XMLHttpRequest || window.XMLHttpRequest;\n\n const http = new XHR();\n http.open('POST', url, true);\n http.onreadystatechange = function() {\n if(http.readyState == 4) {\n if (http.status == 200) {\n resolve(http.responseText);\n }\n else {\n reject(new Error(`[Anys]: ajax post fail with status ${http.status}`));\n }\n }\n };\n http.onerror = reject;\n http.send(JSON.stringify(data));\n });\n}\n","import { Anys } from 'anys';\nimport { AnysRecorderPlugin } from './recorder-plugin.js';\n\nconst { currentScript } = document;\n\nexport const create = (options = {}) => new Anys({\n plugins: {\n recorder: AnysRecorderPlugin,\n },\n namespace: 'AnysTracer',\n autoReport: false,\n ...options,\n});\n\n// remove current script, so that we will not collect it in snapshot\ncurrentScript.parentNode.removeChild(currentScript);\n"],"names":["__webpack_require__","exports","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","isArray","Array","isFunction","isStrict","f","strict","entire","fnBody","slice","indexOf","lastIndexOf","trim","isNativeClass","isNativeSTD","level4","topCtx","replace","isBabelTransformedClass","test","isBabelRuntimeTransformedClass","isBabelTransformedMinifiedClass","level3","protos","getOwnPropertyDescriptors","hasProtos","keys","filter","item","length","level2","hasThisInside","level1","isConstructor","createRandomString","len","CHARS","text","i","charAt","Math","floor","random","each","fn","descriptor","withDescriptor","descriptors","forEach","set","configurable","writable","withIterator","Anys","options","this","$events","Constructor","ins","getPrototypeOf","constructor","filters","defaultFilters","plugins","defaultPluings","defaultOptions","givenFilters","givenPluings","defines","givenDefines","givenOptions","pluginOptions","pluginFilters","pluginDefines","isGivenPluginsMapping","givenPluingList","values","givenPluginMapping","map","pluginsDraft","mergePluginDeps","pluginList","Plugin","depPlugins","dependencies","dep","unshift","pluginSet","localName","find","name","msg","console","debug","error","warnExist","deps","P","plugin","assign","push","$plugins","requiredOption","Error","definitions","clientId","client","traceId","trace","requestId","basicLog","defineProperties","result","define","request","$basicLog","invoke","autoStart","start","_proto","on","event","callback","off","splice","emit","args","type","refreshTraceId","prevTraceId","prev","next","refreshRequestId","prevRequestId","write","log","setTimeout","data","autoReport","report","message","Promise","resolve","reject","defers","readers","senders","completers","toAsync","fns","reduce","deferer","then","runAsyncAll","param","all","read","send","defer","complete","bind","readSend","groups","logs","selfReport","stop","replaceUrlSearch","url","params","search","join","path","hash","split","right","origin","AnysPlugin","anys","$effects","affect","methodName","toUpperCase","revoke","stch","Evt","eventName","eventCall","evt","OXHR","window","XMLHttpRequest","__XMLHttpRequest","xhr","overmap","open","info","recordData","method","response","responseType","responseText","toString","time","Date","now","detail","status","undefined","recordResponse","readyState","async","onreadystatechange","body","recordSend","res","addEventListener","e","ofetch","fetch","__fetch","config","Proxy","_","err","AnysMonitorAjaxPlugin","_AnysPlugin","apply","arguments","ajaxResponse","patchRequestId","registerXhr","listener","registerFetch","registerPatchRequestId","newUrl","_request_id","AnysIdentifyPlugin","namespace","defineClientId","defineTraceId","localStorage","getItem","sessionStorage","setItem","getPath","node","root","document","documentElement","nodeName","nodePath","current","parent","parentNode","findIndex","childNodes","index","toLowerCase","reverse","AnysMonitorInputEventPlugin","input","registerInput","extract","target","inputType","tagName","getAttribute","elInput","detailData","el","listenInput","listenChange","listenPaste","removeEventListener","AnysMonitorMouseEventPlugin","mouse","click","mousemove","mousedown","mouseup","wheel","contextmenu","createThrottleListener","innerWidth","innerHeight","button","pageX","pageY","w","h","x","y","registerClick","registerMousemove","registerMouseup","registerMousedown","registerContextmenu","registerWheel","deltaX","deltaY","deltaZ","deltaMode","mode","createLog","ticking","requestAnimationFrame","enterLog","AnysMonitorWindowActivityPlugin","activity","deadTimeout","init","registerActivity","onvisibilitychange","visibilityState","onunload","registerDeadTimeout","timer","clearTimeout","AnysMonitorUrlPlugin","registerUrl","recordUrl","location","href","a","URL","pathname","uri","protocol","host","hostname","port","AnysMonitorTouchEventPlugin","isSupportTouch","touch","touchstart","touchend","touchmove","identifier","force","width","height","registerTouchmove","registerTouchend","registerTouchstart","AsyncQueue","queue","runner","rs","rj","run","shift","finally","InDB","version","stores","asStorage","isKv","cache","connection","indexedDB","onupgradeneeded","db","existStoreNames","from","objectStoreNames","passStoreNames","objectStore","transaction","keyPath","primaryKeyPath","autoIncrement","createObjectStore","indexNames","deleteIndex","indexes","createIndex","unique","multiEntry","deleteObjectStore","onblocked","modifyError","use","connect","onerror","onsuccess","currentStore","store","InDBStore","put","removeItem","delete","close","deleteDatabase","databases","_queue","_proto2","create","tx","disconnect","oncomplete","onabort","latest","cursor","range","direction","onTouch","onDone","onError","owner","openCursor","iterate","continue","commit","batch","promises","results","parse","count","some","offset","end","min","catch","first","items","last","query","compare","IDBKeyRange","lowerBound","upperBound","only","targetObj","targetValue","select","rules","indexesMapping","compareAandB","b","determine","and_conditions","or_conditions","conditions","optional","isOk","add","objs","remove","clear","chain","makeKeyChain","AnysStoreOfflinePlugin","expireTime","storeName","idb","setInterval","clearInterval","curr","ids","_id","id","AnysMonitorDOMMutationPlugin","mutation","registerMutation","observer","createObserver","observe","characterData","attributes","childList","subtree","recordSnapshot","buildPath","snapshot","publicId","systemId","doctype","html","clearHtml","innerHTML","attrs","querySelector","forms","querySelectorAll","createFormSnapshot","createSnapshot","MutationObserver","inputs","mutations","attributeName","oldValue","hasAttribute","isInIgnore","targetPath","getRelativePath","someNode","removedNodes","addedNodes","previousSibling","nextSibling","movedNodes","contains","before","after","patch","Boolean","move","insert","sibling","movedNode","isText","isComment","comment","outerHTML","children","AnysMonitorWindowSizePlugin","size","createRecordLog","registerSize","listen","recordSize","AnysMonitorScrollEventPlugin","scroll","registerScroll","bubbles","scrollX","scrollY","scrollLeft","scrollTop","AnysRecorderPlugin","offlineLogger","urlMonitor","windowSizeMonitor","DOMMutationMonitor","_this","reportUrl","reportInterval","reportParams","registerAutoReport","autoReportWhenRefreshTraceId","isUnloaded","sendBeaconWhenBeforeUnload","navigator","sendBeacon","JSON","stringify","addCacheWhenWriteLog","http","ajaxPost","auth","currentScript","recorder","removeChild"],"sourceRoot":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "anys-web",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "cjs/index.js",
|
|
6
|
+
"module": "src/index.js",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
"import": "./src/index.js",
|
|
10
|
+
"require": "./cjs/index.js"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build:cjs": "rimraf cjs && babel src --out-dir cjs --root-mode upward",
|
|
14
|
+
"build:dist": "rimraf dist && webpack --config ../../webpack.config.js",
|
|
15
|
+
"build": "npm run build:cjs && npm run build:dist"
|
|
16
|
+
},
|
|
17
|
+
"keywords": [],
|
|
18
|
+
"author": "tangshuang",
|
|
19
|
+
"license": "ISC",
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"anys": "^1.1.0",
|
|
22
|
+
"anys-shared": "^1.1.0",
|
|
23
|
+
"anys-web-plugin-identify": "^1.1.0",
|
|
24
|
+
"anys-web-plugin-monitor-ajax": "^1.1.0",
|
|
25
|
+
"anys-web-plugin-monitor-dom-mutation": "^1.1.0",
|
|
26
|
+
"anys-web-plugin-monitor-input-event": "^1.1.0",
|
|
27
|
+
"anys-web-plugin-monitor-mouse-event": "^1.1.0",
|
|
28
|
+
"anys-web-plugin-monitor-scroll-event": "^1.1.0",
|
|
29
|
+
"anys-web-plugin-monitor-touch-event": "^1.1.0",
|
|
30
|
+
"anys-web-plugin-monitor-url": "^1.1.0",
|
|
31
|
+
"anys-web-plugin-monitor-window-activity": "^1.1.0",
|
|
32
|
+
"anys-web-plugin-monitor-window-size": "^1.1.0",
|
|
33
|
+
"anys-web-plugin-send-by-ajax": "^1.1.0",
|
|
34
|
+
"anys-web-plugin-store-offline": "^1.1.0"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"registry": "https://registry.npmjs.org/"
|
|
38
|
+
},
|
|
39
|
+
"gitHead": "4900ece7d934e1b30346a03ee9e2916e9f2853f5"
|
|
40
|
+
}
|
package/src/index.js
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Anys } from 'anys';
|
|
2
|
+
import { AnysRecorderPlugin } from './recorder-plugin.js';
|
|
3
|
+
|
|
4
|
+
const { currentScript } = document;
|
|
5
|
+
|
|
6
|
+
export const create = (options = {}) => new Anys({
|
|
7
|
+
plugins: {
|
|
8
|
+
recorder: AnysRecorderPlugin,
|
|
9
|
+
},
|
|
10
|
+
namespace: 'AnysTracer',
|
|
11
|
+
autoReport: false,
|
|
12
|
+
...options,
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
// remove current script, so that we will not collect it in snapshot
|
|
16
|
+
currentScript.parentNode.removeChild(currentScript);
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { AnysPlugin, ajaxPost, replaceUrlSearch } from 'anys-shared';
|
|
2
|
+
import { AnysMonitorAjaxPlugin } from 'anys-web-plugin-monitor-ajax';
|
|
3
|
+
import { AnysIdentifyPlugin } from 'anys-web-plugin-identify';
|
|
4
|
+
import { AnysMonitorInputEventPlugin } from 'anys-web-plugin-monitor-input-event';
|
|
5
|
+
import { AnysMonitorMouseEventPlugin } from 'anys-web-plugin-monitor-mouse-event';
|
|
6
|
+
import { AnysMonitorWindowActivityPlugin } from 'anys-web-plugin-monitor-window-activity';
|
|
7
|
+
import { AnysMonitorUrlPlugin } from 'anys-web-plugin-monitor-url';
|
|
8
|
+
import { AnysMonitorTouchEventPlugin } from 'anys-web-plugin-monitor-touch-event';
|
|
9
|
+
import { AnysStoreOfflinePlugin } from 'anys-web-plugin-store-offline';
|
|
10
|
+
import { AnysMonitorDOMMutationPlugin } from 'anys-web-plugin-monitor-dom-mutation';
|
|
11
|
+
import { AnysMonitorWindowSizePlugin } from 'anys-web-plugin-monitor-window-size';
|
|
12
|
+
import { AnysMonitorScrollEventPlugin } from 'anys-web-plugin-monitor-scroll-event';
|
|
13
|
+
|
|
14
|
+
export class AnysRecorderPlugin extends AnysPlugin {
|
|
15
|
+
static dependencies = [
|
|
16
|
+
AnysStoreOfflinePlugin,
|
|
17
|
+
AnysMonitorUrlPlugin,
|
|
18
|
+
AnysMonitorWindowSizePlugin,
|
|
19
|
+
AnysMonitorDOMMutationPlugin,
|
|
20
|
+
AnysIdentifyPlugin,
|
|
21
|
+
AnysMonitorAjaxPlugin,
|
|
22
|
+
AnysMonitorInputEventPlugin,
|
|
23
|
+
AnysMonitorMouseEventPlugin,
|
|
24
|
+
AnysMonitorWindowActivityPlugin,
|
|
25
|
+
AnysMonitorTouchEventPlugin,
|
|
26
|
+
AnysMonitorScrollEventPlugin,
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
constructor(anys, [offlineLogger, urlMonitor, windowSizeMonitor, DOMMutationMonitor]) {
|
|
30
|
+
super(anys);
|
|
31
|
+
this.offlineLogger = offlineLogger;
|
|
32
|
+
this.urlMonitor = urlMonitor;
|
|
33
|
+
this.windowSizeMonitor = windowSizeMonitor;
|
|
34
|
+
this.DOMMutationMonitor = DOMMutationMonitor;
|
|
35
|
+
// cache for trace logs to be send by beacon
|
|
36
|
+
this.cache = {};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
options() {
|
|
40
|
+
const isSupportTouch = 'ontouchend' in document;
|
|
41
|
+
return {
|
|
42
|
+
touch: isSupportTouch,
|
|
43
|
+
mouse: !isSupportTouch,
|
|
44
|
+
click: false,
|
|
45
|
+
mousedown: true,
|
|
46
|
+
mousemove: true,
|
|
47
|
+
mouseup: true,
|
|
48
|
+
autoReport: false,
|
|
49
|
+
reportUrl: new Error('[Anys]: options.reportUrl is required!'),
|
|
50
|
+
reportInterval: 10000,
|
|
51
|
+
reportParams: null,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
registerAutoReport() {
|
|
56
|
+
const { clientId } = this.anys;
|
|
57
|
+
const autoReportWhenRefreshTraceId = ({ prev }) => {
|
|
58
|
+
// report previous trace logs
|
|
59
|
+
this.anys.report([
|
|
60
|
+
{ key: 'client', value: clientId },
|
|
61
|
+
{ key: 'trace', value: prev },
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
// clear cache
|
|
65
|
+
this.cache = {};
|
|
66
|
+
|
|
67
|
+
// record new information
|
|
68
|
+
this.urlMonitor.recordUrl();
|
|
69
|
+
this.windowSizeMonitor.recordSize();
|
|
70
|
+
this.DOMMutationMonitor.recordSnapshot();
|
|
71
|
+
};
|
|
72
|
+
this.anys.on('refreshTraceId', autoReportWhenRefreshTraceId);
|
|
73
|
+
|
|
74
|
+
const timer = setInterval(() => {
|
|
75
|
+
this.anys.report();
|
|
76
|
+
this.cache = {};
|
|
77
|
+
}, this.anys.options.reportInterval);
|
|
78
|
+
|
|
79
|
+
let isUnloaded = 0;
|
|
80
|
+
const sendBeaconWhenBeforeUnload = () => {
|
|
81
|
+
if (isUnloaded) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
isUnloaded = 1;
|
|
85
|
+
|
|
86
|
+
const ids = Object.keys(this.cache);
|
|
87
|
+
const logs = Object.values(this.cache);
|
|
88
|
+
if (ids.length) {
|
|
89
|
+
this.offlineLogger.remove(ids); // async may not executed
|
|
90
|
+
navigator.sendBeacon(this.anys.options.reportUrl, JSON.stringify(logs));
|
|
91
|
+
this.cache = {};
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
window.addEventListener('beforeunload', sendBeaconWhenBeforeUnload);
|
|
95
|
+
window.addEventListener('pagehide', sendBeaconWhenBeforeUnload); // 兼容微信浏览器
|
|
96
|
+
window.addEventListener('unload', sendBeaconWhenBeforeUnload);
|
|
97
|
+
|
|
98
|
+
const addCacheWhenWriteLog = ({ id, data }) => {
|
|
99
|
+
this.cache[id] = data;
|
|
100
|
+
};
|
|
101
|
+
this.anys.on('writeOfflineLog', addCacheWhenWriteLog);
|
|
102
|
+
|
|
103
|
+
return () => {
|
|
104
|
+
this.anys.off('refreshTraceId', autoReportWhenRefreshTraceId);
|
|
105
|
+
this.anys.off('writeOfflineLog', addCacheWhenWriteLog);
|
|
106
|
+
// @ts-ignore
|
|
107
|
+
clearInterval(timer);
|
|
108
|
+
window.removeEventListener('beforeunload', sendBeaconWhenBeforeUnload);
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* define read here, so that recorder will not send other plugins 'read' output
|
|
114
|
+
* @param {*} message
|
|
115
|
+
* @returns
|
|
116
|
+
*/
|
|
117
|
+
read(message) {
|
|
118
|
+
return this.offlineLogger.read(message);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
send(logs) {
|
|
122
|
+
const groups = [];
|
|
123
|
+
let i = 0;
|
|
124
|
+
|
|
125
|
+
logs.forEach((item) => {
|
|
126
|
+
groups[i] = groups[i] || [];
|
|
127
|
+
groups[i].push(item);
|
|
128
|
+
if (groups[i].length > 200) {
|
|
129
|
+
i ++;
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
groups.forEach((data) => {
|
|
134
|
+
const items = [];
|
|
135
|
+
const ids = [];
|
|
136
|
+
|
|
137
|
+
data.forEach((item) => {
|
|
138
|
+
const { _id, ...info } = item;
|
|
139
|
+
ids.push(_id);
|
|
140
|
+
items.push(info);
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
if (!items.length) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const { reportUrl, reportParams } = this.anys.options;
|
|
148
|
+
const url = reportParams ? replaceUrlSearch(reportUrl, reportParams) : reportUrl;
|
|
149
|
+
ajaxPost(url, items).then(() => {
|
|
150
|
+
this.offlineLogger.remove(ids);
|
|
151
|
+
ids.forEach((id) => {
|
|
152
|
+
delete this.cache[id];
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
auth(info) {
|
|
159
|
+
this.anys.options.reportParams = Object.assign(this.anys.options.reportParams || {}, info);
|
|
160
|
+
}
|
|
161
|
+
}
|