@mentra/sdk 2.1.2 → 2.1.3
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/app/session/events.d.ts +3 -2
- package/dist/app/session/events.d.ts.map +1 -1
- package/dist/app/session/events.js +3 -0
- package/dist/app/session/index.d.ts +8 -1
- package/dist/app/session/index.d.ts.map +1 -1
- package/dist/app/session/index.js +9 -0
- package/dist/app/session/layouts.d.ts +63 -3
- package/dist/app/session/layouts.d.ts.map +1 -1
- package/dist/app/session/layouts.js +101 -7
- package/dist/app/session/modules/camera-managed-extension.d.ts +3 -1
- package/dist/app/session/modules/camera-managed-extension.d.ts.map +1 -1
- package/dist/app/session/modules/camera-managed-extension.js +26 -18
- package/dist/examples/managed-rtmp-streaming-example.js +3 -0
- package/dist/examples/managed-rtmp-streaming-with-restream-example.d.ts +11 -0
- package/dist/examples/managed-rtmp-streaming-with-restream-example.d.ts.map +1 -0
- package/dist/examples/managed-rtmp-streaming-with-restream-example.js +124 -0
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/types/enums.d.ts +3 -1
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/enums.js +2 -0
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/layouts.d.ts +16 -1
- package/dist/types/layouts.d.ts.map +1 -1
- package/dist/types/message-types.d.ts +2 -2
- package/dist/types/message-types.d.ts.map +1 -1
- package/dist/types/message-types.js +3 -3
- package/dist/types/messages/app-to-cloud.d.ts +11 -0
- package/dist/types/messages/app-to-cloud.d.ts.map +1 -1
- package/dist/types/messages/cloud-to-app.d.ts +19 -0
- package/dist/types/messages/cloud-to-app.d.ts.map +1 -1
- package/dist/types/messages/glasses-to-cloud.d.ts +8 -4
- package/dist/types/messages/glasses-to-cloud.d.ts.map +1 -1
- package/dist/types/messages/glasses-to-cloud.js +3 -3
- package/dist/types/models.d.ts +1 -0
- package/dist/types/models.d.ts.map +1 -1
- package/dist/types/models.js +1 -0
- package/dist/types/streams.d.ts +1 -1
- package/dist/types/streams.d.ts.map +1 -1
- package/dist/types/streams.js +2 -2
- package/dist/utils/animation-utils.d.ts +206 -0
- package/dist/utils/animation-utils.d.ts.map +1 -0
- package/dist/utils/animation-utils.js +339 -0
- package/dist/utils/bitmap-utils.d.ts +147 -0
- package/dist/utils/bitmap-utils.d.ts.map +1 -0
- package/dist/utils/bitmap-utils.js +338 -0
- package/package.json +1 -1
@@ -2,7 +2,7 @@
|
|
2
2
|
* 🎮 Event Manager Module
|
3
3
|
*/
|
4
4
|
import EventEmitter from 'events';
|
5
|
-
import { StreamType, ExtendedStreamType, AppSettings, WebSocketError, ButtonPress, HeadPosition, PhoneNotification, TranscriptionData, TranslationData, GlassesBatteryUpdate, PhoneBatteryUpdate, GlassesConnectionState, LocationUpdate, Vad,
|
5
|
+
import { StreamType, ExtendedStreamType, AppSettings, WebSocketError, ButtonPress, HeadPosition, PhoneNotification, TranscriptionData, TranslationData, GlassesBatteryUpdate, PhoneBatteryUpdate, GlassesConnectionState, LocationUpdate, Vad, AudioChunk, CalendarEvent, VpsCoordinates, CustomMessage, RtmpStreamStatus, PhotoTaken, ManagedStreamStatus, PhoneNotificationDismissed } from '../../types';
|
6
6
|
import { DashboardMode } from '../../types/dashboard';
|
7
7
|
import { PermissionErrorDetail } from '../../types/messages/cloud-to-app';
|
8
8
|
/** 🎯 Type-safe event handler function */
|
@@ -52,7 +52,7 @@ export interface StreamDataTypes {
|
|
52
52
|
[StreamType.LOCATION_UPDATE]: LocationUpdate;
|
53
53
|
[StreamType.CALENDAR_EVENT]: CalendarEvent;
|
54
54
|
[StreamType.VAD]: Vad;
|
55
|
-
[StreamType.
|
55
|
+
[StreamType.PHONE_NOTIFICATION_DISMISSED]: PhoneNotificationDismissed;
|
56
56
|
[StreamType.AUDIO_CHUNK]: AudioChunk;
|
57
57
|
[StreamType.VIDEO]: ArrayBuffer;
|
58
58
|
[StreamType.RTMP_STREAM_STATUS]: RtmpStreamStatus;
|
@@ -96,6 +96,7 @@ export declare class EventManager {
|
|
96
96
|
onHeadPosition(handler: Handler<HeadPosition>): () => void;
|
97
97
|
onButtonPress(handler: Handler<ButtonPress>): () => void;
|
98
98
|
onPhoneNotifications(handler: Handler<PhoneNotification>): () => void;
|
99
|
+
onPhoneNotificationDismissed(handler: Handler<PhoneNotificationDismissed>): () => void;
|
99
100
|
onGlassesBattery(handler: Handler<GlassesBatteryUpdate>): () => void;
|
100
101
|
onPhoneBattery(handler: Handler<PhoneBatteryUpdate>): () => void;
|
101
102
|
onVoiceActivity(handler: Handler<Vad>): () => void;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/app/session/events.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,YAAY,MAAM,QAAQ,CAAC;AAClC,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,WAAW,EACX,cAAc,EAEd,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,GAAG,EACH,
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../src/app/session/events.ts"],"names":[],"mappings":"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"}
|
@@ -71,6 +71,9 @@ class EventManager {
|
|
71
71
|
onPhoneNotifications(handler) {
|
72
72
|
return this.addHandler(types_1.StreamType.PHONE_NOTIFICATION, handler);
|
73
73
|
}
|
74
|
+
onPhoneNotificationDismissed(handler) {
|
75
|
+
return this.addHandler(types_1.StreamType.PHONE_NOTIFICATION_DISMISSED, handler);
|
76
|
+
}
|
74
77
|
onGlassesBattery(handler) {
|
75
78
|
return this.addHandler(types_1.StreamType.GLASSES_BATTERY_UPDATE, handler);
|
76
79
|
}
|
@@ -4,7 +4,7 @@ import { SettingsManager } from './settings';
|
|
4
4
|
import { LocationManager } from './modules/location';
|
5
5
|
import { CameraModule } from './modules/camera';
|
6
6
|
import { AudioManager } from './modules/audio';
|
7
|
-
import { ExtendedStreamType, ButtonPress, HeadPosition, PhoneNotification, TranscriptionData, TranslationData, AppSettings, AppSetting, AppConfig, VpsCoordinates, PhotoTaken, SubscriptionRequest, Capabilities } from '../../types';
|
7
|
+
import { ExtendedStreamType, ButtonPress, HeadPosition, PhoneNotification, PhoneNotificationDismissed, TranscriptionData, TranslationData, AppSettings, AppSetting, AppConfig, VpsCoordinates, PhotoTaken, SubscriptionRequest, Capabilities } from '../../types';
|
8
8
|
import { DashboardAPI } from '../../types/dashboard';
|
9
9
|
import { Logger } from 'pino';
|
10
10
|
import { AppServer } from '../server';
|
@@ -167,6 +167,13 @@ export declare class AppSession {
|
|
167
167
|
* @deprecated Use session.events.onPhoneNotifications() instead
|
168
168
|
*/
|
169
169
|
onPhoneNotifications(handler: (data: PhoneNotification) => void): () => void;
|
170
|
+
/**
|
171
|
+
* 📱 Listen for phone notification dismissed events
|
172
|
+
* @param handler - Function to handle notification dismissal data
|
173
|
+
* @returns Cleanup function to remove the handler
|
174
|
+
* @deprecated Use session.events.onPhoneNotificationDismissed() instead
|
175
|
+
*/
|
176
|
+
onPhoneNotificationDismissed(handler: (data: PhoneNotificationDismissed) => void): () => void;
|
170
177
|
/**
|
171
178
|
* 📡 Listen for VPS coordinates updates
|
172
179
|
* @param handler - Function to handle VPS coordinates
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/app/session/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAmB,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,YAAY,EAA0C,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAeL,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EAaf,WAAW,EACX,UAAU,EACV,SAAS,EAQT,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,YAAY,EAEb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAStC;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAC/B,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,wEAAwE;IACxE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,SAAS,CAAC;CACtB;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,UAAU;IA2DT,OAAO,CAAC,MAAM;IA1D1B,6CAA6C;IAC7C,OAAO,CAAC,EAAE,CAA0B;IACpC,iCAAiC;IACjC,OAAO,CAAC,SAAS,CAAuB;IACxC,2CAA2C;IAC3C,OAAO,CAAC,iBAAiB,CAAK;IAC9B,iCAAiC;IACjC,OAAO,CAAC,aAAa,CAAiC;IACtD,4CAA4C;IAC5C,OAAO,CAAC,WAAW,CAAyC;IAC5D,6CAA6C;IAC7C,OAAO,CAAC,SAAS,CAAyB;IAC1C,kEAAkE;IAClE,OAAO,CAAC,YAAY,CAAmB;IACvC,oDAAoD;IACpD,OAAO,CAAC,SAAS,CAA0B;IAC3C,2DAA2D;IAC3D,OAAO,CAAC,yCAAyC,CAAS;IAC1D,mEAAmE;IACnE,OAAO,CAAC,2BAA2B,CAAC,CAAkD;IACtF,qEAAqE;IACrE,OAAO,CAAC,0BAA0B,CAAgB;IAClD,4DAA4D;IAC5D,OAAO,CAAC,4BAA4B,CAG/B;IACL,4DAA4D;IAC5D,OAAO,CAAC,qBAAqB,CAGxB;IAEL,oCAAoC;IACpC,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,qCAAqC;IACrC,SAAgB,OAAO,EAAE,aAAa,CAAC;IACvC,uCAAuC;IACvC,SAAgB,QAAQ,EAAE,eAAe,CAAC;IAC1C,wCAAwC;IACxC,SAAgB,SAAS,EAAE,YAAY,CAAC;IACxC,uCAAuC;IACvC,SAAgB,QAAQ,EAAE,eAAe,CAAC;IAC1C,mDAAmD;IACnD,SAAgB,MAAM,EAAE,YAAY,CAAC;IACrC,4CAA4C;IAC5C,SAAgB,KAAK,EAAE,YAAY,CAAC;IAEpC,SAAgB,SAAS,EAAE,SAAS,CAAC;IACrC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,wDAAwD;IACjD,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IAEhD,8CAA8C;IAC9C,OAAO,CAAC,SAAS,CAAsB;gBAEnB,MAAM,EAAE,gBAAgB;IAwG5C;;;OAGG;IACH,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACH,cAAc,IAAI,MAAM;IASxB;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;IAIvE;;;;;;;OAOG;IACH,0BAA0B,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;IAIpG;;;;;;;;OAQG;IACH,wBAAwB,CAAC,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAI9H;;;;;OAKG;IACH,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI;IAIjE;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,WAAW,KAAK,IAAI,GAAG,MAAM,IAAI;IAI/D;;;;;OAKG;IACH,oBAAoB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,iBAAiB,KAAK,IAAI,GAAG,MAAM,IAAI;IAI5E;;;;;OAKG;IACH,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,IAAI,GAAG,MAAM,IAAI;IAKrE;;;;;OAKG;IACH,YAAY,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,MAAM,IAAI;IAS7D;;;OAGG;IACH,SAAS,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI;IA2BzC;;;OAGG;IACH,WAAW,CAAC,GAAG,EAAE,mBAAmB,GAAG,IAAI;IAmB3C;;;;OAIG;IACH,EAAE,CAAC,CAAC,SAAS,kBAAkB,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAQ7F;;;;OAIG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqQ/C;;OAEG;IACH,UAAU,IAAI,IAAI;IAuBlB;;;;OAIG;IACH,WAAW,IAAI,WAAW;IAI1B;;;;;OAKG;IACH,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIzC;;;;OAIG;IACH,uBAAuB,CAAC,OAAO,EAAE;QAC/B,cAAc,EAAE,MAAM,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,KAAK,kBAAkB,EAAE,CAAC;KAC1D,GAAG,IAAI;IAWR;;;OAGG;IACH,OAAO,CAAC,+BAA+B;IAwBvC;;;;OAIG;IACH,wBAAwB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI;IAexD;;;;;OAKG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS;IAgB/C;;;OAGG;IACH,SAAS,IAAI,SAAS,GAAG,IAAI;IAI7B;;;OAGG;IACH,YAAY,IAAI,MAAM,GAAG,SAAS;IAI3B,iBAAiB,IAAI,MAAM,GAAG,SAAS;IAO9C,OAAO,CAAC,MAAM,CAAC,cAAc;IAU7B;;;;OAIG;IACH,kBAAkB,IAAI,WAAW;IAajC;;;;OAIG;IACH,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAcrD;;OAEG;IACH,OAAO,CAAC,aAAa;IA+RrB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAoBvB;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA8B3B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA+CzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAW1B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;YACW,kBAAkB;IA8DhC;;;OAGG;IACH,OAAO,CAAC,IAAI;IAwDZ;;;OAGG;IACU,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IActD;;;;OAIG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,UAAQ,GAAG,OAAO,CAAC,GAAG,CAAC;IAgC7E;;;;OAIG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUpD;;;OAGG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAUnD;;;;;OAKG;IACG,mBAAmB,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBvE;;;;;OAKG;IACG,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAoC7E;;;;;OAKG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE;QAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,QAAQ,CAAC,EAAE,GAAG,CAAC;KAChB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBjB;;;;OAIG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjD;;;;OAIG;IACH,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD;;;;OAIG;IACH,eAAe,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAKzD;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAKvD;;;;OAIG;IACH,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,GAAG,MAAM,IAAI;IAK1D;;;OAGG;IACH,OAAO,CAAC,iBAAiB;CAG1B;AAGD;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,gBAAgB,GAAG,gBAAgB,CAAC;AAEhD;;;;;;;;;;;;GAYG;AACH,qBAAa,UAAW,SAAQ,UAAU;gBAC5B,MAAM,EAAE,gBAAgB;CASrC;AAGD,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACxF,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/app/session/index.ts"],"names":[],"mappings":"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"}
|
@@ -239,6 +239,15 @@ class AppSession {
|
|
239
239
|
onPhoneNotifications(handler) {
|
240
240
|
return this.events.onPhoneNotifications(handler);
|
241
241
|
}
|
242
|
+
/**
|
243
|
+
* 📱 Listen for phone notification dismissed events
|
244
|
+
* @param handler - Function to handle notification dismissal data
|
245
|
+
* @returns Cleanup function to remove the handler
|
246
|
+
* @deprecated Use session.events.onPhoneNotificationDismissed() instead
|
247
|
+
*/
|
248
|
+
onPhoneNotificationDismissed(handler) {
|
249
|
+
return this.events.onPhoneNotificationDismissed(handler);
|
250
|
+
}
|
242
251
|
/**
|
243
252
|
* 📡 Listen for VPS coordinates updates
|
244
253
|
* @param handler - Function to handle VPS coordinates
|
@@ -111,20 +111,26 @@ export declare class LayoutManager {
|
|
111
111
|
/**
|
112
112
|
* 📇 Shows a bitmap
|
113
113
|
*
|
114
|
-
*
|
114
|
+
* Uses the proven animation system internally for proper L/R eye synchronization.
|
115
|
+
* This ensures single bitmap displays work consistently with the same
|
116
|
+
* hardware-optimized timing as animations.
|
117
|
+
*
|
118
|
+
* @param data - hex or base64 encoded bitmap data
|
115
119
|
* @param options - Optional parameters (view, duration)
|
116
120
|
*
|
117
121
|
* @example
|
118
122
|
* ```typescript
|
119
123
|
* layouts.showBitmapView(
|
120
|
-
*
|
124
|
+
* yourHexOrBase64EncodedBitmapDataString
|
121
125
|
* );
|
122
126
|
* ```
|
123
127
|
*/
|
124
128
|
showBitmapView(data: string, options?: {
|
125
129
|
view?: ViewType;
|
126
130
|
durationMs?: number;
|
127
|
-
}):
|
131
|
+
}): {
|
132
|
+
stop: () => void;
|
133
|
+
};
|
128
134
|
/**
|
129
135
|
* 📊 Shows a dashboard card with left and right text
|
130
136
|
*
|
@@ -146,5 +152,59 @@ export declare class LayoutManager {
|
|
146
152
|
view?: ViewType;
|
147
153
|
durationMs?: number;
|
148
154
|
}): void;
|
155
|
+
/**
|
156
|
+
* 🧹 Clears the display
|
157
|
+
*
|
158
|
+
* Best for:
|
159
|
+
* - Clearing previous content
|
160
|
+
* - Resetting display state
|
161
|
+
* - Starting fresh
|
162
|
+
*
|
163
|
+
* @param options - Optional parameters (view)
|
164
|
+
*
|
165
|
+
* @example
|
166
|
+
* ```typescript
|
167
|
+
* layouts.clearView();
|
168
|
+
* layouts.clearView({ view: ViewType.DASHBOARD });
|
169
|
+
* ```
|
170
|
+
*/
|
171
|
+
clearView(options?: {
|
172
|
+
view?: ViewType;
|
173
|
+
}): void;
|
174
|
+
/**
|
175
|
+
* 🎬 Shows an animated sequence of bitmap images (iOS-controlled timing)
|
176
|
+
*
|
177
|
+
* Sends complete animation package to iOS for device-controlled timing.
|
178
|
+
* This provides superior performance and synchronization by letting
|
179
|
+
* the device control the display timing directly.
|
180
|
+
*
|
181
|
+
* Best for:
|
182
|
+
* - Smooth high-performance animations
|
183
|
+
* - Precise timing control
|
184
|
+
* - Synchronized left/right display
|
185
|
+
* - EvenDemo-quality performance
|
186
|
+
*
|
187
|
+
* @param bitmapDataArray - Array of bitmap data strings (hex or base64 encoded)
|
188
|
+
* @param intervalMs - Time between frames in milliseconds (default: 1650ms)
|
189
|
+
* @param repeat - Whether to loop the animation continuously (default: false)
|
190
|
+
* @param options - Optional parameters (view)
|
191
|
+
*
|
192
|
+
* @example
|
193
|
+
* ```typescript
|
194
|
+
* // Device-controlled animation (recommended)
|
195
|
+
* const frames = ['hexdata1', 'hexdata2', 'hexdata3'];
|
196
|
+
* layouts.showBitmapAnimation(frames, 1650, true);
|
197
|
+
*
|
198
|
+
* // Single-cycle animation
|
199
|
+
* layouts.showBitmapAnimation(loadingFrames, 1650, false);
|
200
|
+
* ```
|
201
|
+
*
|
202
|
+
* @returns Animation controller object with stop() method
|
203
|
+
*/
|
204
|
+
showBitmapAnimation(bitmapDataArray: string[], intervalMs?: number, repeat?: boolean, options?: {
|
205
|
+
view?: ViewType;
|
206
|
+
}): {
|
207
|
+
stop: () => void;
|
208
|
+
};
|
149
209
|
}
|
150
210
|
//# sourceMappingURL=layouts.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"layouts.d.ts","sourceRoot":"","sources":["../../../src/app/session/layouts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,cAAc,EAOd,QAAQ,
|
1
|
+
{"version":3,"file":"layouts.d.ts","sourceRoot":"","sources":["../../../src/app/session/layouts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,cAAc,EAOd,QAAQ,EAKT,MAAM,aAAa,CAAC;AAErB,qBAAa,aAAa;IAQtB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,WAAW;IARrB;;;;;OAKG;gBAEO,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,IAAI;IAGxD;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAuG1B;;;;;;;;;;;;;;;;;OAiBG;IACH,YAAY,CACV,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAC;IAuCnD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,kBAAkB,CAChB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAcpD;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,iBAAiB,CACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAclD;;;;;;;;;;;;;;;;KAgBC;IACH,cAAc,CACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;cA0HzC,MAAM,IAAI;;IA/FrB;;;;;;;;;;;;;;;;OAgBG;IACH,iBAAiB,CACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE;IAcpD;;;;;;;;;;;;;;;OAeG;IACH,SAAS,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;KAAE;IAUvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,mBAAmB,CACjB,eAAe,EAAE,MAAM,EAAE,EACzB,UAAU,GAAE,MAAa,EACzB,MAAM,GAAE,OAAe,EACvB,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,QAAQ,CAAA;KAAE,GAC5B;QAAE,IAAI,EAAE,MAAM,IAAI,CAAA;KAAE;CA8BxB"}
|
@@ -96,6 +96,9 @@ class LayoutManager {
|
|
96
96
|
throw new Error("Bitmap data is too large (>1MB), please reduce size");
|
97
97
|
}
|
98
98
|
break;
|
99
|
+
case types_1.LayoutType.CLEAR_VIEW:
|
100
|
+
// ClearView has no additional validation needed
|
101
|
+
break;
|
99
102
|
}
|
100
103
|
// Validate view type
|
101
104
|
if (view !== types_1.ViewType.MAIN && view !== types_1.ViewType.DASHBOARD) {
|
@@ -236,22 +239,38 @@ class LayoutManager {
|
|
236
239
|
/**
|
237
240
|
* 📇 Shows a bitmap
|
238
241
|
*
|
239
|
-
*
|
242
|
+
* Uses the proven animation system internally for proper L/R eye synchronization.
|
243
|
+
* This ensures single bitmap displays work consistently with the same
|
244
|
+
* hardware-optimized timing as animations.
|
245
|
+
*
|
246
|
+
* @param data - hex or base64 encoded bitmap data
|
240
247
|
* @param options - Optional parameters (view, duration)
|
241
248
|
*
|
242
249
|
* @example
|
243
250
|
* ```typescript
|
244
251
|
* layouts.showBitmapView(
|
245
|
-
*
|
252
|
+
* yourHexOrBase64EncodedBitmapDataString
|
246
253
|
* );
|
247
254
|
* ```
|
248
255
|
*/
|
249
256
|
showBitmapView(data, options) {
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
257
|
+
// Use the proven animation system for single frame display
|
258
|
+
// This ensures proper L/R eye synchronization that works with
|
259
|
+
// the optimized iOS BLE transmission system
|
260
|
+
const duration = options?.durationMs || 5000; // Default 5 seconds
|
261
|
+
const frameInterval = 1650; // Use same interval as working animations
|
262
|
+
// Create short multi-frame animation for better L/R sync
|
263
|
+
// Repeat the same frame a few times to mimic continuous animation behavior
|
264
|
+
const frames = [data, data, data]; // Triple the frame for stability
|
265
|
+
const animation = this.showBitmapAnimation(frames, // Multi-frame array (same image repeated)
|
266
|
+
frameInterval, // Use proven 1650ms interval
|
267
|
+
false, // Don't repeat infinitely
|
268
|
+
{ view: options?.view });
|
269
|
+
// Auto-stop after duration
|
270
|
+
setTimeout(() => {
|
271
|
+
animation.stop();
|
272
|
+
}, duration);
|
273
|
+
return animation;
|
255
274
|
}
|
256
275
|
/**
|
257
276
|
* 📊 Shows a dashboard card with left and right text
|
@@ -278,5 +297,80 @@ class LayoutManager {
|
|
278
297
|
};
|
279
298
|
this.sendMessage(this.createDisplayEvent(layout, options?.view || types_1.ViewType.DASHBOARD, options?.durationMs));
|
280
299
|
}
|
300
|
+
/**
|
301
|
+
* 🧹 Clears the display
|
302
|
+
*
|
303
|
+
* Best for:
|
304
|
+
* - Clearing previous content
|
305
|
+
* - Resetting display state
|
306
|
+
* - Starting fresh
|
307
|
+
*
|
308
|
+
* @param options - Optional parameters (view)
|
309
|
+
*
|
310
|
+
* @example
|
311
|
+
* ```typescript
|
312
|
+
* layouts.clearView();
|
313
|
+
* layouts.clearView({ view: ViewType.DASHBOARD });
|
314
|
+
* ```
|
315
|
+
*/
|
316
|
+
clearView(options) {
|
317
|
+
const layout = {
|
318
|
+
layoutType: types_1.LayoutType.CLEAR_VIEW
|
319
|
+
};
|
320
|
+
this.sendMessage(this.createDisplayEvent(layout, options?.view));
|
321
|
+
}
|
322
|
+
/**
|
323
|
+
* 🎬 Shows an animated sequence of bitmap images (iOS-controlled timing)
|
324
|
+
*
|
325
|
+
* Sends complete animation package to iOS for device-controlled timing.
|
326
|
+
* This provides superior performance and synchronization by letting
|
327
|
+
* the device control the display timing directly.
|
328
|
+
*
|
329
|
+
* Best for:
|
330
|
+
* - Smooth high-performance animations
|
331
|
+
* - Precise timing control
|
332
|
+
* - Synchronized left/right display
|
333
|
+
* - EvenDemo-quality performance
|
334
|
+
*
|
335
|
+
* @param bitmapDataArray - Array of bitmap data strings (hex or base64 encoded)
|
336
|
+
* @param intervalMs - Time between frames in milliseconds (default: 1650ms)
|
337
|
+
* @param repeat - Whether to loop the animation continuously (default: false)
|
338
|
+
* @param options - Optional parameters (view)
|
339
|
+
*
|
340
|
+
* @example
|
341
|
+
* ```typescript
|
342
|
+
* // Device-controlled animation (recommended)
|
343
|
+
* const frames = ['hexdata1', 'hexdata2', 'hexdata3'];
|
344
|
+
* layouts.showBitmapAnimation(frames, 1650, true);
|
345
|
+
*
|
346
|
+
* // Single-cycle animation
|
347
|
+
* layouts.showBitmapAnimation(loadingFrames, 1650, false);
|
348
|
+
* ```
|
349
|
+
*
|
350
|
+
* @returns Animation controller object with stop() method
|
351
|
+
*/
|
352
|
+
showBitmapAnimation(bitmapDataArray, intervalMs = 1650, repeat = false, options) {
|
353
|
+
// Validation
|
354
|
+
if (!Array.isArray(bitmapDataArray) || bitmapDataArray.length === 0) {
|
355
|
+
throw new Error("showBitmapAnimation requires a non-empty array of bitmap data");
|
356
|
+
}
|
357
|
+
// Send complete animation package to iOS for device-controlled timing
|
358
|
+
const layout = {
|
359
|
+
layoutType: types_1.LayoutType.BITMAP_ANIMATION,
|
360
|
+
frames: bitmapDataArray,
|
361
|
+
interval: intervalMs,
|
362
|
+
repeat: repeat
|
363
|
+
};
|
364
|
+
this.sendMessage(this.createDisplayEvent(layout, options?.view));
|
365
|
+
console.log(`🎬 Sent batched animation to iOS: ${bitmapDataArray.length} frames at ${intervalMs}ms${repeat ? ' (repeating)' : ''}`);
|
366
|
+
// Return controller for compatibility
|
367
|
+
return {
|
368
|
+
stop: () => {
|
369
|
+
// Send stop command to iOS
|
370
|
+
this.clearView();
|
371
|
+
console.log('🛑 Animation stop requested');
|
372
|
+
}
|
373
|
+
};
|
374
|
+
}
|
281
375
|
}
|
282
376
|
exports.LayoutManager = LayoutManager;
|
@@ -4,7 +4,7 @@
|
|
4
4
|
* Extends the camera module with managed streaming capabilities.
|
5
5
|
* Apps can request managed streams and receive HLS/DASH URLs without managing RTMP endpoints.
|
6
6
|
*/
|
7
|
-
import { ManagedStreamStatus } from '../../../types';
|
7
|
+
import { ManagedStreamStatus, RestreamDestination } from '../../../types';
|
8
8
|
import { VideoConfig, AudioConfig, StreamConfig } from '../../../types/rtmp-stream';
|
9
9
|
import { Logger } from 'pino';
|
10
10
|
/**
|
@@ -21,6 +21,8 @@ export interface ManagedStreamOptions {
|
|
21
21
|
audio?: AudioConfig;
|
22
22
|
/** Optional stream configuration settings */
|
23
23
|
stream?: StreamConfig;
|
24
|
+
/** Optional RTMP destinations to re-stream to (YouTube, Twitch, etc) */
|
25
|
+
restreamDestinations?: RestreamDestination[];
|
24
26
|
}
|
25
27
|
/**
|
26
28
|
* Result returned when starting a managed stream
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"camera-managed-extension.d.ts","sourceRoot":"","sources":["../../../../src/app/session/modules/camera-managed-extension.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAGL,mBAAmB,
|
1
|
+
{"version":3,"file":"camera-managed-extension.d.ts","sourceRoot":"","sources":["../../../../src/app/session/modules/camera-managed-extension.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAGL,mBAAmB,EAKnB,mBAAmB,EACpB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,4BAA4B;IAC5B,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,kDAAkD;IAClD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,4CAA4C;IAC5C,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,6CAA6C;IAC7C,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,wEAAwE;IACxE,oBAAoB,CAAC,EAAE,mBAAmB,EAAE,CAAC;CAC9C;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,sCAAsC;IACtC,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAC,CAAM;IAGtB,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,sBAAsB,CAAC,CAAS;IACxC,OAAO,CAAC,wBAAwB,CAAC,CAAsB;IACvD,OAAO,CAAC,mBAAmB,CAAC,CAAsB;IAGlD,OAAO,CAAC,2BAA2B,CAAC,CAGlC;gBAGA,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,IAAI,EAC5B,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,GAAG;IASf;;;;;;;;;;;;;;;;;;OAkBG;IACG,kBAAkB,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAyC1F;;;;;;;OAOG;IACG,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBxC;;;;OAIG;IACH,qBAAqB,IAAI,OAAO;IAIhC;;;;OAIG;IACH,oBAAoB,IAAI,mBAAmB,GAAG,SAAS;IAIvD;;;;OAIG;IACH,sBAAsB,IAAI,mBAAmB,GAAG,SAAS;IAIzD;;;;;;;;;;;;;;;;;;OAkBG;IACH,qBAAqB,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI;IAYjF;;;OAGG;IACH,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,GAAG,IAAI;IAwD5D;;OAEG;IACH,OAAO,IAAI,IAAI;CAahB"}
|
@@ -78,7 +78,8 @@ class CameraManagedExtension {
|
|
78
78
|
enableWebRTC: options.enableWebRTC,
|
79
79
|
video: options.video,
|
80
80
|
audio: options.audio,
|
81
|
-
stream: options.stream
|
81
|
+
stream: options.stream,
|
82
|
+
restreamDestinations: options.restreamDestinations
|
82
83
|
};
|
83
84
|
// Send the request
|
84
85
|
this.send(request);
|
@@ -115,12 +116,8 @@ class CameraManagedExtension {
|
|
115
116
|
packageName: this.packageName
|
116
117
|
};
|
117
118
|
this.send(request);
|
118
|
-
//
|
119
|
-
|
120
|
-
this.currentManagedStreamId = undefined;
|
121
|
-
this.currentManagedStreamUrls = undefined;
|
122
|
-
this.managedStreamStatus = undefined;
|
123
|
-
this.pendingManagedStreamRequest = undefined;
|
119
|
+
// Don't clean up state immediately - wait for the 'stopped' status from cloud
|
120
|
+
// This ensures we can retry stop if needed and maintains accurate state
|
124
121
|
}
|
125
122
|
/**
|
126
123
|
* 📊 Check if currently managed streaming
|
@@ -184,19 +181,30 @@ class CameraManagedExtension {
|
|
184
181
|
streamId: status.streamId
|
185
182
|
}, '📹 Received managed stream status');
|
186
183
|
this.managedStreamStatus = status;
|
184
|
+
// Handle initializing status - stream is starting
|
185
|
+
if (status.status === 'initializing' && status.streamId) {
|
186
|
+
this.isManagedStreaming = true;
|
187
|
+
this.currentManagedStreamId = status.streamId;
|
188
|
+
}
|
187
189
|
// Handle initial stream ready status
|
188
|
-
if (status.status === 'active'
|
189
|
-
|
190
|
-
|
191
|
-
dashUrl: status.dashUrl,
|
192
|
-
webrtcUrl: status.webrtcUrl,
|
193
|
-
streamId: status.streamId || ''
|
194
|
-
};
|
190
|
+
if (status.status === 'active') {
|
191
|
+
// Always update state when stream is active
|
192
|
+
this.isManagedStreaming = true;
|
195
193
|
this.currentManagedStreamId = status.streamId;
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
194
|
+
if (status.hlsUrl && status.dashUrl) {
|
195
|
+
const result = {
|
196
|
+
hlsUrl: status.hlsUrl,
|
197
|
+
dashUrl: status.dashUrl,
|
198
|
+
webrtcUrl: status.webrtcUrl,
|
199
|
+
streamId: status.streamId || ''
|
200
|
+
};
|
201
|
+
this.currentManagedStreamUrls = result;
|
202
|
+
// Resolve pending promise if exists
|
203
|
+
if (this.pendingManagedStreamRequest) {
|
204
|
+
this.pendingManagedStreamRequest.resolve(result);
|
205
|
+
this.pendingManagedStreamRequest = undefined;
|
206
|
+
}
|
207
|
+
}
|
200
208
|
}
|
201
209
|
// Handle error status
|
202
210
|
if ((status.status === 'error' || status.status === 'stopped') && this.pendingManagedStreamRequest) {
|
@@ -11,6 +11,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
11
|
* - Social media streaming (X, YouTube Live, TikTok Live)
|
12
12
|
* - Quick demos and prototypes
|
13
13
|
* - Production apps without existing streaming infrastructure
|
14
|
+
*
|
15
|
+
* NEW: You can now add re-streaming to multiple platforms! See
|
16
|
+
* managed-rtmp-streaming-with-restream-example.ts for details.
|
14
17
|
*/
|
15
18
|
const __1 = require("../");
|
16
19
|
// Initialize App session
|
@@ -0,0 +1,11 @@
|
|
1
|
+
/**
|
2
|
+
* Example: Managed RTMP Streaming with Re-streaming to Multiple Platforms
|
3
|
+
*
|
4
|
+
* This example demonstrates how to use the managed streaming feature with
|
5
|
+
* automatic re-streaming to platforms like YouTube, Twitch, and Facebook.
|
6
|
+
*
|
7
|
+
* The cloud handles all RTMP endpoints and automatically forwards your stream
|
8
|
+
* to the specified destinations.
|
9
|
+
*/
|
10
|
+
export {};
|
11
|
+
//# sourceMappingURL=managed-rtmp-streaming-with-restream-example.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"managed-rtmp-streaming-with-restream-example.d.ts","sourceRoot":"","sources":["../../src/examples/managed-rtmp-streaming-with-restream-example.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
@@ -0,0 +1,124 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* Example: Managed RTMP Streaming with Re-streaming to Multiple Platforms
|
4
|
+
*
|
5
|
+
* This example demonstrates how to use the managed streaming feature with
|
6
|
+
* automatic re-streaming to platforms like YouTube, Twitch, and Facebook.
|
7
|
+
*
|
8
|
+
* The cloud handles all RTMP endpoints and automatically forwards your stream
|
9
|
+
* to the specified destinations.
|
10
|
+
*/
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
+
const __1 = require("../");
|
13
|
+
class MultiPlatformStreamingApp extends __1.AppServer {
|
14
|
+
constructor() {
|
15
|
+
super({
|
16
|
+
packageName: 'com.example.multiplatform-streaming',
|
17
|
+
apiKey: process.env.MENTRAOS_API_KEY || 'your-api-key',
|
18
|
+
port: 3000
|
19
|
+
});
|
20
|
+
}
|
21
|
+
async onSession(session, sessionId, userId) {
|
22
|
+
console.log(`New session started: ${sessionId} for user ${userId}`);
|
23
|
+
// Subscribe to managed stream status updates
|
24
|
+
const managedStreamCleanup = session.camera.onManagedStreamStatus((status) => {
|
25
|
+
console.log(`Stream status: ${status.status}`);
|
26
|
+
// Check output statuses
|
27
|
+
if (status.outputs && status.outputs.length > 0) {
|
28
|
+
console.log('Re-stream outputs:');
|
29
|
+
status.outputs.forEach(output => {
|
30
|
+
console.log(`- ${output.name || output.url}: ${output.status}`);
|
31
|
+
if (output.error) {
|
32
|
+
console.error(` Error: ${output.error}`);
|
33
|
+
}
|
34
|
+
});
|
35
|
+
}
|
36
|
+
if (status.status === 'active') {
|
37
|
+
console.log('Stream is live!');
|
38
|
+
console.log('HLS URL:', status.hlsUrl);
|
39
|
+
console.log('DASH URL:', status.dashUrl);
|
40
|
+
session.layouts.showTextWall('Multi-platform stream is live!');
|
41
|
+
}
|
42
|
+
});
|
43
|
+
// Start managed stream when glasses connect
|
44
|
+
const connectCleanup = session.events.onConnected(async () => {
|
45
|
+
console.log('Glasses connected! Starting multi-platform stream...');
|
46
|
+
session.layouts.showTextWall('Starting multi-platform stream...');
|
47
|
+
try {
|
48
|
+
const streamResult = await session.camera.startManagedStream({
|
49
|
+
quality: '720p',
|
50
|
+
enableWebRTC: true,
|
51
|
+
// NEW: Add re-streaming destinations
|
52
|
+
restreamDestinations: [
|
53
|
+
{
|
54
|
+
url: 'rtmp://a.rtmp.youtube.com/live2/YOUR-YOUTUBE-STREAM-KEY',
|
55
|
+
name: 'YouTube'
|
56
|
+
},
|
57
|
+
{
|
58
|
+
url: 'rtmp://live.twitch.tv/app/YOUR-TWITCH-STREAM-KEY',
|
59
|
+
name: 'Twitch'
|
60
|
+
},
|
61
|
+
{
|
62
|
+
url: 'rtmps://live-api-s.facebook.com:443/rtmp/YOUR-FACEBOOK-STREAM-KEY',
|
63
|
+
name: 'Facebook'
|
64
|
+
}
|
65
|
+
],
|
66
|
+
// Optional: Custom encoding settings
|
67
|
+
video: {
|
68
|
+
width: 1280,
|
69
|
+
height: 720,
|
70
|
+
bitrate: 2000000, // 2 Mbps
|
71
|
+
frameRate: 30
|
72
|
+
},
|
73
|
+
audio: {
|
74
|
+
bitrate: 128000, // 128 kbps
|
75
|
+
sampleRate: 48000,
|
76
|
+
echoCancellation: true,
|
77
|
+
noiseSuppression: true
|
78
|
+
}
|
79
|
+
});
|
80
|
+
console.log('Managed stream started successfully!');
|
81
|
+
console.log('Stream ID:', streamResult.streamId);
|
82
|
+
console.log('HLS URL:', streamResult.hlsUrl);
|
83
|
+
console.log('DASH URL:', streamResult.dashUrl);
|
84
|
+
console.log('WebRTC URL:', streamResult.webrtcUrl);
|
85
|
+
// The stream is now being:
|
86
|
+
// 1. Sent from glasses to the RTMP relay
|
87
|
+
// 2. Forwarded to Cloudflare for HLS/DASH distribution
|
88
|
+
// 3. Re-streamed to YouTube, Twitch, and Facebook automatically
|
89
|
+
}
|
90
|
+
catch (error) {
|
91
|
+
console.error('Failed to start managed stream:', error);
|
92
|
+
session.layouts.showTextWall(`Failed to start stream: ${error instanceof Error ? error.message : String(error)}`);
|
93
|
+
}
|
94
|
+
});
|
95
|
+
// Stop stream when disconnected
|
96
|
+
const disconnectCleanup = session.events.onDisconnected(async () => {
|
97
|
+
console.log('Glasses disconnected, stopping stream...');
|
98
|
+
try {
|
99
|
+
await session.camera.stopManagedStream();
|
100
|
+
}
|
101
|
+
catch (error) {
|
102
|
+
console.error('Error stopping stream:', error);
|
103
|
+
}
|
104
|
+
});
|
105
|
+
// Register cleanup handlers
|
106
|
+
this.addCleanupHandler(managedStreamCleanup);
|
107
|
+
this.addCleanupHandler(connectCleanup);
|
108
|
+
this.addCleanupHandler(disconnectCleanup);
|
109
|
+
}
|
110
|
+
}
|
111
|
+
// Start the app server
|
112
|
+
const app = new MultiPlatformStreamingApp();
|
113
|
+
app.start().catch(console.error);
|
114
|
+
// Important notes:
|
115
|
+
//
|
116
|
+
// 1. Stream Keys: Replace YOUR-*-STREAM-KEY with actual stream keys from each platform
|
117
|
+
// 2. Platform Requirements: Each platform has specific requirements:
|
118
|
+
// - YouTube: Requires 720p+ resolution, 30fps+, 2.5-4 Mbps bitrate
|
119
|
+
// - Twitch: Flexible, but recommends 3-6 Mbps for 1080p
|
120
|
+
// - Facebook: Supports up to 1080p, recommends 4 Mbps
|
121
|
+
//
|
122
|
+
// 3. The RTMP relay automatically transcodes your stream to meet platform requirements
|
123
|
+
// 4. You can monitor the status of each output in the ManagedStreamStatus updates
|
124
|
+
// 5. If an output fails, the main stream and other outputs continue working
|