-
Notifications
You must be signed in to change notification settings - Fork 4.1k
Expand file tree
/
Copy pathlocal-subscription-platform-remote.js
More file actions
129 lines (118 loc) · 4.08 KB
/
local-subscription-platform-remote.js
File metadata and controls
129 lines (118 loc) · 4.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/**
* Copyright 2018 The AMP HTML Authors. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS-IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {Entitlement} from './entitlement';
import {LocalSubscriptionBasePlatform} from './local-subscription-platform-base';
import {Services} from '../../../src/services';
import {addParamToUrl, assertHttpsUrl} from '../../../src/url';
import {devAssert, userAssert} from '../../../src/log';
import {dict} from '../../../src/utils/object';
import {isArray} from '../../../src/types';
/**
* Implments the remotel local subscriptions platform which uses
* authorization and pingback urls
*
* @implements {./subscription-platform.SubscriptionPlatform}
*/
export class LocalSubscriptionRemotePlatform extends LocalSubscriptionBasePlatform {
/**
* @param {!../../../src/service/ampdoc-impl.AmpDoc} ampdoc
* @param {!JsonObject} platformConfig
* @param {!./service-adapter.ServiceAdapter} serviceAdapter
*/
constructor(ampdoc, platformConfig, serviceAdapter) {
super(ampdoc, platformConfig, serviceAdapter);
/** @private @const {string} */
this.authorizationUrl_ = assertHttpsUrl(
userAssert(
this.serviceConfig_['authorizationUrl'],
'Service config does not have authorization Url'
),
'Authorization Url'
);
/** @const @private {!../../../src/service/xhr-impl.Xhr} */
this.xhr_ = Services.xhrFor(this.ampdoc_.win);
/** @private @const {?string} */
this.pingbackUrl_ = this.serviceConfig_['pingbackUrl'] || null;
this.initializeListeners_();
}
/** @override */
getEntitlements() {
return this.urlBuilder_
.buildUrl(this.authorizationUrl_, /* useAuthData */ false)
.then(fetchUrl => {
// WARNING: If this key is really long, you might run into issues by hitting
// the maximum URL length in some browsers when sending the GET fetch URL.
const encryptedDocumentKey = this.serviceAdapter_.getEncryptedDocumentKey(
'local'
);
if (encryptedDocumentKey) {
//TODO(chenshay): if crypt, switch to 'post'
fetchUrl = addParamToUrl(fetchUrl, 'crypt', encryptedDocumentKey);
}
return this.xhr_
.fetchJson(fetchUrl, {credentials: 'include'})
.then(res => res.json())
.then(resJson => {
return Entitlement.parseFromJson(resJson);
});
});
}
/** @override */
isPingbackEnabled() {
return !!this.pingbackUrl_;
}
/**
* Format data for pingback
* @param {./entitlement.Entitlement|Array<./entitlement.Entitlement>} entitlements
* @return {string}
* @private
*/
stringifyPingbackData_(entitlements) {
if (isArray(entitlements)) {
const entitlementArray = [];
entitlements.forEach(ent => {
entitlementArray.push(ent.jsonForPingback());
});
return JSON.stringify(entitlementArray);
}
return JSON.stringify(entitlements.jsonForPingback());
}
/** @override */
pingback(selectedEntitlement) {
if (!this.isPingbackEnabled) {
return;
}
const pingbackUrl = /** @type {string} */ (devAssert(
this.pingbackUrl_,
'pingbackUrl is null'
));
const promise = this.urlBuilder_.buildUrl(
pingbackUrl,
/* useAuthData */ true
);
return promise.then(url => {
// Content should be 'text/plain' to avoid CORS preflight.
return this.xhr_.sendSignal(url, {
method: 'POST',
credentials: 'include',
headers: dict({
'Content-Type': 'text/plain',
}),
body: this.stringifyPingbackData_(selectedEntitlement),
});
});
}
}