@tivio/sdk-js 1.0.0-alpha

Sign up to get free protection for your applications and to get access to all the features.
package/LICENSE.md ADDED
@@ -0,0 +1,35 @@
1
+ Copyright © 2021, nangu.TV, a.s.
2
+ All rights reserved.
3
+
4
+ This software and related documentation are provided under a
5
+ license agreement containing restrictions on use and
6
+ disclosure and are protected by intellectual property laws.
7
+ Except as expressly permitted in your license agreement or
8
+ allowed by law, you may not use, copy, reproduce, translate,
9
+ broadcast, modify, license, transmit, distribute, exhibit,
10
+ perform, publish, or display any part, in any form, or by
11
+ any means. Except as expressly permitted in your license agreement
12
+ or allowed by law, reverse engineering, disassembly, or decompilation
13
+ of this software is prohibited.
14
+
15
+ The information contained herein is subject to change
16
+ without notice and is not warranted to be error-free. If you
17
+ find any errors, please report them to us in writing.
18
+
19
+ This software is developed for general use. It is not
20
+ developed or intended for use in any inherently dangerous
21
+ applications, including applications that may create a risk
22
+ of personal injury. If you use this software or hardware in
23
+ dangerous applications, then you shall be responsible to
24
+ take all appropriate fail-safe, backup, redundancy, and
25
+ other measures to ensure its safe use. Nangu.TV, a.s. disclaims any
26
+ liability for any damages caused by use of this software or
27
+ hardware in dangerous applications.
28
+
29
+ This software and documentation may provide
30
+ access to or information on content, products, and services
31
+ from third parties. Nangu.TV, a.s. is not responsible for and expressly
32
+ disclaim all warranties of any kind with respect to third-party content,
33
+ products, and services. Nangu.TV, a.s. will not be responsible for any
34
+ loss, costs, or damages incurred due to your access to or use of third-party
35
+ content, products, or services.
package/README.md ADDED
@@ -0,0 +1,155 @@
1
+ # Tivio SDK
2
+
3
+ ## Installation
4
+
5
+ ``` sh
6
+ npm install --save @tivio/sdk-js
7
+ ```
8
+ or
9
+ ``` sh
10
+ yarn add @tivio/sdk-js
11
+ ```
12
+
13
+ # Changelog
14
+
15
+ * 1.0.0
16
+ * initial public release
17
+ <!--
18
+ ####################################################################################################
19
+ TODO FIXME: This file describes how it should look like based on https://jira.nangu.tv/browse/NS-96,
20
+ it needs to be checked/corrected before @tivio/sdk-js will be really published!
21
+ ####################################################################################################
22
+ -->
23
+
24
+ <!--
25
+ ## Usage
26
+
27
+ ``` typescript
28
+ import { todo } from '@tivio/js'
29
+
30
+ ```
31
+
32
+ ## Example usage
33
+
34
+ ```typescript
35
+ import { initTivio } from '@tivio/sdk-js'
36
+
37
+ (async () => {
38
+ const tivio = await initTivio({secret: 'HG3PbieoHQ5DSH9f2xxx'})
39
+
40
+ const channels = tivio.getWidgetById('myWidget').getChannels()
41
+
42
+ for (const channel of channels.records) {
43
+ const sections = await channel.getSections()
44
+
45
+ for (const section of sections.records) {
46
+ let hasNextPage = true
47
+
48
+ do {
49
+ const videos = await section.getVideos({count: 10})
50
+
51
+ for (const video of videos.records) {
52
+ console.log(video.name, video.url.hls)
53
+ }
54
+
55
+ hasNextPage = videos.hasNextPage
56
+
57
+ } while (hasNextPage)
58
+ }
59
+ }
60
+ })()
61
+ ```
62
+
63
+ ## Api Description
64
+
65
+ ### Init
66
+
67
+ - The init method is called with parameter `secret` that is generated in administration and identifies the application.
68
+ - Init returns a Tivio instance.
69
+
70
+ ```typescript
71
+ interface Config {
72
+ secret: string
73
+ }
74
+
75
+ type initTivio = (config: Config) => Promise<Tivio>
76
+
77
+ interface Tivio {
78
+ getWidgetById: (id: string) => Widget
79
+ }
80
+ ```
81
+
82
+ ### Pagination
83
+
84
+ - Result of methods that can return a larger amount of data is wrapped in the `Pagination` object.
85
+ - To get all records iterate until the `hasNextPage` is true.
86
+ - Called method can have a `count` parameter to change the number of returned records.
87
+
88
+ ```typescript
89
+ type Pagination<T> = (props?: {count?: number}) => Promise<{
90
+ records: T[]
91
+ hasNextPage: boolean
92
+ }>
93
+ ```
94
+
95
+ ### Widget
96
+
97
+ - A Widget holds together multiple channels with some specific configuration.
98
+
99
+ ```typescript
100
+ interface Widget {
101
+ id: string
102
+ name: string
103
+ getChannels: Pagination<Channel>
104
+ getRecent: Pagination<Video>
105
+ }
106
+ ```
107
+
108
+ ### Channel
109
+
110
+ - A Channel holds together multiple Sections (if it is the deepest Channel in the hierarchy) OR Channels
111
+ (if it is a container; this allows deeper hierarchy like "Widget > Channel > Channel > Section > Video"
112
+ instead of typical "Widget > Channel > Section > Video")
113
+
114
+ ```typescript
115
+ interface Channel {
116
+ id: string
117
+ name: string
118
+ getChannels?: Pagination<Channel>
119
+ getSections?: Pagination<Section>
120
+ getRecent: Pagination<Video>
121
+ images: {
122
+ cover?: string
123
+ logo?: string
124
+ }
125
+ }
126
+ ```
127
+
128
+ ### Section
129
+
130
+ - The Section is a container for multiple videos.
131
+
132
+ ```typescript
133
+ interface Section {
134
+ id: string
135
+ name: string
136
+ getVideos: Pagination<Video>
137
+ }
138
+ ```
139
+
140
+ ### Video
141
+
142
+ ```typescript
143
+ interface Video {
144
+ id: string
145
+ name: string
146
+ durationMs: number
147
+ created: Date
148
+ images: {
149
+ cover?: string
150
+ }
151
+ url: {
152
+ hls: string
153
+ }
154
+ }
155
+ ``` -->
@@ -0,0 +1,220 @@
1
+ import type { Video, SubscribeToScreen, SubscribeToItemsInRow } from '@tivio/common';
2
+ declare type Language = 'cs' | 'en' | 'sk' | 'de' | 'pl';
3
+ declare type Widget = {
4
+ channels: Channel[];
5
+ isEnabled: boolean | null;
6
+ name: string | null;
7
+ recentVideos: Video[] | null;
8
+ widgetId: string | null;
9
+ };
10
+ declare type Channel = {
11
+ name: string;
12
+ header: string;
13
+ headerLogo: string;
14
+ recentVideos: Video[];
15
+ };
16
+ declare type Section = {
17
+ name: string;
18
+ channel: Channel;
19
+ videos: Video[];
20
+ };
21
+ declare type Player = {
22
+ ad: any;
23
+ currentTime: any;
24
+ adSegment: any;
25
+ event: any;
26
+ events: any;
27
+ source: any;
28
+ state: any;
29
+ onPlaybackEnded: any;
30
+ onSourceChanged: any;
31
+ onStateChanged: any;
32
+ onTimeChanged: any;
33
+ pause: any;
34
+ play: any;
35
+ togglePlayPause: any;
36
+ register: any;
37
+ seekTo: any;
38
+ setVolume: any;
39
+ triggerEvent: any;
40
+ };
41
+ declare type Source = {
42
+ type: 'tv_program';
43
+ uri: string;
44
+ tvMode: 'startover' | 'timeshift' | null;
45
+ channelName: string;
46
+ epgFrom: Date;
47
+ epgTo: Date;
48
+ positionMs: number;
49
+ additionalPayload?: Record<string, any>;
50
+ } | {
51
+ type: 'tivio_vod';
52
+ uri: string;
53
+ positionMs: number;
54
+ videoPath: string;
55
+ additionalPayload?: Record<string, any>;
56
+ } | {
57
+ type: 'ad';
58
+ uri: string;
59
+ additionalPayload?: Record<string, any>;
60
+ } | {
61
+ type: 'other';
62
+ uri: string;
63
+ positionMs: number;
64
+ additionalPayload?: Record<string, any>;
65
+ } | {
66
+ type: 'live_tv_channel';
67
+ uri: string;
68
+ channelName: string;
69
+ positionMs: number;
70
+ additionalPayload?: Record<string, any>;
71
+ };
72
+ declare type AdMetadata = {
73
+ type: 'ad';
74
+ subType: 'inserted' | 'original';
75
+ secondsToEnd: number;
76
+ secondsToSkippable: number | null;
77
+ canTriggerSkip: boolean;
78
+ skip: () => void;
79
+ } | null;
80
+ declare enum PlayerWrapperEventType {
81
+ adMetadata = "adMetadata"
82
+ }
83
+ declare type TivioPlayerWrapper = {
84
+ addEventListener: (eventType: PlayerWrapperEventType.adMetadata, listener: (metadata: AdMetadata) => void) => void;
85
+ reportLoadError: (error: Error) => void;
86
+ reportPlaybackEnded: () => void;
87
+ reportTimeProgress: (ms: number) => void;
88
+ seekTo: (ms: number) => void;
89
+ setSource: (source: Source | null) => void;
90
+ };
91
+ declare type ExposedApi = {
92
+ AdSource: any;
93
+ ChannelSource: any;
94
+ VodTivioSource: any;
95
+ /**
96
+ * Get channel by its id.
97
+ * @param channelId - channel id
98
+ * @returns {Promise<Channel | null>} channel or null if channel does not exists
99
+ */
100
+ getChannelById: (channelId: string) => Promise<Channel | null>;
101
+ /**
102
+ * Get (or create) player wrapper instance
103
+ * @param id - player wrapper id
104
+ * @returns {Player} player wrapper instance
105
+ */
106
+ getPlayer: (id: string) => Player;
107
+ /**
108
+ * Get section by its id.
109
+ * @param sectionId - section id
110
+ * @returns {Promise<{section: Section, channel: Channel} | null>} section and channel or null if channel or section does not exists
111
+ */
112
+ getSectionById: (sectionId: string) => Promise<Section | null>;
113
+ /**
114
+ * Get video by its id.
115
+ * @param videoId - video id
116
+ * @returns {Promise<Video | null>} video or null if video does not exists
117
+ */
118
+ getVideoById: (videoId: string) => Promise<Video | null>;
119
+ /**
120
+ * Get widget by its id.
121
+ * @param widgetId - widget id
122
+ * @returns {Promise<Widget | null>} widget or null if widget does not exists
123
+ */
124
+ getWidgetById: (widgetId: string) => Promise<Widget | null>;
125
+ /**
126
+ * Set tivio language.
127
+ * @param language
128
+ */
129
+ setLanguage: (language: Language) => void;
130
+ /**
131
+ * Set user.
132
+ * @param userId
133
+ * @param payload
134
+ * @param additionalUserData
135
+ */
136
+ setUser: (userId: string, payload: unknown, additionalUserData?: unknown) => Promise<void>;
137
+ /**
138
+ * Listen to widget changes.
139
+ * @param widgetId - widget id
140
+ * @param cb - callback on widget updates or on error
141
+ */
142
+ subscribeToWidget: (widgetId: string, cb: (error: Error | null, data: Widget | null) => void) => void;
143
+ /**
144
+ * Listen to channel changes.
145
+ * @param channelId - channel id
146
+ * @param cb - callback on channel updates or on error
147
+ */
148
+ subscribeToChannel: (channelId: string, cb: (error: Error | null, data: Channel | null) => void) => void;
149
+ /**
150
+ * Listen to section changes.
151
+ * @param sectionId - section id
152
+ * @param cb - callback on section updates or on error
153
+ */
154
+ subscribeToSection: (sectionId: string, cb: (error: Error | null, data: Section | null) => void) => void;
155
+ /**
156
+ * Listen to video changes.
157
+ * @param videoId - video id
158
+ * @param cb - callback on video updates or on error
159
+ */
160
+ subscribeToVideo: (videoId: string, cb: (error: Error | null, data: Video | null) => void) => void;
161
+ /**
162
+ * Listen to videos in section changes.
163
+ * @param channelId - channel id
164
+ * @param sectionId - section id
165
+ * @param cb - callback on videos change or error
166
+ * @param limit - videos count
167
+ */
168
+ subscribeToVideosInSection: (sectionId: string, cb: (error: null | Error, data: null | {
169
+ videos: Video[];
170
+ hasNextPage: boolean;
171
+ }, fetchMore: null | ((count?: number) => void)) => void, limit?: number) => void;
172
+ /**
173
+ * Listen to section in channel changes
174
+ * @param channelId - channel id
175
+ * @param cb - callback on sections change or error
176
+ * @param limit - sections count
177
+ */
178
+ subscribeToSectionsInChannel: (channelId: string, cb: (error: null | Error, data: null | {
179
+ sections: Section[];
180
+ hasNextPage: boolean;
181
+ }, fetchMore: null | ((count?: number) => void)) => void, limit?: number) => void;
182
+ /**
183
+ * Listen to channels in widget changes
184
+ * @param widgetId - widget id
185
+ * @param cb - callback on channels change or error
186
+ * @param limit - channels count
187
+ */
188
+ subscribeToChannelsInWidget: (widgetId: string, cb: (error: null | Error, data: null | {
189
+ channels: Channel[];
190
+ hasNextPage: boolean;
191
+ }, fetchMore: null | ((count?: number) => void)) => void, limit?: number) => void;
192
+ /**
193
+ * @param screenId - screen id
194
+ * @param cb - callback on screen or error
195
+ * @param options - additional options
196
+ */
197
+ subscribeToScreen: SubscribeToScreen;
198
+ /**
199
+ * @param rowId - screen id
200
+ * @param cb - callback on items or error
201
+ * @param options - additional options
202
+ */
203
+ subscribeToItemsInRow: SubscribeToItemsInRow;
204
+ /**
205
+ * @param email
206
+ * @param password
207
+ */
208
+ createUserWithEmailAndPassword: (email: string, password: string) => Promise<void>;
209
+ /**
210
+ * Sign in the user and starts listening on his purchases
211
+ * @param email
212
+ * @param password
213
+ */
214
+ signInWithEmailAndPassword: (email: string, password: string) => Promise<void>;
215
+ createPlayerWrapper: (playerImplementation: {
216
+ setSource: (source: Source | null) => void;
217
+ seekTo: (ms: number) => void;
218
+ }) => TivioPlayerWrapper;
219
+ };
220
+ export { AdMetadata, ExposedApi, TivioPlayerWrapper, PlayerWrapperEventType, Source, };
package/dist/conf.d.ts ADDED
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Copyright (c) 2021, nangu.TV, a.s. All rights reserved.
3
+ * nangu.TV, a.s PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
4
+ */
5
+ import { Conf as ExternalConf } from './types';
6
+ import { Logger } from './services/logger';
7
+ import { FetchPackage } from './services/packageLoader';
8
+ export declare type InternalConf = {
9
+ secret: string;
10
+ resolverUrl: string;
11
+ logger?: Logger | null;
12
+ fetchPackage: FetchPackage;
13
+ language?: string;
14
+ sdkVersion: string;
15
+ };
16
+ export declare const defaultConf: {
17
+ resolverUrl: string;
18
+ fetchPackage: FetchPackage;
19
+ };
20
+ export declare const createInternalConf: (conf: ExternalConf) => InternalConf;
@@ -0,0 +1 @@
1
+ import './setupTests';
@@ -0,0 +1,36 @@
1
+ import type { Empty } from './types';
2
+ interface BasicSource {
3
+ description: string;
4
+ name: string;
5
+ uri: string;
6
+ type: 'AD' | 'VOD' | 'CHANNEL';
7
+ }
8
+ interface ChannelSource extends BasicSource {
9
+ from: Date;
10
+ channelName: string;
11
+ to: Date;
12
+ type: 'CHANNEL';
13
+ }
14
+ interface AdSource extends BasicSource {
15
+ durationMs: number;
16
+ skipDelayMs: number | null;
17
+ type: 'AD';
18
+ }
19
+ interface VodSource extends BasicSource {
20
+ type: 'VOD';
21
+ }
22
+ export declare type InputSource = AdSource | ChannelSource | VodSource;
23
+ export declare type PlayerInterface = {
24
+ play: () => Empty;
25
+ pause: () => Empty;
26
+ seekTo: (positionMs: number) => Empty;
27
+ setSource: (source: InputSource | null) => Empty;
28
+ setVolume: (volume: number) => Empty;
29
+ };
30
+ export declare type PlayerWrapper = {
31
+ events: {
32
+ addListener: <T = any>(event: string, cb: (value: T) => Empty) => Empty;
33
+ removeAllListeners: () => Empty;
34
+ };
35
+ };
36
+ export {};
@@ -0,0 +1,3 @@
1
+ export * from './services/bundleLoader';
2
+ export * from './types';
3
+ export * from './api.types';
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("@sentry/browser"),require("firebase/app"),require("firebase/auth"),require("firebase/firestore"),require("mobx")):"function"==typeof define&&define.amd?define("@tivio/sdk-js",["@sentry/browser","firebase/app","firebase/auth","firebase/firestore","mobx"],t):"object"==typeof exports?exports["@tivio/sdk-js"]=t(require("@sentry/browser"),require("firebase/app"),require("firebase/auth"),require("firebase/firestore"),require("mobx")):e["@tivio/sdk-js"]=t(e["@sentry/browser"],e["firebase/app"],e["firebase/auth"],e["firebase/firestore"],e.mobx)}(this,(function(e,t,r,n,o){return i={992:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.PlayerWrapperEventType=void 0,function(e){e.adMetadata="adMetadata"}(r||(r={})),t.PlayerWrapperEventType=r},958:function(e,t,r){"use strict";var n=this&&this.__assign||function(){return n=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},n.apply(this,arguments)};Object.defineProperty(t,"__esModule",{value:!0}),t.createInternalConf=t.defaultConf=void 0;var o=r(782),i=r(373);t.defaultConf={resolverUrl:"https://tivio-resolver.firebaseapp.com/resolver.js",fetchPackage:i.fetchPackage},t.createInternalConf=function(e){return n(n(n({},t.defaultConf),e),{logger:void 0!==e.logger?e.logger:(0,o.createLogger)({isConsoleEnabled:!0}),sdkVersion:"1.0.0-alpha"})}},920:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),o=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||n(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),o(r(643),t),o(r(173),t),o(r(992),t)},643:function(e,t,r){"use strict";var n=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{u(n.next(e))}catch(e){i(e)}}function s(e){try{u(n.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},o=this&&this.__generator||function(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}};Object.defineProperty(t,"__esModule",{value:!0}),t.createTivio=t.createRemotePackageLoader=t.fetchResolver=void 0;var i=r(958),a=r(229),s=r(614);t.fetchResolver=function(e){return n(void 0,void 0,void 0,(function(){var t;return o(this,(function(r){return t=e.resolverUrl,[2,(0,e.fetchPackage)(t).then((function(t){var r,n={},o={exports:n};try{new Function("require","module","exports",t)(a.resolveShared,o,n)}catch(e){throw new Error("Cannot load Tivio Resolver "+e)}if("function"!=typeof(null===(r=o.exports.tivio)||void 0===r?void 0:r.fetch))throw new Error("Invalid Tivio Resolver export");return o.exports.tivio.fetch(e.secret,e.sdkVersion)}))]}))}))},t.createRemotePackageLoader=function(){return function(e){return(0,t.fetchResolver)(e).then((function(e){var t={},r={exports:t};try{new Function("require","module","exports",e)(a.resolveShared,r,t)}catch(e){throw new Error("Cannot load module "+e)}if("object"!=typeof r.exports.Tivio)throw new Error('Tivio package does not export "Tivio" namespace');if("function"!=typeof r.exports.Tivio.setUser)throw new Error('Tivio namespace does not export "setUser" member');if("function"!=typeof r.exports.Tivio.init)throw new Error('Tivio namespace does not export "init" member');return r.exports.Tivio}))}},t.createTivio=function(){var e=(0,t.createRemotePackageLoader)(),r=!1;return function(t){return n(void 0,void 0,void 0,(function(){var a,u;return o(this,(function(c){return a=(0,i.createInternalConf)(t),u=(0,s.createSettings)(a),[2,e(a).then((function(e){return n(void 0,void 0,void 0,(function(){return o(this,(function(t){switch(t.label){case 0:return r?[3,2]:[4,e.init(a)];case 1:t.sent(),r=!0,t.label=2;case 2:return u.onSetUser(e.setUser),[2,{state:"ready",error:null,settings:u,conf:a,AdSource:e.AdSource,ChannelSource:e.ChannelSource,VodTivioSource:e.VodTivioSource,getChannelById:e.getChannelById,getPlayer:e.getPlayer,getSectionById:e.getSectionById,getVideoById:e.getVideoById,getWidgetById:e.getWidgetById,setLanguage:e.setLanguage,setUser:e.setUser,subscribeToWidget:e.subscribeToWidget,subscribeToChannel:e.subscribeToChannel,subscribeToSection:e.subscribeToSection,subscribeToVideo:e.subscribeToVideo,subscribeToVideosInSection:e.subscribeToVideosInSection,subscribeToSectionsInChannel:e.subscribeToSectionsInChannel,subscribeToChannelsInWidget:e.subscribeToChannelsInWidget,subscribeToScreen:e.subscribeToScreen,subscribeToItemsInRow:e.subscribeToItemsInRow,createUserWithEmailAndPassword:e.createUserWithEmailAndPassword,signInWithEmailAndPassword:e.signInWithEmailAndPassword,createPlayerWrapper:e.createPlayerWrapper}]}}))}))})).catch((function(e){var t;return null===(t=a.logger)||void 0===t||t.exception(e),{state:"error",error:""+e,conf:a,settings:u}}))]}))}))}}},229:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&n(t,e,r);return o(t,e),t},a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.resolveShared=void 0;var s=a(r(937));r(703),r(462);var u=i(r(259)),c=i(r(970)),l={mobx:u,firebase:s.default,"firebase/app":s.default,"firebase/auth":null,"firebase/firestore":null,timers:c};t.resolveShared=function(e){if(!(e in l))throw new Error("Could not resolve shared dependency "+e);return l[e]}},782:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),o=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var r in e)"default"!==r&&Object.prototype.hasOwnProperty.call(e,r)&&n(t,e,r);return o(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=void 0;var a=i(r(356));t.createLogger=function(e){var t=!1!==e.isSentryEnabled&&!0;t&&(a.init({dsn:"https://f318b29129f84c459ea756907bc1a2e6@o507550.ingest.sentry.io/5600272",release:"@tivio/sdk-js@1.0.0-alpha",tracesSampleRate:1}),window.sentry=a),console.info("Sentry "+(t?"on":"off"));var r=function(r,n){e.isConsoleEnabled&&console[r]("Tivio sdk-js "+n.join(" ")),t&&a.captureMessage(""+n,a.Severity.fromString(r))};return{error:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];r("error",e)},info:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];r("info",e)},warn:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];r("warn",e)},debug:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];r("debug",e)},exception:function(r){e.isConsoleEnabled&&console.error(r),t&&a.captureException(r)}}}},373:function(e,t){"use strict";var r=this&&this.__awaiter||function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{u(n.next(e))}catch(e){i(e)}}function s(e){try{u(n.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},n=this&&this.__generator||function(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}};Object.defineProperty(t,"__esModule",{value:!0}),t.fetchPackage=void 0;var o={cache:"no-store"},i=function(e){var t=e.headers.get("content-type");return 200!==e.status?Promise.reject('Incorrect status "'+e.status+'" was obtained while fetching the module.'):t&&(t.includes("application/javascript")||t.includes("text/javascript"))?e.text():Promise.reject('Incorrect content "'+t+'" was obtained while fetching the module.')},a=function(e){return Promise.reject("Network failure: "+e)};t.fetchPackage=function(e){return r(void 0,void 0,void 0,(function(){return n(this,(function(t){return[2,fetch(e,o).then(i).catch(a)]}))}))}},614:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createSettings=void 0,t.createSettings=function(e){var t=null,r=null;return{onSetUser:function(n){var o;"function"!=typeof n?null===(o=e.logger)||void 0===o||o.exception("Tivio Bundle setUser handler must be a function"):(t=n,null!==r&&n(r.userId,r.userPayload))},setUser:function(e,n){"function"==typeof t?(r=null,t(e,n)):r={userId:e,userPayload:n}}}}},173:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},356:t=>{"use strict";t.exports=e},937:e=>{"use strict";e.exports=t},703:e=>{"use strict";e.exports=r},462:e=>{"use strict";e.exports=n},259:e=>{"use strict";e.exports=o},970:()=>{}},a={},function e(t){var r=a[t];if(void 0!==r)return r.exports;var n=a[t]={exports:{}};return i[t].call(n.exports,n,n.exports,e),n.exports}(920);var i,a}));
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright (c) 2021, nangu.TV, a.s. All rights reserved.
3
+ * nangu.TV, a.s PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
4
+ */
5
+ /**
6
+ * Tivio Bundle downloader service.
7
+ * This package knows internal structure of Tivio Bundle and
8
+ * is responsible for life-cycle control of the bundle.
9
+ */
10
+ import { InternalConf } from '../conf';
11
+ import { Conf } from '../types';
12
+ import { Settings } from './settings';
13
+ import type { ExposedApi } from '../api.types';
14
+ export declare type RemoteProviderProps = {
15
+ language?: string;
16
+ };
17
+ export declare type TivioBundle = {
18
+ init: (config: Conf) => void | Promise<void>;
19
+ setUser: (userId: string, payload: unknown, additionalUserData?: unknown) => void;
20
+ } & ExposedApi;
21
+ export declare type RemoteBundleState = {
22
+ state: 'loading' | 'error' | 'ready';
23
+ error: string | null;
24
+ conf: InternalConf;
25
+ settings: Settings;
26
+ } & Partial<ExposedApi>;
27
+ export declare type Api = RemoteBundleState;
28
+ export declare const fetchResolver: (conf: InternalConf) => Promise<string>;
29
+ /**
30
+ * Fetch & load CommonJS remote module.
31
+ */
32
+ export declare const createRemotePackageLoader: () => (conf: InternalConf) => Promise<TivioBundle>;
33
+ export declare const createTivio: () => (conf: Conf) => Promise<RemoteBundleState>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Copyright (c) 2021, nangu.TV, a.s. All rights reserved.
3
+ * nangu.TV, a.s PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
4
+ */
5
+ /// <reference types="node" />
6
+ import firebase from 'firebase/app';
7
+ import 'firebase/auth';
8
+ import 'firebase/firestore';
9
+ import * as mobx from 'mobx';
10
+ import * as timers from 'timers';
11
+ export declare type SharedDependency = typeof mobx | typeof firebase | typeof timers | null;
12
+ export declare const resolveShared: (name: string) => SharedDependency;
@@ -0,0 +1 @@
1
+ import '../setupTests';
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Copyright (c) 2021, nangu.TV, a.s. All rights reserved.
3
+ * nangu.TV, a.s PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
4
+ */
5
+ export declare type LoggerArgs = any[];
6
+ export interface Logger {
7
+ /** important messages */
8
+ warn(...data: LoggerArgs): void;
9
+ /** errors */
10
+ error(...data: LoggerArgs): void;
11
+ /** critical errors */
12
+ exception(...data: LoggerArgs): void;
13
+ /** metrics */
14
+ info(...data: LoggerArgs): void;
15
+ /** non-production messages */
16
+ debug(...data: LoggerArgs): void;
17
+ }
18
+ export declare type LoggerConf = {
19
+ isConsoleEnabled: boolean;
20
+ isSentryEnabled?: boolean;
21
+ };
22
+ declare type LogLevel = 'warn' | 'error' | 'info' | 'debug';
23
+ export declare type Severity = LogLevel | 'exception';
24
+ /**
25
+ * Factory
26
+ **/
27
+ export declare const createLogger: (conf: LoggerConf) => Logger;
28
+ export {};
@@ -0,0 +1 @@
1
+ import '../setupTests';
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2021, nangu.TV, a.s. All rights reserved.
3
+ * nangu.TV, a.s PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
4
+ */
5
+ export declare type FetchPackage = (url: string) => Promise<string>;
6
+ export declare const fetchPackage: FetchPackage;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Copyright (c) 2021, nangu.TV, a.s. All rights reserved.
3
+ * nangu.TV, a.s PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
4
+ */
5
+ /**
6
+ * The settings can be called before Tivio is loaded.
7
+ * So this package is responsible for settings from the beginning of the life cycle.
8
+ */
9
+ import { InternalConf } from '../conf';
10
+ export declare type Settings = {
11
+ onSetUser: (handler: (userId: string, userPayload: unknown) => void) => void;
12
+ setUser: (userId: string, userPayload: unknown) => void;
13
+ };
14
+ export declare const createSettings: (conf: InternalConf) => {
15
+ onSetUser: (handler: (userId: string, userPayload: unknown) => void) => void;
16
+ setUser: (userId: string, userPayload: unknown) => void;
17
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ export declare const fetch: import("jest-fetch-mock").FetchMock;
2
+ export declare const loggerMock: {
3
+ error: {
4
+ (...data: any[]): void;
5
+ (message?: any, ...optionalParams: any[]): void;
6
+ };
7
+ info: {
8
+ (...data: any[]): void;
9
+ (message?: any, ...optionalParams: any[]): void;
10
+ };
11
+ warn: {
12
+ (...data: any[]): void;
13
+ (message?: any, ...optionalParams: any[]): void;
14
+ };
15
+ debug: {
16
+ (...data: any[]): void;
17
+ (message?: any, ...optionalParams: any[]): void;
18
+ };
19
+ exception: (error: any) => never;
20
+ };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright (c) 2021, nangu.TV, a.s. All rights reserved.
3
+ * nangu.TV, a.s PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
4
+ */
5
+ /**
6
+ * Export public client side API
7
+ */
8
+ import { InternalConf } from './conf';
9
+ export declare type Conf = Pick<InternalConf, 'secret' | 'logger' | 'language'>;
10
+ export declare type Empty = Promise<void> | void;
11
+ export declare type Disposer = () => void;
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@tivio/sdk-js",
3
+ "version": "1.0.0-alpha",
4
+ "main": "dist/index.js",
5
+ "typings": "dist/index.d.ts",
6
+ "source": "src/index.ts",
7
+ "license": "SEE LICENSE IN LICENSE.md",
8
+ "publishConfig": {
9
+ "access": "public"
10
+ },
11
+ "scripts": {
12
+ "build": "yarn run clean && webpack --config=webpack.config.prod.js",
13
+ "dev": "yarn run clean && webpack --config=webpack.config.dev.js",
14
+ "test": "jest --config=./jest.config.js --coverage",
15
+ "start": "webpack -w",
16
+ "clean": "rm -rf dist",
17
+ "prepublishOnly": "yarn && rm -rf ./dist && yarn run build"
18
+ },
19
+ "dependencies": {
20
+ "@sentry/browser": "^6.1.0",
21
+ "firebase": "^8.2.3",
22
+ "mobx": "^6.0.4"
23
+ },
24
+ "devDependencies": {
25
+ "@tivio/common": "*",
26
+ "@types/jest": "^26.0.23",
27
+ "@types/node": "^14.14.21",
28
+ "@types/node-fetch": "^2.5.8",
29
+ "@typescript-eslint/eslint-plugin": "^4.14.0",
30
+ "@typescript-eslint/parser": "^4.14.2",
31
+ "dotenv": "^8.2.0",
32
+ "dotenv-webpack": "^7.0.3",
33
+ "eslint": "^7.19.0",
34
+ "firebase": "^8.2.3",
35
+ "jest": "^26.6.3",
36
+ "jest-cli": "^26.6.3",
37
+ "jest-fetch-mock": "^3.0.3",
38
+ "mobx": "^6.0.4",
39
+ "node-fetch": "^2.6.1",
40
+ "stream-browserify": "^3.0.0",
41
+ "timers-browserify": "^2.0.12",
42
+ "ts-jest": "^26.4.4",
43
+ "typescript": "^4.0.2",
44
+ "webpack": "^5.15.0",
45
+ "webpack-cli": "^4.4.0",
46
+ "webpack-merge": "^5.7.3"
47
+ }
48
+ }