기본 콘텐츠로 건너뛰기

라벨이 publish인 게시물 표시

Meteor DDP subscribe 처리 시 주의할 점

Meteor에서 logout 시 독특한 패턴으로 websocket이 날아오기 때문에 주의해야한다. 먼저 logout을 보내면 ["{\"msg\":\"method\",\"method\":\"logout\",\"params\":[],\"id\":\"3\"}"] 가입 되있던 모든 publish에 영향 받는 collection이 removed 된다. a["{\"msg\":\"removed\",\"collection\":\"users\",\"id\":\"ySWmTt329QeLQZTEc\"}"] 80 23:56:26.494 ......... a["{\"msg\":\"ready\",\"subs\":[\"CPSzK3DsirQq4fSmo\",\"87ojrAZZKFwu9LTeH\",\"5ynAG9oTZg7i3DMCs\",\"KZBaQRzyPiF33BoLz\",\"w3JwjFeWaFmxXiiaL\",\"ZM9oXYRjZ7cfSxvMY\",\"Q7XAmPJC35NjLdBYL\"]}"] 189 23:56:26.529 정체불명의 subs 가 array로 뭉텅 날아오고 a["{\"msg\":\"updated\",\"methods\":[\"3\"]}"] 46 23:56:26.530 logout method 에 대한 updated 와 a["{\"msg\":\"res...

pub/sub RethinkDB in Meteor

Meteor DevShop 영상 중 RethinkDB에 대한 언급이 있었는데 그냥 그런게 있구나하다가 최근에 데이터베이스에서 변경 고지쪽의 중요함을 피부로 느끼고 설치도 해보고 좀 살펴보았다. https://github.com/tuhinc/rethink-livedata  같은 구현도 있고 코드를 보니 꽤 좋아보였다. 일단, 기존의 Meteor가 어떻게 mongoDB의 변경을 감지하는지 알아볼 필요가 있는데 mongo 콘솔에서 데이터를 직접 조작하면 Meteor Application에서도 실시간으로 적용되는 모습은 처음 접하는 사람들에겐 대단히 흥미로운 부분이다. 이것이 가능한 이유는 mongoDB가 그 자체로 oplog라는 이름의 collection(정확히 말하면 capped collection이라고 고정용량인 환형 collection인데 자세한 설명은 http://docs.mongodb.org/manual/core/replica-set-oplog/  이쪽을 참조)을 가지고 있어서인데 Meteor가 이 oplog를 감시하면서 변경내역이 있을 때마다 DDP로 변경내용을 갱신하여 구현하였다. 이 oplog라는 collection은 local이라는 이름의 system database에 있고 아래와 같이 접근 가능하다. > use local > show collections me oplog.rs startup_log system.indexes system.replset > db['oplog.rs'] .find().pretty() .... { "ts" : Timestamp(1438072144, 1), "h" : NumberLong("-854779810064123573"), "v" : 2, "op" : "i",...

MongoDB를 사용하지 않는 Meteor Publish(+MQTT)

오래간만에 Meteor 문서를 보던 중 흥미로운 내용을 발견. publish쪽을 보다 보니 이런게 있더라. http://docs.meteor.com/#/full/publish_added Meteor.subscribe한 컬렉션에서 observe를 해보면 added/changed/removed 를 받을 수 있는데 사실은 이게 publish에서 "만들"수 있는 것. 최초 publish 에 들어왔을 때 this.ready()를 한번 해주고 들어올때마다 publish에서 add를 해주는 식이다. 외부 API를 쓴다거나 TCP/UDP 연결해서 얻은 결과물을 Collection 형태로 받을 때 매우 유용하다. 그래서 MQTT pub/sub 연동 예제를 구현해보았다. http://meteorpad.com/pad/uGoYkgrkWxBbkfJhh/mqttMeteor test.mosquitto.org  를 바라보고 MQTT 메시지를 수신하고 송신할 수 있다. 구현이 얼마없는 것에 비해 매우 잘 작동하지 않는가!? MongoDB가 아닌 외부의 비동기 호출을 통해 받은 결과를 넘겨주는 것으로 실제 publish쪽 구현은 아주 간단한데 Meteor.publish("chats", function() {   var pub = this;   // async function   client.on('message', function(topic, message) {     pub.added("chats", Random.id(), {       message:message.toString(),       createdAt: +new Date()     });   });   this.ready(); }); 이게 전부다. subscribe쪽에 collection이 준비되었음을 알리기 위해 ready() ( h...

Meteor Package 만들기

1.0 이후론 package를 만드는 과정이 아주 직관적으로 바뀌었다. 이번엔 photoswipe 를 가지고 만들어 보았다. 모바일에서도 pinch zoom in/out등이 잘 작동하는 의존성이 없는 좋은 javascript gallery다. 먼저 해당 meteor project의 root 에서 package를 생성해보자 meteor create --package spectrum:photoswipe cd packages/spectrum:photoswipe packages/ 경로 안에 해당 package경로로 들어가서 git init 으로 저장소를 초기화한 후 git submodule add https://github.com/dimsemenov/PhotoSwipe.git lib 으로 photoswipe 저장소를 submodule로 추가한다. 여기선 lib 경로아래로 받도록 하였다. packages.js 수정하여 설명, 버전, 저장소등을 수정한다. Package.describe({   name: 'spectrum:photoswipe',   summary: 'JavaScript gallery, no dependencies.',   version: '1.0.0',   git: ' https://github.com/acidsound/meteor-photoswipe.git ' }); Package.onUse(function(api) {   api.versionsFrom('1.0');   api.addFiles([     'lib/dist/photoswipe.css',     'lib/dist/default-skin/default-skin.css',     'lib/dist/default-skin/default-skin.png',     'lib/dist/default-skin/defau...

Multiple pub/sub collection in meteor

iron Router를 잘 쓰고 있는데 쓰다 보니 이상한 점이 있다. 페이지별로 subscribe 하는 것까지는 좋지만 당연히 여러 개의 page에 대해 subscribe를 해야 하는데 waitOn 같은 곳에서 여러 개의 collection에 대해 subscribe를 하다 보니 N번 화면을 갱신하기도 하고 코드도 좀 번거롭다. 여러 개의 Collection에 대한 pub/sub을 한 번에 할 수 없을까 생각하고 있었는데 https://github.com/meteor/meteor/pull/716 최근 내용을 보니까 구현이 되어있다! 이것도 undocumented라고 해야 하나 싶다. 아무튼, 좋다. Posts, Replies 두 개의 Collection이 있다고 할 때 autopublish package를 meteor(혹은 mrt) remove autopublish하여 삭제하고 수동 가입을 구현한다면 /model/model.coffee @Posts = new Meteor.Collection "posts" @Replies = new Meteor.Collection "replies" /client/subscribe.coffee Meteor.subscribe 'posts-replies' /server/publish.coffee Meteor.publish 'posts', ->   [Posts.find(), Replies.find()] 이렇게 [ ] 배열 형태로 묶어만 주면 된다. 좋은 패치라고 생각한다. 적극적으로 활용하자.

meteorite package에 d3.js를 올렸다.

http://meteor.com/authcast  를 보면서 벡터그래픽을 마치 DOM처럼 쓰는 게 너무 맘에 들어서  https://atmosphere.meteor.com/  에 올려야겠다는 생각이 들었음. https://gist.github.com/3327056  와  https://atmosphere.meteor.com/wtf/package 내용 참조해서  https://github.com/acidsound/d3js-package  이런걸 올리긴 했는데 submodule 을 처음 써봐서 삽질 좀 했다. js 라이브러리의 경로를 잘못써서 몇가지를 수정하고 올리려고 했더니 /usr/local/lib/node_modules/meteorite/lib/atmosphere.js:82           throw "This tag has already been committed to the repo.";           ^ This tag has already been committed to the repo. 이런 오류가 나서 소스를 열어보았다. 80      exec('git tag', function (err, stdout, stderr) { 81        if (stdout.indexOf(versionName) >= 0) 82          throw "This tag has already been committed to the repo."; versionName 이 뭔가 쫓아가보았더니 smart.json 에서 지정한 "version". 뭐 암튼 release 할때 "version" 키의 값에 "v"를 앞에 붙여서 tag를 만들기 때문에...