1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 07:14:47 -05:00

refactor: move op_resources and op_close to deno_core (#7539)

Moves op_close and op_resources to deno_core::ops and exports them.
Adds serde dependency to deno_core and reexports it.

Moves JS implementation of those ops to Deno.core and reexports them in Deno.
This commit is contained in:
Bartek Iwańczuk 2020-09-17 18:09:50 +02:00 committed by GitHub
parent 3421f4dbbd
commit bda9379385
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 85 additions and 97 deletions

View file

@ -19,7 +19,6 @@ pub mod plugin;
pub mod process; pub mod process;
pub mod random; pub mod random;
pub mod repl; pub mod repl;
pub mod resources;
pub mod runtime; pub mod runtime;
pub mod runtime_compiler; pub mod runtime_compiler;
pub mod signal; pub mod signal;

View file

@ -1,40 +0,0 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
use deno_core::error::bad_resource_id;
use deno_core::error::AnyError;
use deno_core::OpState;
use deno_core::ZeroCopyBuf;
use serde::Deserialize;
use serde_json::Value;
pub fn init(rt: &mut deno_core::JsRuntime) {
super::reg_json_sync(rt, "op_resources", op_resources);
super::reg_json_sync(rt, "op_close", op_close);
}
fn op_resources(
state: &mut OpState,
_args: Value,
_zero_copy: &mut [ZeroCopyBuf],
) -> Result<Value, AnyError> {
let serialized_resources = state.resource_table.entries();
Ok(json!(serialized_resources))
}
/// op_close removes a resource from the resource table.
fn op_close(
state: &mut OpState,
args: Value,
_zero_copy: &mut [ZeroCopyBuf],
) -> Result<Value, AnyError> {
#[derive(Deserialize)]
struct CloseArgs {
rid: i32,
}
let args: CloseArgs = serde_json::from_value(args)?;
state
.resource_table
.close(args.rid as u32)
.ok_or_else(bad_resource_id)?;
Ok(json!({}))
}

View file

@ -1,23 +0,0 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => {
const core = window.Deno.core;
function resources() {
const res = core.jsonOpSync("op_resources");
const resources = {};
for (const resourceTuple of res) {
resources[resourceTuple[0]] = resourceTuple[1];
}
return resources;
}
function close(rid) {
core.jsonOpSync("op_close", { rid });
}
window.__bootstrap.resources = {
close,
resources,
};
})(this);

View file

@ -5,7 +5,6 @@
const { notImplemented } = window.__bootstrap.util; const { notImplemented } = window.__bootstrap.util;
const { getHeaderValueParams, isTypedArray } = window.__bootstrap.webUtil; const { getHeaderValueParams, isTypedArray } = window.__bootstrap.webUtil;
const { Blob, bytesSymbol: blobBytesSymbol } = window.__bootstrap.blob; const { Blob, bytesSymbol: blobBytesSymbol } = window.__bootstrap.blob;
const { close } = window.__bootstrap.resources;
const Body = window.__bootstrap.body; const Body = window.__bootstrap.body;
const { ReadableStream } = window.__bootstrap.streams; const { ReadableStream } = window.__bootstrap.streams;
const { MultipartBuilder } = window.__bootstrap.multipart; const { MultipartBuilder } = window.__bootstrap.multipart;
@ -24,7 +23,7 @@
this.rid = rid; this.rid = rid;
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
} }
@ -290,7 +289,7 @@
) { ) {
// We won't use body of received response, so close it now // We won't use body of received response, so close it now
// otherwise it will be kept in resource table. // otherwise it will be kept in resource table.
close(fetchResponse.bodyRid); core.close(fetchResponse.bodyRid);
responseBody = null; responseBody = null;
} else { } else {
responseBody = new ReadableStream({ responseBody = new ReadableStream({
@ -300,7 +299,7 @@
const result = await core.jsonOpAsync("op_fetch_read", { rid }); const result = await core.jsonOpAsync("op_fetch_read", { rid });
if (!result || !result.chunk) { if (!result || !result.chunk) {
controller.close(); controller.close();
close(rid); core.close(rid);
} else { } else {
// TODO(ry) This is terribly inefficient. Make this zero-copy. // TODO(ry) This is terribly inefficient. Make this zero-copy.
const chunk = new Uint8Array(result.chunk); const chunk = new Uint8Array(result.chunk);
@ -309,12 +308,12 @@
} catch (e) { } catch (e) {
controller.error(e); controller.error(e);
controller.close(); controller.close();
close(rid); core.close(rid);
} }
}, },
cancel() { cancel() {
// When reader.cancel() is called // When reader.cancel() is called
close(rid); core.close(rid);
}, },
}); });
} }

View file

@ -2,7 +2,6 @@
((window) => { ((window) => {
const core = window.Deno.core; const core = window.Deno.core;
const { close } = window.__bootstrap.resources;
const { requiredArguments } = window.__bootstrap.webUtil; const { requiredArguments } = window.__bootstrap.webUtil;
const CONNECTING = 0; const CONNECTING = 0;
const OPEN = 1; const OPEN = 1;
@ -71,7 +70,7 @@
event.target = this; event.target = this;
this.onclose?.(event); this.onclose?.(event);
this.dispatchEvent(event); this.dispatchEvent(event);
close(this.#rid); core.close(this.#rid);
}); });
const event = new Event("error"); const event = new Event("error");
@ -242,7 +241,7 @@
event.target = this; event.target = this;
this.onclose?.(event); this.onclose?.(event);
this.dispatchEvent(event); this.dispatchEvent(event);
close(this.#rid); core.close(this.#rid);
}); });
} }
} }

View file

@ -2,7 +2,6 @@
((window) => { ((window) => {
const core = window.Deno.core; const core = window.Deno.core;
const { close } = window.__bootstrap.resources;
const { read, readSync, write, writeSync } = window.__bootstrap.io; const { read, readSync, write, writeSync } = window.__bootstrap.io;
const { pathFromURL } = window.__bootstrap.util; const { pathFromURL } = window.__bootstrap.util;
@ -104,7 +103,7 @@
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
} }
@ -122,7 +121,7 @@
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
} }
@ -140,7 +139,7 @@
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
} }
@ -158,7 +157,7 @@
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
} }

View file

@ -4,7 +4,6 @@
const core = window.Deno.core; const core = window.Deno.core;
const { errors } = window.__bootstrap.errors; const { errors } = window.__bootstrap.errors;
const { read, write } = window.__bootstrap.io; const { read, write } = window.__bootstrap.io;
const { close } = window.__bootstrap.resources;
const ShutdownMode = { const ShutdownMode = {
// See http://man7.org/linux/man-pages/man2/shutdown.2.html // See http://man7.org/linux/man-pages/man2/shutdown.2.html
@ -88,7 +87,7 @@
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
// TODO(lucacasonato): make this unavailable in stable // TODO(lucacasonato): make this unavailable in stable
@ -138,7 +137,7 @@
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
[Symbol.asyncIterator]() { [Symbol.asyncIterator]() {
@ -187,7 +186,7 @@
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
async *[Symbol.asyncIterator]() { async *[Symbol.asyncIterator]() {

View file

@ -3,7 +3,6 @@
((window) => { ((window) => {
const core = window.Deno.core; const core = window.Deno.core;
const { errors } = window.__bootstrap.errors; const { errors } = window.__bootstrap.errors;
const { close } = window.__bootstrap.resources;
class FsWatcher { class FsWatcher {
#rid = 0; #rid = 0;
@ -31,7 +30,7 @@
} }
return(value) { return(value) {
close(this.rid); core.close(this.rid);
return Promise.resolve({ value, done: true }); return Promise.resolve({ value, done: true });
} }

View file

@ -3,7 +3,6 @@
((window) => { ((window) => {
const core = window.Deno.core; const core = window.Deno.core;
const { File } = window.__bootstrap.files; const { File } = window.__bootstrap.files;
const { close } = window.__bootstrap.resources;
const { readAll } = window.__bootstrap.buffer; const { readAll } = window.__bootstrap.buffer;
const { assert, pathFromURL } = window.__bootstrap.util; const { assert, pathFromURL } = window.__bootstrap.util;
@ -78,7 +77,7 @@
} }
close() { close() {
close(this.rid); core.close(this.rid);
} }
kill(signo) { kill(signo) {

View file

@ -4,7 +4,6 @@
const core = window.Deno.core; const core = window.Deno.core;
const exit = window.__bootstrap.os.exit; const exit = window.__bootstrap.os.exit;
const version = window.__bootstrap.version.version; const version = window.__bootstrap.version.version;
const close = window.__bootstrap.resources.close;
const inspectArgs = window.__bootstrap.console.inspectArgs; const inspectArgs = window.__bootstrap.console.inspectArgs;
function opStartRepl(historyFile) { function opStartRepl(historyFile) {
@ -90,7 +89,7 @@
const quitRepl = (exitCode) => { const quitRepl = (exitCode) => {
// Special handling in case user calls deno.close(3). // Special handling in case user calls deno.close(3).
try { try {
close(rid); // close signals Drop on REPL and saves history. core.close(rid); // close signals Drop on REPL and saves history.
} catch {} } catch {}
exit(exitCode); exit(exitCode);
}; };

View file

@ -1,13 +1,13 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
((window) => { ((window) => {
const core = window.Deno.core;
const { gray, green, italic, red, yellow } = window.__bootstrap.colors; const { gray, green, italic, red, yellow } = window.__bootstrap.colors;
const { exit } = window.__bootstrap.os; const { exit } = window.__bootstrap.os;
const { Console, inspectArgs } = window.__bootstrap.console; const { Console, inspectArgs } = window.__bootstrap.console;
const { stdout } = window.__bootstrap.files; const { stdout } = window.__bootstrap.files;
const { exposeForTest } = window.__bootstrap.internals; const { exposeForTest } = window.__bootstrap.internals;
const { metrics } = window.__bootstrap.metrics; const { metrics } = window.__bootstrap.metrics;
const { resources } = window.__bootstrap.resources;
const { assert } = window.__bootstrap.util; const { assert } = window.__bootstrap.util;
const disabledConsole = new Console(() => {}); const disabledConsole = new Console(() => {});
@ -64,9 +64,9 @@ finishing test case.`,
fn, fn,
) { ) {
return async function resourceSanitizer() { return async function resourceSanitizer() {
const pre = resources(); const pre = core.resources();
await fn(); await fn();
const post = resources(); const post = core.resources();
const preStr = JSON.stringify(pre, null, 2); const preStr = JSON.stringify(pre, null, 2);
const postStr = JSON.stringify(post, null, 2); const postStr = JSON.stringify(post, null, 2);

View file

@ -53,8 +53,6 @@ __bootstrap.denoNs = {
env: __bootstrap.os.env, env: __bootstrap.os.env,
exit: __bootstrap.os.exit, exit: __bootstrap.os.exit,
execPath: __bootstrap.os.execPath, execPath: __bootstrap.os.execPath,
resources: __bootstrap.resources.resources,
close: __bootstrap.resources.close,
Buffer: __bootstrap.buffer.Buffer, Buffer: __bootstrap.buffer.Buffer,
readAll: __bootstrap.buffer.readAll, readAll: __bootstrap.buffer.readAll,
readAllSync: __bootstrap.buffer.readAllSync, readAllSync: __bootstrap.buffer.readAllSync,

View file

@ -308,6 +308,8 @@ delete Object.prototype.__proto__;
core, core,
internal: internalSymbol, internal: internalSymbol,
[internalSymbol]: internalObject, [internalSymbol]: internalObject,
resources: core.resources,
close: core.close,
...denoNs, ...denoNs,
}; };
Object.defineProperties(finalDenoNs, { Object.defineProperties(finalDenoNs, {
@ -361,6 +363,8 @@ delete Object.prototype.__proto__;
core, core,
internal: internalSymbol, internal: internalSymbol,
[internalSymbol]: internalObject, [internalSymbol]: internalObject,
resources: core.resources,
close: core.close,
...denoNs, ...denoNs,
}; };
if (useDenoNamespace) { if (useDenoNamespace) {

View file

@ -4,7 +4,7 @@ import { unitTest, assertEquals, assert, assertThrows } from "./test_util.ts";
unitTest(function resourcesCloseBadArgs(): void { unitTest(function resourcesCloseBadArgs(): void {
assertThrows(() => { assertThrows(() => {
Deno.close((null as unknown) as number); Deno.close((null as unknown) as number);
}, Deno.errors.InvalidData); }, TypeError);
}); });
unitTest(function resourcesStdio(): void { unitTest(function resourcesStdio(): void {

View file

@ -117,7 +117,16 @@ impl WebWorker {
ops::worker_host::init(&mut web_worker.worker); ops::worker_host::init(&mut web_worker.worker);
ops::idna::init(&mut web_worker.worker); ops::idna::init(&mut web_worker.worker);
ops::io::init(&mut web_worker.worker); ops::io::init(&mut web_worker.worker);
ops::resources::init(&mut web_worker.worker); ops::reg_json_sync(
&mut web_worker.worker,
"op_close",
deno_core::op_close,
);
ops::reg_json_sync(
&mut web_worker.worker,
"op_resources",
deno_core::op_resources,
);
ops::errors::init(&mut web_worker.worker); ops::errors::init(&mut web_worker.worker);
ops::timers::init(&mut web_worker.worker); ops::timers::init(&mut web_worker.worker);
ops::fetch::init(&mut web_worker.worker); ops::fetch::init(&mut web_worker.worker);

View file

@ -287,7 +287,8 @@ impl MainWorker {
ops::process::init(&mut worker); ops::process::init(&mut worker);
ops::random::init(&mut worker); ops::random::init(&mut worker);
ops::repl::init(&mut worker); ops::repl::init(&mut worker);
ops::resources::init(&mut worker); ops::reg_json_sync(&mut worker, "op_close", deno_core::op_close);
ops::reg_json_sync(&mut worker, "op_resources", deno_core::op_resources);
ops::signal::init(&mut worker); ops::signal::init(&mut worker);
ops::timers::init(&mut worker); ops::timers::init(&mut worker);
ops::tty::init(&mut worker); ops::tty::init(&mut worker);

View file

@ -256,6 +256,14 @@ SharedQueue Binary Layout
promise.resolve(res); promise.resolve(res);
} }
function resources() {
return jsonOpSync("op_resources");
}
function close(rid) {
jsonOpSync("op_close", { rid });
}
Object.assign(window.Deno.core, { Object.assign(window.Deno.core, {
jsonOpAsync, jsonOpAsync,
jsonOpSync, jsonOpSync,
@ -263,6 +271,8 @@ SharedQueue Binary Layout
dispatch: send, dispatch: send,
dispatchByName: dispatch, dispatchByName: dispatch,
ops, ops,
close,
resources,
registerErrorClass, registerErrorClass,
getErrorClass, getErrorClass,
// sharedQueue is private but exposed for testing. // sharedQueue is private but exposed for testing.

View file

@ -37,6 +37,8 @@ pub use crate::modules::RecursiveModuleLoad;
pub use crate::normalize_path::normalize_path; pub use crate::normalize_path::normalize_path;
pub use crate::ops::json_op_async; pub use crate::ops::json_op_async;
pub use crate::ops::json_op_sync; pub use crate::ops::json_op_sync;
pub use crate::ops::op_close;
pub use crate::ops::op_resources;
pub use crate::ops::Op; pub use crate::ops::Op;
pub use crate::ops::OpAsyncFuture; pub use crate::ops::OpAsyncFuture;
pub use crate::ops::OpFn; pub use crate::ops::OpFn;

View file

@ -1,5 +1,6 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
use crate::error::bad_resource_id;
use crate::error::type_error; use crate::error::type_error;
use crate::error::AnyError; use crate::error::AnyError;
use crate::gotham_state::GothamState; use crate::gotham_state::GothamState;
@ -7,6 +8,7 @@ use crate::BufVec;
use crate::ZeroCopyBuf; use crate::ZeroCopyBuf;
use futures::Future; use futures::Future;
use indexmap::IndexMap; use indexmap::IndexMap;
use serde_json::json;
use serde_json::Value; use serde_json::Value;
use std::cell::RefCell; use std::cell::RefCell;
use std::collections::HashMap; use std::collections::HashMap;
@ -217,3 +219,36 @@ fn json_serialize_op_result(
}; };
serde_json::to_vec(&value).unwrap().into_boxed_slice() serde_json::to_vec(&value).unwrap().into_boxed_slice()
} }
/// Return map of resources with id as key
/// and string representaion as value.
///
/// This op must be wrapped in `json_op_sync`.
pub fn op_resources(
state: &mut OpState,
_args: Value,
_zero_copy: &mut [ZeroCopyBuf],
) -> Result<Value, AnyError> {
let serialized_resources = state.resource_table.entries();
Ok(json!(serialized_resources))
}
/// Remove a resource from the resource table.
///
/// This op must be wrapped in `json_op_sync`.
pub fn op_close(
state: &mut OpState,
args: Value,
_zero_copy: &mut [ZeroCopyBuf],
) -> Result<Value, AnyError> {
let rid = args
.get("rid")
.and_then(Value::as_u64)
.ok_or_else(|| type_error("missing or invalid `rid`"))?;
state
.resource_table
.close(rid as u32)
.ok_or_else(bad_resource_id)?;
Ok(json!({}))
}

View file

@ -52,7 +52,7 @@ impl ResourceTable {
rid rid
} }
pub fn entries(&self) -> Vec<(ResourceId, String)> { pub fn entries(&self) -> HashMap<ResourceId, String> {
self self
.map .map
.iter() .iter()