@24i/bigscreen-sdk 1.0.54-alpha.2844 → 1.0.54-alpha.2845
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/package.json +2 -1
- package/packages/device/src/driver/index.vegaos.tv.ts +1 -0
- package/packages/device/src/resolver/resolver.ts +5 -0
- package/packages/driver-base/src/index.ts +1 -0
- package/packages/driver-vegaos/src/DeviceVegaOS.ts +223 -0
- package/packages/driver-vegaos/src/index.ts +1 -0
- package/packages/driver-vegaos/src/keymap.ts +12 -0
- package/packages/driver-vegaos/src/types.ts +53 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@24i/bigscreen-sdk",
|
|
3
|
-
"version": "1.0.54-alpha.
|
|
3
|
+
"version": "1.0.54-alpha.2845",
|
|
4
4
|
"description": "SmartApps BIGscreen SDK monorepo",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -128,6 +128,7 @@
|
|
|
128
128
|
"./driver-saphi": "./packages/driver-saphi/src/index.ts",
|
|
129
129
|
"./driver-smartcast": "./packages/driver-smartcast/src/index.ts",
|
|
130
130
|
"./driver-tizen": "./packages/driver-tizen/src/index.ts",
|
|
131
|
+
"./driver-vegaos": "./packages/driver-vegaos/src/index.ts",
|
|
131
132
|
"./driver-vidaa": "./packages/driver-vidaa/src/index.ts",
|
|
132
133
|
"./driver-webos/scripts/template": "./packages/driver-webos/scripts/template.ts",
|
|
133
134
|
"./driver-webos/scripts/exportWebOSTVjs": "./packages/driver-webos/scripts/exportWebOSTVjs.ts",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DeviceVegaOS as Device } from '@24i/bigscreen-sdk/driver-vegaos';
|
|
@@ -7,6 +7,7 @@ import { DeviceHbbTV } from '@24i/bigscreen-sdk/driver-hbbtv';
|
|
|
7
7
|
import { DeviceKreaTV } from '@24i/bigscreen-sdk/driver-kreatv';
|
|
8
8
|
import { DeviceSaphi } from '@24i/bigscreen-sdk/driver-saphi';
|
|
9
9
|
import { DeviceTizen } from '@24i/bigscreen-sdk/driver-tizen';
|
|
10
|
+
import { DeviceVegaOS } from '@24i/bigscreen-sdk/driver-vegaos';
|
|
10
11
|
import { DeviceVidaa } from '@24i/bigscreen-sdk/driver-vidaa';
|
|
11
12
|
import { DeviceSmartCast } from '@24i/bigscreen-sdk/driver-smartcast';
|
|
12
13
|
import { DeviceWebos } from '@24i/bigscreen-sdk/driver-webos';
|
|
@@ -34,6 +35,10 @@ const getDevice = () => {
|
|
|
34
35
|
info('AndroidTV');
|
|
35
36
|
return new DeviceAndroidTV();
|
|
36
37
|
}
|
|
38
|
+
if (userAgent.match(/Kepler/)) {
|
|
39
|
+
info('VegaOS');
|
|
40
|
+
return new DeviceVegaOS();
|
|
41
|
+
}
|
|
37
42
|
if (userAgent.match(/Tizen/)) {
|
|
38
43
|
info('Tizen');
|
|
39
44
|
return new DeviceTizen();
|
|
@@ -5,6 +5,7 @@ export { VolumeRange } from './VolumeRange';
|
|
|
5
5
|
export type { ScreenSize } from './ScreenSize';
|
|
6
6
|
export type { KeycodeKeyMap } from './types/KeycodeKeyMap';
|
|
7
7
|
export type { DeviceEventMap } from './types/DeviceEvent';
|
|
8
|
+
export type { AdInfo } from './types/AdInfo';
|
|
8
9
|
export type {
|
|
9
10
|
IAPSuccessPayload, IAPErrorPayload, IAPPromiseResolve, IAPPromiseReject, IAPPurchaseProductData,
|
|
10
11
|
} from './types/InAppPurchase';
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DeviceBase,
|
|
3
|
+
ConnectionType,
|
|
4
|
+
ScreenSaverStatus,
|
|
5
|
+
VolumeRange,
|
|
6
|
+
IAPSuccessPayload,
|
|
7
|
+
IAPPromiseReject,
|
|
8
|
+
IAPPromiseResolve,
|
|
9
|
+
IAPPurchaseProductData,
|
|
10
|
+
AdInfo,
|
|
11
|
+
} from '@24i/bigscreen-sdk/driver-base';
|
|
12
|
+
import { generateUuid } from '@24i/bigscreen-sdk/utils';
|
|
13
|
+
import { VendorType } from '@24i/smartapps-datalayer/api';
|
|
14
|
+
import { getKeyMap } from './keymap';
|
|
15
|
+
import {
|
|
16
|
+
DeviceInfo,
|
|
17
|
+
IVegaOSBridge,
|
|
18
|
+
IAPErrorEventDetail,
|
|
19
|
+
IAPSuccessEventDetail,
|
|
20
|
+
Receipt,
|
|
21
|
+
} from './types';
|
|
22
|
+
|
|
23
|
+
declare global {
|
|
24
|
+
interface Window extends IVegaOSBridge {}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class DeviceVegaOS extends DeviceBase {
|
|
28
|
+
keyMap = getKeyMap();
|
|
29
|
+
|
|
30
|
+
deviceInfo: DeviceInfo | null = null;
|
|
31
|
+
|
|
32
|
+
subscriptionFeaturesConfiguration = {
|
|
33
|
+
purchase: true,
|
|
34
|
+
management: false,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
async initDevice(): Promise<void> {
|
|
38
|
+
this.initNetworkChangeListener();
|
|
39
|
+
this.hideCastButton();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
hideCastButton(): void {
|
|
43
|
+
const style = document.createElement('style');
|
|
44
|
+
style.textContent = 'video::-internal-media-controls-overlay-cast-button{display:none}';
|
|
45
|
+
document.head.appendChild(style);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
getDeviceInfo(): DeviceInfo | null {
|
|
49
|
+
if (this.deviceInfo) return this.deviceInfo;
|
|
50
|
+
try {
|
|
51
|
+
const deviceInfo = window.VegaOSBridge.getDeviceInfo();
|
|
52
|
+
if (deviceInfo) this.deviceInfo = deviceInfo;
|
|
53
|
+
return this.deviceInfo;
|
|
54
|
+
} catch {}
|
|
55
|
+
return this.deviceInfo;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
initNetworkChangeListener() {
|
|
59
|
+
window.addEventListener('online', () => {
|
|
60
|
+
this.triggerEvent('networkchange', { isConnected: true });
|
|
61
|
+
});
|
|
62
|
+
window.addEventListener('offline', () => {
|
|
63
|
+
this.triggerEvent('networkchange', { isConnected: false });
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
reboot(): void {
|
|
68
|
+
let rootPath = '';
|
|
69
|
+
const splitUrl = window.location.href.split('#');
|
|
70
|
+
if (splitUrl.length > 1) rootPath = splitUrl[0];
|
|
71
|
+
window.location.href = rootPath;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
exit(): void {
|
|
75
|
+
window.VegaOSBridge.exit();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
async getManufacturerName(): Promise<string> {
|
|
79
|
+
return this.getDeviceInfo()?.manufacturer || '';
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async getPlatformName(): Promise<string> {
|
|
83
|
+
return 'VegaOS';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async getPlatformVersion(): Promise<string> {
|
|
87
|
+
return this.getDeviceInfo()?.platformVersion || '';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
async getDeviceName(): Promise<string> {
|
|
91
|
+
const modelName = await this.getModelName();
|
|
92
|
+
const manufacturerName = await this.getManufacturerName();
|
|
93
|
+
return `VegaOS ${manufacturerName} ${modelName}`.trim();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async getModelName(): Promise<string> {
|
|
97
|
+
return this.getDeviceInfo()?.modelName || '';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async getFirmware(): Promise<string> {
|
|
101
|
+
return this.getDeviceInfo()?.firmwareVersion || '';
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async is4KSupported(): Promise<boolean> {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
async is8KSupported(): Promise<boolean> {
|
|
109
|
+
return false;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async getUuid(): Promise<string> {
|
|
113
|
+
return this.getBaseUuid();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
async getAdInfo(): Promise<AdInfo> {
|
|
117
|
+
try {
|
|
118
|
+
const { adId, latEnabled } = window.VegaOSBridge.getAdInfo();
|
|
119
|
+
if (adId) return { adId, type: 'afai', latEnabled };
|
|
120
|
+
} catch {}
|
|
121
|
+
return { adId: generateUuid(), type: 'sessionid', latEnabled: null };
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async getOsLanguage(): Promise<string> {
|
|
125
|
+
return this.getDeviceInfo()?.osLanguage || '';
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
async getVolume(): Promise<number> {
|
|
129
|
+
return VolumeRange.UNSUPPORTED;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
async getWrapperVersion(): Promise<string> {
|
|
133
|
+
return this.getDeviceInfo()?.wrapperVersion || '';
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
137
|
+
async setVolume(volumePercentage: number): Promise<void> {
|
|
138
|
+
// not supported on VegaOS platform
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
142
|
+
async mute(mute: boolean): Promise<void> {
|
|
143
|
+
// not supported on VegaOS platform
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
async isMute(): Promise<boolean> {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
async getScreenSaver(): Promise<ScreenSaverStatus> {
|
|
151
|
+
return { enabled: false };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
155
|
+
async setScreenSaver(status: ScreenSaverStatus): Promise<void> {
|
|
156
|
+
// not supported on VegaOS platform
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
160
|
+
async setUserAgent(userAgent: string): Promise<boolean> {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async isNetworkConnected(): Promise<boolean> {
|
|
165
|
+
return window.navigator.onLine;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
async getConnectionType(): Promise<ConnectionType> {
|
|
169
|
+
// only wifi connection is supported on VegaOS platform
|
|
170
|
+
return 'wifi';
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
async getLocalIP(): Promise<string> {
|
|
174
|
+
return '';
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
async getMacAddress(): Promise<string> {
|
|
178
|
+
return '';
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
onIAPSuccess = (resolve: IAPPromiseResolve, reject: IAPPromiseReject) => (event: Event) => {
|
|
182
|
+
this.removeIAPListeners(resolve, reject);
|
|
183
|
+
try {
|
|
184
|
+
const { userId, receipt: receiptToParse } = (
|
|
185
|
+
event as CustomEvent<IAPSuccessEventDetail>
|
|
186
|
+
).detail;
|
|
187
|
+
const receipt: Receipt = JSON.parse(receiptToParse);
|
|
188
|
+
window.VegaOSBridge.notifyFulfillment(receipt.receiptId);
|
|
189
|
+
resolve({
|
|
190
|
+
platform: VendorType.AMAZON,
|
|
191
|
+
receiptPayload: {
|
|
192
|
+
userId,
|
|
193
|
+
receiptId: receipt.receiptId,
|
|
194
|
+
},
|
|
195
|
+
});
|
|
196
|
+
} catch (e) {
|
|
197
|
+
reject(e);
|
|
198
|
+
}
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
onIAPError = (resolve: IAPPromiseResolve, reject: IAPPromiseReject) => (event: Event) => {
|
|
202
|
+
this.removeIAPListeners(resolve, reject);
|
|
203
|
+
reject(new Error((event as CustomEvent<IAPErrorEventDetail>).detail.message));
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
removeIAPListeners(resolve: IAPPromiseResolve, reject: IAPPromiseReject) {
|
|
207
|
+
document.removeEventListener('iapSuccess', this.onIAPSuccess(resolve, reject));
|
|
208
|
+
document.removeEventListener('iapError', this.onIAPError(resolve, reject));
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
async purchaseProduct(data: IAPPurchaseProductData): Promise<IAPSuccessPayload> {
|
|
212
|
+
return new Promise((resolve, reject) => {
|
|
213
|
+
document.addEventListener('iapSuccess', this.onIAPSuccess(resolve, reject));
|
|
214
|
+
document.addEventListener('iapError', this.onIAPError(resolve, reject));
|
|
215
|
+
window.VegaOSBridge.purchase(data.sku!);
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
220
|
+
async cancelSubscription(data: IAPPurchaseProductData): Promise<void> {
|
|
221
|
+
throw new Error('Not supported');
|
|
222
|
+
}
|
|
223
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { DeviceVegaOS } from './DeviceVegaOS';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* eslint-disable no-magic-numbers */
|
|
2
|
+
import { KeyMap } from '@24i/bigscreen-sdk/driver-base';
|
|
3
|
+
|
|
4
|
+
export const getKeyMap = () => {
|
|
5
|
+
KeyMap.overrideValues({
|
|
6
|
+
BACK: { keyCode: 8, alternativeKeyCodes: [27] },
|
|
7
|
+
FF: { keyCode: 228 },
|
|
8
|
+
REW: { keyCode: 227 },
|
|
9
|
+
PLAYPAUSE: { keyCode: 179 },
|
|
10
|
+
});
|
|
11
|
+
return KeyMap.generateKeyCodeKeyMap();
|
|
12
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
interface VegaOSBridge {
|
|
2
|
+
/**
|
|
3
|
+
* It returns a JSON string with device info.
|
|
4
|
+
*/
|
|
5
|
+
getDeviceInfo: () => DeviceInfo,
|
|
6
|
+
/**
|
|
7
|
+
* It returns the advertising info of the device.
|
|
8
|
+
*/
|
|
9
|
+
getAdInfo: () => VegaOSAdInfo,
|
|
10
|
+
/**
|
|
11
|
+
* It initiates the purchase-flow for the given SKU. The result is delivered
|
|
12
|
+
* asynchronously via the `iapSuccess` / `iapError` document events.
|
|
13
|
+
*/
|
|
14
|
+
purchase: (sku: string) => void,
|
|
15
|
+
/**
|
|
16
|
+
* It notifies the Amazon Appstore that the purchase identified by the
|
|
17
|
+
* given receipt ID has been fulfilled.
|
|
18
|
+
*/
|
|
19
|
+
notifyFulfillment: (receiptId: string) => void,
|
|
20
|
+
/**
|
|
21
|
+
* It exists the application.
|
|
22
|
+
*/
|
|
23
|
+
exit: () => void,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type DeviceInfo = {
|
|
27
|
+
manufacturer: string;
|
|
28
|
+
platformVersion: string;
|
|
29
|
+
firmwareVersion: string;
|
|
30
|
+
modelName: string;
|
|
31
|
+
osLanguage: string;
|
|
32
|
+
wrapperVersion: string;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export type VegaOSAdInfo = {
|
|
36
|
+
adId: string;
|
|
37
|
+
latEnabled: boolean;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export type Receipt = object & { receiptId: string };
|
|
41
|
+
|
|
42
|
+
export type IAPSuccessEventDetail = {
|
|
43
|
+
userId: string;
|
|
44
|
+
receipt: string;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
export type IAPErrorEventDetail = {
|
|
48
|
+
message: string;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export interface IVegaOSBridge {
|
|
52
|
+
VegaOSBridge: VegaOSBridge,
|
|
53
|
+
}
|