json-midi-encoder-broker 4.0.116 → 4.0.117

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. package/build/es2019/interfaces/index.d.ts +2 -0
  2. package/build/es2019/interfaces/index.d.ts.map +1 -0
  3. package/build/es2019/interfaces/index.js +2 -0
  4. package/build/es2019/interfaces/index.js.map +1 -0
  5. package/build/es2019/interfaces/json-midi-encoder-broker-definition.d.ts +6 -0
  6. package/build/es2019/interfaces/json-midi-encoder-broker-definition.d.ts.map +1 -0
  7. package/build/es2019/interfaces/json-midi-encoder-broker-definition.js +2 -0
  8. package/build/es2019/interfaces/json-midi-encoder-broker-definition.js.map +1 -0
  9. package/build/es2019/module.d.ts +5 -4
  10. package/build/es2019/module.d.ts.map +1 -1
  11. package/build/es2019/module.js +13 -24
  12. package/build/es2019/module.js.map +1 -1
  13. package/build/es2019/types/index.d.ts +3 -0
  14. package/build/es2019/types/index.d.ts.map +1 -0
  15. package/build/es2019/types/index.js +3 -0
  16. package/build/es2019/types/index.js.map +1 -0
  17. package/build/es2019/types/json-midi-encoder-broker-loader.d.ts +4 -0
  18. package/build/es2019/types/json-midi-encoder-broker-loader.d.ts.map +1 -0
  19. package/build/es2019/types/json-midi-encoder-broker-loader.js +2 -0
  20. package/build/es2019/types/json-midi-encoder-broker-loader.js.map +1 -0
  21. package/build/es2019/types/json-midi-encoder-broker-wrapper.d.ts +4 -0
  22. package/build/es2019/types/json-midi-encoder-broker-wrapper.d.ts.map +1 -0
  23. package/build/es2019/types/json-midi-encoder-broker-wrapper.js +2 -0
  24. package/build/es2019/types/json-midi-encoder-broker-wrapper.js.map +1 -0
  25. package/build/es5/bundle.js +16 -33
  26. package/package.json +12 -12
  27. package/src/interfaces/index.ts +1 -0
  28. package/src/interfaces/json-midi-encoder-broker-definition.ts +6 -0
  29. package/src/module.ts +20 -34
  30. package/src/types/index.ts +2 -0
  31. package/src/types/json-midi-encoder-broker-loader.ts +4 -0
  32. package/src/types/json-midi-encoder-broker-wrapper.ts +4 -0
@@ -0,0 +1,2 @@
1
+ export * from './json-midi-encoder-broker-definition';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './json-midi-encoder-broker-definition';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,cAAc,uCAAuC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { IBrokerDefinition } from 'broker-factory';
2
+ import { IMidiFile } from 'midi-json-parser-worker';
3
+ export interface IJsonMidiEncoderBrokerDefinition extends IBrokerDefinition {
4
+ encode(midiFile: IMidiFile): Promise<ArrayBuffer>;
5
+ }
6
+ //# sourceMappingURL=json-midi-encoder-broker-definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-midi-encoder-broker-definition.d.ts","sourceRoot":"","sources":["../../../src/interfaces/json-midi-encoder-broker-definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,MAAM,WAAW,gCAAiC,SAAQ,iBAAiB;IACvE,MAAM,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACrD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json-midi-encoder-broker-definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-midi-encoder-broker-definition.js","sourceRoot":"","sources":["../../../src/interfaces/json-midi-encoder-broker-definition.ts"],"names":[],"mappings":""}
@@ -1,5 +1,6 @@
1
- import { IMidiFile } from 'midi-json-parser-worker';
2
- export declare const load: (url: string) => {
3
- encode: (midiFile: IMidiFile) => Promise<ArrayBuffer>;
4
- };
1
+ import { TJsonMidiEncoderBrokerLoader, TJsonMidiEncoderBrokerWrapper } from './types';
2
+ export * from './interfaces/index';
3
+ export * from './types/index';
4
+ export declare const wrap: TJsonMidiEncoderBrokerWrapper;
5
+ export declare const load: TJsonMidiEncoderBrokerLoader;
5
6
  //# sourceMappingURL=module.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEpD,eAAO,MAAM,IAAI,QAAS,MAAM;uBAKF,SAAS,KAAG,OAAO,CAAC,WAAW,CAAC;CA2B7D,CAAC"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,4BAA4B,EAAE,6BAA6B,EAAE,MAAM,SAAS,CAAC;AAMtF,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAE9B,eAAO,MAAM,IAAI,EAAE,6BAIjB,CAAC;AAEH,eAAO,MAAM,IAAI,EAAE,4BAIlB,CAAC"}
@@ -1,28 +1,17 @@
1
- import { addUniqueNumber } from 'fast-unique-numbers';
1
+ import { createBroker } from 'broker-factory';
2
+ /*
3
+ * @todo Explicitly referencing the barrel file seems to be necessary when enabling the
4
+ * isolatedModules compiler option.
5
+ */
6
+ export * from './interfaces/index';
7
+ export * from './types/index';
8
+ export const wrap = createBroker({
9
+ encode: ({ call }) => {
10
+ return (midiFile) => call('encode', { midiFile });
11
+ }
12
+ });
2
13
  export const load = (url) => {
3
14
  const worker = new Worker(url);
4
- const ongoingRecordingRequests = new Set();
5
- const encode = (midiFile) => {
6
- return new Promise((resolve, reject) => {
7
- const id = addUniqueNumber(ongoingRecordingRequests);
8
- const onMessage = ({ data }) => {
9
- if (data.id === id) {
10
- ongoingRecordingRequests.delete(id);
11
- worker.removeEventListener('message', onMessage);
12
- if (data.error === null) {
13
- resolve(data.result.arrayBuffer);
14
- }
15
- else {
16
- reject(new Error(data.error.message));
17
- }
18
- }
19
- };
20
- worker.addEventListener('message', onMessage);
21
- worker.postMessage({ id, method: 'encode', params: { midiFile } });
22
- });
23
- };
24
- return {
25
- encode
26
- };
15
+ return wrap(worker);
27
16
  };
28
17
  //# sourceMappingURL=module.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAItD,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;IAChC,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IAE/B,MAAM,wBAAwB,GAAgB,IAAI,GAAG,EAAE,CAAC;IAExD,MAAM,MAAM,GAAG,CAAC,QAAmB,EAAwB,EAAE;QACzD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACnC,MAAM,EAAE,GAAG,eAAe,CAAC,wBAAwB,CAAC,CAAC;YAErD,MAAM,SAAS,GAAG,CAAC,EAAE,IAAI,EAAgB,EAAE,EAAE;gBACzC,IAAI,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;oBACjB,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBAEpC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;oBAEjD,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;wBACtB,OAAO,CAAmB,IAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;oBACxD,CAAC;yBAAM,CAAC;wBACJ,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;oBAC1C,CAAC;gBACL,CAAC;YACL,CAAC,CAAC;YAEF,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAE9C,MAAM,CAAC,WAAW,CAAiB,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACvF,CAAC,CAAC,CAAC;IACP,CAAC,CAAC;IAEF,OAAO;QACH,MAAM;KACT,CAAC;AACN,CAAC,CAAC"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAK9C;;;GAGG;AACH,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAE9B,MAAM,CAAC,MAAM,IAAI,GAAkC,YAAY,CAAqE;IAChI,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;QACjB,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;CACJ,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,IAAI,GAAiC,CAAC,GAAW,EAAE,EAAE;IAC9D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;IAE/B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACxB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './json-midi-encoder-broker-loader';
2
+ export * from './json-midi-encoder-broker-wrapper';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './json-midi-encoder-broker-loader';
2
+ export * from './json-midi-encoder-broker-wrapper';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,mCAAmC,CAAC;AAClD,cAAc,oCAAoC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { IDefaultBrokerDefinition } from 'broker-factory';
2
+ import { IJsonMidiEncoderBrokerDefinition } from '../interfaces';
3
+ export type TJsonMidiEncoderBrokerLoader = (url: string) => IJsonMidiEncoderBrokerDefinition & IDefaultBrokerDefinition;
4
+ //# sourceMappingURL=json-midi-encoder-broker-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-midi-encoder-broker-loader.d.ts","sourceRoot":"","sources":["../../../src/types/json-midi-encoder-broker-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,MAAM,4BAA4B,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,gCAAgC,GAAG,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json-midi-encoder-broker-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-midi-encoder-broker-loader.js","sourceRoot":"","sources":["../../../src/types/json-midi-encoder-broker-loader.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { IDefaultBrokerDefinition } from 'broker-factory';
2
+ import { IJsonMidiEncoderBrokerDefinition } from '../interfaces';
3
+ export type TJsonMidiEncoderBrokerWrapper = (sender: MessagePort | Worker) => IJsonMidiEncoderBrokerDefinition & IDefaultBrokerDefinition;
4
+ //# sourceMappingURL=json-midi-encoder-broker-wrapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-midi-encoder-broker-wrapper.d.ts","sourceRoot":"","sources":["../../../src/types/json-midi-encoder-broker-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,gCAAgC,EAAE,MAAM,eAAe,CAAC;AAEjE,MAAM,MAAM,6BAA6B,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,KAAK,gCAAgC,GAAG,wBAAwB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=json-midi-encoder-broker-wrapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-midi-encoder-broker-wrapper.js","sourceRoot":"","sources":["../../../src/types/json-midi-encoder-broker-wrapper.ts"],"names":[],"mappings":""}
@@ -1,42 +1,25 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('fast-unique-numbers')) :
3
- typeof define === 'function' && define.amd ? define(['exports', 'fast-unique-numbers'], factory) :
4
- (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jsonMidiEncoderBroker = {}, global.fastUniqueNumbers));
5
- })(this, (function (exports, fastUniqueNumbers) { 'use strict';
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('broker-factory')) :
3
+ typeof define === 'function' && define.amd ? define(['exports', 'broker-factory'], factory) :
4
+ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jsonMidiEncoderBroker = {}, global.brokerFactory));
5
+ })(this, (function (exports, brokerFactory) { 'use strict';
6
6
 
7
+ var wrap = brokerFactory.createBroker({
8
+ encode: function encode(_ref) {
9
+ var call = _ref.call;
10
+ return function (midiFile) {
11
+ return call('encode', {
12
+ midiFile: midiFile
13
+ });
14
+ };
15
+ }
16
+ });
7
17
  var load = function load(url) {
8
18
  var worker = new Worker(url);
9
- var ongoingRecordingRequests = new Set();
10
- var encode = function encode(midiFile) {
11
- return new Promise(function (resolve, reject) {
12
- var id = fastUniqueNumbers.addUniqueNumber(ongoingRecordingRequests);
13
- var _onMessage = function onMessage(_ref) {
14
- var data = _ref.data;
15
- if (data.id === id) {
16
- ongoingRecordingRequests["delete"](id);
17
- worker.removeEventListener('message', _onMessage);
18
- if (data.error === null) {
19
- resolve(data.result.arrayBuffer);
20
- } else {
21
- reject(new Error(data.error.message));
22
- }
23
- }
24
- };
25
- worker.addEventListener('message', _onMessage);
26
- worker.postMessage({
27
- id: id,
28
- method: 'encode',
29
- params: {
30
- midiFile: midiFile
31
- }
32
- });
33
- });
34
- };
35
- return {
36
- encode: encode
37
- };
19
+ return wrap(worker);
38
20
  };
39
21
 
40
22
  exports.load = load;
23
+ exports.wrap = wrap;
41
24
 
42
25
  }));
package/package.json CHANGED
@@ -9,20 +9,20 @@
9
9
  }
10
10
  },
11
11
  "dependencies": {
12
- "@babel/runtime": "^7.26.0",
13
- "fast-unique-numbers": "^9.0.15",
14
- "json-midi-encoder-worker": "^6.1.52",
12
+ "@babel/runtime": "^7.26.7",
13
+ "broker-factory": "^3.0.109",
14
+ "json-midi-encoder-worker": "^7.0.1",
15
15
  "midi-json-parser-worker": "^8.1.52",
16
16
  "tslib": "^2.8.1"
17
17
  },
18
18
  "description": "The broker which is used by the json-midi-encoder package.",
19
19
  "devDependencies": {
20
- "@babel/core": "^7.26.0",
20
+ "@babel/core": "^7.26.7",
21
21
  "@babel/plugin-external-helpers": "^7.25.9",
22
22
  "@babel/plugin-transform-runtime": "^7.25.9",
23
- "@babel/preset-env": "^7.26.0",
24
- "@commitlint/cli": "^19.6.1",
25
- "@commitlint/config-angular": "^19.7.0",
23
+ "@babel/preset-env": "^7.26.7",
24
+ "@commitlint/cli": "^19.7.1",
25
+ "@commitlint/config-angular": "^19.7.1",
26
26
  "@rollup/plugin-babel": "^6.0.4",
27
27
  "chai": "^4.3.10",
28
28
  "commitizen": "^4.3.1",
@@ -41,19 +41,19 @@
41
41
  "karma-sinon-chai": "^2.0.2",
42
42
  "karma-webkit-launcher": "^2.6.0",
43
43
  "karma-webpack": "^5.0.1",
44
- "lint-staged": "^15.3.0",
44
+ "lint-staged": "^15.4.3",
45
45
  "load-grunt-config": "^4.0.1",
46
46
  "mocha": "^10.8.2",
47
47
  "prettier": "^3.4.2",
48
48
  "rimraf": "^6.0.1",
49
- "rollup": "^4.30.0",
49
+ "rollup": "^4.34.4",
50
50
  "sinon": "^17.0.2",
51
51
  "sinon-chai": "^3.7.0",
52
- "ts-loader": "^9.5.1",
52
+ "ts-loader": "^9.5.2",
53
53
  "tsconfig-holy-grail": "^15.0.2",
54
54
  "tslint": "^6.1.3",
55
55
  "tslint-config-holy-grail": "^56.0.6",
56
- "typescript": "^5.7.2",
56
+ "typescript": "^5.7.3",
57
57
  "webpack": "^5.97.1"
58
58
  },
59
59
  "files": [
@@ -81,5 +81,5 @@
81
81
  "test": "grunt lint && grunt test"
82
82
  },
83
83
  "types": "build/es2019/module.d.ts",
84
- "version": "4.0.116"
84
+ "version": "4.0.117"
85
85
  }
@@ -0,0 +1 @@
1
+ export * from './json-midi-encoder-broker-definition';
@@ -0,0 +1,6 @@
1
+ import { IBrokerDefinition } from 'broker-factory';
2
+ import { IMidiFile } from 'midi-json-parser-worker';
3
+
4
+ export interface IJsonMidiEncoderBrokerDefinition extends IBrokerDefinition {
5
+ encode(midiFile: IMidiFile): Promise<ArrayBuffer>;
6
+ }
package/src/module.ts CHANGED
@@ -1,37 +1,23 @@
1
- import { addUniqueNumber } from 'fast-unique-numbers';
2
- import { IEncodeRequest, IEncodeResponse, IWorkerEvent } from 'json-midi-encoder-worker';
3
- import { IMidiFile } from 'midi-json-parser-worker';
4
-
5
- export const load = (url: string) => {
1
+ import { createBroker } from 'broker-factory';
2
+ import { TJsonMidiEncoderWorkerDefinition } from 'json-midi-encoder-worker';
3
+ import { IJsonMidiEncoderBrokerDefinition } from './interfaces';
4
+ import { TJsonMidiEncoderBrokerLoader, TJsonMidiEncoderBrokerWrapper } from './types';
5
+
6
+ /*
7
+ * @todo Explicitly referencing the barrel file seems to be necessary when enabling the
8
+ * isolatedModules compiler option.
9
+ */
10
+ export * from './interfaces/index';
11
+ export * from './types/index';
12
+
13
+ export const wrap: TJsonMidiEncoderBrokerWrapper = createBroker<IJsonMidiEncoderBrokerDefinition, TJsonMidiEncoderWorkerDefinition>({
14
+ encode: ({ call }) => {
15
+ return (midiFile) => call('encode', { midiFile });
16
+ }
17
+ });
18
+
19
+ export const load: TJsonMidiEncoderBrokerLoader = (url: string) => {
6
20
  const worker = new Worker(url);
7
21
 
8
- const ongoingRecordingRequests: Set<number> = new Set();
9
-
10
- const encode = (midiFile: IMidiFile): Promise<ArrayBuffer> => {
11
- return new Promise((resolve, reject) => {
12
- const id = addUniqueNumber(ongoingRecordingRequests);
13
-
14
- const onMessage = ({ data }: IWorkerEvent) => {
15
- if (data.id === id) {
16
- ongoingRecordingRequests.delete(id);
17
-
18
- worker.removeEventListener('message', onMessage);
19
-
20
- if (data.error === null) {
21
- resolve((<IEncodeResponse>data).result.arrayBuffer);
22
- } else {
23
- reject(new Error(data.error.message));
24
- }
25
- }
26
- };
27
-
28
- worker.addEventListener('message', onMessage);
29
-
30
- worker.postMessage(<IEncodeRequest>{ id, method: 'encode', params: { midiFile } });
31
- });
32
- };
33
-
34
- return {
35
- encode
36
- };
22
+ return wrap(worker);
37
23
  };
@@ -0,0 +1,2 @@
1
+ export * from './json-midi-encoder-broker-loader';
2
+ export * from './json-midi-encoder-broker-wrapper';
@@ -0,0 +1,4 @@
1
+ import { IDefaultBrokerDefinition } from 'broker-factory';
2
+ import { IJsonMidiEncoderBrokerDefinition } from '../interfaces';
3
+
4
+ export type TJsonMidiEncoderBrokerLoader = (url: string) => IJsonMidiEncoderBrokerDefinition & IDefaultBrokerDefinition;
@@ -0,0 +1,4 @@
1
+ import { IDefaultBrokerDefinition } from 'broker-factory';
2
+ import { IJsonMidiEncoderBrokerDefinition } from '../interfaces';
3
+
4
+ export type TJsonMidiEncoderBrokerWrapper = (sender: MessagePort | Worker) => IJsonMidiEncoderBrokerDefinition & IDefaultBrokerDefinition;