Skip to content

Commit fd6ded4

Browse files
authored
fix: add NPM deployment with release notes and fix flow issues (#24)
Add deployment to NPM and ping to Jenkins after with release notes. fix flow issues to complete the cycle as we have on other NPM packages. Solve FEC-9495, FEC-10064.
1 parent 0aae5ee commit fd6ded4

13 files changed

+167
-46
lines changed

.travis.yml

Lines changed: 78 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,88 @@
1-
1+
conditions: v1
22
sudo: required
3-
dist: trusty
3+
dist: xenial
44
language: node_js
55
node_js:
6-
- "node"
6+
- "node"
7+
8+
addons:
9+
chrome: stable
710

11+
services:
12+
- xvfb
813
cache:
914
yarn: true
1015
directories:
11-
- node_modules
16+
- node_modules
1217

1318
before_install:
14-
- export CHROME_BIN=/usr/bin/google-chrome
15-
- export DISPLAY=:99.0
16-
- sh -e /etc/init.d/xvfb start
17-
- sudo apt-get update
18-
- sudo apt-get install -y libappindicator1 fonts-liberation
19-
- wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
20-
- sudo dpkg -i google-chrome*.deb
19+
- export DISPLAY=:99.0
20+
- chmod +x ./scripts/travis.sh
21+
22+
script: ./scripts/travis.sh
23+
24+
stages:
25+
- Tests
26+
- Release canary
27+
- Release
2128

22-
script:
23-
- npm run eslint
24-
- npm run flow
25-
- npm run test
29+
jobs:
30+
fast_finish: true
31+
include:
32+
# https://docs.travis-ci.com/user/build-stages/deploy-github-releases/
33+
- stage: Release
34+
name: "Releasing a new version"
35+
if: tag IS present
36+
env: TRAVIS_MODE=release
37+
deploy:
38+
- provider: releases
39+
api_key: $GH_TOKEN
40+
file_glob: true
41+
file: dist/*
42+
prerelease: true
43+
skip_cleanup: true
44+
on:
45+
branch: master
46+
tags: true
47+
- provider: npm
48+
api_key: $NPM_TOKEN
49+
email: $NPM_EMAIL
50+
skip_cleanup: true
51+
on:
52+
tags: true
53+
branch: master
54+
after_deploy:
55+
- currentVersion=$(npx -c 'echo "$npm_package_version"')
56+
- chmod +x ./scripts/after_deploy.sh
57+
- ./scripts/after_deploy.sh "cast-receiver" "$currentVersion" "$JENKINS_TAG_TOKEN"
58+
# publish canary package if on master
59+
- stage: Release canary
60+
if: (branch = master) AND (type != pull_request) AND commit_message !~ /^chore\(release\)/
61+
env: TRAVIS_MODE=releaseCanary
62+
deploy:
63+
provider: npm
64+
api_key: $NPM_TOKEN
65+
email: $NPM_EMAIL
66+
skip_cleanup: true
67+
tag: canary
68+
on:
69+
tags: false
70+
branch: master
71+
after_deploy:
72+
- currentVersion=$(npx -c 'echo "$npm_package_version"')
73+
- echo $currentVersion
74+
- chmod +x ./scripts/after_deploy.sh
75+
- ./scripts/after_deploy.sh "cast-receiver" "$currentVersion" "$JENKINS_CANARY_TOKEN"
76+
# Required tests
77+
- stage: Tests
78+
if: (branch = master) OR (tag IS present) OR (type = pull_request)
79+
name: "Running lint"
80+
env: TRAVIS_MODE=lint
81+
- stage: Tests
82+
if: (branch = master) OR (tag IS present) OR (type = pull_request)
83+
name: "Running Flow type check"
84+
env: TRAVIS_MODE=flow
85+
- stage: Tests
86+
if: (branch = master) OR (tag IS present) OR (type = pull_request)
87+
name: "Running unit tests"
88+
env: TRAVIS_MODE=unitTests

flow-typed/receiver-options-object.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@
3535
* }
3636
*}
3737
*/
38+
39+
import {PKMediaSourceOptionsObject, PKStreamPriorityObject} from '@playkit-js/playkit-js';
40+
import {ProviderOptionsObject} from 'playkit-js-providers';
41+
3842
type _KPReceiverOptionsObject = {
3943
provider: ProviderOptionsObject,
4044
playback?: {

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
}
3535
},
3636
"devDependencies": {
37+
"@playkit-js/playkit-js": "^0.58.1",
3738
"babel-cli": "^6.18.0",
3839
"babel-core": "^6.18.2",
3940
"babel-eslint": "^7.1.1",
@@ -74,6 +75,7 @@
7475
"lint-staged": "^7.1.2",
7576
"mocha": "^3.2.0",
7677
"mocha-cli": "^1.0.1",
78+
"playkit-js-providers": "https://github.com/kaltura/playkit-js-providers.git#v2.20.5",
7779
"pre-push": "^0.1.1",
7880
"prettier": "^1.13.2",
7981
"sinon": "^2.0.0",

scripts/after_deploy.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/bash
2+
curl -k -d "{'name':$1, 'version':$2, 'source':'npm'}" -H "Content-Type: application/json" -X POST https://jenkins.ovp.kaltura.com/generic-webhook-trigger/invoke?token=$3

scripts/travis.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,4 @@ elif [ "${TRAVIS_MODE}" = "release" ] || [ "${TRAVIS_MODE}" = "releaseCanary" ];
2929
else
3030
echo "Unknown travis mode: ${TRAVIS_MODE}" 1>&2
3131
exit 1
32+
fi

src/receiver-ads-manager.js

Lines changed: 17 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class ReceiverAdsManager {
1414
_ad: ?Ad;
1515
_adBreak: ?AdBreak;
1616
_adIsPlaying: boolean;
17-
_adCanSkipTriggered: false;
17+
_adCanSkipTriggered: boolean = false;
1818
_adLifecycleEventHandlers: {[event: string]: Function};
1919
_adTrackingEventHandlers: {[event: string]: Function};
2020
_playerEventHandlers: {[event: string]: Function};
@@ -28,7 +28,6 @@ class ReceiverAdsManager {
2828
this._context = cast.framework.CastReceiverContext.getInstance();
2929
this._playerManager = this._context.getPlayerManager();
3030
this._player = player;
31-
this._bindMethods();
3231
this._attachListeners();
3332
}
3433

@@ -42,36 +41,22 @@ class ReceiverAdsManager {
4241
return !!this._adBreak;
4342
}
4443

45-
_bindMethods(): void {
46-
this._onPlayerLoadComplete = this._onPlayerLoadComplete.bind(this);
47-
this._onBreakStarted = this._onBreakStarted.bind(this);
48-
this._onBreakEnded = this._onBreakEnded.bind(this);
49-
this._onBreakClipLoading = this._onBreakClipLoading.bind(this);
50-
this._onBreakClipStarted = this._onBreakClipStarted.bind(this);
51-
this._onBreakClipEnded = this._onBreakClipEnded.bind(this);
52-
this._onAdPaused = this._onAdPaused.bind(this);
53-
this._onAdResumed = this._onAdResumed.bind(this);
54-
this._onAdProgress = this._onAdProgress.bind(this);
55-
this._onMuteChange = this._onMuteChange.bind(this);
56-
this._onVolumeChange = this._onVolumeChange.bind(this);
57-
}
58-
5944
_attachListeners(): void {
6045
this._adLifecycleEventHandlers = {
61-
[cast.framework.events.EventType.PLAYER_LOAD_COMPLETE]: this._onPlayerLoadComplete,
62-
[cast.framework.events.EventType.BREAK_STARTED]: this._onBreakStarted,
63-
[cast.framework.events.EventType.BREAK_ENDED]: this._onBreakEnded,
64-
[cast.framework.events.EventType.BREAK_CLIP_LOADING]: this._onBreakClipLoading,
65-
[cast.framework.events.EventType.BREAK_CLIP_STARTED]: this._onBreakClipStarted,
66-
[cast.framework.events.EventType.BREAK_CLIP_ENDED]: this._onBreakClipEnded
46+
[cast.framework.events.EventType.PLAYER_LOAD_COMPLETE]: this._onPlayerLoadComplete.bind(this),
47+
[cast.framework.events.EventType.BREAK_STARTED]: this._onBreakStarted.bind(this),
48+
[cast.framework.events.EventType.BREAK_ENDED]: this._onBreakEnded.bind(this),
49+
[cast.framework.events.EventType.BREAK_CLIP_LOADING]: this._onBreakClipLoading.bind(this),
50+
[cast.framework.events.EventType.BREAK_CLIP_STARTED]: this._onBreakClipStarted.bind(this),
51+
[cast.framework.events.EventType.BREAK_CLIP_ENDED]: this._onBreakClipEnded.bind(this)
6752
};
6853
this._adTrackingEventHandlers = {
69-
[cast.framework.events.EventType.PAUSE]: this._onAdPaused,
70-
[cast.framework.events.EventType.PLAY]: this._onAdResumed
54+
[cast.framework.events.EventType.PAUSE]: this._onAdPaused.bind(this),
55+
[cast.framework.events.EventType.PLAY]: this._onAdResumed.bind(this)
7156
};
7257
this._playerEventHandlers = {
73-
[EventType.MUTE_CHANGE]: this._onMuteChange,
74-
[EventType.VOLUME_CHANGE]: this._onVolumeChange
58+
[EventType.MUTE_CHANGE]: this._onMuteChange.bind(this),
59+
[EventType.VOLUME_CHANGE]: this._onVolumeChange.bind(this)
7560
};
7661
Object.keys(this._adLifecycleEventHandlers).forEach(event => this._playerManager.addEventListener(event, this._adLifecycleEventHandlers[event]));
7762
}
@@ -155,7 +140,7 @@ class ReceiverAdsManager {
155140
this._timePercentEvent.AD_REACHED_75_PERCENT = true;
156141
this._sendEventAndCustomMessage(this._player.Event.AD_THIRD_QUARTILE);
157142
}
158-
if (!this._adCanSkipTriggered && this._ad.skippable) {
143+
if (!this._adCanSkipTriggered && this._ad && this._ad.skippable) {
159144
if (adCurrentTime >= this._ad.skipOffset) {
160145
this._sendEventAndCustomMessage(this._player.Event.AD_CAN_SKIP);
161146
this._adCanSkipTriggered = true;
@@ -183,14 +168,16 @@ class ReceiverAdsManager {
183168
if (toggle) {
184169
Object.keys(this._adTrackingEventHandlers).forEach(event => this._playerManager.addEventListener(event, this._adTrackingEventHandlers[event]));
185170
Object.keys(this._playerEventHandlers).forEach(event => this._player.addEventListener(event, this._playerEventHandlers[event]));
186-
this._adProgressIntervalId = setInterval(this._onAdProgress, 300);
171+
this._adProgressIntervalId = setInterval(this._onAdProgress.bind(this), 300);
187172
} else {
188173
Object.keys(this._adTrackingEventHandlers).forEach(event =>
189174
this._playerManager.removeEventListener(event, this._adTrackingEventHandlers[event])
190175
);
191176
Object.keys(this._playerEventHandlers).forEach(event => this._player.removeEventListener(event, this._playerEventHandlers[event]));
192-
clearInterval(this._adProgressIntervalId);
193-
this._adProgressIntervalId = null;
177+
if (this._adProgressIntervalId) {
178+
clearInterval(this._adProgressIntervalId);
179+
this._adProgressIntervalId = null;
180+
}
194181
}
195182
}
196183

src/receiver-manager.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,7 @@ class ReceiverManager {
265265
}
266266
}
267267

268-
_maybeCreateVmapAdsRequest(media: Object): Object {
268+
_maybeCreateVmapAdsRequest(media: Object): void {
269269
if (media.customData && media.customData.vmapAdsRequest) {
270270
media.vmapAdsRequest = media.customData.vmapAdsRequest;
271271
}

test/.eslintrc.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"rules": {
3+
"flowtype/no-types-missing-file-annotation": "off",
4+
"require-jsdoc": "off",
5+
"valid-jsdoc": "off",
6+
"mocha-no-only/mocha-no-only": ["error"]
7+
}
8+
}

test/setup/karma.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import prepareTestEnvironment from './prepare-test-environment';
2+
import loadSpecs from './load-specs';
3+
4+
prepareTestEnvironment();
5+
loadSpecs();

test/setup/load-specs.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/**
2+
* @returns {void}
3+
*/
4+
export function loadSpecs() {
5+
const context = require.context('../src/', true, /\.spec\.js$/);
6+
for (const key of context.keys()) {
7+
describe(key, () => {
8+
context(key);
9+
});
10+
}
11+
}
12+
13+
export default loadSpecs;
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import chai from 'chai';
2+
import sinonChai from 'sinon-chai';
3+
import sinon from 'sinon/pkg/sinon';
4+
5+
/**
6+
* @returns {void}
7+
*/
8+
export function prepareTestEnvironment() {
9+
chai.should();
10+
chai.use(sinonChai);
11+
global.chai = chai;
12+
global.expect = chai.expect;
13+
global.should = chai.should;
14+
global.sinon = sinon;
15+
}
16+
17+
export default prepareTestEnvironment;

test/src/cast-player.spec.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
describe('Cast Player', () => {
2+
it('', function(done) {
3+
done();
4+
});
5+
});

yarn.lock

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,14 @@
2727
version "1.1.0"
2828
resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.0.tgz#50c1e2260ac0ed9439a181de3725a0168d59c48a"
2929

30+
"@playkit-js/playkit-js@^0.58.1":
31+
version "0.58.1"
32+
resolved "https://registry.yarnpkg.com/@playkit-js/playkit-js/-/playkit-js-0.58.1.tgz#480ef32c39c005728ce0b1a5fa58478e73ec3c0c"
33+
integrity sha512-1wpaeJDhIP/vmPlWL+XXxes8edKKuSE3Xjs1z44gFkvkWqdmStt5UjZSQQxJ/6ZMv6tGSHKLvo4J/4AlDA1Z6w==
34+
dependencies:
35+
js-logger "^1.3.0"
36+
ua-parser-js "^0.7.13"
37+
3038
"@samverschueren/stream-to-observable@^0.3.0":
3139
version "0.3.0"
3240
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
@@ -7015,6 +7023,12 @@ pkg-up@^1.0.0:
70157023
version "0.1.5"
70167024
resolved "https://github.com/kaltura/playkit-js-ott-analytics.git#45e4603035aced93bba5c3fb5507b7a80e2802b7"
70177025

7026+
"playkit-js-providers@https://github.com/kaltura/playkit-js-providers.git#v2.20.5":
7027+
version "2.20.5"
7028+
resolved "https://github.com/kaltura/playkit-js-providers.git#1e1eb5f6fceaf5e19fac27fc881231a439b33df8"
7029+
dependencies:
7030+
js-logger "^1.3.0"
7031+
70187032
"playkit-js-providers@https://github.com/kaltura/playkit-js-providers.git#v2.7.1":
70197033
version "2.7.1"
70207034
resolved "https://github.com/kaltura/playkit-js-providers.git#c8ab75495159053b15ac5235c4970926d62e75d7"

0 commit comments

Comments
 (0)