linting, editorconfig

This commit is contained in:
Rik Berkelder 2021-01-23 20:48:42 +01:00
parent ee66b16be2
commit 2f4ab521b5
9 changed files with 2267 additions and 146 deletions

13
.editorconfig Normal file
View file

@ -0,0 +1,13 @@
# Editor configuration, see http://editorconfig.org
root = true
[*.{js,ts,json}]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
max_line_length = off
trim_trailing_whitespace = false

33
.eslintrc.js Normal file
View file

@ -0,0 +1,33 @@
module.exports = {
parser: "@typescript-eslint/parser", // Specifies the ESLint parser
parserOptions: {
ecmaVersion: 2020, // Allows for the parsing of modern ECMAScript features
sourceType: "module" // Allows for the use of imports
},
extends: [
"plugin:@typescript-eslint/recommended",
"prettier/@typescript-eslint",
"plugin:prettier/recommended"
],
rules: {
"@typescript-eslint/no-shadow": ["error", { "allow": ["err"] }],
"no-console": "off",
"no-use-before-define": "off",
"no-constant-condition": "off",
"import/no-unresolved": "off",
"import/extensions": "off",
"class-methods-use-this": "off",
"@typescript-eslint/array-type": [2, { "default": "array" }],
"@typescript-eslint/consistent-type-definitions": [2, "interface"],
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-use-before-define": "warn",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "warn",
"no-underscore-dangle": "off",
"prefer-destructuring": "off"
}
};

55
.eslintrc.json Normal file
View file

@ -0,0 +1,55 @@
{
"env": {
"es6": true
},
"extends": ["airbnb-base", "prettier"],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parser": "@typescript-eslint/parser",
"parserOptions": {
"ecmaVersion": 2018,
"sourceType": "module",
"allowImportExportEverywhere": true
},
"plugins": [
"prettier",
"@typescript-eslint"
],
"rules": {
"prettier/prettier": "error",
"class-methods-use-this": [
"error",
{"exceptMethods": ["requestDidStart", "willSendRequest", "willSendResponse", "errorFromResponse"]}
],
"camelcase": 0,
"no-undef": 0,
"no-new": 0,
"no-shadow": 0,
"@typescript-eslint/no-shadow": ["error", { "allow": ["err"] }],
"no-console": "off",
"no-use-before-define": "warn",
"no-constant-condition": "off",
"import/no-unresolved": "off",
"import/prefer-default-export": "warn",
"import/extensions": "off",
"class-methods-use-this": "off",
"@typescript-eslint/array-type": [2, { "default": "array" }],
"@typescript-eslint/consistent-type-definitions": [2, "interface"],
"@typescript-eslint/no-explicit-any": "error",
"@typescript-eslint/no-for-in-array": "error",
"@typescript-eslint/no-inferrable-types": "error",
"@typescript-eslint/no-use-before-define": "warn",
"no-unused-vars": "off",
"@typescript-eslint/no-unused-vars": "warn",
"no-underscore-dangle": "off",
"prefer-destructuring": "off"
},
"settings": {
"import/extensions": [".js", ".ts"],
"import/parsers": {
"@typescript-eslint/parser": [".ts", ".tsx"]
}
}
}

7
.prettierrc.js Normal file
View file

@ -0,0 +1,7 @@
module.exports = {
semi: true,
trailingComma: "all",
singleQuote: true,
printWidth: 120,
tabWidth: 2
};

1996
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,37 +1,55 @@
{ {
"name": "ts-osc", "name": "ts-osc",
"version": "0.1.2", "version": "0.1.2",
"description": "Fully TypeScript-native OSC Client based on osc-min", "description": "Fully TypeScript-native OSC Client based on osc-min",
"main": "./lib/index.js", "main": "./lib/index.js",
"types": "./lib/index.d.ts", "types": "./lib/index.d.ts",
"scripts": { "scripts": {
"test": "echo \"Error: no test specified\" && exit 1", "test": "echo \"Error: no test specified\" && exit 1",
"compile": "tsc", "compile": "tsc",
"watch": "tsc --watch", "watch": "tsc --watch",
"docs": "typedoc --out docs ./src/index.ts", "docs": "typedoc --out docs ./src/index.ts",
"clean": "rimraf lib", "clean": "rimraf lib",
"build": "run-s clean compile docs" "build": "run-s clean compile docs",
}, "lint": "eslint ./src --ext .js,.ts",
"repository": { "lint:fix": "npm run lint -- --fix"
"type": "git", },
"url": "https://gitlab.riksolo.com/riksolo/ts-osc/" "repository": {
}, "type": "git",
"keywords": [ "url": "https://gitlab.riksolo.com/riksolo/ts-osc/"
"osc", },
"open sound control", "keywords": [
"udp", "osc",
"sound control" "open sound control",
], "udp",
"author": "Rik Berkelder <mail@riksolo.com>", "sound control"
"license": "MIT", ],
"dependencies": { "author": "Rik Berkelder <mail@riksolo.com>",
"osc-min": "^1.1.2" "license": "MIT",
}, "dependencies": {
"devDependencies": { "osc-min": "^1.1.2"
"@types/node": "^14.14.22", },
"npm-run-all": "^4.1.5", "devDependencies": {
"rimraf": "^3.0.2", "@types/node": "^14.14.22",
"typedoc": "^0.20.16", "@typescript-eslint/eslint-plugin": "^4.14.0",
"typescript": "^4.1.3" "@typescript-eslint/parser": "^4.14.0",
"eslint": "^7.18.0",
"eslint-config-prettier": "^7.2.0",
"eslint-plugin-prettier": "^3.3.1",
"husky": "^4.3.8",
"lint-staged": "^10.5.3",
"npm-run-all": "^4.1.5",
"prettier": "^2.2.1",
"rimraf": "^3.0.2",
"typedoc": "^0.20.16",
"typescript": "^4.1.3"
},
"lint-staged": {
"src/**/*.{ts}": "eslint ./src --fix"
},
"husky": {
"hooks": {
"pre-commit": "lint-staged"
} }
}
} }

View file

@ -1,3 +1,2 @@
export * from './oscClient'; export * from './oscClient';
export {OSCType, OSCArgumentType} from 'osc-min' export { OSCType, OSCArgumentType } from 'osc-min';

View file

@ -1,41 +1,37 @@
import * as dgram from 'dgram'; import * as dgram from 'dgram';
import {OSCArgument, OSCType, toBuffer, fromBuffer, OSCArgumentType} from 'osc-min'; import { OSCArgument, OSCType, toBuffer, fromBuffer, OSCArgumentType } from 'osc-min';
import { EventEmitter } from 'events'; import { EventEmitter } from 'events';
export interface OSCClientOptions { export interface OSCClientOptions {
/** host to output OSC data to */ /** host to output OSC data to */
outHost: string; outHost: string;
/** port to output OSC data to */ /** port to output OSC data to */
outPort: number; outPort: number;
/** Local port for incoming OSC messages */ /** Local port for incoming OSC messages */
inPort?: number; inPort?: number;
} }
export interface ReceivedOSCMessage<T extends OSCType> { export interface ReceivedOSCMessage<T extends OSCType> {
address: string; address: string;
type: T; type: T;
value: OSCArgumentType<T> value: OSCArgumentType<T>;
} }
// declare types for events // declare types for events
export declare interface OSCClient { export declare interface OSCClient {
/** /**
Emitted whenever an OSC message is received on inPort Emitted whenever an OSC message is received on inPort
@event @event
*/ */
on(event: 'message', listener: (message: ReceivedOSCMessage<OSCType>) => void): this on(event: 'message', listener: (message: ReceivedOSCMessage<OSCType>) => void): this;
/**
/**
Emitted when OSC client is listening on inPort Emitted when OSC client is listening on inPort
@event @event
*/ */
on(event: 'listening', listener: ()=>void): this on(event: 'listening', listener: () => void): this;
} }
/** /**
* OSC Client base class, handles sending and receiving OSC messages * OSC Client base class, handles sending and receiving OSC messages
@ -47,54 +43,54 @@ export declare interface OSCClient {
}) })
``` ```
*/ */
export class OSCClient extends EventEmitter{ export class OSCClient extends EventEmitter {
private socket: dgram.Socket; private socket: dgram.Socket;
private options: OSCClientOptions; private options: OSCClientOptions;
constructor(options: OSCClientOptions){ constructor(options: OSCClientOptions) {
super(); super();
this.socket = dgram.createSocket({type: "udp4", reuseAddr: true}); this.socket = dgram.createSocket({ type: 'udp4', reuseAddr: true });
this.options = options; this.options = options;
if(options.inPort){ if (options.inPort) {
this.socket.bind(options.inPort); this.socket.bind(options.inPort);
}
this.socket.on('listening', ()=>{
this.emit('listening');
})
this.socket.on('message', (msg)=>{
const decoded = fromBuffer(msg)
if(decoded.oscType === "message"){
decoded.args.forEach((arg)=>{
this.emit('message', {
address: decoded.address,
type: arg.type,
value: arg.value
})
})
}
})
} }
private sendPacket(packet: Buffer): void{ this.socket.on('listening', () => {
this.socket.send(packet, 0, packet.length, this.options.outPort, this.options.outHost) this.emit('listening');
} });
/** this.socket.on('message', (msg) => {
const decoded = fromBuffer(msg);
if (decoded.oscType === 'message') {
decoded.args.forEach((arg) => {
this.emit('message', {
address: decoded.address,
type: arg.type,
value: arg.value,
});
});
}
});
}
private sendPacket(packet: Buffer): void {
this.socket.send(packet, 0, packet.length, this.options.outPort, this.options.outHost);
}
/**
* Send an OSC message * Send an OSC message
``` ```
osc.send("/osc/url", OSCType.String, "hello") osc.send("/osc/url", OSCType.String, "hello")
``` ```
*/ */
public send<T extends OSCType>(address: string, type: T, value: OSCArgumentType<T>){ public send<T extends OSCType>(address: string, type: T, value: OSCArgumentType<T>): void {
const arg: OSCArgument<T> = { const arg: OSCArgument<T> = {
type, type,
value value,
} };
const encoded = toBuffer(address, [arg]); const encoded = toBuffer(address, [arg]);
this.sendPacket(encoded); this.sendPacket(encoded);
} }
} }

106
src/types/osc-min.d.ts vendored
View file

@ -1,59 +1,65 @@
declare module "osc-min" { declare module 'osc-min' {
export const enum OSCType { export const enum OSCType {
String = "string", String = 'string',
Float = "float", Float = 'float',
Integer = "integer", Integer = 'integer',
Blob = "blob", Blob = 'blob',
True = "true", True = 'true',
False = "false", False = 'false',
Null = "null", Null = 'null',
Bang = "bang", Bang = 'bang',
Timetag = "timetag", Timetag = 'timetag',
Array = "array" Array = 'array',
} }
export type OSCTimeTag = [number, number]; export type OSCTimeTag = [number, number];
export type OutgoingOSCArgsTypes = (OSCArgument<OSCType> | Buffer | boolean | string | number)[];
export interface OSCMessage { export interface OSCMessage {
oscType?: "message", oscType?: 'message';
address: string, address: string;
args: Array<OSCArgument<OSCType>> args: OSCArgument<OSCType>[];
} }
export interface OutgoingOSCMessage extends OSCMessage{ export interface OutgoingOSCMessage extends OSCMessage {
args: OutgoingOSCArgsTypes; args: OutgoingOSCArgsTypes;
} }
export type OutgoingOSCArgsTypes = Array<OSCArgument<OSCType> | Buffer | boolean | string | number> export interface OSCBundle {
oscType: 'bundle';
timetag: null | number | Date | OSCTimeTag;
elements: (OSCMessage | OSCBundle)[];
}
export interface OSCBundle { export type OSCArgumentType<T extends OSCType> = T extends OSCType.String
oscType: "bundle", ? string
timetag: null | number | Date | OSCTimeTag, : T extends OSCType.Float | OSCType.Integer | OSCType.Timetag
elements: Array<OSCMessage | OSCBundle> ? number
} : T extends OSCType.True
? true
: T extends OSCType.False
? false
: T extends OSCType.Blob
? Buffer
: T extends OSCType.Array
? OSCArgument<OSCType>[]
: null;
export type OSCArgumentType<T extends OSCType> = T extends OSCType.String ? string export interface OSCArgument<T extends OSCType> {
: T extends OSCType.Float | OSCType.Integer | OSCType.Timetag ? number type: T;
: T extends OSCType.True ? true value: OSCArgumentType<T>;
: T extends OSCType.False ? false }
: T extends OSCType.Blob ? Buffer
: T extends OSCType.Array ? Array<OSCArgument<OSCType>>
: null;
export interface OSCArgument<T extends OSCType>{ type OSCPacket = OSCMessage | OSCBundle;
type: T;
value: OSCArgumentType<T>;
}
type OSCPacket = OSCMessage | OSCBundle; export function fromBuffer(buffer: Buffer, strict?: boolean): OSCPacket;
export function toBuffer(object: OutgoingOSCMessage, strict?: boolean): Buffer;
export function fromBuffer(buffer: Buffer, strict?: boolean): OSCPacket; export function toBuffer(address: string, args: OSCArgument<OSCType>[], strict?: boolean): Buffer;
export function toBuffer(object: OutgoingOSCMessage, strict?: boolean): Buffer; export function applyMessageTransform(msg: Buffer, transform: (message: OSCMessage) => OSCMessage);
export function toBuffer(address: string, args: Array<OSCArgument<OSCType>>, strict?: boolean): Buffer; export function applyAddressTransform(msg: Buffer, transform: (address: string) => string);
export function applyMessageTransform(msg: Buffer, transform: (message: OSCMessage) => OSCMessage); export function timetagToDate(ntpTimeTag: OSCTimeTag): Date;
export function applyAddressTransform(msg: Buffer, transform: (address: string) => string); export function dateToTimetag(date: Date): OSCTimeTag;
export function timetagToDate(ntpTimeTag: OSCTimeTag): Date; export function timetagToTimestamp(timeTag: OSCTimeTag): number;
export function dateToTimetag(date: Date): OSCTimeTag; export function timestampToTimetag(timestamp: number);
export function timetagToTimestamp(timeTag: OSCTimeTag): number; OSCTimeTag;
export function timestampToTimetag(timestamp: number); OSCTimeTag;
} }