1

Web サーバー マシンに接続された Web カメラを記録するための REST API を提供する、expressjs を使用して実装された Web サーバー API があります。

Web カメラとエンコードは C++ で記述された dll を使用して処理され、相互運用はnode-ffiライブラリを使用して行われます。

私が抱えている問題は、応答でネイティブの ffi ハンドルと JSON 文字列化を混在させていることです。

たとえばStream、プロトタイプを持つクラスがあります。

Stream.prototype.id = '';
Stream.prototype.url = '':
Stream.prototype.parent = null;
Stream.prototype.filePtr = null;

ffiStream.filePtrハンドルが含まれる場所などref.refType(ref.types.void)

次に、expressjs POSTstart呼び出しで次のようなことを行います。

impl.start = function(req, res){
    var camera = cameras.find(function(camera) {
        return camera.id === req.params.camera;
    });

    res.send(camera.startStream()); // startStream returns a new 'Stream' object.
};

ご覧のとおり、Streamオブジェクトをそのまま応答に送信するだけです。これは、通常、REST API を実装する方法です。問題は、ネイティブfilePtrハンドルを実際に含めるべきではないことです。これに対するベスト プラクティスが何であるか、または何か根本的に間違っているかどうかはわかりません。

注: Web、nodejs、expressjs、および javascript 全般に関しては、私は初心者です。したがって、私が行っていることが意味をなさない、またはもっとうまくできる可能性がある場合は、指摘してください。

より完全な例:

// dll bindings

var fileType = ref.types.void;
var filePtrType = ref.refType(fileType);
var cameraType = ref.types.void;
var cameraPtrType = ref.refType(cameraType);

var myLib = ffi.Library(/* Stuff */):

// expressjs api definitions

app.post('api/cameras/:camera/streams', impl.start);
app.delete('api/cameras/:camera/streams/:stream', impl.stop);
app.get('api/cameras', impl.cameras);
app.get('api/cameras/:camera', impl.camera);
app.get('api/cameras/:camera/streams', impl.streams);
app.get('api/cameras/:camera/streams/:stream', impl.stream);

// objects definitions

function Stream() {
    this.id = Date.now();
    this.url = this.id + '.mp4';
};

Stream.prototype.id = '';
Stream.prototype.url = '':
Stream.prototype.parent = null;
Stream.prototype.filePtr = null;

function Camera(id, device){
    this.id = id;
    this.device = device;
    this.cameraPtr = myLib.openCamera(device);  
};

Camera.prototype.id = '';
Camera.prototype.device = 0;
Camera.prototype.cameraPtr = null;

Camera.prototype.startStream = function() {
    var stream = new Stream(this);
    stream.filePtr = myLib.openFile(this.cameraPtr, stream.url);
    return stream;
};

Camera.prototype.stopStream = function(stream) {
    myLib.closeFile(stream.filePtr);
    this.streams.slice(this.streams.indexOf(stream), 1);
};

// object declaration

var cameras = [];

var numCameras = myLib.num_cameras();

for (var n = 0; n < numCameras; ++n) {
    cameras.push(new Camera(n, n));
}

// express api implementation

var impl = {};

impl.streams = function(req, res) {
    var camera = cameras.find(function(camera) {
        return camera.id === req.params.camera;
    });
    res.send(camera.streams);
};

impl.start = function(req, res){
    var camera = cameras.find(function(camera) {
        return camera.id === req.params.camera;
    });

    res.send(camera.startStream());
};

impl.stop = function(req. res) {
    var camera = cameras.find(function(camera){
        return camera.id === req.params.camera;
    });
    var stream = camera.streams.find(function(stream) {
        return stream.id === req.params.stream:
    });
    camera.stopStream(stream);
};

/* Stuff */
4

1 に答える 1