@inappstory/game-center-api 1.3.13 → 1.3.14
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/lib/ResourceManager.d.ts +2 -2
- package/lib/ResourceManager.js +41 -13
- package/lib/errorHandler.d.ts +1 -1
- package/lib/errorHandler.js +22 -17
- package/lib/iasApi.js +13 -2
- package/lib/index.d.ts +1 -1
- package/lib/localData.js +7 -3
- package/lib/logger.html +15 -3
- package/lib/sdkApi/filePicker.js +17 -2
- package/lib/sdkApi/index.js +1 -2
- package/lib/sdkApi/initGame.js +11 -10
- package/lib/sdkApi/share.js +1 -2
- package/package.json +1 -1
package/lib/ResourceManager.d.ts
CHANGED
|
@@ -17,10 +17,10 @@ export declare class ResourceManager {
|
|
|
17
17
|
private addResourceToCacheTree;
|
|
18
18
|
private createCacheTree;
|
|
19
19
|
cacheAllResources(): Promise<void>;
|
|
20
|
-
cacheResource({ uri, originUri,
|
|
20
|
+
cacheResource({ uri, originUri, resourceKeys, }: {
|
|
21
21
|
uri: string;
|
|
22
22
|
originUri?: string;
|
|
23
|
-
|
|
23
|
+
resourceKeys?: string[];
|
|
24
24
|
}): Promise<string>;
|
|
25
25
|
private createObjectUrlByUri;
|
|
26
26
|
revokeCache(): void;
|
package/lib/ResourceManager.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ResourceManager = void 0;
|
|
4
4
|
const fetchLocalFile_1 = require("./sdkApi/fetchLocalFile");
|
|
5
|
+
const errorHandler_1 = require("./errorHandler");
|
|
5
6
|
let instance;
|
|
6
7
|
class ResourceManager {
|
|
7
8
|
resLists;
|
|
@@ -44,11 +45,11 @@ class ResourceManager {
|
|
|
44
45
|
const { resourceForFetch, relatedResources } = this.cacheTree[resUri];
|
|
45
46
|
const promise = ((resourceForFetch, relatedResources) => {
|
|
46
47
|
return new Promise(async (resolve, reject) => {
|
|
47
|
-
const
|
|
48
|
+
const resourceKeys = relatedResources.map(resource => resource.key);
|
|
48
49
|
const uri = resourceForFetch.getUri();
|
|
49
50
|
const originUri = resourceForFetch.getOriginUri();
|
|
50
51
|
try {
|
|
51
|
-
const objectUrl = await this.cacheResource({ uri, originUri,
|
|
52
|
+
const objectUrl = await this.cacheResource({ uri, originUri, resourceKeys: resourceKeys });
|
|
52
53
|
if (objectUrl === originUri) {
|
|
53
54
|
resolve();
|
|
54
55
|
return;
|
|
@@ -59,22 +60,41 @@ class ResourceManager {
|
|
|
59
60
|
resolve();
|
|
60
61
|
}
|
|
61
62
|
catch (e) {
|
|
62
|
-
|
|
63
|
+
(0, errorHandler_1.logError)(e, { resourceKeys });
|
|
64
|
+
reject(`Can't load resource for [${resourceKeys.join(", ")}]`);
|
|
63
65
|
}
|
|
64
66
|
});
|
|
65
67
|
})(resourceForFetch, relatedResources);
|
|
66
68
|
promises.push(promise);
|
|
67
69
|
}
|
|
68
|
-
|
|
70
|
+
try {
|
|
71
|
+
await Promise.all(promises);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
(0, errorHandler_1.logError)(e);
|
|
75
|
+
}
|
|
69
76
|
for (const resList of this.resLists)
|
|
70
77
|
resList["onCacheDone"]();
|
|
71
78
|
}
|
|
72
|
-
async cacheResource({ uri, originUri = uri,
|
|
73
|
-
let objectUrl =
|
|
74
|
-
|
|
75
|
-
objectUrl = await this.createObjectUrlByUri(
|
|
76
|
-
|
|
79
|
+
async cacheResource({ uri, originUri = uri, resourceKeys = ["outerResource"], }) {
|
|
80
|
+
let objectUrl = null;
|
|
81
|
+
try {
|
|
82
|
+
objectUrl = await this.createObjectUrlByUri(uri, resourceKeys);
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
(0, errorHandler_1.logError)(e, { uri, resourceKeys });
|
|
86
|
+
}
|
|
87
|
+
if (objectUrl === null && uri !== originUri) {
|
|
88
|
+
try {
|
|
89
|
+
objectUrl = await this.createObjectUrlByUri(originUri, resourceKeys);
|
|
90
|
+
}
|
|
91
|
+
catch (e) {
|
|
92
|
+
(0, errorHandler_1.logError)(e, { originUri, resourceKeys });
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (objectUrl !== null) {
|
|
77
96
|
return objectUrl;
|
|
97
|
+
}
|
|
78
98
|
return new Promise((resolve, reject) => {
|
|
79
99
|
const image = new Image();
|
|
80
100
|
image.onload = () => resolve(originUri);
|
|
@@ -82,21 +102,29 @@ class ResourceManager {
|
|
|
82
102
|
image.src = originUri;
|
|
83
103
|
});
|
|
84
104
|
}
|
|
85
|
-
async createObjectUrlByUri(uri,
|
|
105
|
+
async createObjectUrlByUri(uri, resourceKeys) {
|
|
86
106
|
if (!uri) {
|
|
87
|
-
throw `Resource uri for [${
|
|
107
|
+
throw `Resource uri for [${resourceKeys.join(", ")}] can't be empty string`;
|
|
88
108
|
}
|
|
89
109
|
try {
|
|
90
110
|
const response = await (0, fetchLocalFile_1.fetchLocalFile)(uri);
|
|
91
111
|
if (response != null && response.ok) {
|
|
92
|
-
|
|
112
|
+
let blob = null;
|
|
113
|
+
try {
|
|
114
|
+
blob = await response.blob();
|
|
115
|
+
}
|
|
116
|
+
catch (e) {
|
|
117
|
+
(0, errorHandler_1.logError)(e);
|
|
118
|
+
throw e;
|
|
119
|
+
}
|
|
120
|
+
return URL.createObjectURL(blob);
|
|
93
121
|
}
|
|
94
122
|
else {
|
|
95
123
|
throw "";
|
|
96
124
|
}
|
|
97
125
|
}
|
|
98
126
|
catch (err) {
|
|
99
|
-
console.warn(`Error to fetch ${uri} for related images [${
|
|
127
|
+
console.warn(`Error to fetch ${uri} for related images [${resourceKeys.join(", ")}]`, err);
|
|
100
128
|
return null;
|
|
101
129
|
}
|
|
102
130
|
}
|
package/lib/errorHandler.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const logError: (e: unknown) => void;
|
|
1
|
+
export declare const logError: (e: unknown, cause?: any) => void;
|
package/lib/errorHandler.js
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.logError = void 0;
|
|
4
|
-
const logError = (e) => {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
4
|
+
const logError = (e, cause) => {
|
|
5
|
+
if (e instanceof Error) {
|
|
6
|
+
const error = e;
|
|
7
|
+
const message = {
|
|
8
|
+
type: "error",
|
|
9
|
+
errorName: error.name ?? "",
|
|
10
|
+
message: error.message ?? "",
|
|
11
|
+
stack: error.stack ?? "",
|
|
12
|
+
cause: cause ?? error.cause ?? "",
|
|
13
|
+
// @ts-ignore Non-standard: This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
|
|
14
|
+
fileName: error.fileName ?? "",
|
|
15
|
+
// @ts-ignore Non-standard: This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
|
|
16
|
+
lineNumber: error.lineNumber ?? "",
|
|
17
|
+
// @ts-ignore Non-standard: This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.
|
|
18
|
+
columnNumber: error.columnNumber ?? "",
|
|
19
|
+
};
|
|
20
|
+
// will be handled via sdk console.error override
|
|
21
|
+
console.error(message);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
console.error(e);
|
|
25
|
+
}
|
|
21
26
|
};
|
|
22
27
|
exports.logError = logError;
|
package/lib/iasApi.js
CHANGED
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.sendIasApiRequest = void 0;
|
|
4
4
|
const gameLaunchConfig_1 = require("./gameLaunchConfig");
|
|
5
5
|
const uuid_1 = require("uuid");
|
|
6
|
+
const errorHandler_1 = require("./errorHandler");
|
|
6
7
|
const prepareHeaders = (headers) => ({
|
|
7
8
|
...{
|
|
8
9
|
"Content-Type": "application/json",
|
|
@@ -34,8 +35,11 @@ async function sendIasApiRequest(requestInfo) {
|
|
|
34
35
|
error: null,
|
|
35
36
|
isOk: false,
|
|
36
37
|
};
|
|
38
|
+
let url = "";
|
|
39
|
+
let requestInit = null;
|
|
37
40
|
try {
|
|
38
|
-
|
|
41
|
+
url = prepareUrl(requestInfo.path);
|
|
42
|
+
requestInit = {
|
|
39
43
|
method: requestInfo.method, // *GET, POST, PUT, DELETE, etc.
|
|
40
44
|
mode: "cors", // no-cors, *cors, same-origin
|
|
41
45
|
cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
|
|
@@ -44,7 +48,13 @@ async function sendIasApiRequest(requestInfo) {
|
|
|
44
48
|
redirect: "follow", // manual, *follow, error
|
|
45
49
|
referrerPolicy: "no-referrer", // no-referrer, *no-referrer-when-downgrade, origin, origin-when-cross-origin, same-origin, strict-origin, strict-origin-when-cross-origin, unsafe-url
|
|
46
50
|
body: JSON.stringify(requestInfo.data), // body data type must match "Content-Type" header
|
|
47
|
-
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
catch (e) {
|
|
54
|
+
(0, errorHandler_1.logError)(e, { requestInfo });
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const response = await fetch(url, requestInit);
|
|
48
58
|
result.status = response.status;
|
|
49
59
|
result.payload = (await response.json()); // parses JSON response into native JavaScript objects
|
|
50
60
|
if (response.status >= 200 && response.status < 300) {
|
|
@@ -53,6 +63,7 @@ async function sendIasApiRequest(requestInfo) {
|
|
|
53
63
|
}
|
|
54
64
|
catch (e) {
|
|
55
65
|
result.error = e;
|
|
66
|
+
(0, errorHandler_1.logError)(e, { url, requestInit });
|
|
56
67
|
}
|
|
57
68
|
return result;
|
|
58
69
|
}
|
package/lib/index.d.ts
CHANGED
|
@@ -91,6 +91,6 @@ declare const GameCenterApi: {
|
|
|
91
91
|
getApplicationVersion: () => string | null;
|
|
92
92
|
getApplicationBuildVersion: () => number | null;
|
|
93
93
|
openGameInstance: (openGameInstance: import("./sdkApi/openGameInstance.h").OpenGameInstanceOptions) => void;
|
|
94
|
-
logError: (e: unknown) => void;
|
|
94
|
+
logError: (e: unknown, cause?: any) => void;
|
|
95
95
|
};
|
|
96
96
|
export { GameCenterApi as default };
|
package/lib/localData.js
CHANGED
|
@@ -41,7 +41,12 @@ const initLocalData = async () => {
|
|
|
41
41
|
if (localDataCreated) {
|
|
42
42
|
console.warn("Duplicate call of initLocalData. Skipping");
|
|
43
43
|
}
|
|
44
|
-
|
|
44
|
+
try {
|
|
45
|
+
exports.gameLocalData.init(Object.entries(await getClientLocalData()));
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
(0, errorHandler_1.logError)(e);
|
|
49
|
+
}
|
|
45
50
|
localDataCreated = true;
|
|
46
51
|
};
|
|
47
52
|
exports.initLocalData = initLocalData;
|
|
@@ -116,8 +121,7 @@ window.gameInstanceGetLocalDataCb = function (id, plainData) {
|
|
|
116
121
|
localData = JSON.parse(plainData);
|
|
117
122
|
}
|
|
118
123
|
catch (e) {
|
|
119
|
-
e
|
|
120
|
-
(0, errorHandler_1.logError)(e);
|
|
124
|
+
(0, errorHandler_1.logError)(e, { inputData: plainData });
|
|
121
125
|
}
|
|
122
126
|
finally {
|
|
123
127
|
if (asyncQueue_1.asyncQueue.has(id)) {
|
package/lib/logger.html
CHANGED
|
@@ -234,9 +234,21 @@
|
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
window._sendErrorLog(payload);
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
237
|
+
if (messages.length && messages[0] != null) {
|
|
238
|
+
let errorAsString = "";
|
|
239
|
+
try {
|
|
240
|
+
errorAsString = JSON.stringify(messages[0]);
|
|
241
|
+
} catch (e) {
|
|
242
|
+
// nothing here
|
|
243
|
+
}
|
|
244
|
+
// for Android
|
|
245
|
+
console.errorOrigin(errorAsString);
|
|
246
|
+
// for iOS
|
|
247
|
+
if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.errorHandler) {
|
|
248
|
+
window.webkit.messageHandlers.errorHandler.postMessage(errorAsString);
|
|
249
|
+
}
|
|
250
|
+
} else {
|
|
251
|
+
console.errorOrigin(messages);
|
|
240
252
|
}
|
|
241
253
|
};
|
|
242
254
|
</script>
|
package/lib/sdkApi/filePicker.js
CHANGED
|
@@ -5,6 +5,7 @@ const filePicker_h_1 = require("./filePicker.h");
|
|
|
5
5
|
const uuid_1 = require("uuid");
|
|
6
6
|
const asyncQueue_1 = require("../asyncQueue");
|
|
7
7
|
const env_1 = require("../env");
|
|
8
|
+
const errorHandler_1 = require("../errorHandler");
|
|
8
9
|
const defaultLang = "en";
|
|
9
10
|
// TODO plural and templates for messages
|
|
10
11
|
const messages = {
|
|
@@ -100,7 +101,14 @@ const openFilePicker = async ({ accept, multiple, resultAsFiles, lang, }) => {
|
|
|
100
101
|
const blobs = new Array();
|
|
101
102
|
response.forEach(src => {
|
|
102
103
|
blobs.push(async () => {
|
|
103
|
-
|
|
104
|
+
let blob = null;
|
|
105
|
+
try {
|
|
106
|
+
blob = await (await fetch(src)).blob();
|
|
107
|
+
}
|
|
108
|
+
catch (e) {
|
|
109
|
+
(0, errorHandler_1.logError)(e);
|
|
110
|
+
throw e;
|
|
111
|
+
}
|
|
104
112
|
const fileName = src.split("\\").pop()?.split("/").pop() || "image";
|
|
105
113
|
// dataTransfer.items.add(new File([blob], fileName, {
|
|
106
114
|
// type: blob.type,
|
|
@@ -151,7 +159,14 @@ const openFilePicker = async ({ accept, multiple, resultAsFiles, lang, }) => {
|
|
|
151
159
|
duration: sdkFileResponse.duration,
|
|
152
160
|
getBlob: async () => {
|
|
153
161
|
const fetchPath = sdkFileResponse.fetchPath;
|
|
154
|
-
|
|
162
|
+
let blob = null;
|
|
163
|
+
try {
|
|
164
|
+
blob = await (await fetch(fetchPath)).blob();
|
|
165
|
+
}
|
|
166
|
+
catch (e) {
|
|
167
|
+
(0, errorHandler_1.logError)(e);
|
|
168
|
+
throw e;
|
|
169
|
+
}
|
|
155
170
|
return new File([blob], fileName, {
|
|
156
171
|
type: blob.type,
|
|
157
172
|
lastModified: new Date().getTime(),
|
package/lib/sdkApi/index.js
CHANGED
|
@@ -51,8 +51,7 @@ const createSdkApi = ({ mounted, beforeUnmount: beforeUnmountCb, onSdkCloseGameR
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
catch (e) {
|
|
54
|
-
e
|
|
55
|
-
(0, errorHandler_1.logError)(e);
|
|
54
|
+
(0, errorHandler_1.logError)(e, { inputData: payload });
|
|
56
55
|
}
|
|
57
56
|
};
|
|
58
57
|
// create bridge for web-sdk
|
package/lib/sdkApi/initGame.js
CHANGED
|
@@ -36,8 +36,7 @@ const gameReader = (function () {
|
|
|
36
36
|
window.gameLoadingInfo.description = "index: " + i;
|
|
37
37
|
}
|
|
38
38
|
catch (e) {
|
|
39
|
-
e
|
|
40
|
-
(0, errorHandler_1.logError)(e);
|
|
39
|
+
(0, errorHandler_1.logError)(e, { src: "gameReaderInit queue" });
|
|
41
40
|
}
|
|
42
41
|
};
|
|
43
42
|
})(self._e[i], i));
|
|
@@ -62,8 +61,7 @@ const gameReader = (function () {
|
|
|
62
61
|
window.gameLoadingInfo.description = "index: " + i;
|
|
63
62
|
}
|
|
64
63
|
catch (e) {
|
|
65
|
-
e
|
|
66
|
-
(0, errorHandler_1.logError)(e);
|
|
64
|
+
(0, errorHandler_1.logError)(e, { src: "gameReaderInit sessionStorage queue" });
|
|
67
65
|
}
|
|
68
66
|
};
|
|
69
67
|
})(_initQueue[i], i));
|
|
@@ -85,8 +83,7 @@ const gameReader = (function () {
|
|
|
85
83
|
window.gameLoadingInfo.description = "";
|
|
86
84
|
}
|
|
87
85
|
catch (e) {
|
|
88
|
-
e
|
|
89
|
-
(0, errorHandler_1.logError)(e);
|
|
86
|
+
(0, errorHandler_1.logError)(e, { src: "gameReaderInit ready" });
|
|
90
87
|
}
|
|
91
88
|
});
|
|
92
89
|
};
|
|
@@ -118,13 +115,18 @@ const createInitGame = (initLocalData, mounted = () => { }) => {
|
|
|
118
115
|
// bcz web-sdk cannot access to document.documentElement inside game iFrame
|
|
119
116
|
window.document.documentElement.dir = gameLaunchConfig_1.gameLaunchConfig?.clientConfig?.dir;
|
|
120
117
|
}
|
|
121
|
-
|
|
118
|
+
try {
|
|
119
|
+
await initLocalData();
|
|
120
|
+
}
|
|
121
|
+
catch (e) {
|
|
122
|
+
(0, errorHandler_1.logError)(e);
|
|
123
|
+
throw e;
|
|
124
|
+
}
|
|
122
125
|
mounted();
|
|
123
126
|
window.gameLoadingInfo.state = "after call initGame";
|
|
124
127
|
window.gameLoadingInfo.description = JSON.stringify(config);
|
|
125
128
|
}
|
|
126
129
|
catch (e) {
|
|
127
|
-
e.cause = { src: "initGame" };
|
|
128
130
|
(0, errorHandler_1.logError)(e);
|
|
129
131
|
}
|
|
130
132
|
};
|
|
@@ -202,8 +204,7 @@ const gameLoadedSdkCallbackInternal = (config) => {
|
|
|
202
204
|
}
|
|
203
205
|
}
|
|
204
206
|
catch (e) {
|
|
205
|
-
e
|
|
206
|
-
(0, errorHandler_1.logError)(e);
|
|
207
|
+
(0, errorHandler_1.logError)(e, { src: "gameLoadedSdkCallback" });
|
|
207
208
|
}
|
|
208
209
|
};
|
|
209
210
|
const _gameLoadingInfoCreated = {
|
package/lib/sdkApi/share.js
CHANGED