@science-corporation/synapse 0.13.0 → 2.0.0
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.
- package/README.md +4 -2
- package/dist/api/api.d.ts +711 -71
- package/dist/api/api.js +5532 -4083
- package/dist/api/api.js.map +1 -1
- package/dist/api/proto.json +122 -32
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +4 -2
- package/dist/config.js.map +1 -1
- package/dist/demo.js +125 -32
- package/dist/demo.js.map +1 -1
- package/dist/device.d.ts +6 -0
- package/dist/device.d.ts.map +1 -1
- package/dist/device.js +25 -0
- package/dist/device.js.map +1 -1
- package/dist/nodes/index.d.ts +2 -1
- package/dist/nodes/index.d.ts.map +1 -1
- package/dist/nodes/index.js +5 -3
- package/dist/nodes/index.js.map +1 -1
- package/dist/nodes/spike_binner.d.ts +11 -0
- package/dist/nodes/{spike_detect.d.ts.map → spike_binner.d.ts.map} +1 -1
- package/dist/nodes/spike_binner.js +28 -0
- package/dist/nodes/{spike_detect.js.map → spike_binner.js.map} +1 -1
- package/dist/nodes/spike_detector.d.ts +11 -0
- package/dist/nodes/spike_detector.d.ts.map +1 -0
- package/dist/nodes/{spike_detect.js → spike_detector.js} +9 -9
- package/dist/nodes/spike_detector.js.map +1 -0
- package/dist/nodes/stream_out.d.ts +12 -5
- package/dist/nodes/stream_out.d.ts.map +1 -1
- package/dist/nodes/stream_out.js +58 -40
- package/dist/nodes/stream_out.js.map +1 -1
- package/dist/utils/ip.d.ts +2 -0
- package/dist/utils/ip.d.ts.map +1 -0
- package/dist/utils/ip.js +52 -0
- package/dist/utils/ip.js.map +1 -0
- package/package.json +6 -5
- package/scripts/postinstall.sh +50 -10
- package/src/api/api.d.ts +711 -71
- package/src/api/api.js +5671 -4121
- package/src/api/proto.json +122 -32
- package/src/config.ts +4 -2
- package/src/demo.ts +20 -8
- package/src/device.ts +34 -1
- package/src/nodes/index.ts +2 -1
- package/src/nodes/spike_binner.ts +30 -0
- package/src/nodes/spike_detector.ts +30 -0
- package/src/nodes/stream_out.ts +67 -50
- package/src/utils/ip.ts +35 -0
- package/synapse-api/.github/pull_request_template.md +10 -0
- package/synapse-api/README.md +1 -1
- package/synapse-api/api/datatype.proto +1 -0
- package/synapse-api/api/node.proto +6 -3
- package/synapse-api/api/nodes/spike_binner.proto +7 -0
- package/synapse-api/api/nodes/spike_detector.proto +19 -0
- package/synapse-api/api/nodes/stream_out.proto +31 -1
- package/synapse-api/api/query.proto +19 -1
- package/synapse-api/api/synapse.proto +1 -0
- package/dist/api-science-device/api.d.ts +0 -3
- package/dist/api-science-device/api.d.ts.map +0 -1
- package/dist/api-science-device/api.js +0 -3822
- package/dist/api-science-device/api.js.map +0 -1
- package/dist/api-science-device/proto.json +0 -258
- package/dist/nodejs.d.ts +0 -8
- package/dist/nodejs.d.ts.map +0 -1
- package/dist/nodejs.js +0 -32
- package/dist/nodejs.js.map +0 -1
- package/dist/nodes/spike_detect.d.ts +0 -11
- package/dist/science-device-api/api.d.ts +0 -3
- package/dist/science-device-api/api.d.ts.map +0 -1
- package/dist/science-device-api/api.js +0 -3822
- package/dist/science-device-api/api.js.map +0 -1
- package/dist/types/index.d.ts +0 -3
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -19
- package/dist/types/index.js.map +0 -1
- package/dist/types.d.ts +0 -5
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -19
- package/dist/types.js.map +0 -1
- package/dist/utils/device-management.d.ts +0 -37
- package/dist/utils/device-management.d.ts.map +0 -1
- package/dist/utils/device-management.js +0 -126
- package/dist/utils/device-management.js.map +0 -1
- package/dist/utils/ndtp.d.ts +0 -40
- package/dist/utils/ndtp.d.ts.map +0 -1
- package/dist/utils/ndtp.js +0 -140
- package/dist/utils/ndtp.js.map +0 -1
- package/src/nodes/spike_detect.ts +0 -30
- package/synapse-api/api/nodes/spike_detect.proto +0 -16
package/dist/nodes/index.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.StreamOut = exports.StreamIn = exports.SpikeSource = exports.
|
|
6
|
+
exports.StreamOut = exports.StreamIn = exports.SpikeSource = exports.SpikeDetector = exports.SpikeBinner = exports.SpectralFilter = exports.OpticalStimulation = exports.ElectricalStimulation = exports.DiskWriter = exports.BroadbandSource = void 0;
|
|
7
7
|
var broadband_source_1 = require("./broadband_source");
|
|
8
8
|
Object.defineProperty(exports, "BroadbandSource", { enumerable: true, get: function () { return __importDefault(broadband_source_1).default; } });
|
|
9
9
|
var disk_writer_1 = require("./disk_writer");
|
|
@@ -14,8 +14,10 @@ var optical_stimulation_1 = require("./optical_stimulation");
|
|
|
14
14
|
Object.defineProperty(exports, "OpticalStimulation", { enumerable: true, get: function () { return __importDefault(optical_stimulation_1).default; } });
|
|
15
15
|
var spectral_filter_1 = require("./spectral_filter");
|
|
16
16
|
Object.defineProperty(exports, "SpectralFilter", { enumerable: true, get: function () { return __importDefault(spectral_filter_1).default; } });
|
|
17
|
-
var
|
|
18
|
-
Object.defineProperty(exports, "
|
|
17
|
+
var spike_binner_1 = require("./spike_binner");
|
|
18
|
+
Object.defineProperty(exports, "SpikeBinner", { enumerable: true, get: function () { return __importDefault(spike_binner_1).default; } });
|
|
19
|
+
var spike_detector_1 = require("./spike_detector");
|
|
20
|
+
Object.defineProperty(exports, "SpikeDetector", { enumerable: true, get: function () { return __importDefault(spike_detector_1).default; } });
|
|
19
21
|
var spike_source_1 = require("./spike_source");
|
|
20
22
|
Object.defineProperty(exports, "SpikeSource", { enumerable: true, get: function () { return __importDefault(spike_source_1).default; } });
|
|
21
23
|
var stream_in_1 = require("./stream_in");
|
package/dist/nodes/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nodes/index.ts"],"names":[],"mappings":";;;;;;AAAA,uDAAgE;AAAvD,oIAAA,OAAO,OAAmB;AACnC,6CAAsD;AAA7C,0HAAA,OAAO,OAAc;AAC9B,mEAA4E;AAAnE,gJAAA,OAAO,OAAyB;AACzC,6DAAsE;AAA7D,0IAAA,OAAO,OAAsB;AACtC,qDAA8D;AAArD,kIAAA,OAAO,OAAkB;AAClC,+CAAwD;AAA/C,4HAAA,OAAO,OAAe;AAC/B,+CAAwD;AAA/C,4HAAA,OAAO,OAAe;AAC/B,yCAAkD;AAAzC,sHAAA,OAAO,OAAY;AAC5B,2CAAoD;AAA3C,wHAAA,OAAO,OAAa"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/nodes/index.ts"],"names":[],"mappings":";;;;;;AAAA,uDAAgE;AAAvD,oIAAA,OAAO,OAAmB;AACnC,6CAAsD;AAA7C,0HAAA,OAAO,OAAc;AAC9B,mEAA4E;AAAnE,gJAAA,OAAO,OAAyB;AACzC,6DAAsE;AAA7D,0IAAA,OAAO,OAAsB;AACtC,qDAA8D;AAArD,kIAAA,OAAO,OAAkB;AAClC,+CAAwD;AAA/C,4HAAA,OAAO,OAAe;AAC/B,mDAA4D;AAAnD,gIAAA,OAAO,OAAiB;AACjC,+CAAwD;AAA/C,4HAAA,OAAO,OAAe;AAC/B,yCAAkD;AAAzC,sHAAA,OAAO,OAAY;AAC5B,2CAAoD;AAA3C,wHAAA,OAAO,OAAa"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { synapse } from "../api/api";
|
|
2
|
+
import Node from "../node";
|
|
3
|
+
declare class SpikeBinner extends Node {
|
|
4
|
+
type: synapse.NodeType;
|
|
5
|
+
config: synapse.ISpikeBinnerConfig;
|
|
6
|
+
constructor(config?: synapse.ISpikeBinnerConfig);
|
|
7
|
+
toProto(): synapse.NodeConfig;
|
|
8
|
+
static fromProto(proto: synapse.INodeConfig): SpikeBinner;
|
|
9
|
+
}
|
|
10
|
+
export default SpikeBinner;
|
|
11
|
+
//# sourceMappingURL=spike_binner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"spike_binner.d.ts","sourceRoot":"","sources":["../../src/nodes/spike_binner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,cAAM,WAAY,SAAQ,IAAI;IAC5B,IAAI,mBAAiC;IACrC,MAAM,EAAE,OAAO,CAAC,kBAAkB,CAAC;gBAEvB,MAAM,GAAE,OAAO,CAAC,kBAAuB;IAMnD,OAAO,IAAI,OAAO,CAAC,UAAU;IAM7B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,GAAG,WAAW;CAQ1D;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const api_1 = require("../api/api");
|
|
7
|
+
const node_1 = __importDefault(require("../node"));
|
|
8
|
+
class SpikeBinner extends node_1.default {
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
super();
|
|
11
|
+
this.type = api_1.synapse.NodeType.kSpikeBinner;
|
|
12
|
+
this.config = config;
|
|
13
|
+
}
|
|
14
|
+
toProto() {
|
|
15
|
+
return super.toProto({
|
|
16
|
+
spikeBinner: this.config,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
static fromProto(proto) {
|
|
20
|
+
const { spikeBinner } = proto;
|
|
21
|
+
if (!spikeBinner) {
|
|
22
|
+
throw new Error("Invalid config, missing spikeBinner");
|
|
23
|
+
}
|
|
24
|
+
return new SpikeBinner(proto.spikeBinner);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.default = SpikeBinner;
|
|
28
|
+
//# sourceMappingURL=spike_binner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"
|
|
1
|
+
{"version":3,"file":"spike_binner.js","sourceRoot":"","sources":["../../src/nodes/spike_binner.ts"],"names":[],"mappings":";;;;;AAAA,oCAAqC;AACrC,mDAA2B;AAE3B,MAAM,WAAY,SAAQ,cAAI;IAI5B,YAAY,SAAqC,EAAE;QACjD,KAAK,EAAE,CAAC;QAJV,SAAI,GAAG,aAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;QAMnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,KAAK,CAAC,OAAO,CAAC;YACnB,WAAW,EAAE,IAAI,CAAC,MAAM;SACzB,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAA0B;QACzC,MAAM,EAAE,WAAW,EAAE,GAAG,KAAK,CAAC;QAC9B,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACzD,CAAC;QAED,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC5C,CAAC;CACF;AAED,kBAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { synapse } from "../api/api";
|
|
2
|
+
import Node from "../node";
|
|
3
|
+
declare class SpikeDetector extends Node {
|
|
4
|
+
type: synapse.NodeType;
|
|
5
|
+
config: synapse.ISpikeDetectorConfig;
|
|
6
|
+
constructor(config?: synapse.ISpikeDetectorConfig);
|
|
7
|
+
toProto(): synapse.NodeConfig;
|
|
8
|
+
static fromProto(proto: synapse.INodeConfig): SpikeDetector;
|
|
9
|
+
}
|
|
10
|
+
export default SpikeDetector;
|
|
11
|
+
//# sourceMappingURL=spike_detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spike_detector.d.ts","sourceRoot":"","sources":["../../src/nodes/spike_detector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,cAAM,aAAc,SAAQ,IAAI;IAC9B,IAAI,mBAAmC;IACvC,MAAM,EAAE,OAAO,CAAC,oBAAoB,CAAC;gBAEzB,MAAM,GAAE,OAAO,CAAC,oBAAyB;IAMrD,OAAO,IAAI,OAAO,CAAC,UAAU;IAM7B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,GAAG,aAAa;CAQ5D;AAED,eAAe,aAAa,CAAC"}
|
|
@@ -5,24 +5,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const api_1 = require("../api/api");
|
|
7
7
|
const node_1 = __importDefault(require("../node"));
|
|
8
|
-
class
|
|
8
|
+
class SpikeDetector extends node_1.default {
|
|
9
9
|
constructor(config = {}) {
|
|
10
10
|
super();
|
|
11
|
-
this.type = api_1.synapse.NodeType.
|
|
11
|
+
this.type = api_1.synapse.NodeType.kSpikeDetector;
|
|
12
12
|
this.config = config;
|
|
13
13
|
}
|
|
14
14
|
toProto() {
|
|
15
15
|
return super.toProto({
|
|
16
|
-
|
|
16
|
+
spikeDetector: this.config,
|
|
17
17
|
});
|
|
18
18
|
}
|
|
19
19
|
static fromProto(proto) {
|
|
20
|
-
const {
|
|
21
|
-
if (!
|
|
22
|
-
throw new Error("Invalid config, missing
|
|
20
|
+
const { spikeDetector } = proto;
|
|
21
|
+
if (!spikeDetector) {
|
|
22
|
+
throw new Error("Invalid config, missing spikeDetector");
|
|
23
23
|
}
|
|
24
|
-
return new
|
|
24
|
+
return new SpikeDetector(proto.spikeDetector);
|
|
25
25
|
}
|
|
26
26
|
}
|
|
27
|
-
exports.default =
|
|
28
|
-
//# sourceMappingURL=
|
|
27
|
+
exports.default = SpikeDetector;
|
|
28
|
+
//# sourceMappingURL=spike_detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spike_detector.js","sourceRoot":"","sources":["../../src/nodes/spike_detector.ts"],"names":[],"mappings":";;;;;AAAA,oCAAqC;AACrC,mDAA2B;AAE3B,MAAM,aAAc,SAAQ,cAAI;IAI9B,YAAY,SAAuC,EAAE;QACnD,KAAK,EAAE,CAAC;QAJV,SAAI,GAAG,aAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;QAMrC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,KAAK,CAAC,OAAO,CAAC;YACnB,aAAa,EAAE,IAAI,CAAC,MAAM;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAA0B;QACzC,MAAM,EAAE,aAAa,EAAE,GAAG,KAAK,CAAC;QAChC,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,IAAI,aAAa,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAChD,CAAC;CACF;AAED,kBAAe,aAAa,CAAC"}
|
|
@@ -1,14 +1,21 @@
|
|
|
1
1
|
import dgram from "dgram";
|
|
2
2
|
import { synapse } from "../api/api";
|
|
3
3
|
import Node from "../node";
|
|
4
|
+
import { Status } from "../utils/status";
|
|
4
5
|
declare class StreamOut extends Node {
|
|
5
6
|
type: synapse.NodeType;
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
_destinationAddress: string;
|
|
8
|
+
_destinationPort: number;
|
|
9
|
+
_label: string;
|
|
10
|
+
_socket: dgram.Socket | null;
|
|
8
11
|
_onMessage: ((msg: Buffer) => void) | null;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
+
_onError: ((error: Error) => void) | null;
|
|
13
|
+
constructor(config: synapse.IStreamOutConfig, callbacks?: {
|
|
14
|
+
onMessage?: (msg: Buffer) => void;
|
|
15
|
+
onError?: (error: Error) => void;
|
|
16
|
+
});
|
|
17
|
+
start(): Promise<Status>;
|
|
18
|
+
stop(): Promise<Status>;
|
|
12
19
|
toProto(): synapse.NodeConfig;
|
|
13
20
|
static fromProto(proto: synapse.INodeConfig): StreamOut;
|
|
14
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream_out.d.ts","sourceRoot":"","sources":["../../src/nodes/stream_out.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,IAAI,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"stream_out.d.ts","sourceRoot":"","sources":["../../src/nodes/stream_out.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,EAAE,MAAM,EAAc,MAAM,iBAAiB,CAAC;AAMrD,cAAM,SAAU,SAAQ,IAAI;IAC1B,IAAI,mBAA+B;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC;IAC7B,UAAU,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,QAAQ,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;gBAGxC,MAAM,EAAE,OAAO,CAAC,gBAAgB,EAChC,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;KAAE;IAY/E,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;IA2CxB,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IAQ7B,OAAO,IAAI,OAAO,CAAC,UAAU;IAc7B,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,WAAW,GAAG,SAAS;CAQxD;AAED,eAAe,SAAS,CAAC"}
|
package/dist/nodes/stream_out.js
CHANGED
|
@@ -15,51 +15,62 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
const dgram_1 = __importDefault(require("dgram"));
|
|
16
16
|
const api_1 = require("../api/api");
|
|
17
17
|
const node_1 = __importDefault(require("../node"));
|
|
18
|
-
const
|
|
18
|
+
const status_1 = require("../utils/status");
|
|
19
|
+
const ip_1 = require("../utils/ip");
|
|
20
|
+
const kDefaultStreamOutPort = 50038;
|
|
21
|
+
const kSocketBufferSize = 5 * 1024 * 1024; // 5MB
|
|
19
22
|
class StreamOut extends node_1.default {
|
|
20
|
-
constructor(config,
|
|
23
|
+
constructor(config, callbacks) {
|
|
21
24
|
super();
|
|
22
25
|
this.type = api_1.synapse.NodeType.kStreamOut;
|
|
23
|
-
|
|
24
|
-
this.
|
|
26
|
+
const { udpUnicast } = config || {};
|
|
27
|
+
this._destinationAddress = udpUnicast === null || udpUnicast === void 0 ? void 0 : udpUnicast.destinationAddress;
|
|
28
|
+
this._destinationPort = (udpUnicast === null || udpUnicast === void 0 ? void 0 : udpUnicast.destinationPort) || kDefaultStreamOutPort;
|
|
29
|
+
this._label = config.label;
|
|
30
|
+
this._onMessage = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onMessage;
|
|
31
|
+
this._onError = callbacks === null || callbacks === void 0 ? void 0 : callbacks.onError;
|
|
25
32
|
}
|
|
26
33
|
start() {
|
|
27
34
|
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
const host = this.config.multicastGroup;
|
|
44
|
-
if (!host) {
|
|
45
|
-
return false;
|
|
46
|
-
}
|
|
47
|
-
this._socket = dgram_1.default.createSocket("udp4");
|
|
48
|
-
this._socket.on("error", () => { });
|
|
49
|
-
this._socket.on("message", (msg) => {
|
|
50
|
-
var _a;
|
|
51
|
-
(_a = this._onMessage) === null || _a === void 0 ? void 0 : _a.call(this, msg);
|
|
52
|
-
});
|
|
53
|
-
this._socket.bind(port, host, () => {
|
|
54
|
-
if (!this._socket) {
|
|
55
|
-
return;
|
|
35
|
+
try {
|
|
36
|
+
this._socket = dgram_1.default.createSocket("udp4");
|
|
37
|
+
if (!this._destinationAddress) {
|
|
38
|
+
try {
|
|
39
|
+
const ip = yield (0, ip_1.getClientIp)();
|
|
40
|
+
if (!ip) {
|
|
41
|
+
return new status_1.Status(status_1.StatusCode.INTERNAL, "failed to get client ip");
|
|
42
|
+
}
|
|
43
|
+
this._destinationAddress = ip;
|
|
44
|
+
}
|
|
45
|
+
catch (e) {
|
|
46
|
+
console.error(e);
|
|
47
|
+
return new status_1.Status(status_1.StatusCode.INTERNAL, `failed to get client ip: ${e}`);
|
|
48
|
+
}
|
|
56
49
|
}
|
|
57
|
-
if (this.
|
|
58
|
-
this.
|
|
59
|
-
this._socket.addMembership(this.config.multicastGroup);
|
|
50
|
+
if (!this._destinationPort) {
|
|
51
|
+
this._destinationPort = kDefaultStreamOutPort;
|
|
60
52
|
}
|
|
61
|
-
|
|
62
|
-
|
|
53
|
+
this._socket.on("message", (msg) => {
|
|
54
|
+
var _a;
|
|
55
|
+
(_a = this._onMessage) === null || _a === void 0 ? void 0 : _a.call(this, msg);
|
|
56
|
+
});
|
|
57
|
+
this._socket.on("error", (error) => {
|
|
58
|
+
var _a;
|
|
59
|
+
(_a = this._onError) === null || _a === void 0 ? void 0 : _a.call(this, error);
|
|
60
|
+
});
|
|
61
|
+
yield new Promise((resolve, reject) => {
|
|
62
|
+
if (!this._socket)
|
|
63
|
+
return reject(new Error("Socket is null"));
|
|
64
|
+
this._socket.bind(this._destinationPort, this._destinationAddress, () => {
|
|
65
|
+
this._socket.setRecvBufferSize(kSocketBufferSize);
|
|
66
|
+
resolve();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
return new status_1.Status();
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
return new status_1.Status(status_1.StatusCode.INTERNAL, `failed to start stream out node: ${e}`);
|
|
73
|
+
}
|
|
63
74
|
});
|
|
64
75
|
}
|
|
65
76
|
stop() {
|
|
@@ -67,12 +78,19 @@ class StreamOut extends node_1.default {
|
|
|
67
78
|
if (this._socket) {
|
|
68
79
|
this._socket.close();
|
|
69
80
|
}
|
|
70
|
-
return
|
|
81
|
+
return new status_1.Status();
|
|
71
82
|
});
|
|
72
83
|
}
|
|
73
84
|
toProto() {
|
|
85
|
+
const config = {
|
|
86
|
+
label: this._label,
|
|
87
|
+
udpUnicast: {
|
|
88
|
+
destinationAddress: this._destinationAddress,
|
|
89
|
+
destinationPort: this._destinationPort,
|
|
90
|
+
},
|
|
91
|
+
};
|
|
74
92
|
return super.toProto({
|
|
75
|
-
streamOut:
|
|
93
|
+
streamOut: config,
|
|
76
94
|
});
|
|
77
95
|
}
|
|
78
96
|
static fromProto(proto) {
|
|
@@ -80,7 +98,7 @@ class StreamOut extends node_1.default {
|
|
|
80
98
|
if (!streamOut) {
|
|
81
99
|
throw new Error("Invalid config, missing streamOut");
|
|
82
100
|
}
|
|
83
|
-
return new StreamOut(streamOut);
|
|
101
|
+
return new StreamOut(streamOut, undefined);
|
|
84
102
|
}
|
|
85
103
|
}
|
|
86
104
|
exports.default = StreamOut;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream_out.js","sourceRoot":"","sources":["../../src/nodes/stream_out.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,kDAA0B;AAE1B,oCAAqC;AACrC,mDAA2B;
|
|
1
|
+
{"version":3,"file":"stream_out.js","sourceRoot":"","sources":["../../src/nodes/stream_out.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip.d.ts","sourceRoot":"","sources":["../../src/utils/ip.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,MAAM,GAAG,IAAI,CAgCzD,CAAC"}
|
package/dist/utils/ip.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.getClientIp = void 0;
|
|
16
|
+
const dgram_1 = __importDefault(require("dgram"));
|
|
17
|
+
const getClientIp = () => __awaiter(void 0, void 0, void 0, function* () {
|
|
18
|
+
return new Promise((resolve, reject) => {
|
|
19
|
+
try {
|
|
20
|
+
const socket = dgram_1.default.createSocket("udp4");
|
|
21
|
+
socket.on("error", (err) => {
|
|
22
|
+
console.error(err);
|
|
23
|
+
socket.close();
|
|
24
|
+
reject(err);
|
|
25
|
+
});
|
|
26
|
+
socket.bind(0, () => {
|
|
27
|
+
try {
|
|
28
|
+
socket.connect(53, "8.8.8.8", () => {
|
|
29
|
+
try {
|
|
30
|
+
const address = socket.address();
|
|
31
|
+
socket.close();
|
|
32
|
+
resolve(address.address);
|
|
33
|
+
}
|
|
34
|
+
catch (e) {
|
|
35
|
+
socket.close();
|
|
36
|
+
reject(e);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
catch (e) {
|
|
41
|
+
socket.close();
|
|
42
|
+
reject(e);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
catch (e) {
|
|
47
|
+
reject(e);
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
exports.getClientIp = getClientIp;
|
|
52
|
+
//# sourceMappingURL=ip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip.js","sourceRoot":"","sources":["../../src/utils/ip.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,kDAA0B;AAEnB,MAAM,WAAW,GAAG,GAAiC,EAAE;IAC5D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,eAAK,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YAE1C,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACzB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnB,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE;gBAClB,IAAI,CAAC;oBACH,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE;wBACjC,IAAI,CAAC;4BACH,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;4BACjC,MAAM,CAAC,KAAK,EAAE,CAAC;4BACf,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;wBAC3B,CAAC;wBAAC,OAAO,CAAC,EAAE,CAAC;4BACX,MAAM,CAAC,KAAK,EAAE,CAAC;4BACf,MAAM,CAAC,CAAC,CAAC,CAAC;wBACZ,CAAC;oBACH,CAAC,CAAC,CAAC;gBACL,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,MAAM,CAAC,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,CAAC,CAAC,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAA,CAAC;AAhCW,QAAA,WAAW,eAgCtB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@science-corporation/synapse",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "Client library and CLI for the Synapse API",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
"synapse-api"
|
|
23
23
|
],
|
|
24
24
|
"scripts": {
|
|
25
|
-
"build": "./scripts/build.sh",
|
|
26
|
-
"clean": "
|
|
25
|
+
"build": "bash ./scripts/build.sh",
|
|
26
|
+
"clean": "rimraf dist src/api",
|
|
27
27
|
"dist": "npm run generate && npm run build",
|
|
28
|
-
"generate": "./scripts/generate.sh",
|
|
28
|
+
"generate": "bash ./scripts/generate.sh",
|
|
29
29
|
"lint": "tsc --noEmit && eslint .",
|
|
30
|
-
"postinstall": "./scripts/postinstall.sh && npm run dist",
|
|
30
|
+
"postinstall": "bash ./scripts/postinstall.sh && npm run dist",
|
|
31
31
|
"test": "tsc --noEmit && jest"
|
|
32
32
|
},
|
|
33
33
|
"repository": {
|
|
@@ -54,6 +54,7 @@
|
|
|
54
54
|
"eslint-import-resolver-typescript": "^3.7.0",
|
|
55
55
|
"eslint-plugin-import": "^2.31.0",
|
|
56
56
|
"jest": "^29.7.0",
|
|
57
|
+
"rimraf": "^5.0.5",
|
|
57
58
|
"ts-jest": "^29.2.5",
|
|
58
59
|
"typescript": "^5.5.2"
|
|
59
60
|
},
|
package/scripts/postinstall.sh
CHANGED
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
#!/bin/bash
|
|
2
2
|
|
|
3
|
+
# Platform detection
|
|
4
|
+
IS_WINDOWS=false
|
|
5
|
+
if [ "$OS" = "Windows_NT" ] || [ "$OSTYPE" = "msys" ] || [ "$OSTYPE" = "cygwin" ]; then
|
|
6
|
+
IS_WINDOWS=true
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
# If running on Windows, ensure we're using bash
|
|
10
|
+
if [ "$IS_WINDOWS" = true ]; then
|
|
11
|
+
if ! command -v bash >/dev/null 2>&1; then
|
|
12
|
+
echo "Error: bash is required to run this script on Windows"
|
|
13
|
+
exit 1
|
|
14
|
+
fi
|
|
15
|
+
fi
|
|
16
|
+
|
|
3
17
|
echo "Postinstall - downloading synapse-api"
|
|
4
18
|
|
|
5
19
|
# If synapse-api directory already exists, skip download
|
|
@@ -22,7 +36,6 @@ if command -v git >/dev/null 2>&1 && git rev-parse --git-dir >/dev/null 2>&1; th
|
|
|
22
36
|
fi
|
|
23
37
|
fi
|
|
24
38
|
|
|
25
|
-
|
|
26
39
|
# Else, fallback to downloading from github
|
|
27
40
|
echo "Downloading synapse-api..."
|
|
28
41
|
|
|
@@ -71,22 +84,49 @@ fi
|
|
|
71
84
|
|
|
72
85
|
echo "- Found synapse-api ref \"$REF_API\""
|
|
73
86
|
|
|
74
|
-
|
|
87
|
+
# Create temp directory in a cross-platform way
|
|
88
|
+
if [ "$IS_WINDOWS" = true ]; then
|
|
89
|
+
# Use a more reliable temp directory path on Windows
|
|
90
|
+
TMP_DIR="C:\\Users\\$USERNAME\\AppData\\Local\\Temp\\synapse-api-temp"
|
|
91
|
+
mkdir -p "$TMP_DIR"
|
|
92
|
+
else
|
|
93
|
+
TMP_DIR=$(mktemp -d)
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# Download using curl or fallback to PowerShell on Windows if curl fails
|
|
75
97
|
if ! curl -s -L "https://github.com/sciencecorp/synapse-api/archive/${REF_API}.zip" -o "$TMP_DIR/synapse-api.zip"; then
|
|
76
|
-
|
|
77
|
-
|
|
98
|
+
if [ "$IS_WINDOWS" = true ]; then
|
|
99
|
+
echo " - Curl failed, attempting download with PowerShell..."
|
|
100
|
+
powershell -Command "Invoke-WebRequest -Uri 'https://github.com/sciencecorp/synapse-api/archive/${REF_API}.zip' -OutFile '$TMP_DIR\\synapse-api.zip'"
|
|
101
|
+
else
|
|
102
|
+
echo " - Failed to download synapse-api"
|
|
103
|
+
exit 1
|
|
104
|
+
fi
|
|
78
105
|
fi
|
|
79
106
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
107
|
+
# Unzip in a cross-platform way
|
|
108
|
+
if [ "$IS_WINDOWS" = true ]; then
|
|
109
|
+
if ! unzip -q "$TMP_DIR/synapse-api.zip" -d "$TMP_DIR" 2>/dev/null; then
|
|
110
|
+
echo " - Unzip failed, attempting with PowerShell..."
|
|
111
|
+
powershell -Command "Expand-Archive -Path '$TMP_DIR\\synapse-api.zip' -DestinationPath '$TMP_DIR' -Force"
|
|
112
|
+
fi
|
|
113
|
+
else
|
|
114
|
+
if ! unzip -q "$TMP_DIR/synapse-api.zip" -d "$TMP_DIR"; then
|
|
115
|
+
echo " - Failed to unzip synapse-api"
|
|
116
|
+
exit 1
|
|
117
|
+
fi
|
|
83
118
|
fi
|
|
84
119
|
|
|
120
|
+
# Create directory and copy files in a cross-platform way
|
|
85
121
|
mkdir -p synapse-api
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
122
|
+
if [ "$IS_WINDOWS" = true ]; then
|
|
123
|
+
powershell -Command "Copy-Item -Path \"$TMP_DIR\\synapse-api-${REF_API}\\*\" -Destination \"synapse-api\\\" -Recurse -Force"
|
|
124
|
+
else
|
|
125
|
+
cp -r "$TMP_DIR/synapse-api-${REF_API}/"* synapse-api/
|
|
126
|
+
fi
|
|
89
127
|
|
|
128
|
+
# Clean up temp files
|
|
129
|
+
rm -rf "$TMP_DIR"
|
|
90
130
|
|
|
91
131
|
if [ ! -f "synapse-api/README.md" ] || [ ! -f "synapse-api/COPYRIGHT" ] || [ ! -d "synapse-api/api" ]; then
|
|
92
132
|
echo " - Failed to download synapse-api - missing required files"
|