@difizen/libro-kernel 0.0.2-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1 -0
- package/es/basemanager.d.ts +94 -0
- package/es/basemanager.d.ts.map +1 -0
- package/es/basemanager.js +110 -0
- package/es/contents/contents-drive.d.ts +189 -0
- package/es/contents/contents-drive.d.ts.map +1 -0
- package/es/contents/contents-drive.js +792 -0
- package/es/contents/contents-manager.d.ts +229 -0
- package/es/contents/contents-manager.d.ts.map +1 -0
- package/es/contents/contents-manager.js +551 -0
- package/es/contents/contents-module.d.ts +3 -0
- package/es/contents/contents-module.d.ts.map +1 -0
- package/es/contents/contents-module.js +4 -0
- package/es/contents/contents-protocol.d.ts +487 -0
- package/es/contents/contents-protocol.d.ts.map +1 -0
- package/es/contents/contents-protocol.js +1 -0
- package/es/contents/index.d.ts +6 -0
- package/es/contents/index.d.ts.map +1 -0
- package/es/contents/index.js +5 -0
- package/es/contents/validate.d.ts +10 -0
- package/es/contents/validate.d.ts.map +1 -0
- package/es/contents/validate.js +22 -0
- package/es/index.d.ts +10 -0
- package/es/index.d.ts.map +1 -0
- package/es/index.js +9 -0
- package/es/index.less +0 -0
- package/es/kernel/comm.d.ts +92 -0
- package/es/kernel/comm.d.ts.map +1 -0
- package/es/kernel/comm.js +216 -0
- package/es/kernel/future.d.ts +178 -0
- package/es/kernel/future.d.ts.map +1 -0
- package/es/kernel/future.js +587 -0
- package/es/kernel/index.d.ts +8 -0
- package/es/kernel/index.d.ts.map +1 -0
- package/es/kernel/index.js +8 -0
- package/es/kernel/kernel-connection.d.ts +550 -0
- package/es/kernel/kernel-connection.d.ts.map +1 -0
- package/es/kernel/kernel-connection.js +1957 -0
- package/es/kernel/kernel-module.d.ts +3 -0
- package/es/kernel/kernel-module.d.ts.map +1 -0
- package/es/kernel/kernel-module.js +32 -0
- package/es/kernel/libro-kernel-manager.d.ts +69 -0
- package/es/kernel/libro-kernel-manager.d.ts.map +1 -0
- package/es/kernel/libro-kernel-manager.js +349 -0
- package/es/kernel/libro-kernel-protocol.d.ts +675 -0
- package/es/kernel/libro-kernel-protocol.d.ts.map +1 -0
- package/es/kernel/libro-kernel-protocol.js +60 -0
- package/es/kernel/libro-kernel-utils.d.ts +95 -0
- package/es/kernel/libro-kernel-utils.d.ts.map +1 -0
- package/es/kernel/libro-kernel-utils.js +130 -0
- package/es/kernel/libro-kernel.d.ts +14 -0
- package/es/kernel/libro-kernel.d.ts.map +1 -0
- package/es/kernel/libro-kernel.js +54 -0
- package/es/kernel/messages.d.ts +845 -0
- package/es/kernel/messages.d.ts.map +1 -0
- package/es/kernel/messages.js +457 -0
- package/es/kernel/restapi.d.ts +78 -0
- package/es/kernel/restapi.d.ts.map +1 -0
- package/es/kernel/restapi.js +367 -0
- package/es/kernel/serialize.d.ts +10 -0
- package/es/kernel/serialize.d.ts.map +1 -0
- package/es/kernel/serialize.js +214 -0
- package/es/kernel/validate.d.ts +15 -0
- package/es/kernel/validate.d.ts.map +1 -0
- package/es/kernel/validate.js +125 -0
- package/es/kernelspec/index.d.ts +5 -0
- package/es/kernelspec/index.d.ts.map +1 -0
- package/es/kernelspec/index.js +4 -0
- package/es/kernelspec/kernelspec-module.d.ts +3 -0
- package/es/kernelspec/kernelspec-module.d.ts.map +1 -0
- package/es/kernelspec/kernelspec-module.js +4 -0
- package/es/kernelspec/kernelspec.d.ts +33 -0
- package/es/kernelspec/kernelspec.d.ts.map +1 -0
- package/es/kernelspec/kernelspec.js +1 -0
- package/es/kernelspec/manager.d.ts +81 -0
- package/es/kernelspec/manager.d.ts.map +1 -0
- package/es/kernelspec/manager.js +248 -0
- package/es/kernelspec/restapi.d.ts +71 -0
- package/es/kernelspec/restapi.d.ts.map +1 -0
- package/es/kernelspec/restapi.js +107 -0
- package/es/kernelspec/validate.d.ts +10 -0
- package/es/kernelspec/validate.d.ts.map +1 -0
- package/es/kernelspec/validate.js +69 -0
- package/es/libro-kernel-connection-manager.d.ts +19 -0
- package/es/libro-kernel-connection-manager.d.ts.map +1 -0
- package/es/libro-kernel-connection-manager.js +142 -0
- package/es/module.d.ts +3 -0
- package/es/module.d.ts.map +1 -0
- package/es/module.js +9 -0
- package/es/page-config.d.ts +36 -0
- package/es/page-config.d.ts.map +1 -0
- package/es/page-config.js +129 -0
- package/es/protocol.d.ts +13 -0
- package/es/protocol.d.ts.map +1 -0
- package/es/protocol.js +8 -0
- package/es/server/connection-error.d.ts +36 -0
- package/es/server/connection-error.d.ts.map +1 -0
- package/es/server/connection-error.js +109 -0
- package/es/server/index.d.ts +6 -0
- package/es/server/index.d.ts.map +1 -0
- package/es/server/index.js +5 -0
- package/es/server/server-connection-protocol.d.ts +49 -0
- package/es/server/server-connection-protocol.d.ts.map +1 -0
- package/es/server/server-connection-protocol.js +0 -0
- package/es/server/server-connection.d.ts +25 -0
- package/es/server/server-connection.d.ts.map +1 -0
- package/es/server/server-connection.js +159 -0
- package/es/server/server-manager.d.ts +22 -0
- package/es/server/server-manager.d.ts.map +1 -0
- package/es/server/server-manager.js +163 -0
- package/es/server/server-module.d.ts +3 -0
- package/es/server/server-module.d.ts.map +1 -0
- package/es/server/server-module.js +4 -0
- package/es/session/index.d.ts +5 -0
- package/es/session/index.d.ts.map +1 -0
- package/es/session/index.js +4 -0
- package/es/session/libro-session-manager.d.ts +71 -0
- package/es/session/libro-session-manager.d.ts.map +1 -0
- package/es/session/libro-session-manager.js +539 -0
- package/es/session/libro-session-protocol.d.ts +50 -0
- package/es/session/libro-session-protocol.d.ts.map +1 -0
- package/es/session/libro-session-protocol.js +21 -0
- package/es/session/libro-session.d.ts +12 -0
- package/es/session/libro-session.d.ts.map +1 -0
- package/es/session/libro-session.js +19 -0
- package/es/session/restapi.d.ts +28 -0
- package/es/session/restapi.d.ts.map +1 -0
- package/es/session/restapi.js +214 -0
- package/es/session/session-module.d.ts +3 -0
- package/es/session/session-module.d.ts.map +1 -0
- package/es/session/session-module.js +18 -0
- package/es/session/validate.d.ts +14 -0
- package/es/session/validate.d.ts.map +1 -0
- package/es/session/validate.js +37 -0
- package/es/utils.d.ts +4 -0
- package/es/utils.d.ts.map +1 -0
- package/es/utils.js +29 -0
- package/es/validate-property.d.ts +2 -0
- package/es/validate-property.d.ts.map +1 -0
- package/es/validate-property.js +35 -0
- package/package.json +62 -0
- package/src/basemanager.ts +133 -0
- package/src/contents/contents-drive.ts +495 -0
- package/src/contents/contents-manager.ts +465 -0
- package/src/contents/contents-module.ts +6 -0
- package/src/contents/contents-protocol.ts +604 -0
- package/src/contents/index.ts +5 -0
- package/src/contents/validate.ts +29 -0
- package/src/index.tsx +9 -0
- package/src/kernel/comm.ts +220 -0
- package/src/kernel/future.ts +474 -0
- package/src/kernel/index.ts +7 -0
- package/src/kernel/kernel-connection.ts +1770 -0
- package/src/kernel/kernel-module.ts +50 -0
- package/src/kernel/libro-kernel-manager.ts +199 -0
- package/src/kernel/libro-kernel-protocol.ts +858 -0
- package/src/kernel/libro-kernel-utils.ts +152 -0
- package/src/kernel/libro-kernel.ts +39 -0
- package/src/kernel/messages.ts +1104 -0
- package/src/kernel/restapi.ts +183 -0
- package/src/kernel/serialize.ts +262 -0
- package/src/kernel/validate.ts +101 -0
- package/src/kernelspec/index.ts +5 -0
- package/src/kernelspec/kernelspec-module.ts +9 -0
- package/src/kernelspec/kernelspec.ts +37 -0
- package/src/kernelspec/manager.ts +173 -0
- package/src/kernelspec/restapi.ts +104 -0
- package/src/kernelspec/validate.ts +80 -0
- package/src/libro-kernel-connection-manager.ts +73 -0
- package/src/module.ts +19 -0
- package/src/page-config.ts +106 -0
- package/src/protocol.ts +24 -0
- package/src/server/connection-error.ts +60 -0
- package/src/server/index.ts +5 -0
- package/src/server/server-connection-protocol.ts +57 -0
- package/src/server/server-connection.ts +144 -0
- package/src/server/server-manager.ts +76 -0
- package/src/server/server-module.ts +9 -0
- package/src/session/index.ts +4 -0
- package/src/session/libro-session-manager.ts +377 -0
- package/src/session/libro-session-protocol.ts +61 -0
- package/src/session/libro-session.ts +33 -0
- package/src/session/restapi.ts +126 -0
- package/src/session/session-module.ts +26 -0
- package/src/session/validate.ts +39 -0
- package/src/utils.ts +28 -0
- package/src/validate-property.ts +38 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { ManaModule } from '@difizen/mana-app';
|
|
2
|
+
|
|
3
|
+
import { LibroServerModule } from '../server/index.js';
|
|
4
|
+
|
|
5
|
+
import { KernelConnection } from './kernel-connection.js';
|
|
6
|
+
import { LibroKernelManager } from './libro-kernel-manager.js';
|
|
7
|
+
import type { KernelMeta } from './libro-kernel-protocol.js';
|
|
8
|
+
import {
|
|
9
|
+
KernelConnectionOptions,
|
|
10
|
+
LibroKernelConnectionFactory,
|
|
11
|
+
LibroKernelFactory,
|
|
12
|
+
KernelMetaOption,
|
|
13
|
+
} from './libro-kernel-protocol.js';
|
|
14
|
+
import { LibroKernel } from './libro-kernel.js';
|
|
15
|
+
import { KernelRestAPI } from './restapi.js';
|
|
16
|
+
|
|
17
|
+
export const LibroKernelModule = ManaModule.create()
|
|
18
|
+
.register(
|
|
19
|
+
KernelRestAPI,
|
|
20
|
+
KernelConnection,
|
|
21
|
+
LibroKernelManager,
|
|
22
|
+
LibroKernel,
|
|
23
|
+
{
|
|
24
|
+
token: LibroKernelFactory,
|
|
25
|
+
useFactory: (ctx) => {
|
|
26
|
+
return (kernelMeta: KernelMeta) => {
|
|
27
|
+
const child = ctx.container.createChild();
|
|
28
|
+
child.register({
|
|
29
|
+
token: KernelMetaOption,
|
|
30
|
+
useValue: kernelMeta,
|
|
31
|
+
});
|
|
32
|
+
return child.get(LibroKernel);
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
token: LibroKernelConnectionFactory,
|
|
38
|
+
useFactory: (ctx) => {
|
|
39
|
+
return (options: KernelConnectionOptions) => {
|
|
40
|
+
const child = ctx.container.createChild();
|
|
41
|
+
child.register({
|
|
42
|
+
token: KernelConnectionOptions,
|
|
43
|
+
useValue: options,
|
|
44
|
+
});
|
|
45
|
+
return child.get(KernelConnection);
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
)
|
|
50
|
+
.dependOn(LibroServerModule);
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Poll } from '@difizen/libro-common';
|
|
2
|
+
import type { Event as ManaEvent } from '@difizen/mana-app';
|
|
3
|
+
import { inject, singleton } from '@difizen/mana-app';
|
|
4
|
+
import { prop, getOrigin } from '@difizen/mana-app';
|
|
5
|
+
import { Emitter } from '@difizen/mana-app';
|
|
6
|
+
|
|
7
|
+
import { NetworkError, ServerManager } from '../server/index.js';
|
|
8
|
+
|
|
9
|
+
import type {
|
|
10
|
+
KernelId,
|
|
11
|
+
IKernelConnection,
|
|
12
|
+
KernelStatus,
|
|
13
|
+
KernelConnectionOptions,
|
|
14
|
+
IKernelModel,
|
|
15
|
+
} from './libro-kernel-protocol.js';
|
|
16
|
+
import {
|
|
17
|
+
LibroKernelFactory,
|
|
18
|
+
LibroKernelConnectionFactory,
|
|
19
|
+
} from './libro-kernel-protocol.js';
|
|
20
|
+
import type { LibroKernel } from './libro-kernel.js';
|
|
21
|
+
import { KernelRestAPI } from './restapi.js';
|
|
22
|
+
|
|
23
|
+
@singleton()
|
|
24
|
+
export class LibroKernelManager {
|
|
25
|
+
@inject(LibroKernelFactory) kernelfactory: LibroKernelFactory;
|
|
26
|
+
@inject(LibroKernelConnectionFactory)
|
|
27
|
+
kernelConnectionFactory: LibroKernelConnectionFactory;
|
|
28
|
+
|
|
29
|
+
@inject(KernelRestAPI) kernelRestAPI: KernelRestAPI;
|
|
30
|
+
|
|
31
|
+
@prop()
|
|
32
|
+
kernelMap = new Map<KernelId, LibroKernel>();
|
|
33
|
+
|
|
34
|
+
protected _pollModels: Poll;
|
|
35
|
+
protected _isReady = false;
|
|
36
|
+
protected _ready: Promise<void>;
|
|
37
|
+
|
|
38
|
+
protected serverManager: ServerManager;
|
|
39
|
+
protected connectToKernelEmitter = new Emitter();
|
|
40
|
+
get onConnectToKernel() {
|
|
41
|
+
return this.connectToKernelEmitter.event;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
get kernelIds() {
|
|
45
|
+
return Array.from(this.kernelMap.keys());
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
getLibroKernel(kernelId: KernelId) {
|
|
49
|
+
return this.kernelMap.get(kernelId);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
constructor(@inject(ServerManager) serverManager: ServerManager) {
|
|
53
|
+
this.serverManager = serverManager;
|
|
54
|
+
|
|
55
|
+
// Start model and specs polling with exponential backoff.
|
|
56
|
+
this._pollModels = new Poll({
|
|
57
|
+
auto: false,
|
|
58
|
+
factory: () => this.requestRunning(),
|
|
59
|
+
frequency: {
|
|
60
|
+
interval: 10 * 1000,
|
|
61
|
+
backoff: true,
|
|
62
|
+
max: 300 * 1000,
|
|
63
|
+
},
|
|
64
|
+
name: `@jupyterlab/services:KernelManager#models`,
|
|
65
|
+
// standby: options.standby ?? 'when-hidden',
|
|
66
|
+
standby: 'when-hidden',
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// Initialize internal data.
|
|
70
|
+
this._ready = (async () => {
|
|
71
|
+
await getOrigin(this._pollModels).start();
|
|
72
|
+
await getOrigin(this._pollModels).tick;
|
|
73
|
+
this._isReady = true;
|
|
74
|
+
})();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Test whether the manager is ready.
|
|
79
|
+
*/
|
|
80
|
+
get isReady(): boolean {
|
|
81
|
+
return this._isReady;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* A promise that fulfills when the manager is ready.
|
|
86
|
+
*/
|
|
87
|
+
get ready(): Promise<void> {
|
|
88
|
+
return this._ready;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* A signal emitted when the running kernels change.
|
|
93
|
+
*/
|
|
94
|
+
get runningChanged(): ManaEvent<IKernelModel[]> {
|
|
95
|
+
return this.runningChangedEmitter.event;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* A signal emitted when there is a connection failure.
|
|
100
|
+
*/
|
|
101
|
+
get connectionFailure(): ManaEvent<Error> {
|
|
102
|
+
return this.connectionFailureEmmiter.event;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Shut down a kernel by id.
|
|
107
|
+
*
|
|
108
|
+
* @param id - The id of the target kernel.
|
|
109
|
+
*
|
|
110
|
+
* @returns A promise that resolves when the operation is complete.
|
|
111
|
+
*/
|
|
112
|
+
async shutdown(id: string): Promise<void> {
|
|
113
|
+
await this.kernelRestAPI.shutdownKernel(id);
|
|
114
|
+
await this.refreshRunning();
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async connectToKernel(options: KernelConnectionOptions) {
|
|
118
|
+
const kernelConnection = this.kernelConnectionFactory(options);
|
|
119
|
+
this.startKernel(kernelConnection);
|
|
120
|
+
this.connectToKernelEmitter.fire(kernelConnection);
|
|
121
|
+
return kernelConnection;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// 通过kernel id判断kernel是否仍然存在
|
|
125
|
+
async isKernelAlive(id: string): Promise<boolean> {
|
|
126
|
+
try {
|
|
127
|
+
const data = await this.kernelRestAPI.getKernelModel(id);
|
|
128
|
+
return !!data;
|
|
129
|
+
} catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async startKernel(kernelConnection: IKernelConnection) {
|
|
135
|
+
kernelConnection.statusChanged(this._onStatusChanged.bind(this));
|
|
136
|
+
kernelConnection.onDisposed(() => this._onDisposed.bind(this)(kernelConnection));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
protected _onDisposed(kernelConnection: IKernelConnection) {
|
|
140
|
+
this.kernelMap.delete(kernelConnection.id);
|
|
141
|
+
// A dispose emission could mean the server session is deleted, or that
|
|
142
|
+
// the kernel JS object is disposed and the kernel still exists on the
|
|
143
|
+
// server, so we refresh from the server to make sure we reflect the
|
|
144
|
+
// server state.
|
|
145
|
+
|
|
146
|
+
void this.refreshRunning().catch(() => {
|
|
147
|
+
/* no-op */
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
protected _onStatusChanged(status: KernelStatus) {
|
|
152
|
+
if (status === 'dead') {
|
|
153
|
+
// We asynchronously update our list of kernels, which asynchronously
|
|
154
|
+
// will dispose them. We do not want to immediately dispose them because
|
|
155
|
+
// there may be other signal handlers that want to be called.
|
|
156
|
+
void this.refreshRunning().catch(() => {
|
|
157
|
+
/* no-op */
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Force a refresh of the running kernels.
|
|
164
|
+
*
|
|
165
|
+
* @returns A promise that resolves when the running list has been refreshed.
|
|
166
|
+
*
|
|
167
|
+
* #### Notes
|
|
168
|
+
* This is not typically meant to be called by the user, since the
|
|
169
|
+
* manager maintains its own internal state.
|
|
170
|
+
*/
|
|
171
|
+
async refreshRunning(): Promise<void> {
|
|
172
|
+
await getOrigin(this._pollModels).refresh();
|
|
173
|
+
await getOrigin(this._pollModels).tick;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
protected connectionFailureEmmiter = new Emitter<Error>();
|
|
177
|
+
protected runningChangedEmitter = new Emitter<IKernelModel[]>();
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Execute a request to the server to poll running kernels and update state.
|
|
181
|
+
*/
|
|
182
|
+
protected async requestRunning(): Promise<void> {
|
|
183
|
+
try {
|
|
184
|
+
await this.kernelRestAPI.listRunning();
|
|
185
|
+
} catch (err: any) {
|
|
186
|
+
// Handle network errors, as well as cases where we are on a
|
|
187
|
+
// JupyterHub and the server is not running. JupyterHub returns a
|
|
188
|
+
// 503 (<2.0) or 424 (>2.0) in that case.
|
|
189
|
+
if (
|
|
190
|
+
err instanceof NetworkError ||
|
|
191
|
+
err.response?.status === 503 ||
|
|
192
|
+
err.response?.status === 424
|
|
193
|
+
) {
|
|
194
|
+
this.connectionFailureEmmiter.fire(err);
|
|
195
|
+
}
|
|
196
|
+
throw err;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|