DDP呼叫拦截

时间:2015-09-06 19:44:22

标签: meteor ddp

我正在考虑我可能想要在Meteor客户端(或DDP)上为我的Meteor Js项目执行横切/ AOP或服务器的其他功能的场景客户端)通过DDP连接调用服务器端方法

此链接here提供了一个非常好的示例,说明如何在对象上执行AOP,但我想知道是否有一种方法可以通过DDP连接侦听入站客户端请求,就像快速拦截器或动作一样asp.net web api的过滤器,当然,对于websocket / ddp rpc实现。

Meteor Js Api只描述了一个事件" onConnection"在服务器上。这个SO响应提到了客户端上的一个connection._send来执行某些AOP功能......但是除此之外没有找到很多官方文档。

我基本上想知道是否有办法在服务器上监听所有DDP方法调用从所有客户端会话到服务器,如DDP规范中所述here

感谢。

1 个答案:

答案 0 :(得分:4)

我们将会发现Meteor中有很多未记载的内容。我真的不认为这是一个问题。以下是拦截Meteor中WebSocket流量的一些方法:

服务器

以下是您可以从服务器执行的一些操作:

Server - >客户端

拦截从服务器到客户端的消息有点乏味,但这有效。您可能希望编写一些代码来将log固定到客户端。

(function () {
  var timeout = 3000
  var streamServer = Meteor.server.stream_server
  var standardConnect = streamServer.server._events.connection

  streamServer.server._events.connection = function (socket) {
    var write = socket.write
    socket.write = function () {
      console.log(arguments)
      write.apply(this, args)
    }
    standardConnect.apply(this, arguments)
  }
})()

客户 - > Server

要拦截来自服务器上客户端的呼叫,您可以执行以下操作:

Meteor.server.stream_server.server.addListener('connection', function (socket) {
  var old = socket._events.data
  socket._events.data = function () {
    console.log(arguments)
    old.apply(this, arguments)
  }
})

上述啜饮不能与第一个一起使用。修复面团并不难。如果您使用此剪辑,Meteor.server.stream_server.server._events.connection将只是一个函数数组而不是函数。

客户端

服务器 - > Client

要收听从服务器到客户端的客户的来电,您可以这样做:

Meteor.connection._stream.on('message', console.log.bind(console))

你也可以使用类似的东西拦截它们

(function () {
  var cb = Meteor.connection._stream.eventCallbacks.message[0]
  Meteor.connection._stream.eventCallbacks.message[0] = function () {
    console.log(arguments)
    cb.apply(this, arguments)
  }
})()

不完全确定那是多么坚固。但它确实有效,那真是太棒了。

要测试它,你可以简单地做

Meteor.subscribe('test')

Client - >服务器

正如您所指出的,您也可以使用来自客户端的外发邮件做类似的事情。

Meteor.connection._send = function () {
  console.log(arguments)
  this.__proto__._send.apply(this, arguments)
}