@mentra/sdk 1.1.20 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{tpa → app}/index.d.ts.map +1 -1
- package/dist/{tpa → app}/index.js +2 -2
- package/dist/{tpa → app}/server/index.d.ts +21 -21
- package/dist/app/server/index.d.ts.map +1 -0
- package/dist/{tpa → app}/server/index.js +21 -21
- package/dist/{tpa → app}/session/api-client.d.ts +1 -1
- package/dist/{tpa → app}/session/api-client.d.ts.map +1 -1
- package/dist/{tpa → app}/session/api-client.js +2 -2
- package/dist/{tpa → app}/session/dashboard.d.ts +9 -9
- package/dist/{tpa → app}/session/dashboard.d.ts.map +1 -1
- package/dist/{tpa → app}/session/dashboard.js +10 -10
- package/dist/{tpa → app}/session/events.d.ts +1 -1
- package/dist/{tpa → app}/session/events.d.ts.map +1 -1
- package/dist/{tpa → app}/session/events.js +1 -1
- package/dist/{tpa → app}/session/index.d.ts +38 -38
- package/dist/{tpa → app}/session/index.d.ts.map +1 -1
- package/dist/{tpa → app}/session/index.js +116 -116
- package/dist/{tpa → app}/session/layouts.d.ts +2 -2
- package/dist/{tpa → app}/session/layouts.d.ts.map +1 -1
- package/dist/{tpa → app}/session/layouts.js +4 -4
- package/dist/{tpa → app}/session/modules/streaming.d.ts +5 -5
- package/dist/{tpa → app}/session/modules/streaming.d.ts.map +1 -1
- package/dist/{tpa → app}/session/modules/streaming.js +7 -7
- package/dist/{tpa → app}/session/settings.d.ts +3 -3
- package/dist/{tpa → app}/session/settings.d.ts.map +1 -1
- package/dist/{tpa → app}/session/settings.js +5 -7
- package/dist/app/token/index.d.ts +7 -0
- package/dist/app/token/index.d.ts.map +1 -0
- package/dist/{tpa → app}/token/index.js +2 -2
- package/dist/{tpa → app}/token/utils.d.ts +6 -6
- package/dist/{tpa → app}/token/utils.d.ts.map +1 -1
- package/dist/{tpa → app}/token/utils.js +6 -6
- package/dist/{tpa → app}/webview/index.d.ts +3 -3
- package/dist/{tpa → app}/webview/index.d.ts.map +1 -1
- package/dist/{tpa → app}/webview/index.js +4 -4
- package/dist/examples/rtmp-streaming-example.js +6 -6
- package/dist/index.d.ts +39 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +76 -16
- package/dist/types/capabilities.d.ts +1 -1
- package/dist/types/capabilities.js +1 -1
- package/dist/types/dashboard/index.d.ts +9 -9
- package/dist/types/enums.d.ts +2 -2
- package/dist/types/enums.js +8 -8
- package/dist/types/index.d.ts +6 -6
- package/dist/types/index.js +24 -24
- package/dist/types/layouts.d.ts +2 -2
- package/dist/types/message-types.d.ts +15 -15
- package/dist/types/message-types.js +47 -47
- package/dist/types/messages/app-to-cloud.d.ts +146 -0
- package/dist/types/messages/{tpa-to-cloud.d.ts.map → app-to-cloud.d.ts.map} +1 -1
- package/dist/types/messages/{tpa-to-cloud.js → app-to-cloud.js} +18 -18
- package/dist/types/messages/{cloud-to-tpa.d.ts → cloud-to-app.d.ts} +52 -52
- package/dist/types/messages/{cloud-to-tpa.d.ts.map → cloud-to-app.d.ts.map} +1 -1
- package/dist/types/messages/{cloud-to-tpa.js → cloud-to-app.js} +22 -22
- package/dist/types/models.d.ts +7 -7
- package/dist/types/models.js +3 -3
- package/dist/types/streams.d.ts +2 -2
- package/dist/types/streams.js +2 -2
- package/dist/types/token.d.ts +7 -7
- package/dist/types/token.js +2 -2
- package/dist/types/webhooks.d.ts +8 -8
- package/dist/types/webhooks.js +3 -3
- package/package.json +1 -1
- package/dist/tpa/server/index.d.ts.map +0 -1
- package/dist/tpa/token/index.d.ts +0 -7
- package/dist/tpa/token/index.d.ts.map +0 -1
- package/dist/types/messages/tpa-to-cloud.d.ts +0 -146
- /package/dist/{tpa → app}/index.d.ts +0 -0
@@ -1,4 +1,4 @@
|
|
1
|
-
import {
|
1
|
+
import { AppToCloudMessageType } from '../message-types';
|
2
2
|
/**
|
3
3
|
* Dashboard modes supported by the system
|
4
4
|
*/
|
@@ -7,7 +7,7 @@ export declare enum DashboardMode {
|
|
7
7
|
EXPANDED = "expanded"
|
8
8
|
}
|
9
9
|
/**
|
10
|
-
* Dashboard API for the system dashboard
|
10
|
+
* Dashboard API for the system dashboard App
|
11
11
|
*/
|
12
12
|
export interface DashboardSystemAPI {
|
13
13
|
/**
|
@@ -37,7 +37,7 @@ export interface DashboardSystemAPI {
|
|
37
37
|
setViewMode(mode: DashboardMode): void;
|
38
38
|
}
|
39
39
|
/**
|
40
|
-
* Dashboard API for all
|
40
|
+
* Dashboard API for all Apps
|
41
41
|
*/
|
42
42
|
export interface DashboardContentAPI {
|
43
43
|
/**
|
@@ -77,15 +77,15 @@ export interface DashboardContentAPI {
|
|
77
77
|
onModeChange(callback: (mode: DashboardMode | 'none') => void): () => void;
|
78
78
|
}
|
79
79
|
/**
|
80
|
-
* Dashboard API exposed on
|
80
|
+
* Dashboard API exposed on AppSession
|
81
81
|
*/
|
82
82
|
export interface DashboardAPI {
|
83
83
|
/**
|
84
|
-
* System dashboard API (only available for system dashboard
|
84
|
+
* System dashboard API (only available for system dashboard App)
|
85
85
|
*/
|
86
86
|
system?: DashboardSystemAPI;
|
87
87
|
/**
|
88
|
-
* Content API (available to all
|
88
|
+
* Content API (available to all Apps)
|
89
89
|
*/
|
90
90
|
content: DashboardContentAPI;
|
91
91
|
}
|
@@ -93,7 +93,7 @@ export interface DashboardAPI {
|
|
93
93
|
* Message to update dashboard content
|
94
94
|
*/
|
95
95
|
export interface DashboardContentUpdate {
|
96
|
-
type:
|
96
|
+
type: AppToCloudMessageType.DASHBOARD_CONTENT_UPDATE;
|
97
97
|
packageName: string;
|
98
98
|
sessionId: string;
|
99
99
|
content: string;
|
@@ -104,7 +104,7 @@ export interface DashboardContentUpdate {
|
|
104
104
|
* Message for dashboard mode change
|
105
105
|
*/
|
106
106
|
export interface DashboardModeChange {
|
107
|
-
type:
|
107
|
+
type: AppToCloudMessageType.DASHBOARD_MODE_CHANGE;
|
108
108
|
packageName: string;
|
109
109
|
sessionId: string;
|
110
110
|
mode: DashboardMode;
|
@@ -114,7 +114,7 @@ export interface DashboardModeChange {
|
|
114
114
|
* Message to update system dashboard content
|
115
115
|
*/
|
116
116
|
export interface DashboardSystemUpdate {
|
117
|
-
type:
|
117
|
+
type: AppToCloudMessageType.DASHBOARD_SYSTEM_UPDATE;
|
118
118
|
packageName: string;
|
119
119
|
sessionId: string;
|
120
120
|
section: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';
|
package/dist/types/enums.d.ts
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/**
|
2
|
-
* Types of Third-Party Applications (
|
2
|
+
* Types of Third-Party Applications (Apps)
|
3
3
|
*/
|
4
|
-
export declare enum
|
4
|
+
export declare enum AppType {
|
5
5
|
SYSTEM_DASHBOARD = "system_dashboard",// Special UI placement, system functionality
|
6
6
|
BACKGROUND = "background",// Can temporarily take control of display
|
7
7
|
STANDARD = "standard"
|
package/dist/types/enums.js
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
"use strict";
|
2
2
|
// src/enums.ts
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
-
exports.AppSettingType = exports.ViewType = exports.LayoutType = exports.Language = exports.AppState = exports.
|
4
|
+
exports.AppSettingType = exports.ViewType = exports.LayoutType = exports.Language = exports.AppState = exports.AppType = void 0;
|
5
5
|
/**
|
6
|
-
* Types of Third-Party Applications (
|
6
|
+
* Types of Third-Party Applications (Apps)
|
7
7
|
*/
|
8
|
-
var
|
9
|
-
(function (
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
})(
|
8
|
+
var AppType;
|
9
|
+
(function (AppType) {
|
10
|
+
AppType["SYSTEM_DASHBOARD"] = "system_dashboard";
|
11
|
+
AppType["BACKGROUND"] = "background";
|
12
|
+
AppType["STANDARD"] = "standard"; // Regular App (default) only one standard app can run at a time. starting a standard App will close any other standard App that is running.
|
13
|
+
})(AppType || (exports.AppType = AppType = {}));
|
14
14
|
// TODO(isaiah): doesn't seem like this is actually used anywhere, remove?
|
15
15
|
/**
|
16
16
|
* Application states in the system
|
package/dist/types/index.d.ts
CHANGED
@@ -3,9 +3,9 @@ export * from './message-types';
|
|
3
3
|
export * from './messages/base';
|
4
4
|
export * from './messages/glasses-to-cloud';
|
5
5
|
export * from './messages/cloud-to-glasses';
|
6
|
-
export * from './messages/
|
7
|
-
export {
|
8
|
-
DataStream,
|
6
|
+
export * from './messages/app-to-cloud';
|
7
|
+
export { AppConnectionAck, AppConnectionError, AppStopped, SettingsUpdate as AppSettingsUpdate, // Alias to avoid conflict with cloud-to-glasses SettingsUpdate
|
8
|
+
DataStream, CloudToAppMessage, TranslationData, ToolCall, StandardConnectionError, CustomMessage, AugmentosSettingsUpdate, TranscriptionData, AudioChunk, PermissionError, PermissionErrorDetail, isAppConnectionAck, isAppConnectionError, isAppStopped, isSettingsUpdate, isDataStream, isAudioChunk, isDashboardModeChanged, isDashboardAlwaysOnChanged, isPhotoResponse as isPhotoResponseFromCloud, isRtmpStreamStatus as isRtmpStreamStatusFromCloud } from './messages/cloud-to-app';
|
9
9
|
export * from './streams';
|
10
10
|
export * from './layouts';
|
11
11
|
export * from './dashboard';
|
@@ -17,12 +17,12 @@ export * from './webhooks';
|
|
17
17
|
export * from './capabilities';
|
18
18
|
export { ButtonPress, HeadPosition, GlassesBatteryUpdate, PhoneBatteryUpdate, GlassesConnectionState, LocationUpdate, CalendarEvent, Vad, PhoneNotification, NotificationDismissed, StartApp, StopApp, ConnectionInit, DashboardState, OpenDashboard, GlassesToCloudMessage, PhotoResponse, RtmpStreamStatus, KeepAliveAck } from './messages/glasses-to-cloud';
|
19
19
|
export { ConnectionAck, ConnectionError, AuthError, DisplayEvent, AppStateChange, MicrophoneStateChange, CloudToGlassesMessage, PhotoRequestToGlasses, SettingsUpdate, StartRtmpStream, StopRtmpStream, KeepRtmpStreamAlive } from './messages/cloud-to-glasses';
|
20
|
-
export {
|
20
|
+
export { AppConnectionInit, AppSubscriptionUpdate, RtmpStreamRequest, RtmpStreamStopRequest, AppToCloudMessage, PhotoRequest } from './messages/app-to-cloud';
|
21
21
|
export { TextWall, DoubleTextWall, DashboardCard, ReferenceCard, Layout, DisplayRequest } from './layouts';
|
22
22
|
export { isButtonPress, isHeadPosition, isConnectionInit, isStartApp, isStopApp, isPhotoResponse as isPhotoResponseFromGlasses, isRtmpStreamStatus as isRtmpStreamStatusFromGlasses, isKeepAliveAck } from './messages/glasses-to-cloud';
|
23
23
|
export { isConnectionAck, isDisplayEvent, isAppStateChange, isPhotoRequest, isSettingsUpdate as isSettingsUpdateToGlasses, isStartRtmpStream, isStopRtmpStream, isKeepRtmpStreamAlive } from './messages/cloud-to-glasses';
|
24
|
-
export {
|
25
|
-
export { BaseAppSetting, AppSetting, AppSettings,
|
24
|
+
export { isAppConnectionInit, isAppSubscriptionUpdate, isDisplayRequest, isRtmpStreamRequest, isRtmpStreamStopRequest, isPhotoRequest as isPhotoRequestFromApp } from './messages/app-to-cloud';
|
25
|
+
export { BaseAppSetting, AppSetting, AppSettings, AppConfig, validateAppConfig, ToolSchema, ToolParameterSchema } from './models';
|
26
26
|
export { VideoConfig, AudioConfig, StreamConfig, StreamStatusHandler } from './rtmp-stream';
|
27
27
|
/**
|
28
28
|
* WebSocket error information
|
package/dist/types/index.js
CHANGED
@@ -15,7 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
15
15
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
16
16
|
};
|
17
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
18
|
-
exports.
|
18
|
+
exports.validateAppConfig = exports.isPhotoRequestFromApp = exports.isRtmpStreamStopRequest = exports.isRtmpStreamRequest = exports.isDisplayRequest = exports.isAppSubscriptionUpdate = exports.isAppConnectionInit = exports.isKeepRtmpStreamAlive = exports.isStopRtmpStream = exports.isStartRtmpStream = exports.isSettingsUpdateToGlasses = exports.isPhotoRequest = exports.isAppStateChange = exports.isDisplayEvent = exports.isConnectionAck = exports.isKeepAliveAck = exports.isRtmpStreamStatusFromGlasses = exports.isPhotoResponseFromGlasses = exports.isStopApp = exports.isStartApp = exports.isConnectionInit = exports.isHeadPosition = exports.isButtonPress = exports.isRtmpStreamStatusFromCloud = exports.isPhotoResponseFromCloud = exports.isDashboardAlwaysOnChanged = exports.isDashboardModeChanged = exports.isAudioChunk = exports.isDataStream = exports.isSettingsUpdate = exports.isAppStopped = exports.isAppConnectionError = exports.isAppConnectionAck = void 0;
|
19
19
|
__exportStar(require("./token"), exports);
|
20
20
|
// Message type enums
|
21
21
|
__exportStar(require("./message-types"), exports);
|
@@ -24,22 +24,22 @@ __exportStar(require("./messages/base"), exports);
|
|
24
24
|
// Messages by direction - export everything except the conflicting type guards
|
25
25
|
__exportStar(require("./messages/glasses-to-cloud"), exports);
|
26
26
|
__exportStar(require("./messages/cloud-to-glasses"), exports);
|
27
|
-
__exportStar(require("./messages/
|
28
|
-
// Export cloud-to-
|
29
|
-
var
|
27
|
+
__exportStar(require("./messages/app-to-cloud"), exports);
|
28
|
+
// Export cloud-to-app but exclude the conflicting type guards
|
29
|
+
var cloud_to_app_1 = require("./messages/cloud-to-app");
|
30
30
|
// Type guards (excluding isPhotoResponse and isRtmpStreamStatus which conflict)
|
31
|
-
Object.defineProperty(exports, "
|
32
|
-
Object.defineProperty(exports, "
|
33
|
-
Object.defineProperty(exports, "isAppStopped", { enumerable: true, get: function () { return
|
34
|
-
Object.defineProperty(exports, "isSettingsUpdate", { enumerable: true, get: function () { return
|
35
|
-
Object.defineProperty(exports, "isDataStream", { enumerable: true, get: function () { return
|
36
|
-
Object.defineProperty(exports, "isAudioChunk", { enumerable: true, get: function () { return
|
37
|
-
Object.defineProperty(exports, "isDashboardModeChanged", { enumerable: true, get: function () { return
|
38
|
-
Object.defineProperty(exports, "isDashboardAlwaysOnChanged", { enumerable: true, get: function () { return
|
39
|
-
// Re-export the cloud-to-
|
40
|
-
// that should be used when dealing with
|
41
|
-
Object.defineProperty(exports, "isPhotoResponseFromCloud", { enumerable: true, get: function () { return
|
42
|
-
Object.defineProperty(exports, "isRtmpStreamStatusFromCloud", { enumerable: true, get: function () { return
|
31
|
+
Object.defineProperty(exports, "isAppConnectionAck", { enumerable: true, get: function () { return cloud_to_app_1.isAppConnectionAck; } });
|
32
|
+
Object.defineProperty(exports, "isAppConnectionError", { enumerable: true, get: function () { return cloud_to_app_1.isAppConnectionError; } });
|
33
|
+
Object.defineProperty(exports, "isAppStopped", { enumerable: true, get: function () { return cloud_to_app_1.isAppStopped; } });
|
34
|
+
Object.defineProperty(exports, "isSettingsUpdate", { enumerable: true, get: function () { return cloud_to_app_1.isSettingsUpdate; } });
|
35
|
+
Object.defineProperty(exports, "isDataStream", { enumerable: true, get: function () { return cloud_to_app_1.isDataStream; } });
|
36
|
+
Object.defineProperty(exports, "isAudioChunk", { enumerable: true, get: function () { return cloud_to_app_1.isAudioChunk; } });
|
37
|
+
Object.defineProperty(exports, "isDashboardModeChanged", { enumerable: true, get: function () { return cloud_to_app_1.isDashboardModeChanged; } });
|
38
|
+
Object.defineProperty(exports, "isDashboardAlwaysOnChanged", { enumerable: true, get: function () { return cloud_to_app_1.isDashboardAlwaysOnChanged; } });
|
39
|
+
// Re-export the cloud-to-app versions of these type guards since they're the ones
|
40
|
+
// that should be used when dealing with CloudToAppMessage types
|
41
|
+
Object.defineProperty(exports, "isPhotoResponseFromCloud", { enumerable: true, get: function () { return cloud_to_app_1.isPhotoResponse; } });
|
42
|
+
Object.defineProperty(exports, "isRtmpStreamStatusFromCloud", { enumerable: true, get: function () { return cloud_to_app_1.isRtmpStreamStatus; } });
|
43
43
|
// Stream types
|
44
44
|
__exportStar(require("./streams"), exports);
|
45
45
|
// Layout types
|
@@ -77,13 +77,13 @@ Object.defineProperty(exports, "isSettingsUpdateToGlasses", { enumerable: true,
|
|
77
77
|
Object.defineProperty(exports, "isStartRtmpStream", { enumerable: true, get: function () { return cloud_to_glasses_1.isStartRtmpStream; } });
|
78
78
|
Object.defineProperty(exports, "isStopRtmpStream", { enumerable: true, get: function () { return cloud_to_glasses_1.isStopRtmpStream; } });
|
79
79
|
Object.defineProperty(exports, "isKeepRtmpStreamAlive", { enumerable: true, get: function () { return cloud_to_glasses_1.isKeepRtmpStreamAlive; } });
|
80
|
-
var
|
81
|
-
Object.defineProperty(exports, "
|
82
|
-
Object.defineProperty(exports, "
|
83
|
-
Object.defineProperty(exports, "isDisplayRequest", { enumerable: true, get: function () { return
|
84
|
-
Object.defineProperty(exports, "isRtmpStreamRequest", { enumerable: true, get: function () { return
|
85
|
-
Object.defineProperty(exports, "isRtmpStreamStopRequest", { enumerable: true, get: function () { return
|
86
|
-
Object.defineProperty(exports, "
|
80
|
+
var app_to_cloud_1 = require("./messages/app-to-cloud");
|
81
|
+
Object.defineProperty(exports, "isAppConnectionInit", { enumerable: true, get: function () { return app_to_cloud_1.isAppConnectionInit; } });
|
82
|
+
Object.defineProperty(exports, "isAppSubscriptionUpdate", { enumerable: true, get: function () { return app_to_cloud_1.isAppSubscriptionUpdate; } });
|
83
|
+
Object.defineProperty(exports, "isDisplayRequest", { enumerable: true, get: function () { return app_to_cloud_1.isDisplayRequest; } });
|
84
|
+
Object.defineProperty(exports, "isRtmpStreamRequest", { enumerable: true, get: function () { return app_to_cloud_1.isRtmpStreamRequest; } });
|
85
|
+
Object.defineProperty(exports, "isRtmpStreamStopRequest", { enumerable: true, get: function () { return app_to_cloud_1.isRtmpStreamStopRequest; } });
|
86
|
+
Object.defineProperty(exports, "isPhotoRequestFromApp", { enumerable: true, get: function () { return app_to_cloud_1.isPhotoRequest; } });
|
87
87
|
// Export setting-related types
|
88
88
|
var models_1 = require("./models");
|
89
|
-
Object.defineProperty(exports, "
|
89
|
+
Object.defineProperty(exports, "validateAppConfig", { enumerable: true, get: function () { return models_1.validateAppConfig; } });
|
package/dist/types/layouts.d.ts
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
import { LayoutType, ViewType } from './enums';
|
2
|
-
import {
|
2
|
+
import { AppToCloudMessageType } from './message-types';
|
3
3
|
import { BaseMessage } from './messages/base';
|
4
4
|
/**
|
5
5
|
* Text wall layout
|
@@ -41,7 +41,7 @@ export interface BitmapView {
|
|
41
41
|
*/
|
42
42
|
export type Layout = TextWall | DoubleTextWall | DashboardCard | ReferenceCard | BitmapView;
|
43
43
|
export interface DisplayRequest extends BaseMessage {
|
44
|
-
type:
|
44
|
+
type: AppToCloudMessageType.DISPLAY_REQUEST;
|
45
45
|
packageName: string;
|
46
46
|
view: ViewType;
|
47
47
|
layout: Layout;
|
@@ -46,9 +46,9 @@ export declare enum CloudToGlassesMessageType {
|
|
46
46
|
WEBSOCKET_ERROR = "websocket_error"
|
47
47
|
}
|
48
48
|
/**
|
49
|
-
* Types of messages from
|
49
|
+
* Types of messages from Apps to cloud
|
50
50
|
*/
|
51
|
-
export declare enum
|
51
|
+
export declare enum AppToCloudMessageType {
|
52
52
|
CONNECTION_INIT = "tpa_connection_init",
|
53
53
|
SUBSCRIPTION_UPDATE = "subscription_update",
|
54
54
|
DISPLAY_REQUEST = "display_event",
|
@@ -58,16 +58,16 @@ export declare enum TpaToCloudMessageType {
|
|
58
58
|
DASHBOARD_CONTENT_UPDATE = "dashboard_content_update",
|
59
59
|
DASHBOARD_MODE_CHANGE = "dashboard_mode_change",
|
60
60
|
DASHBOARD_SYSTEM_UPDATE = "dashboard_system_update",
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
61
|
+
APP_BROADCAST_MESSAGE = "app_broadcast_message",
|
62
|
+
APP_DIRECT_MESSAGE = "app_direct_message",
|
63
|
+
APP_USER_DISCOVERY = "app_user_discovery",
|
64
|
+
APP_ROOM_JOIN = "app_room_join",
|
65
|
+
APP_ROOM_LEAVE = "app_room_leave"
|
66
66
|
}
|
67
67
|
/**
|
68
|
-
* Types of messages from cloud to
|
68
|
+
* Types of messages from cloud to Apps
|
69
69
|
*/
|
70
|
-
export declare enum
|
70
|
+
export declare enum CloudToAppMessageType {
|
71
71
|
CONNECTION_ACK = "tpa_connection_ack",
|
72
72
|
CONNECTION_ERROR = "tpa_connection_error",
|
73
73
|
APP_STOPPED = "app_stopped",
|
@@ -80,11 +80,11 @@ export declare enum CloudToTpaMessageType {
|
|
80
80
|
WEBSOCKET_ERROR = "websocket_error",
|
81
81
|
PERMISSION_ERROR = "permission_error",
|
82
82
|
CUSTOM_MESSAGE = "custom_message",
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
83
|
+
APP_MESSAGE_RECEIVED = "app_message_received",
|
84
|
+
APP_USER_JOINED = "app_user_joined",
|
85
|
+
APP_USER_LEFT = "app_user_left",
|
86
|
+
APP_ROOM_UPDATED = "app_room_updated",
|
87
|
+
APP_DIRECT_MESSAGE_RESPONSE = "app_direct_message_response"
|
88
88
|
}
|
89
89
|
/**
|
90
90
|
* Control action message types (subset of GlassesToCloudMessageType)
|
@@ -105,5 +105,5 @@ export declare const UpdateTypes: readonly [CloudToGlassesMessageType.DISPLAY_EV
|
|
105
105
|
/**
|
106
106
|
* Dashboard message types
|
107
107
|
*/
|
108
|
-
export declare const DashboardMessageTypes: readonly [
|
108
|
+
export declare const DashboardMessageTypes: readonly [AppToCloudMessageType.DASHBOARD_CONTENT_UPDATE, AppToCloudMessageType.DASHBOARD_MODE_CHANGE, AppToCloudMessageType.DASHBOARD_SYSTEM_UPDATE, CloudToAppMessageType.DASHBOARD_MODE_CHANGED, CloudToAppMessageType.DASHBOARD_ALWAYS_ON_CHANGED];
|
109
109
|
//# sourceMappingURL=message-types.d.ts.map
|
@@ -1,7 +1,7 @@
|
|
1
1
|
"use strict";
|
2
2
|
// src/message-types.ts
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true });
|
4
|
-
exports.DashboardMessageTypes = exports.UpdateTypes = exports.ResponseTypes = exports.EventTypes = exports.ControlActionTypes = exports.
|
4
|
+
exports.DashboardMessageTypes = exports.UpdateTypes = exports.ResponseTypes = exports.EventTypes = exports.ControlActionTypes = exports.CloudToAppMessageType = exports.AppToCloudMessageType = exports.CloudToGlassesMessageType = exports.GlassesToCloudMessageType = void 0;
|
5
5
|
/**
|
6
6
|
* Types of messages from glasses to cloud
|
7
7
|
*/
|
@@ -71,61 +71,61 @@ var CloudToGlassesMessageType;
|
|
71
71
|
CloudToGlassesMessageType["WEBSOCKET_ERROR"] = "websocket_error";
|
72
72
|
})(CloudToGlassesMessageType || (exports.CloudToGlassesMessageType = CloudToGlassesMessageType = {}));
|
73
73
|
/**
|
74
|
-
* Types of messages from
|
74
|
+
* Types of messages from Apps to cloud
|
75
75
|
*/
|
76
|
-
var
|
77
|
-
(function (
|
76
|
+
var AppToCloudMessageType;
|
77
|
+
(function (AppToCloudMessageType) {
|
78
78
|
// Commands
|
79
|
-
|
80
|
-
|
79
|
+
AppToCloudMessageType["CONNECTION_INIT"] = "tpa_connection_init";
|
80
|
+
AppToCloudMessageType["SUBSCRIPTION_UPDATE"] = "subscription_update";
|
81
81
|
// Requests
|
82
|
-
|
83
|
-
|
82
|
+
AppToCloudMessageType["DISPLAY_REQUEST"] = "display_event";
|
83
|
+
AppToCloudMessageType["PHOTO_REQUEST"] = "photo_request";
|
84
84
|
// RTMP streaming
|
85
|
-
|
86
|
-
|
85
|
+
AppToCloudMessageType["RTMP_STREAM_REQUEST"] = "rtmp_stream_request";
|
86
|
+
AppToCloudMessageType["RTMP_STREAM_STOP"] = "rtmp_stream_stop";
|
87
87
|
// Dashboard requests
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
//
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
})(
|
88
|
+
AppToCloudMessageType["DASHBOARD_CONTENT_UPDATE"] = "dashboard_content_update";
|
89
|
+
AppToCloudMessageType["DASHBOARD_MODE_CHANGE"] = "dashboard_mode_change";
|
90
|
+
AppToCloudMessageType["DASHBOARD_SYSTEM_UPDATE"] = "dashboard_system_update";
|
91
|
+
// App-to-App Communication
|
92
|
+
AppToCloudMessageType["APP_BROADCAST_MESSAGE"] = "app_broadcast_message";
|
93
|
+
AppToCloudMessageType["APP_DIRECT_MESSAGE"] = "app_direct_message";
|
94
|
+
AppToCloudMessageType["APP_USER_DISCOVERY"] = "app_user_discovery";
|
95
|
+
AppToCloudMessageType["APP_ROOM_JOIN"] = "app_room_join";
|
96
|
+
AppToCloudMessageType["APP_ROOM_LEAVE"] = "app_room_leave";
|
97
|
+
})(AppToCloudMessageType || (exports.AppToCloudMessageType = AppToCloudMessageType = {}));
|
98
98
|
/**
|
99
|
-
* Types of messages from cloud to
|
99
|
+
* Types of messages from cloud to Apps
|
100
100
|
*/
|
101
|
-
var
|
102
|
-
(function (
|
101
|
+
var CloudToAppMessageType;
|
102
|
+
(function (CloudToAppMessageType) {
|
103
103
|
// Responses
|
104
|
-
|
105
|
-
|
104
|
+
CloudToAppMessageType["CONNECTION_ACK"] = "tpa_connection_ack";
|
105
|
+
CloudToAppMessageType["CONNECTION_ERROR"] = "tpa_connection_error";
|
106
106
|
// Updates
|
107
|
-
|
108
|
-
|
107
|
+
CloudToAppMessageType["APP_STOPPED"] = "app_stopped";
|
108
|
+
CloudToAppMessageType["SETTINGS_UPDATE"] = "settings_update";
|
109
109
|
// Dashboard updates
|
110
|
-
|
111
|
-
|
110
|
+
CloudToAppMessageType["DASHBOARD_MODE_CHANGED"] = "dashboard_mode_changed";
|
111
|
+
CloudToAppMessageType["DASHBOARD_ALWAYS_ON_CHANGED"] = "dashboard_always_on_changed";
|
112
112
|
// Stream data
|
113
|
-
|
113
|
+
CloudToAppMessageType["DATA_STREAM"] = "data_stream";
|
114
114
|
// Media responses
|
115
|
-
|
116
|
-
|
117
|
-
|
115
|
+
CloudToAppMessageType["PHOTO_RESPONSE"] = "photo_response";
|
116
|
+
CloudToAppMessageType["RTMP_STREAM_STATUS"] = "rtmp_stream_status";
|
117
|
+
CloudToAppMessageType["WEBSOCKET_ERROR"] = "websocket_error";
|
118
118
|
// Permissions
|
119
|
-
|
119
|
+
CloudToAppMessageType["PERMISSION_ERROR"] = "permission_error";
|
120
120
|
// General purpose messaging
|
121
|
-
|
122
|
-
//
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
})(
|
121
|
+
CloudToAppMessageType["CUSTOM_MESSAGE"] = "custom_message";
|
122
|
+
// App-to-App Communication Responses
|
123
|
+
CloudToAppMessageType["APP_MESSAGE_RECEIVED"] = "app_message_received";
|
124
|
+
CloudToAppMessageType["APP_USER_JOINED"] = "app_user_joined";
|
125
|
+
CloudToAppMessageType["APP_USER_LEFT"] = "app_user_left";
|
126
|
+
CloudToAppMessageType["APP_ROOM_UPDATED"] = "app_room_updated";
|
127
|
+
CloudToAppMessageType["APP_DIRECT_MESSAGE_RESPONSE"] = "app_direct_message_response";
|
128
|
+
})(CloudToAppMessageType || (exports.CloudToAppMessageType = CloudToAppMessageType = {}));
|
129
129
|
/**
|
130
130
|
* Control action message types (subset of GlassesToCloudMessageType)
|
131
131
|
*/
|
@@ -181,9 +181,9 @@ exports.UpdateTypes = [
|
|
181
181
|
* Dashboard message types
|
182
182
|
*/
|
183
183
|
exports.DashboardMessageTypes = [
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
184
|
+
AppToCloudMessageType.DASHBOARD_CONTENT_UPDATE,
|
185
|
+
AppToCloudMessageType.DASHBOARD_MODE_CHANGE,
|
186
|
+
AppToCloudMessageType.DASHBOARD_SYSTEM_UPDATE,
|
187
|
+
CloudToAppMessageType.DASHBOARD_MODE_CHANGED,
|
188
|
+
CloudToAppMessageType.DASHBOARD_ALWAYS_ON_CHANGED
|
189
189
|
];
|
@@ -0,0 +1,146 @@
|
|
1
|
+
import { BaseMessage } from './base';
|
2
|
+
import { AppToCloudMessageType } from '../message-types';
|
3
|
+
import { ExtendedStreamType } from '../streams';
|
4
|
+
import { DisplayRequest } from '../layouts';
|
5
|
+
import { DashboardContentUpdate, DashboardModeChange, DashboardSystemUpdate } from '../dashboard';
|
6
|
+
import { VideoConfig, AudioConfig, StreamConfig } from '../rtmp-stream';
|
7
|
+
/**
|
8
|
+
* Connection initialization from App
|
9
|
+
*/
|
10
|
+
export interface AppConnectionInit extends BaseMessage {
|
11
|
+
type: AppToCloudMessageType.CONNECTION_INIT;
|
12
|
+
packageName: string;
|
13
|
+
sessionId: string;
|
14
|
+
apiKey: string;
|
15
|
+
}
|
16
|
+
/**
|
17
|
+
* Subscription update from App
|
18
|
+
*/
|
19
|
+
export interface AppSubscriptionUpdate extends BaseMessage {
|
20
|
+
type: AppToCloudMessageType.SUBSCRIPTION_UPDATE;
|
21
|
+
packageName: string;
|
22
|
+
subscriptions: ExtendedStreamType[];
|
23
|
+
}
|
24
|
+
/**
|
25
|
+
* Photo request from App
|
26
|
+
*/
|
27
|
+
export interface PhotoRequest extends BaseMessage {
|
28
|
+
type: AppToCloudMessageType.PHOTO_REQUEST;
|
29
|
+
packageName: string;
|
30
|
+
saveToGallery?: boolean;
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* RTMP stream request from App
|
34
|
+
*/
|
35
|
+
export interface RtmpStreamRequest extends BaseMessage {
|
36
|
+
type: AppToCloudMessageType.RTMP_STREAM_REQUEST;
|
37
|
+
packageName: string;
|
38
|
+
rtmpUrl: string;
|
39
|
+
video?: VideoConfig;
|
40
|
+
audio?: AudioConfig;
|
41
|
+
stream?: StreamConfig;
|
42
|
+
}
|
43
|
+
/**
|
44
|
+
* RTMP stream stop request from App
|
45
|
+
*/
|
46
|
+
export interface RtmpStreamStopRequest extends BaseMessage {
|
47
|
+
type: AppToCloudMessageType.RTMP_STREAM_STOP;
|
48
|
+
packageName: string;
|
49
|
+
streamId?: string;
|
50
|
+
}
|
51
|
+
/**
|
52
|
+
* Union type for all messages from Apps to cloud
|
53
|
+
*/
|
54
|
+
export type AppToCloudMessage = AppConnectionInit | AppSubscriptionUpdate | DisplayRequest | PhotoRequest | RtmpStreamRequest | RtmpStreamStopRequest | DashboardContentUpdate | DashboardModeChange | DashboardSystemUpdate | AppBroadcastMessage | AppDirectMessage | AppUserDiscovery | AppRoomJoin | AppRoomLeave;
|
55
|
+
/**
|
56
|
+
* Type guard to check if a message is a App connection init
|
57
|
+
*/
|
58
|
+
export declare function isAppConnectionInit(message: AppToCloudMessage): message is AppConnectionInit;
|
59
|
+
/**
|
60
|
+
* Type guard to check if a message is a App subscription update
|
61
|
+
*/
|
62
|
+
export declare function isAppSubscriptionUpdate(message: AppToCloudMessage): message is AppSubscriptionUpdate;
|
63
|
+
/**
|
64
|
+
* Type guard to check if a message is a App display request
|
65
|
+
*/
|
66
|
+
export declare function isDisplayRequest(message: AppToCloudMessage): message is DisplayRequest;
|
67
|
+
/**
|
68
|
+
* Type guard to check if a message is a App photo request
|
69
|
+
*/
|
70
|
+
export declare function isPhotoRequest(message: AppToCloudMessage): message is PhotoRequest;
|
71
|
+
/**
|
72
|
+
* Type guard to check if a message is a dashboard content update
|
73
|
+
*/
|
74
|
+
export declare function isDashboardContentUpdate(message: AppToCloudMessage): message is DashboardContentUpdate;
|
75
|
+
/**
|
76
|
+
* Type guard to check if a message is a dashboard mode change
|
77
|
+
*/
|
78
|
+
export declare function isDashboardModeChange(message: AppToCloudMessage): message is DashboardModeChange;
|
79
|
+
/**
|
80
|
+
* Type guard to check if a message is a dashboard system update
|
81
|
+
*/
|
82
|
+
export declare function isDashboardSystemUpdate(message: AppToCloudMessage): message is DashboardSystemUpdate;
|
83
|
+
/**
|
84
|
+
* Broadcast message to all users with the same App active
|
85
|
+
*/
|
86
|
+
export interface AppBroadcastMessage extends BaseMessage {
|
87
|
+
type: AppToCloudMessageType.APP_BROADCAST_MESSAGE;
|
88
|
+
packageName: string;
|
89
|
+
sessionId: string;
|
90
|
+
payload: any;
|
91
|
+
messageId: string;
|
92
|
+
senderUserId: string;
|
93
|
+
}
|
94
|
+
/**
|
95
|
+
* Direct message to a specific user with the same App active
|
96
|
+
*/
|
97
|
+
export interface AppDirectMessage extends BaseMessage {
|
98
|
+
type: AppToCloudMessageType.APP_DIRECT_MESSAGE;
|
99
|
+
packageName: string;
|
100
|
+
sessionId: string;
|
101
|
+
targetUserId: string;
|
102
|
+
payload: any;
|
103
|
+
messageId: string;
|
104
|
+
senderUserId: string;
|
105
|
+
}
|
106
|
+
/**
|
107
|
+
* Request to discover other users with the same App active
|
108
|
+
*/
|
109
|
+
export interface AppUserDiscovery extends BaseMessage {
|
110
|
+
type: AppToCloudMessageType.APP_USER_DISCOVERY;
|
111
|
+
packageName: string;
|
112
|
+
sessionId: string;
|
113
|
+
includeUserProfiles?: boolean;
|
114
|
+
}
|
115
|
+
/**
|
116
|
+
* Join a communication room for group messaging
|
117
|
+
*/
|
118
|
+
export interface AppRoomJoin extends BaseMessage {
|
119
|
+
type: AppToCloudMessageType.APP_ROOM_JOIN;
|
120
|
+
packageName: string;
|
121
|
+
sessionId: string;
|
122
|
+
roomId: string;
|
123
|
+
roomConfig?: {
|
124
|
+
maxUsers?: number;
|
125
|
+
isPrivate?: boolean;
|
126
|
+
metadata?: any;
|
127
|
+
};
|
128
|
+
}
|
129
|
+
/**
|
130
|
+
* Leave a communication room
|
131
|
+
*/
|
132
|
+
export interface AppRoomLeave extends BaseMessage {
|
133
|
+
type: AppToCloudMessageType.APP_ROOM_LEAVE;
|
134
|
+
packageName: string;
|
135
|
+
sessionId: string;
|
136
|
+
roomId: string;
|
137
|
+
}
|
138
|
+
/**
|
139
|
+
* Type guard to check if a message is an RTMP stream request
|
140
|
+
*/
|
141
|
+
export declare function isRtmpStreamRequest(message: AppToCloudMessage): message is RtmpStreamRequest;
|
142
|
+
/**
|
143
|
+
* Type guard to check if a message is an RTMP stream stop request
|
144
|
+
*/
|
145
|
+
export declare function isRtmpStreamStopRequest(message: AppToCloudMessage): message is RtmpStreamStopRequest;
|
146
|
+
//# sourceMappingURL=app-to-cloud.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"
|
1
|
+
{"version":3,"file":"app-to-cloud.d.ts","sourceRoot":"","sources":["../../../src/types/messages/app-to-cloud.ts"],"names":[],"mappings":"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"}
|