API
Library and JSON-RPC Client
The library @dicy/core and the JSON-RPC client @dicy/client share a common
API with the exception of initialization methods. Both packages export various
types defined in Common Types and a class DiCy that implements an
interface which creates and caches builders. That interface is defined below and
extends EventEmitter.
interface BuilderCacheInterface extends EventEmitter {
destroy(): Promise<void>;
get(file: Uri): Promise<BuilderInterface>;
clear(file: Uri): Promise<void>;
clearAll(): Promise<void>;
getTargetPaths(file: Uri): Promise<string[]>;
kill(file: Uri, message?: string): Promise<void>;
killAll(message?: string): Promise<void>;
run(file: Uri, commands: Command[]): Promise<boolean>;
setInstanceOptions(file: Uri, options: object, merge?: boolean): Promise<void>;
setUserOptions(file: Uri, options: object, merge?: boolean): Promise<void>;
setDirectoryOptions(file: Uri, options: object, merge?: boolean): Promise<void>;
setProjectOptions(file: Uri, options: object, merge?: boolean): Promise<void>;
}
BuilderCacheInterface provides two methods of building documents using DiCy.
The first is to let DiCy find and call the appropriate method on the specific
builder. For instance, to build foo.tex with SyncTeX enabled one would do the
following.
const dicy = new DiCy()
await dicy.setInstanceOptions('file:///bar/foo.tex', { synctex: true })
await dicy.run('file:///bar/foo.tex', ['load', 'build', 'save'])
In order to capture log messages produced during the build or during the log
command one needs to listen to the log event where messages is an array
of Message.
dicy.on('log', (file, messages) => {
for (const message of messages) {
const nameText = event.name ? `[${event.name}] ` : ''
const typeText = event.category ? `${event.category}: ` : ''
const text = `${event.severity} ${nameText}${typeText}${event.text.replace('\n', ' ')}`
console.log(text)
}
})
await dicy.run('file:///bar/foo.tex', ['load', 'build', 'log', 'save'])
To retrieve targets produced by a build getTargetPaths can be called.
Please note that synctex.gz files are also returned in addition to PDF,
DVI or PostScript files.
A build can be interupted by calling kill or all builds can be stopped by
calling killAll. The DiCy class caches builders based on main file path.
This cache can be cleared on file specific basis with clear or the complete
cache can be cleared with clearAll. Once building is done the instance should
be released with destroy.
A specific builder can also be retrieved with the get method. The returned
builder will implement the following interface.
interface BuilderInterface extends EventEmitter {
getTargetPaths(): Promise<string[]>;
kill(message?: string): Promise<void>;
run(commands: Command[]): Promise<boolean>;
setInstanceOptions(options: object, merge?: boolean): Promise<void>;
setUserOptions(options: object, merge?: boolean): Promise<void>;
setDirectoryOptions(options: object, merge?: boolean): Promise<void>;
setProjectOptions(options: object, merge?: boolean): Promise<void>;
}
This instance can be used in the same way as described above except that the root file path does not need to be passed to each method. For example, to build and log one would do the following.
const builder = dicy.get('file:///bar/foo.tex')
builder.on('log', (messages) => {
for (const message of messages) {
const nameText = event.name ? `[${event.name}] ` : ''
const typeText = event.category ? `${event.category}: ` : ''
const text = `${event.severity} ${nameText}${typeText}${event.text.replace('\n', ' ')}`
console.log(text)
}
})
await builder.setInstanceOptions({ synctex: true })
await builder.run(['load', 'build', 'log', 'save'])
The received log events will only be from the specific builder. This means that multiple builds can be in progress at the same time an will not interfere with each other.
Common Types
Both @dicy/core and @dicy/client export various types used by DiCy builders.
The most common are listed below and are primarily used in the
BuilderCacheInterface and BuilderInterface for commands and log messages.
type Command = 'build' | 'clean' | 'graph' | 'load' | 'log' | 'save' | 'scrub';
interface LineRange {
start: number;
end: number;
}
interface Reference {
file: string;
range?: LineRange;
}
type Severity = 'trace' | 'info' | 'warning' | 'error';
export interface Message {
severity: Severity;
text: string;
name?: string;
category?: string;
source?: Reference;
log?: Reference;
}
JSON-RPC Server
@dicy/server implements a JSON-RPC interface to DiCy that can be accessed
using @dicy/client or directly via a JSON-RPC client. The interface provided
by @dicy/server mirrors BuilderCacheInterface without the get method. The
server may be started using the shell command dicy-server with an option that
specifies the transport mechanism.
--node-ipc— Use Node-IPC--pipe— Use a named pipe. For example:--pipe=foo--socket— Use a socket. For example:--socket=5000--stdio— User standard input/ouput
RPC Requests and Notificatons
| Name | Type | Parameters | Return |
|---|---|---|---|
clear |
Server Request | file: Uri |
Promise<void> |
clearAll |
Server Request | None | Promise<void> |
exit |
Server Notification | None | None |
kill |
Server Request | file: Uri, message?: string |
Promise<void> |
killAll |
Server Request | message?: string |
Promise<void> |
log |
Client Notification | file: Uri, messages: Message[] |
None |
run |
Server Request | file: Uri, commands: Command[] |
Promise<boolean> |
setDirectoryOptionsRequest |
Server Request | file: Uri, options: object, merge?: boolean |
Promise<boolean> |
setInstanceOptionsRequest |
Server Request | file: Uri, options: object, merge?: boolean |
Promise<boolean> |
setProjectOptionsRequest |
Server Request | file: Uri, options: object, merge?: boolean |
Promise<boolean> |
setUserOptionsRequest |
Server Request | file: Uri, options: object, merge?: boolean |
Promise<boolean> |