File: proxy_node.html

package info (click to toggle)
opendht 3.0.1-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,284 kB
  • sloc: cpp: 23,342; python: 2,189; ansic: 2,041; makefile: 207; sh: 72
file content (196 lines) | stat: -rw-r--r-- 9,345 bytes parent folder | download | duplicates (3)
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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
		<title>OpenDHT tester</title>
		<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" />
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" />
		<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
		<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
		<script type="text/javascript">"use strict";
let onGet;
let onPut;
let setServer;
const valueGetElement = function(o) {
    const d = window.atob(o.data);
    return d;
};
$(function() {
    let request = undefined;
    let server;
    const getTools = $("#getTools");
    const getBtn = $("#getBtn");
    const getDropdown = $("#getDropdown");
    const listenBtn = $("#listenBtn").click(function(){onGet('LISTEN');});
    const setGetRequest = function() {
        getBtn.button('loading');
        getStopBtn.appendTo(getTools);
        getDropdown.hide();
    }
    const clearGetRequest = function() {
        if (request === undefined)
            return;
        request.abort();
        request = undefined;
        getStopBtn.detach();
        getDropdown.show();
        getBtn.button('reset');
    }
    const getStopBtn = $("#getStopBtn").detach().click(clearGetRequest);
    const putBtn = $("#putBtn");
    const result = $("#dhtResult");
    const group = $('<ul class="list-group"/>').appendTo(result);
    onGet = function (method) {
        if (request !== undefined)
            return false;
        const input = $("#getKey").val();
        group.empty();
        let lastAppended = 0;
        let start = new Date().getTime();
        request = new XMLHttpRequest();
        request.onreadystatechange = function(event) {
            if (this.readyState >= XMLHttpRequest.LOADING) {
                if (this.readyState == XMLHttpRequest.DONE) {
                    clearGetRequest();
                }
                if (this.status === 200) {
                    const elements = this.responseText.split("\n");
                    const elementsLength = elements.length;
                    const now = new Date().getTime();
                    for (let i = lastAppended; i < elementsLength; i++) {
                        const element = elements[i];
                        if (!element || element.length == 0)
                            return;
                        const o = JSON.parse(element);
                        if (o.expired) {
                            $('#value'+o.id).slideUp(100, (e) => $(e.target).remove());
                        } else {
                            const d = window.atob(o.data);
                            const delay = Math.max(0, start-now);
                            $('<li class="list-group-item" id="value'+o.id+'"/>').append(valueGetElement(o)).appendTo(group).hide().delay(delay).slideDown(100);
                            lastAppended = i+1;
                            start = Math.max(start, now)+25;
                        }
                    }
                } else if (this.status !== 0) {
                    group.empty().append($('<li class="list-group-item list-group-item-danger"/>').text("Error loading content: " + this.statusText));
                }
            }
        };
        request.onerror = function(event) {
            clearGetRequest();
            group.empty().append($('<li class="list-group-item list-group-item-danger"/>').text("Error loading content."));
        };
        request.open(method, server + input, true);
        request.send(null);
        setGetRequest();
        return false;
    };

    onPut = function( ) {
        const key = $("#getKey").val();
        const value = $("#putValue").val();
        $.ajax({
            url: server + key,
            type: 'POST',
            data: JSON.stringify({
                data:window.btoa(value)
            }),
            contentType: 'application/json; charset=utf-8',
            dataType: 'json',
            success: function( result ) {
                putBtn.button('reset');
                //$('<li class="list-group-item list-group-item-success"/>').append(valueGetElement(result)).appendTo(group.empty());
            },
            error: function(result) {
                putBtn.button('reset');
                group.empty().append($('<li class="list-group-item list-group-item-danger"/>').text(result.statusText));
            }
        });
        putBtn.button('loading');
        return false;
    };

    const serverValue = $("#serverValue");
    const serverStatus = $("#serverStatus");
    const serverBtn = $("#serverBtn");
    setServer = function(event) {
        server = serverValue.val() + '/';
        serverStatus.empty();
        serverBtn.button('loading');
        $.getJSON(server, function(data){
            $('<span><b>Node</b> '+data.node_id+'</span>').appendTo(serverStatus).hide().fadeIn();
        }).fail(function(error) {
            var message = " Cant' access node."
            if (serverValue.val().indexOf("https") != -1){
                message += "</br></br>Self-signed certificate must be allowed in browser."
            }
            serverStatus.html("<div class='alert alert-danger' style='margin-bottom: 0px;'>" +
                              "<span class='glyphicon glyphicon-remove' aria-hidden='true'></span>" +
                              message + "</div>");
        }).always(function(error) {
            serverBtn.button('reset');
        });
        return false;
    };
    setServer();
});
	</script>
</head>
<body>
    <div class="container" style="max-width: 730px;">
        <header class="page-header">
            <div class="row">
                <div class="col-sm-5">
                    <h1>OpenDHT tester</h1>
                </div>
                <div class="col-sm-7">
                    <div class="well well-sm" style="margin-top:10px; margin-bottom:0px;">
                        <form id="serverForm" class="form-inline" onsubmit="return setServer();" style="margin-bottom:4px;">
                            <div class="input-group">
                                <input type="text" class="form-control" id="serverValue" placeholder="Proxy server" value="http://127.0.0.1:8080"/>
                                <span class="input-group-btn">
                                    <button id="serverBtn" type="submit" class="btn btn-default" data-loading-text="<i class='fa fa-circle-o-notch fa-spin'></i>"><span class="glyphicon glyphicon-refresh" aria-hidden="true"></span></button>
                                </span>
                            </div>
                        </form>
                        <div id="serverStatus"><i class='fa fa-circle-o-notch fa-spin'></i></div>
                    </div>
                </div>
            </div>
        </header>
        <div class="panel panel-default" id="dhtResult">
                <div class="panel-heading">
                    <div class="row">
                    <div class="col-xs-6">
                        <form class="form-inline" onsubmit="return onGet('GET');">
                            <div class="input-group">
                                <input type="text" class="form-control" id="getKey" placeholder="Key" aria-label="Key" />
                                <span class="input-group-btn" id="getTools">
                                    <button id="getBtn" class="btn btn-default" data-loading-text="<i class='fa fa-circle-o-notch fa-spin'></i>" type="submit">Get</button>
                                    <button id="getDropdown"type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span class="caret"></span> <span class="sr-only">Toggle Dropdown</span> </button>
                                    <ul class="dropdown-menu">
                                        <li><a id="listenBtn" href="#">Listen</a></li>
                                    </ul>
                                    <button id="getStopBtn" class="btn btn-default" type="submit"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></button>
                                </span>
                            </div>
                        </form>
                    </div>
                    <div class="col-xs-6">
                        <form class="form-inline" onsubmit="return onPut();">
                            <div class="input-group">
                                <input type="text" class="form-control input-group-input" id="putValue" placeholder="Value" />
                                <span class="input-group-btn">
                                    <button id="putBtn" type="submit" class="btn btn-default" data-loading-text="<i class='fa fa-circle-o-notch fa-spin'></i> Loading">Put</button>
                                </span>
                            </div>
                        </form>
                    </div>
                </div>
            </div>
        </div>
    </div>
</body>
</html>