/
Http.ts
89 lines (84 loc) · 3.02 KB
/
Http.ts
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
import { DetectPlugin } from "./DetectPlugin";
function Check(url: string, mode: 'ajax' | 'script'): Promise<boolean> {
return new Promise<boolean>((end) => {
if (mode === 'ajax') {
var readyStates = [ false, false, false, false ];
var status: null | number = null;
var respond = function (responseForce?: boolean) {
if (responseForce !== undefined) {
end(responseForce);
} else {
if (status === 0) {
end(true);
return;
}
for (var i = 0; i < 4; i++) {
if (readyStates[ i ] === false) {
end(true);
return;
}
}
end(false);
}
};
var xmlHttp = new XMLHttpRequest();
xmlHttp.onreadystatechange = function () {
readyStates[ xmlHttp.readyState - 1 ] = true;
try {
status = xmlHttp.status;
} catch (e) {
}
if (xmlHttp.readyState === 4) {
respond();
}
};
try {
xmlHttp.open('GET', url, true);
xmlHttp.send();
} catch (e) {
if (e.result == '2153644038') {
respond(true);
}
}
} else if (mode === 'script') {
var element = document.createElement('script');
element.src = url;
element.onerror = function () {
end(true);
window.document.body.removeChild(element);
};
element.onload = function () {
end(false);
window.document.body.removeChild(element);
};
window.document.body.appendChild(element);
} else {
end(false);
}
});
}
export interface HttpOptions {
name?: string;
baitUrl: string;
baitMode: "ajax" | "script";
}
export const HttpAjaxOptions: HttpOptions = Object.freeze<HttpOptions>({
baitUrl: '/ad/banner/_adsense_/_adserver/_adview_.ad.json?adzone=top&adsize=300x250&advid={RANDOM}',
baitMode: "ajax",
});
export const HttpScriptOptions: HttpOptions = Object.freeze<HttpOptions>({
baitUrl: '/ad/banner/_adsense_/_adserver/_adview_.ad.js?adzone=top&adsize=300x250&advid={RANDOM}',
baitMode: "script",
});
export function Http(options: HttpOptions): DetectPlugin {
return {
detect: function HttpDetectPlugin(resolve: (result: boolean) => void) {
Check(options.baitUrl.replace('{RANDOM}', Number(new Date).toString()), options.baitMode)
.then(resolve);
},
name: "detect-ad-block/http" + (options.name || (":" + options.baitMode)),
version: 1,
};
}
export const ajax = Http(HttpAjaxOptions);
export const script = Http(HttpScriptOptions);