@itwin/core-mobile 4.0.0-dev.8 → 4.0.0-dev.81
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/CHANGELOG.md +48 -1
- package/README.md +1 -1
- package/lib/cjs/MobileBackend.d.ts +7 -7
- package/lib/cjs/MobileBackend.js +28 -24
- package/lib/cjs/MobileBackend.js.map +1 -1
- package/lib/cjs/MobileFrontend.d.ts +5 -5
- package/lib/cjs/MobileFrontend.js +25 -21
- package/lib/cjs/MobileFrontend.js.map +1 -1
- package/lib/cjs/__DOC_ONLY__.d.ts +33 -33
- package/lib/cjs/__DOC_ONLY__.js +56 -52
- package/lib/cjs/__DOC_ONLY__.js.map +1 -1
- package/lib/cjs/backend/MobileAuthorizationBackend.d.ts +17 -17
- package/lib/cjs/backend/MobileAuthorizationBackend.js +46 -46
- package/lib/cjs/backend/MobileAuthorizationBackend.js.map +1 -1
- package/lib/cjs/backend/MobileFileHandler.d.ts +112 -112
- package/lib/cjs/backend/MobileFileHandler.d.ts.map +1 -1
- package/lib/cjs/backend/MobileFileHandler.js +263 -263
- package/lib/cjs/backend/MobileFileHandler.js.map +1 -1
- package/lib/cjs/backend/MobileHost.d.ts +72 -72
- package/lib/cjs/backend/MobileHost.d.ts.map +1 -1
- package/lib/cjs/backend/MobileHost.js +149 -156
- package/lib/cjs/backend/MobileHost.js.map +1 -1
- package/lib/cjs/backend/MobileRpcServer.d.ts +19 -19
- package/lib/cjs/backend/MobileRpcServer.js +156 -156
- package/lib/cjs/backend/MobileRpcServer.js.map +1 -1
- package/lib/cjs/backend/Request.d.ts +117 -149
- package/lib/cjs/backend/Request.d.ts.map +1 -1
- package/lib/cjs/backend/Request.js +255 -267
- package/lib/cjs/backend/Request.js.map +1 -1
- package/lib/cjs/common/MobileAppChannel.d.ts +4 -4
- package/lib/cjs/common/MobileAppChannel.js +11 -11
- package/lib/cjs/common/MobileAppChannel.js.map +1 -1
- package/lib/cjs/common/MobileAppProps.d.ts +35 -35
- package/lib/cjs/common/MobileAppProps.d.ts.map +1 -1
- package/lib/cjs/common/MobileAppProps.js +26 -26
- package/lib/cjs/common/MobileAppProps.js.map +1 -1
- package/lib/cjs/common/MobileEventLoop.d.ts +11 -11
- package/lib/cjs/common/MobileEventLoop.js +30 -30
- package/lib/cjs/common/MobileEventLoop.js.map +1 -1
- package/lib/cjs/common/MobileIpc.d.ts +17 -17
- package/lib/cjs/common/MobileIpc.js +70 -70
- package/lib/cjs/common/MobileIpc.js.map +1 -1
- package/lib/cjs/common/MobilePush.d.ts +20 -20
- package/lib/cjs/common/MobilePush.js +53 -53
- package/lib/cjs/common/MobilePush.js.map +1 -1
- package/lib/cjs/common/MobileRpcManager.d.ts +40 -40
- package/lib/cjs/common/MobileRpcManager.js +110 -110
- package/lib/cjs/common/MobileRpcManager.js.map +1 -1
- package/lib/cjs/common/MobileRpcProtocol.d.ts +58 -58
- package/lib/cjs/common/MobileRpcProtocol.d.ts.map +1 -1
- package/lib/cjs/common/MobileRpcProtocol.js +277 -277
- package/lib/cjs/common/MobileRpcProtocol.js.map +1 -1
- package/lib/cjs/common/MobileRpcRequest.d.ts +20 -20
- package/lib/cjs/common/MobileRpcRequest.js +50 -50
- package/lib/cjs/common/MobileRpcRequest.js.map +1 -1
- package/lib/cjs/frontend/MobileApp.d.ts +23 -23
- package/lib/cjs/frontend/MobileApp.d.ts.map +1 -1
- package/lib/cjs/frontend/MobileApp.js +79 -80
- package/lib/cjs/frontend/MobileApp.js.map +1 -1
- package/lib/cjs/frontend/MobileAuthorizationFrontend.d.ts +17 -17
- package/lib/cjs/frontend/MobileAuthorizationFrontend.d.ts.map +1 -1
- package/lib/cjs/frontend/MobileAuthorizationFrontend.js +54 -46
- package/lib/cjs/frontend/MobileAuthorizationFrontend.js.map +1 -1
- package/lib/cjs/test/ios/MobilePlatform.test.d.ts +1 -1
- package/lib/cjs/test/ios/MobilePlatform.test.js +84 -84
- package/lib/cjs/test/ios/MobilePlatform.test.js.map +1 -1
- package/package.json +18 -26
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
import { BeEvent } from "@itwin/core-bentley";
|
|
2
|
-
import { NativeHostOpts } from "@itwin/core-backend";
|
|
3
|
-
import { RpcInterfaceDefinition } from "@itwin/core-common";
|
|
4
|
-
import { CancelRequest } from "./MobileFileHandler";
|
|
5
|
-
import { ProgressCallback } from "./Request";
|
|
6
|
-
import { BatteryState, DeviceEvents, MobileNotifications, Orientation } from "../common/MobileAppProps";
|
|
7
|
-
/** @beta */
|
|
8
|
-
export
|
|
9
|
-
/** @beta */
|
|
10
|
-
export
|
|
11
|
-
/** @beta */
|
|
12
|
-
export
|
|
13
|
-
/** @beta */
|
|
14
|
-
export interface DownloadTask {
|
|
15
|
-
url: string;
|
|
16
|
-
downloadPath: string;
|
|
17
|
-
isDetached: boolean;
|
|
18
|
-
isRunning: boolean;
|
|
19
|
-
totalBytes?: number;
|
|
20
|
-
doneBytes?: number;
|
|
21
|
-
cancelId?: number;
|
|
22
|
-
isBackground?: boolean;
|
|
23
|
-
cancel?: MobileCancelCallback;
|
|
24
|
-
toBackground: () => boolean;
|
|
25
|
-
toForeground: () => boolean;
|
|
26
|
-
}
|
|
27
|
-
/** @beta */
|
|
28
|
-
export declare abstract class MobileDevice {
|
|
29
|
-
emit(eventName: DeviceEvents, ...args: any[]): void;
|
|
30
|
-
abstract getOrientation(): Orientation;
|
|
31
|
-
abstract getBatteryState(): BatteryState;
|
|
32
|
-
abstract getBatteryLevel(): number;
|
|
33
|
-
abstract createDownloadTask(downloadUrl: string, isBackground: boolean, downloadTo: string, completion: MobileCompletionCallback, progress?: MobileProgressCallback): number;
|
|
34
|
-
abstract cancelDownloadTask(cancelId: number): boolean;
|
|
35
|
-
abstract getDownloadTasks(): DownloadTask[];
|
|
36
|
-
abstract resumeDownloadInForeground(requestId: number): boolean;
|
|
37
|
-
abstract resumeDownloadInBackground(requestId: number): boolean;
|
|
38
|
-
abstract reconnect(connection: number): void;
|
|
39
|
-
abstract authGetAccessToken(callback: (accessToken?: string, expirationDate?: string, err?: string) => void): void;
|
|
40
|
-
}
|
|
41
|
-
/** @beta */
|
|
42
|
-
export interface MobileHostOpts extends NativeHostOpts {
|
|
43
|
-
mobileHost?: {
|
|
44
|
-
device?: MobileDevice;
|
|
45
|
-
/** list of RPC interface definitions to register */
|
|
46
|
-
rpcInterfaces?: RpcInterfaceDefinition[];
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* @beta
|
|
51
|
-
*/
|
|
52
|
-
export declare class MobileHost {
|
|
53
|
-
private static _device?;
|
|
54
|
-
static get device(): MobileDevice;
|
|
55
|
-
static readonly onMemoryWarning: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
56
|
-
static readonly onOrientationChanged: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
57
|
-
static readonly onEnterForeground: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
58
|
-
static readonly onEnterBackground: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
59
|
-
static readonly onWillTerminate: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
60
|
-
static readonly onAuthAccessTokenChanged: BeEvent<(accessToken: string | undefined, expirationDate: string | undefined) => void>;
|
|
61
|
-
/** Send a notification to the MobileApp connected to this MobileHost. */
|
|
62
|
-
static notifyMobileFrontend<T extends keyof MobileNotifications>(methodName: T, ...args: Parameters<MobileNotifications[T]>): void;
|
|
63
|
-
/** @internal */
|
|
64
|
-
static reconnect(connection: number): void;
|
|
65
|
-
/** @internal */
|
|
66
|
-
static authGetAccessToken(): Promise<[string, string]>;
|
|
67
|
-
/** @internal */
|
|
68
|
-
static downloadFile(downloadUrl: string, downloadTo: string, progress?: ProgressCallback, cancelRequest?: CancelRequest): Promise<void>;
|
|
69
|
-
static get isValid(): boolean;
|
|
70
|
-
/** Start the backend of a mobile app. */
|
|
71
|
-
static startup(opt?: MobileHostOpts): Promise<void>;
|
|
72
|
-
}
|
|
1
|
+
import { BeEvent } from "@itwin/core-bentley";
|
|
2
|
+
import { NativeHostOpts } from "@itwin/core-backend";
|
|
3
|
+
import { RpcInterfaceDefinition } from "@itwin/core-common";
|
|
4
|
+
import { CancelRequest } from "./MobileFileHandler";
|
|
5
|
+
import { ProgressCallback } from "./Request";
|
|
6
|
+
import { BatteryState, DeviceEvents, MobileNotifications, Orientation } from "../common/MobileAppProps";
|
|
7
|
+
/** @beta */
|
|
8
|
+
export type MobileCompletionCallback = (downloadUrl: string, downloadFileUrl: string, cancelled: boolean, err?: string) => void;
|
|
9
|
+
/** @beta */
|
|
10
|
+
export type MobileProgressCallback = (bytesWritten: number, totalBytesWritten: number, totalBytesExpectedToWrite: number) => void;
|
|
11
|
+
/** @beta */
|
|
12
|
+
export type MobileCancelCallback = () => boolean;
|
|
13
|
+
/** @beta */
|
|
14
|
+
export interface DownloadTask {
|
|
15
|
+
url: string;
|
|
16
|
+
downloadPath: string;
|
|
17
|
+
isDetached: boolean;
|
|
18
|
+
isRunning: boolean;
|
|
19
|
+
totalBytes?: number;
|
|
20
|
+
doneBytes?: number;
|
|
21
|
+
cancelId?: number;
|
|
22
|
+
isBackground?: boolean;
|
|
23
|
+
cancel?: MobileCancelCallback;
|
|
24
|
+
toBackground: () => boolean;
|
|
25
|
+
toForeground: () => boolean;
|
|
26
|
+
}
|
|
27
|
+
/** @beta */
|
|
28
|
+
export declare abstract class MobileDevice {
|
|
29
|
+
emit(eventName: DeviceEvents, ...args: any[]): void;
|
|
30
|
+
abstract getOrientation(): Orientation;
|
|
31
|
+
abstract getBatteryState(): BatteryState;
|
|
32
|
+
abstract getBatteryLevel(): number;
|
|
33
|
+
abstract createDownloadTask(downloadUrl: string, isBackground: boolean, downloadTo: string, completion: MobileCompletionCallback, progress?: MobileProgressCallback): number;
|
|
34
|
+
abstract cancelDownloadTask(cancelId: number): boolean;
|
|
35
|
+
abstract getDownloadTasks(): DownloadTask[];
|
|
36
|
+
abstract resumeDownloadInForeground(requestId: number): boolean;
|
|
37
|
+
abstract resumeDownloadInBackground(requestId: number): boolean;
|
|
38
|
+
abstract reconnect(connection: number): void;
|
|
39
|
+
abstract authGetAccessToken(callback: (accessToken?: string, expirationDate?: string, err?: string) => void): void;
|
|
40
|
+
}
|
|
41
|
+
/** @beta */
|
|
42
|
+
export interface MobileHostOpts extends NativeHostOpts {
|
|
43
|
+
mobileHost?: {
|
|
44
|
+
device?: MobileDevice;
|
|
45
|
+
/** list of RPC interface definitions to register */
|
|
46
|
+
rpcInterfaces?: RpcInterfaceDefinition[];
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* @beta
|
|
51
|
+
*/
|
|
52
|
+
export declare class MobileHost {
|
|
53
|
+
private static _device?;
|
|
54
|
+
static get device(): MobileDevice;
|
|
55
|
+
static readonly onMemoryWarning: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
56
|
+
static readonly onOrientationChanged: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
57
|
+
static readonly onEnterForeground: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
58
|
+
static readonly onEnterBackground: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
59
|
+
static readonly onWillTerminate: BeEvent<import("@itwin/core-bentley").Listener>;
|
|
60
|
+
static readonly onAuthAccessTokenChanged: BeEvent<(accessToken: string | undefined, expirationDate: string | undefined) => void>;
|
|
61
|
+
/** Send a notification to the MobileApp connected to this MobileHost. */
|
|
62
|
+
static notifyMobileFrontend<T extends keyof MobileNotifications>(methodName: T, ...args: Parameters<MobileNotifications[T]>): void;
|
|
63
|
+
/** @internal */
|
|
64
|
+
static reconnect(connection: number): void;
|
|
65
|
+
/** @internal */
|
|
66
|
+
static authGetAccessToken(): Promise<[string, string]>;
|
|
67
|
+
/** @internal */
|
|
68
|
+
static downloadFile(downloadUrl: string, downloadTo: string, progress?: ProgressCallback, cancelRequest?: CancelRequest): Promise<void>;
|
|
69
|
+
static get isValid(): boolean;
|
|
70
|
+
/** Start the backend of a mobile app. */
|
|
71
|
+
static startup(opt?: MobileHostOpts): Promise<void>;
|
|
72
|
+
}
|
|
73
73
|
//# sourceMappingURL=MobileHost.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MobileHost.d.ts","sourceRoot":"","sources":["../../../src/backend/MobileHost.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,OAAO,EAAmB,MAAM,qBAAqB,CAAC;AAC5E,OAAO,EAAmC,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtF,OAAO,
|
|
1
|
+
{"version":3,"file":"MobileHost.d.ts","sourceRoot":"","sources":["../../../src/backend/MobileHost.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,157 +1,150 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
|
3
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
|
6
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
-
exports.MobileHost = exports.MobileDevice = void 0;
|
|
8
|
-
const core_bentley_1 = require("@itwin/core-bentley");
|
|
9
|
-
const core_backend_1 = require("@itwin/core-backend");
|
|
10
|
-
const core_common_1 = require("@itwin/core-common");
|
|
11
|
-
const MobileFileHandler_1 = require("./MobileFileHandler");
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
let
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
}
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
exports.MobileHost = MobileHost;
|
|
151
|
-
MobileHost.onMemoryWarning = new core_bentley_1.BeEvent();
|
|
152
|
-
MobileHost.onOrientationChanged = new core_bentley_1.BeEvent();
|
|
153
|
-
MobileHost.onEnterForeground = new core_bentley_1.BeEvent();
|
|
154
|
-
MobileHost.onEnterBackground = new core_bentley_1.BeEvent();
|
|
155
|
-
MobileHost.onWillTerminate = new core_bentley_1.BeEvent();
|
|
156
|
-
MobileHost.onAuthAccessTokenChanged = new core_bentley_1.BeEvent();
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
+
*--------------------------------------------------------------------------------------------*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.MobileHost = exports.MobileDevice = void 0;
|
|
8
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
9
|
+
const core_backend_1 = require("@itwin/core-backend");
|
|
10
|
+
const core_common_1 = require("@itwin/core-common");
|
|
11
|
+
const MobileFileHandler_1 = require("./MobileFileHandler");
|
|
12
|
+
const MobileAppChannel_1 = require("../common/MobileAppChannel");
|
|
13
|
+
const MobileRpcManager_1 = require("../common/MobileRpcManager");
|
|
14
|
+
const MobileAuthorizationBackend_1 = require("./MobileAuthorizationBackend");
|
|
15
|
+
const MobileRpcServer_1 = require("./MobileRpcServer");
|
|
16
|
+
/** @beta */
|
|
17
|
+
class MobileDevice {
|
|
18
|
+
emit(eventName, ...args) {
|
|
19
|
+
switch (eventName) {
|
|
20
|
+
case "memoryWarning":
|
|
21
|
+
MobileHost.onMemoryWarning.raiseEvent(...args);
|
|
22
|
+
break;
|
|
23
|
+
case "orientationChanged":
|
|
24
|
+
MobileHost.onOrientationChanged.raiseEvent(...args);
|
|
25
|
+
break;
|
|
26
|
+
case "enterForeground":
|
|
27
|
+
MobileHost.onEnterForeground.raiseEvent(...args);
|
|
28
|
+
break;
|
|
29
|
+
case "enterBackground":
|
|
30
|
+
MobileHost.onEnterBackground.raiseEvent(...args);
|
|
31
|
+
break;
|
|
32
|
+
case "willTerminate":
|
|
33
|
+
MobileHost.onWillTerminate.raiseEvent(...args);
|
|
34
|
+
break;
|
|
35
|
+
case "authAccessTokenChanged":
|
|
36
|
+
MobileHost.onAuthAccessTokenChanged.raiseEvent(args[0], args[1]);
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.MobileDevice = MobileDevice;
|
|
42
|
+
class MobileAppHandler extends core_backend_1.IpcHandler {
|
|
43
|
+
get channelName() { return MobileAppChannel_1.mobileAppChannel; }
|
|
44
|
+
async reconnect(connection) {
|
|
45
|
+
MobileHost.reconnect(connection);
|
|
46
|
+
}
|
|
47
|
+
async getAccessToken() {
|
|
48
|
+
return MobileHost.authGetAccessToken();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* @beta
|
|
53
|
+
*/
|
|
54
|
+
class MobileHost {
|
|
55
|
+
static get device() { return this._device; }
|
|
56
|
+
/** Send a notification to the MobileApp connected to this MobileHost. */
|
|
57
|
+
static notifyMobileFrontend(methodName, ...args) {
|
|
58
|
+
return core_backend_1.IpcHost.send(MobileAppChannel_1.mobileAppNotify, methodName, ...args);
|
|
59
|
+
}
|
|
60
|
+
/** @internal */
|
|
61
|
+
static reconnect(connection) {
|
|
62
|
+
this.device.reconnect(connection);
|
|
63
|
+
}
|
|
64
|
+
/** @internal */
|
|
65
|
+
static async authGetAccessToken() {
|
|
66
|
+
return new Promise((resolve, reject) => {
|
|
67
|
+
this.device.authGetAccessToken((tokenString, expirationDate, error) => {
|
|
68
|
+
if (error) {
|
|
69
|
+
reject(error);
|
|
70
|
+
}
|
|
71
|
+
resolve([tokenString ?? "", expirationDate ?? ""]);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** @internal */
|
|
76
|
+
static async downloadFile(downloadUrl, downloadTo, progress, cancelRequest) {
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
let progressCb;
|
|
79
|
+
let lastReportedOn = Date.now();
|
|
80
|
+
const minTimeBeforeReportingProgress = 1000;
|
|
81
|
+
if (progress) {
|
|
82
|
+
progressCb = (_bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) => {
|
|
83
|
+
const currentTime = Date.now();
|
|
84
|
+
const timeSinceLastEvent = currentTime - lastReportedOn;
|
|
85
|
+
// report all event for last 5 Mbs so we never miss 100% progress event
|
|
86
|
+
const lastEvent = (totalBytesExpectedToWrite - totalBytesWritten) < 1024 * 1024 * 5;
|
|
87
|
+
if (timeSinceLastEvent < minTimeBeforeReportingProgress && !lastEvent)
|
|
88
|
+
return;
|
|
89
|
+
lastReportedOn = currentTime;
|
|
90
|
+
const percent = Number((100 * (totalBytesWritten / totalBytesExpectedToWrite)).toFixed(2));
|
|
91
|
+
progress({ total: totalBytesExpectedToWrite, loaded: totalBytesWritten, percent });
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
const requestId = this.device.createDownloadTask(downloadUrl, false, downloadTo, (_downloadUrl, _downloadFileUrl, cancelled, err) => {
|
|
95
|
+
if (cancelled)
|
|
96
|
+
reject(new MobileFileHandler_1.UserCancelledError(core_bentley_1.BriefcaseStatus.DownloadCancelled, "User cancelled download"));
|
|
97
|
+
else if (err)
|
|
98
|
+
reject(new MobileFileHandler_1.DownloadFailed(400, "Download failed"));
|
|
99
|
+
else
|
|
100
|
+
resolve();
|
|
101
|
+
}, progressCb);
|
|
102
|
+
if (cancelRequest) {
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/unbound-method
|
|
104
|
+
cancelRequest.cancel = () => this.device.cancelDownloadTask(requestId);
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
static get isValid() { return undefined !== this._device; }
|
|
109
|
+
/** Start the backend of a mobile app. */
|
|
110
|
+
static async startup(opt) {
|
|
111
|
+
const authorizationClient = new MobileAuthorizationBackend_1.MobileAuthorizationBackend();
|
|
112
|
+
if (!this.isValid) {
|
|
113
|
+
this._device = opt?.mobileHost?.device ?? new MobileDevice();
|
|
114
|
+
// set global device interface.
|
|
115
|
+
global.__iTwinJsNativeBridge = this._device;
|
|
116
|
+
this.onMemoryWarning.addListener(() => {
|
|
117
|
+
MobileHost.notifyMobileFrontend("notifyMemoryWarning");
|
|
118
|
+
});
|
|
119
|
+
this.onOrientationChanged.addListener(() => {
|
|
120
|
+
MobileHost.notifyMobileFrontend("notifyOrientationChanged");
|
|
121
|
+
});
|
|
122
|
+
this.onWillTerminate.addListener(() => {
|
|
123
|
+
MobileHost.notifyMobileFrontend("notifyWillTerminate");
|
|
124
|
+
});
|
|
125
|
+
this.onAuthAccessTokenChanged.addListener((accessToken, expirationDate) => {
|
|
126
|
+
authorizationClient.setAccessToken(accessToken, expirationDate);
|
|
127
|
+
MobileHost.notifyMobileFrontend("notifyAuthAccessTokenChanged", accessToken, expirationDate);
|
|
128
|
+
});
|
|
129
|
+
// following will provide impl for device specific api.
|
|
130
|
+
(0, MobileRpcServer_1.setupMobileRpc)();
|
|
131
|
+
}
|
|
132
|
+
const socket = opt?.ipcHost?.socket ?? new core_common_1.IpcWebSocketBackend();
|
|
133
|
+
opt = { ...opt, mobileHost: { ...opt?.mobileHost }, ipcHost: { ...opt?.ipcHost, socket } };
|
|
134
|
+
const iModelHost = opt?.iModelHost ?? {};
|
|
135
|
+
iModelHost.authorizationClient = authorizationClient;
|
|
136
|
+
await core_backend_1.NativeHost.startup({ ...opt, iModelHost });
|
|
137
|
+
if (core_backend_1.IpcHost.isValid)
|
|
138
|
+
MobileAppHandler.register();
|
|
139
|
+
const rpcInterfaces = opt?.mobileHost?.rpcInterfaces ?? [];
|
|
140
|
+
MobileRpcManager_1.MobileRpcManager.initializeImpl(rpcInterfaces);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
MobileHost.onMemoryWarning = new core_bentley_1.BeEvent();
|
|
144
|
+
MobileHost.onOrientationChanged = new core_bentley_1.BeEvent();
|
|
145
|
+
MobileHost.onEnterForeground = new core_bentley_1.BeEvent();
|
|
146
|
+
MobileHost.onEnterBackground = new core_bentley_1.BeEvent();
|
|
147
|
+
MobileHost.onWillTerminate = new core_bentley_1.BeEvent();
|
|
148
|
+
MobileHost.onAuthAccessTokenChanged = new core_bentley_1.BeEvent();
|
|
149
|
+
exports.MobileHost = MobileHost;
|
|
157
150
|
//# sourceMappingURL=MobileHost.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MobileHost.js","sourceRoot":"","sources":["../../../src/backend/MobileHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { AccessToken, BeEvent, BriefcaseStatus } from \"@itwin/core-bentley\";\r\nimport { IpcHandler, IpcHost, NativeHost, NativeHostOpts } from \"@itwin/core-backend\";\r\nimport {\r\n IModelReadRpcInterface, IModelTileRpcInterface, IpcWebSocketBackend, RpcInterfaceDefinition,\r\n SnapshotIModelRpcInterface,\r\n} from \"@itwin/core-common\";\r\nimport { CancelRequest, DownloadFailed, UserCancelledError } from \"./MobileFileHandler\";\r\nimport { ProgressCallback } from \"./Request\";\r\nimport { PresentationRpcInterface } from \"@itwin/presentation-common\";\r\nimport { mobileAppChannel, mobileAppNotify } from \"../common/MobileAppChannel\";\r\nimport { BatteryState, DeviceEvents, MobileAppFunctions, MobileNotifications, Orientation } from \"../common/MobileAppProps\";\r\nimport { MobileRpcManager } from \"../common/MobileRpcManager\";\r\nimport { MobileAuthorizationBackend } from \"./MobileAuthorizationBackend\";\r\nimport { setupMobileRpc } from \"./MobileRpcServer\";\r\n\r\n/** @beta */\r\nexport type MobileCompletionCallback = (downloadUrl: string, downloadFileUrl: string, cancelled: boolean, err?: string) => void;\r\n/** @beta */\r\nexport type MobileProgressCallback = (bytesWritten: number, totalBytesWritten: number, totalBytesExpectedToWrite: number) => void;\r\n/** @beta */\r\nexport type MobileCancelCallback = () => boolean;\r\n\r\n/** @beta */\r\nexport interface DownloadTask {\r\n url: string;\r\n downloadPath: string;\r\n isDetached: boolean;\r\n isRunning: boolean;\r\n totalBytes?: number;\r\n doneBytes?: number;\r\n cancelId?: number;\r\n isBackground?: boolean;\r\n cancel?: MobileCancelCallback;\r\n toBackground: () => boolean;\r\n toForeground: () => boolean;\r\n}\r\n\r\n/** @beta */\r\nexport abstract class MobileDevice {\r\n public emit(eventName: DeviceEvents, ...args: any[]) {\r\n switch (eventName) {\r\n case \"memoryWarning\":\r\n MobileHost.onMemoryWarning.raiseEvent(...args);\r\n break;\r\n case \"orientationChanged\":\r\n MobileHost.onOrientationChanged.raiseEvent(...args);\r\n break;\r\n case \"enterForeground\":\r\n MobileHost.onEnterForeground.raiseEvent(...args);\r\n break;\r\n case \"enterBackground\":\r\n MobileHost.onEnterBackground.raiseEvent(...args);\r\n break;\r\n case \"willTerminate\":\r\n MobileHost.onWillTerminate.raiseEvent(...args);\r\n break;\r\n case \"authAccessTokenChanged\":\r\n MobileHost.onAuthAccessTokenChanged.raiseEvent(args[0], args[1]);\r\n break;\r\n }\r\n }\r\n\r\n public abstract getOrientation(): Orientation;\r\n public abstract getBatteryState(): BatteryState;\r\n public abstract getBatteryLevel(): number;\r\n public abstract createDownloadTask(downloadUrl: string, isBackground: boolean, downloadTo: string, completion: MobileCompletionCallback, progress?: MobileProgressCallback): number;\r\n public abstract cancelDownloadTask(cancelId: number): boolean;\r\n public abstract getDownloadTasks(): DownloadTask[];\r\n public abstract resumeDownloadInForeground(requestId: number): boolean;\r\n public abstract resumeDownloadInBackground(requestId: number): boolean;\r\n public abstract reconnect(connection: number): void;\r\n public abstract authGetAccessToken(callback: (accessToken?: string, expirationDate?: string, err?: string) => void): void;\r\n}\r\n\r\nclass MobileAppHandler extends IpcHandler implements MobileAppFunctions {\r\n public get channelName() { return mobileAppChannel; }\r\n public async reconnect(connection: number) {\r\n MobileHost.reconnect(connection);\r\n }\r\n public async getAccessToken() {\r\n return MobileHost.authGetAccessToken();\r\n }\r\n}\r\n\r\n/** @beta */\r\nexport interface MobileHostOpts extends NativeHostOpts {\r\n mobileHost?: {\r\n device?: MobileDevice;\r\n /** list of RPC interface definitions to register */\r\n rpcInterfaces?: RpcInterfaceDefinition[];\r\n };\r\n}\r\n\r\n/**\r\n * @beta\r\n */\r\nexport class MobileHost {\r\n private static _device?: MobileDevice;\r\n public static get device() { return this._device!; }\r\n public static readonly onMemoryWarning = new BeEvent();\r\n public static readonly onOrientationChanged = new BeEvent();\r\n public static readonly onEnterForeground = new BeEvent();\r\n public static readonly onEnterBackground = new BeEvent();\r\n public static readonly onWillTerminate = new BeEvent();\r\n public static readonly onAuthAccessTokenChanged = new BeEvent<(accessToken: string | undefined, expirationDate: string | undefined) => void>();\r\n\r\n /** Send a notification to the MobileApp connected to this MobileHost. */\r\n public static notifyMobileFrontend<T extends keyof MobileNotifications>(methodName: T, ...args: Parameters<MobileNotifications[T]>) {\r\n return IpcHost.send(mobileAppNotify, methodName, ...args);\r\n }\r\n\r\n /** @internal */\r\n public static reconnect(connection: number) {\r\n this.device.reconnect(connection);\r\n }\r\n\r\n /** @internal */\r\n public static async authGetAccessToken() {\r\n return new Promise<[AccessToken, string]>((resolve, reject) => {\r\n this.device.authGetAccessToken((tokenString?: AccessToken, expirationDate?: string, error?: string) => {\r\n if (error) {\r\n reject(error);\r\n }\r\n resolve([tokenString ?? \"\", expirationDate ?? \"\"]);\r\n });\r\n });\r\n }\r\n\r\n /** @internal */\r\n public static async downloadFile(downloadUrl: string, downloadTo: string, progress?: ProgressCallback, cancelRequest?: CancelRequest): Promise<void> {\r\n return new Promise<void>((resolve, reject) => {\r\n\r\n let progressCb: MobileProgressCallback | undefined;\r\n let lastReportedOn = Date.now();\r\n const minTimeBeforeReportingProgress = 1000;\r\n if (progress) {\r\n progressCb = (_bytesWritten: number, totalBytesWritten: number, totalBytesExpectedToWrite: number) => {\r\n const currentTime = Date.now();\r\n const timeSinceLastEvent = currentTime - lastReportedOn;\r\n // report all event for last 5 Mbs so we never miss 100% progress event\r\n const lastEvent = (totalBytesExpectedToWrite - totalBytesWritten) < 1024 * 1024 * 5;\r\n if (timeSinceLastEvent < minTimeBeforeReportingProgress && !lastEvent)\r\n return;\r\n\r\n lastReportedOn = currentTime;\r\n const percent = Number((100 * (totalBytesWritten / totalBytesExpectedToWrite)).toFixed(2));\r\n progress({ total: totalBytesExpectedToWrite, loaded: totalBytesWritten, percent });\r\n };\r\n }\r\n const requestId = this.device.createDownloadTask(downloadUrl, false, downloadTo, (_downloadUrl: string, _downloadFileUrl: string, cancelled: boolean, err?: string) => {\r\n if (cancelled)\r\n reject(new UserCancelledError(BriefcaseStatus.DownloadCancelled, \"User cancelled download\"));\r\n else if (err)\r\n reject(new DownloadFailed(400, \"Download failed\"));\r\n else\r\n resolve();\r\n }, progressCb);\r\n if (cancelRequest) {\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n cancelRequest.cancel = () => this.device.cancelDownloadTask(requestId);\r\n }\r\n });\r\n }\r\n\r\n public static get isValid() { return undefined !== this._device; }\r\n\r\n /** Start the backend of a mobile app. */\r\n public static async startup(opt?: MobileHostOpts): Promise<void> {\r\n const authorizationClient = new MobileAuthorizationBackend();\r\n if (!this.isValid) {\r\n this._device = opt?.mobileHost?.device ?? new (MobileDevice as any)();\r\n // set global device interface.\r\n (global as any).__iTwinJsNativeBridge = this._device;\r\n this.onMemoryWarning.addListener(() => {\r\n MobileHost.notifyMobileFrontend(\"notifyMemoryWarning\");\r\n });\r\n this.onOrientationChanged.addListener(() => {\r\n MobileHost.notifyMobileFrontend(\"notifyOrientationChanged\");\r\n });\r\n this.onWillTerminate.addListener(() => {\r\n MobileHost.notifyMobileFrontend(\"notifyWillTerminate\");\r\n });\r\n this.onAuthAccessTokenChanged.addListener((accessToken: string | undefined, expirationDate: string | undefined) => {\r\n authorizationClient.setAccessToken(accessToken, expirationDate);\r\n MobileHost.notifyMobileFrontend(\"notifyAuthAccessTokenChanged\", accessToken, expirationDate);\r\n });\r\n\r\n // following will provide impl for device specific api.\r\n setupMobileRpc();\r\n }\r\n\r\n const socket = opt?.ipcHost?.socket ?? new IpcWebSocketBackend();\r\n opt = { ...opt, mobileHost: { ...opt?.mobileHost }, ipcHost: { ...opt?.ipcHost, socket } };\r\n\r\n const iModelHost = opt?.iModelHost ?? {};\r\n iModelHost.authorizationClient = authorizationClient;\r\n await NativeHost.startup({ ...opt, iModelHost });\r\n\r\n if (IpcHost.isValid)\r\n MobileAppHandler.register();\r\n\r\n const rpcInterfaces = opt?.mobileHost?.rpcInterfaces ?? [\r\n IModelReadRpcInterface,\r\n IModelTileRpcInterface,\r\n SnapshotIModelRpcInterface,\r\n PresentationRpcInterface,\r\n ];\r\n\r\n MobileRpcManager.initializeImpl(rpcInterfaces);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"MobileHost.js","sourceRoot":"","sources":["../../../src/backend/MobileHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { AccessToken, BeEvent, BriefcaseStatus } from \"@itwin/core-bentley\";\nimport { IpcHandler, IpcHost, NativeHost, NativeHostOpts } from \"@itwin/core-backend\";\nimport { IpcWebSocketBackend, RpcInterfaceDefinition } from \"@itwin/core-common\";\nimport { CancelRequest, DownloadFailed, UserCancelledError } from \"./MobileFileHandler\";\nimport { ProgressCallback } from \"./Request\";\nimport { mobileAppChannel, mobileAppNotify } from \"../common/MobileAppChannel\";\nimport { BatteryState, DeviceEvents, MobileAppFunctions, MobileNotifications, Orientation } from \"../common/MobileAppProps\";\nimport { MobileRpcManager } from \"../common/MobileRpcManager\";\nimport { MobileAuthorizationBackend } from \"./MobileAuthorizationBackend\";\nimport { setupMobileRpc } from \"./MobileRpcServer\";\n\n/** @beta */\nexport type MobileCompletionCallback = (downloadUrl: string, downloadFileUrl: string, cancelled: boolean, err?: string) => void;\n/** @beta */\nexport type MobileProgressCallback = (bytesWritten: number, totalBytesWritten: number, totalBytesExpectedToWrite: number) => void;\n/** @beta */\nexport type MobileCancelCallback = () => boolean;\n\n/** @beta */\nexport interface DownloadTask {\n url: string;\n downloadPath: string;\n isDetached: boolean;\n isRunning: boolean;\n totalBytes?: number;\n doneBytes?: number;\n cancelId?: number;\n isBackground?: boolean;\n cancel?: MobileCancelCallback;\n toBackground: () => boolean;\n toForeground: () => boolean;\n}\n\n/** @beta */\nexport abstract class MobileDevice {\n public emit(eventName: DeviceEvents, ...args: any[]) {\n switch (eventName) {\n case \"memoryWarning\":\n MobileHost.onMemoryWarning.raiseEvent(...args);\n break;\n case \"orientationChanged\":\n MobileHost.onOrientationChanged.raiseEvent(...args);\n break;\n case \"enterForeground\":\n MobileHost.onEnterForeground.raiseEvent(...args);\n break;\n case \"enterBackground\":\n MobileHost.onEnterBackground.raiseEvent(...args);\n break;\n case \"willTerminate\":\n MobileHost.onWillTerminate.raiseEvent(...args);\n break;\n case \"authAccessTokenChanged\":\n MobileHost.onAuthAccessTokenChanged.raiseEvent(args[0], args[1]);\n break;\n }\n }\n\n public abstract getOrientation(): Orientation;\n public abstract getBatteryState(): BatteryState;\n public abstract getBatteryLevel(): number;\n public abstract createDownloadTask(downloadUrl: string, isBackground: boolean, downloadTo: string, completion: MobileCompletionCallback, progress?: MobileProgressCallback): number;\n public abstract cancelDownloadTask(cancelId: number): boolean;\n public abstract getDownloadTasks(): DownloadTask[];\n public abstract resumeDownloadInForeground(requestId: number): boolean;\n public abstract resumeDownloadInBackground(requestId: number): boolean;\n public abstract reconnect(connection: number): void;\n public abstract authGetAccessToken(callback: (accessToken?: string, expirationDate?: string, err?: string) => void): void;\n}\n\nclass MobileAppHandler extends IpcHandler implements MobileAppFunctions {\n public get channelName() { return mobileAppChannel; }\n public async reconnect(connection: number) {\n MobileHost.reconnect(connection);\n }\n public async getAccessToken() {\n return MobileHost.authGetAccessToken();\n }\n}\n\n/** @beta */\nexport interface MobileHostOpts extends NativeHostOpts {\n mobileHost?: {\n device?: MobileDevice;\n /** list of RPC interface definitions to register */\n rpcInterfaces?: RpcInterfaceDefinition[];\n };\n}\n\n/**\n * @beta\n */\nexport class MobileHost {\n private static _device?: MobileDevice;\n public static get device() { return this._device!; }\n public static readonly onMemoryWarning = new BeEvent();\n public static readonly onOrientationChanged = new BeEvent();\n public static readonly onEnterForeground = new BeEvent();\n public static readonly onEnterBackground = new BeEvent();\n public static readonly onWillTerminate = new BeEvent();\n public static readonly onAuthAccessTokenChanged = new BeEvent<(accessToken: string | undefined, expirationDate: string | undefined) => void>();\n\n /** Send a notification to the MobileApp connected to this MobileHost. */\n public static notifyMobileFrontend<T extends keyof MobileNotifications>(methodName: T, ...args: Parameters<MobileNotifications[T]>) {\n return IpcHost.send(mobileAppNotify, methodName, ...args);\n }\n\n /** @internal */\n public static reconnect(connection: number) {\n this.device.reconnect(connection);\n }\n\n /** @internal */\n public static async authGetAccessToken() {\n return new Promise<[AccessToken, string]>((resolve, reject) => {\n this.device.authGetAccessToken((tokenString?: AccessToken, expirationDate?: string, error?: string) => {\n if (error) {\n reject(error);\n }\n resolve([tokenString ?? \"\", expirationDate ?? \"\"]);\n });\n });\n }\n\n /** @internal */\n public static async downloadFile(downloadUrl: string, downloadTo: string, progress?: ProgressCallback, cancelRequest?: CancelRequest): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n\n let progressCb: MobileProgressCallback | undefined;\n let lastReportedOn = Date.now();\n const minTimeBeforeReportingProgress = 1000;\n if (progress) {\n progressCb = (_bytesWritten: number, totalBytesWritten: number, totalBytesExpectedToWrite: number) => {\n const currentTime = Date.now();\n const timeSinceLastEvent = currentTime - lastReportedOn;\n // report all event for last 5 Mbs so we never miss 100% progress event\n const lastEvent = (totalBytesExpectedToWrite - totalBytesWritten) < 1024 * 1024 * 5;\n if (timeSinceLastEvent < minTimeBeforeReportingProgress && !lastEvent)\n return;\n\n lastReportedOn = currentTime;\n const percent = Number((100 * (totalBytesWritten / totalBytesExpectedToWrite)).toFixed(2));\n progress({ total: totalBytesExpectedToWrite, loaded: totalBytesWritten, percent });\n };\n }\n const requestId = this.device.createDownloadTask(downloadUrl, false, downloadTo, (_downloadUrl: string, _downloadFileUrl: string, cancelled: boolean, err?: string) => {\n if (cancelled)\n reject(new UserCancelledError(BriefcaseStatus.DownloadCancelled, \"User cancelled download\"));\n else if (err)\n reject(new DownloadFailed(400, \"Download failed\"));\n else\n resolve();\n }, progressCb);\n if (cancelRequest) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n cancelRequest.cancel = () => this.device.cancelDownloadTask(requestId);\n }\n });\n }\n\n public static get isValid() { return undefined !== this._device; }\n\n /** Start the backend of a mobile app. */\n public static async startup(opt?: MobileHostOpts): Promise<void> {\n const authorizationClient = new MobileAuthorizationBackend();\n if (!this.isValid) {\n this._device = opt?.mobileHost?.device ?? new (MobileDevice as any)();\n // set global device interface.\n (global as any).__iTwinJsNativeBridge = this._device;\n this.onMemoryWarning.addListener(() => {\n MobileHost.notifyMobileFrontend(\"notifyMemoryWarning\");\n });\n this.onOrientationChanged.addListener(() => {\n MobileHost.notifyMobileFrontend(\"notifyOrientationChanged\");\n });\n this.onWillTerminate.addListener(() => {\n MobileHost.notifyMobileFrontend(\"notifyWillTerminate\");\n });\n this.onAuthAccessTokenChanged.addListener((accessToken: string | undefined, expirationDate: string | undefined) => {\n authorizationClient.setAccessToken(accessToken, expirationDate);\n MobileHost.notifyMobileFrontend(\"notifyAuthAccessTokenChanged\", accessToken, expirationDate);\n });\n\n // following will provide impl for device specific api.\n setupMobileRpc();\n }\n\n const socket = opt?.ipcHost?.socket ?? new IpcWebSocketBackend();\n opt = { ...opt, mobileHost: { ...opt?.mobileHost }, ipcHost: { ...opt?.ipcHost, socket } };\n\n const iModelHost = opt?.iModelHost ?? {};\n iModelHost.authorizationClient = authorizationClient;\n await NativeHost.startup({ ...opt, iModelHost });\n\n if (IpcHost.isValid)\n MobileAppHandler.register();\n\n const rpcInterfaces = opt?.mobileHost?.rpcInterfaces ?? [];\n\n MobileRpcManager.initializeImpl(rpcInterfaces);\n }\n}\n"]}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import { MobileRpcGateway } from "../common/MobileRpcProtocol";
|
|
2
|
-
/** @internal */
|
|
3
|
-
export declare class MobileRpcServer {
|
|
4
|
-
private static _nextId;
|
|
5
|
-
static interop: MobileRpcGateway;
|
|
6
|
-
private _server;
|
|
7
|
-
private _connection;
|
|
8
|
-
private _port;
|
|
9
|
-
private _connectionId;
|
|
10
|
-
private _pingTimer;
|
|
11
|
-
constructor();
|
|
12
|
-
private _onListening;
|
|
13
|
-
private _notifyListening;
|
|
14
|
-
private _onConnection;
|
|
15
|
-
private _createSender;
|
|
16
|
-
private _onConnectionMessage;
|
|
17
|
-
dispose(): void;
|
|
18
|
-
}
|
|
19
|
-
export declare function setupMobileRpc(): void;
|
|
1
|
+
import { MobileRpcGateway } from "../common/MobileRpcProtocol";
|
|
2
|
+
/** @internal */
|
|
3
|
+
export declare class MobileRpcServer {
|
|
4
|
+
private static _nextId;
|
|
5
|
+
static interop: MobileRpcGateway;
|
|
6
|
+
private _server;
|
|
7
|
+
private _connection;
|
|
8
|
+
private _port;
|
|
9
|
+
private _connectionId;
|
|
10
|
+
private _pingTimer;
|
|
11
|
+
constructor();
|
|
12
|
+
private _onListening;
|
|
13
|
+
private _notifyListening;
|
|
14
|
+
private _onConnection;
|
|
15
|
+
private _createSender;
|
|
16
|
+
private _onConnectionMessage;
|
|
17
|
+
dispose(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare function setupMobileRpc(): void;
|
|
20
20
|
//# sourceMappingURL=MobileRpcServer.d.ts.map
|