| # shell: Interact with Fuchsia by typing things. | |
| This directory is for development of a Fuchsia shell. | |
| A less generic name, and more content, is pending. | |
| The current shell is based on JavaScript. | |
| Currently, invoking FIDL calls (and wrappers around FIDL calls) requires | |
| the use of `Promise`s. You can invoke FIDL calls on protocols available from | |
| `/svc` easily by saying something like: | |
| ``` | |
| svc.fuchsia_kernel_DebugBroker.SendDebugCommand("threadstats") | |
| ``` | |
| This returns a `Promise`. Followup actions can be taken in the `Promise`'s then | |
| clause. You can also use `async`/`await`, although this is not supported for | |
| direct invocation from the command line. | |
| Arbitrary FIDL requests (those that do not depend on `/svc`) can be sent | |
| using the `fidl.Request` and `fidl.ProtocolClient` API. For example, if you have a | |
| channel to a directory called dirChannel, and you want to open a path within that | |
| directory, you can say: | |
| ``` | |
| let dirClient = new fidl.ProtocolClient(dirChannel, fidling.fuchsia_io.Directory); | |
| const request = new fidl.Request(fidling.fuchsia_io.Node); | |
| pathClient = request.getProtocolClient(); | |
| let openedPromise = pathClient.OnOpen((args) => { | |
| return args; | |
| }); | |
| dirClient.Open( | |
| fidling.fuchsia_io.OPEN_RIGHT_READABLE | fidling.fuchsia_io.OPEN_FLAG_DESCRIBE, 0, | |
| path, request.getChannelForServer()); | |
| let args = await openedPromise; | |
| // Manipulate args.s or args.info. | |
| fidl.ProtocolClient.close(request.getProtocolClient()); | |
| ``` | |
| Note that available FIDL libraries are available off of a global object called | |
| `fidling`. If a FIDL library you want is not available, please contact the OWNERS | |
| of this directory. | |
| If you want to try the shell, add the package "//src/developer/shell:josh" to | |
| the packages available, shell into the device, and type "josh". | |