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