@tivio/sdk-js 1.0.0-alpha

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/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
+ }