Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Avatar for KuCalc : devops.
Download
50654 views
1
//----------------------------------------------------------------------------
2
// Copyright (C) 2013 The IPython Development Team
3
//
4
// Distributed under the terms of the BSD License. The full license is in
5
// the file COPYING, distributed as part of this software.
6
//----------------------------------------------------------------------------
7
8
//============================================================================
9
// Comm and CommManager bases
10
//============================================================================
11
/**
12
* Base Comm classes
13
* @module IPython
14
* @namespace IPython
15
* @submodule comm
16
*/
17
18
var IPython = (function (IPython) {
19
"use strict";
20
21
//-----------------------------------------------------------------------
22
// CommManager class
23
//-----------------------------------------------------------------------
24
25
var CommManager = function (kernel) {
26
this.comms = {};
27
this.targets = {};
28
if (kernel !== undefined) {
29
this.init_kernel(kernel);
30
}
31
};
32
33
CommManager.prototype.init_kernel = function (kernel) {
34
// connect the kernel, and register message handlers
35
this.kernel = kernel;
36
var msg_types = ['comm_open', 'comm_msg', 'comm_close'];
37
for (var i = 0; i < msg_types.length; i++) {
38
var msg_type = msg_types[i];
39
kernel.register_iopub_handler(msg_type, $.proxy(this[msg_type], this));
40
}
41
};
42
43
CommManager.prototype.new_comm = function (target_name, data, callbacks, metadata) {
44
// Create a new Comm, register it, and open its Kernel-side counterpart
45
// Mimics the auto-registration in `Comm.__init__` in the IPython Comm
46
var comm = new Comm(target_name);
47
this.register_comm(comm);
48
comm.open(data, callbacks, metadata);
49
return comm;
50
};
51
52
CommManager.prototype.register_target = function (target_name, f) {
53
// Register a target function for a given target name
54
this.targets[target_name] = f;
55
};
56
57
CommManager.prototype.unregister_target = function (target_name, f) {
58
// Unregister a target function for a given target name
59
delete this.targets[target_name];
60
};
61
62
CommManager.prototype.register_comm = function (comm) {
63
// Register a comm in the mapping
64
this.comms[comm.comm_id] = comm;
65
comm.kernel = this.kernel;
66
return comm.comm_id;
67
};
68
69
CommManager.prototype.unregister_comm = function (comm_id) {
70
// Remove a comm from the mapping
71
delete this.comms[comm_id];
72
};
73
74
// comm message handlers
75
76
CommManager.prototype.comm_open = function (msg) {
77
var content = msg.content;
78
var f = this.targets[content.target_name];
79
if (f === undefined) {
80
console.log("No such target registered: ", content.target_name);
81
console.log("Available targets are: ", this.targets);
82
return;
83
}
84
var comm = new Comm(content.target_name, content.comm_id);
85
this.register_comm(comm);
86
try {
87
f(comm, msg);
88
} catch (e) {
89
console.log("Exception opening new comm:", e, e.stack, msg);
90
comm.close();
91
this.unregister_comm(comm);
92
}
93
};
94
95
CommManager.prototype.comm_close = function (msg) {
96
var content = msg.content;
97
var comm = this.comms[content.comm_id];
98
if (comm === undefined) {
99
return;
100
}
101
delete this.comms[content.comm_id];
102
try {
103
comm.handle_close(msg);
104
} catch (e) {
105
console.log("Exception closing comm: ", e, e.stack, msg);
106
}
107
};
108
109
CommManager.prototype.comm_msg = function (msg) {
110
var content = msg.content;
111
var comm = this.comms[content.comm_id];
112
if (comm === undefined) {
113
return;
114
}
115
try {
116
comm.handle_msg(msg);
117
} catch (e) {
118
console.log("Exception handling comm msg: ", e, e.stack, msg);
119
}
120
};
121
122
//-----------------------------------------------------------------------
123
// Comm base class
124
//-----------------------------------------------------------------------
125
126
var Comm = function (target_name, comm_id) {
127
this.target_name = target_name;
128
this.comm_id = comm_id || IPython.utils.uuid();
129
this._msg_callback = this._close_callback = null;
130
};
131
132
// methods for sending messages
133
Comm.prototype.open = function (data, callbacks, metadata) {
134
var content = {
135
comm_id : this.comm_id,
136
target_name : this.target_name,
137
data : data || {},
138
};
139
return this.kernel.send_shell_message("comm_open", content, callbacks, metadata);
140
};
141
142
Comm.prototype.send = function (data, callbacks, metadata) {
143
var content = {
144
comm_id : this.comm_id,
145
data : data || {},
146
};
147
return this.kernel.send_shell_message("comm_msg", content, callbacks, metadata);
148
};
149
150
Comm.prototype.close = function (data, callbacks, metadata) {
151
var content = {
152
comm_id : this.comm_id,
153
data : data || {},
154
};
155
return this.kernel.send_shell_message("comm_close", content, callbacks, metadata);
156
};
157
158
// methods for registering callbacks for incoming messages
159
Comm.prototype._register_callback = function (key, callback) {
160
this['_' + key + '_callback'] = callback;
161
};
162
163
Comm.prototype.on_msg = function (callback) {
164
this._register_callback('msg', callback);
165
};
166
167
Comm.prototype.on_close = function (callback) {
168
this._register_callback('close', callback);
169
};
170
171
// methods for handling incoming messages
172
173
Comm.prototype._maybe_callback = function (key, msg) {
174
var callback = this['_' + key + '_callback'];
175
if (callback) {
176
try {
177
callback(msg);
178
} catch (e) {
179
console.log("Exception in Comm callback", e, e.stack, msg);
180
}
181
}
182
};
183
184
Comm.prototype.handle_msg = function (msg) {
185
this._maybe_callback('msg', msg);
186
};
187
188
Comm.prototype.handle_close = function (msg) {
189
this._maybe_callback('close', msg);
190
};
191
192
IPython.CommManager = CommManager;
193
IPython.Comm = Comm;
194
195
return IPython;
196
197
}(IPython));
198
199
200