blob: 4ee2d84a3a3f9720e9ecb25fc4ac9f32a2f74aa8 [file] [log] [blame]
// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Utilities for interacting with Zircon objects.
*/
import * as zx_internal from 'zx_internal';
(function(global) {
/**
* Wraps and takes ownership of a handle to an object.
*/
class Object {
/**
* Constructor for zx.Object.
* @param {handle} handle (as returned by, e.g., zx.channelCreate()). Will be
* deleted by a call to close()
*/
constructor(handle) {
this._handle = handle;
}
/**
* The zx_object_wait_async() call.
* @param {int32} flags The set of signals
* @param {callback} callback The code to invoke when you are done waiting.
*/
waitAsync(flags, callback) {
zx_internal.objectWaitAsync(this._handle, flags, callback);
}
/**
* Closes the underlying handle.
*/
close() {
zx_internal.handleClose(this._handle);
}
/**
* Duplicates the underlying handle: do not call on zx.Object, only on a subclass.
*/
duplicate(rights) {
// Fix this if you can figure out how to get a new object of the type of this.
throw 'Cannot call duplicate on pure object';
}
/**
* The zx_object_get_child() call. Returns a zx.Object that is a child of this object
* with the specified koid.
* @param {Number} koid The koid of the child object.
* @param {Number} rights The rights on the child object.
*/
getChild(koid, rights) {
return zx_internal.getChild(this._handle, koid, rights);
}
/**
* Returns an object with fields corresponding to the result of
* zx_object_get_info(ZX_INFO_HANDLE_BASIC). See the zx_object_get_info documentation for details.
*/
getBasicInfo() {
return zx_internal.getObjectInfo(this._handle, zx_internal.ZX_INFO_HANDLE_BASIC);
}
/**
* Returns a given property of a kernel object. See the documentation for
* zx_object_get_property for details.
*
* The property ZX_PROP_NAME will be converted into a JS string.
*
* @param {Number} property An uint32 indicating which property to get/set.
*/
getProperty(property) {
return zx_internal.getObjectProperty(this._handle, property);
}
}
/**
* A Zircon object of type channel.
*/
class Channel extends Object {
constructor(handle) {
super(handle);
}
/**
* Calls zx_channel_create()
* @returns a two-element array, where element 0 is zx.Channel representing
* out0, and element 1 is zx.Channel representing out1.
*/
static create() {
const handles = zx_internal.channelCreate();
return [new Channel(handles[0]), new Channel(handles[1])];
}
/**
* Calls zx_channel_write.
* @param {ArrayBuffer} bytes An ArrayBuffer with bytes to send over the channel.
* @param {Handle} handles An Array of Handle objects.
*/
write(bytes, handles) {
let unpackedHandles = [];
for (let i = 0; i < handles.length; i++) {
unpackedHandles.push(handles[i]._handle);
}
zx_internal.channelWrite(this._handle, bytes, unpackedHandles)
}
/**
* Calls zx_channel_read. Returns an array with two elements, the first of
* which is the bytes, and the second of which is the handles.
* TODO(jeremymanson) We can do better than a two element array. Also, the
* first thing should be an ArrayBuffer, as we pass to write.
*/
read() {
return zx_internal.channelRead(this._handle);
}
duplicate(rights) {
return new zx.Channel(zx_internal.duplicate(this._handle, rights));
}
/**
* Returns a new zx.Channel object, where the handle is the numerical value passed in.
* To be removed when fidl_codec gives us Handles instead of numbers.
* @param {Number} value An int32 that represents a valid zx handle.
*/
static fromValueDeprecated(value) {
if (value == 0) {
throw 'Null handle to Channel';
}
return new Channel(zx_internal.handleFromInt(value));
}
}
/**
* A Zircon object of type Task.
*/
class Task extends Object {
constructor(handle) {
super(handle);
}
/**
* Kills the task, returns 0 on success
*/
kill(){
return zx_internal.kill(this._handle);
}
}
/**
* A Zircon object of type Job (a kind of task).
*/
class Job extends Task {
constructor(handle) {
super(handle);
}
/**
* Returns an object with fields corresponding to the result of
* zx_object_get_info(ZX_INFO_JOB_CHILDREN). See the zx_object_get_info documentation for details.
*/
getChildrenInfo() {
return zx_internal.getObjectInfo(this._handle, zx_internal.ZX_INFO_JOB_CHILDREN);
}
/**
* Returns an object with fields corresponding to the result of
* zx_object_get_info(ZX_INFO_JOB_PROCESSES). See the zx_object_get_info documentation for
* details.
*/
getProcessesInfo() {
return zx_internal.getObjectInfo(this._handle, zx_internal.ZX_INFO_JOB_PROCESSES)
}
/**
* Returns a new zx.Job object, where the handle is the numerical value passed in.
* To be removed when fidl_codec gives us Handles instead of numbers.
* @param {Number} value An int32 that represents a valid zx handle.
*/
static fromValueDeprecated(value) {
if (value == 0) {
throw 'Null handle to Job';
}
return new Job(zx_internal.handleFromInt(value));
}
/**
* Returns the default zx.Job (i.e., zx_job_default())
*/
static default() {
return zx_internal.jobDefault();
}
}
/**
* A Zircon object of type Process (a kind of task).
*/
class Process extends Task {
constructor(handle) {
super(handle);
}
/**
* Returns a zx.Process representing the current process.
*/
self() {
return new Process(zx_internal.processSelf());
}
}
const ZX_CHANNEL_READABLE = zx_internal.ZX_CHANNEL_READABLE;
const ZX_CHANNEL_PEER_CLOSED = zx_internal.ZX_CHANNEL_PEER_CLOSED;
const ZX_RIGHT_SAME_RIGHTS = zx_internal.ZX_RIGHT_SAME_RIGHTS;
const ZX_PROP_NAME = zx_internal.ZX_PROP_NAME;
global['zx'] = {
Object,
Channel,
Job,
Process,
ZX_CHANNEL_READABLE,
ZX_CHANNEL_PEER_CLOSED,
ZX_RIGHT_SAME_RIGHTS,
ZX_PROP_NAME,
}
})(globalThis);