Permalink
Switch branches/tags
Nothing to show
Find file
Fetching contributors…
Cannot retrieve contributors at this time
525 lines (524 sloc) 60.6 KB
{"nick":"dennismartensson","reason":"Ping timeout: 240 seconds","date":"2013-03-30T00:01:53.599Z","type":"quit"}
{"nick":"lluad","reason":"Quit: lluad","date":"2013-03-30T00:16:45.407Z","type":"quit"}
{"nick":"dennismartensson","date":"2013-03-30T00:26:03.139Z","type":"join"}
{"nick":"crikeyjp","date":"2013-03-30T00:52:51.196Z","type":"join"}
{"nick":"crikeyjp","reason":"Ping timeout: 252 seconds","date":"2013-03-30T00:58:00.239Z","type":"quit"}
{"nick":"evangenieur","date":"2013-03-30T00:59:38.848Z","type":"join"}
{"nick":"k1i","date":"2013-03-30T01:13:34.420Z","type":"join"}
{"nick":"lluad","date":"2013-03-30T01:24:30.727Z","type":"join"}
{"nick":"dennismartensson","reason":"Remote host closed the connection","date":"2013-03-30T01:31:11.699Z","type":"quit"}
{"nick":"ArxPoetica1","message":"anyone around?","date":"2013-03-30T01:36:27.683Z","type":"message"}
{"nick":"ArxPoetica1","new_nick":"ArxPoetica","date":"2013-03-30T01:36:34.259Z","type":"nick"}
{"nick":"ArxPoetica","message":"owenb?","date":"2013-03-30T01:36:39.952Z","type":"message"}
{"nick":"k1i","message":"yo","date":"2013-03-30T01:36:48.946Z","type":"message"}
{"nick":"ArxPoetica","message":"hey k1i — have you ever hosted SS in production?","date":"2013-03-30T01:37:09.244Z","type":"message"}
{"nick":"k1i","message":"nope","date":"2013-03-30T01:37:12.483Z","type":"message"}
{"nick":"k1i","message":"why, what are you thinking?","date":"2013-03-30T01:37:15.826Z","type":"message"}
{"nick":"ArxPoetica","message":"Oh, just trying to pack the assets correctly — having some trouble","date":"2013-03-30T01:37:29.662Z","type":"message"}
{"nick":"ArxPoetica","message":"It's technically only a staging site","date":"2013-03-30T01:37:39.904Z","type":"message"}
{"nick":"k1i","message":"gotcha","date":"2013-03-30T01:37:52.223Z","type":"message"}
{"nick":"ArxPoetica","message":"using S3","date":"2013-03-30T01:37:53.627Z","type":"message"}
{"nick":"k1i","message":"most of my work has been in .4","date":"2013-03-30T01:37:56.022Z","type":"message"}
{"nick":"ArxPoetica","message":"gotcha","date":"2013-03-30T01:38:00.142Z","type":"message"}
{"nick":"k1i","message":"I need to write a mongoose proxy","date":"2013-03-30T01:40:08.140Z","type":"message"}
{"nick":"k1i","message":"a good one","date":"2013-03-30T01:40:13.442Z","type":"message"}
{"nick":"k1i","message":"for S4","date":"2013-03-30T01:40:14.583Z","type":"message"}
{"nick":"crikeyjp","date":"2013-03-30T01:47:17.390Z","type":"join"}
{"nick":"crikeyjp","reason":"Ping timeout: 252 seconds","date":"2013-03-30T01:51:54.279Z","type":"quit"}
{"nick":"dennismartensson","date":"2013-03-30T02:01:40.180Z","type":"join"}
{"nick":"dennismartensson","reason":"Ping timeout: 245 seconds","date":"2013-03-30T02:09:43.167Z","type":"quit"}
{"nick":"evangenieur","reason":"Remote host closed the connection","date":"2013-03-30T02:18:02.559Z","type":"quit"}
{"nick":"sonofjack","reason":"Remote host closed the connection","date":"2013-03-30T02:29:34.910Z","type":"quit"}
{"nick":"dennismartensson","date":"2013-03-30T02:36:24.338Z","type":"join"}
{"nick":"lluad","reason":"Quit: lluad","date":"2013-03-30T02:46:39.638Z","type":"quit"}
{"nick":"ArxPoetica1","date":"2013-03-30T02:47:17.216Z","type":"join"}
{"nick":"ArxPoetica1","reason":"Client Quit","date":"2013-03-30T02:48:22.747Z","type":"quit"}
{"nick":"lluad","date":"2013-03-30T02:50:03.168Z","type":"join"}
{"nick":"ArxPoetica","reason":"*.net *.split","date":"2013-03-30T02:55:59.444Z","type":"quit"}
{"nick":"ArxPoetica","date":"2013-03-30T03:03:40.167Z","type":"join"}
{"nick":"lluad","reason":"Quit: lluad","date":"2013-03-30T03:14:09.983Z","type":"quit"}
{"nick":"ArxPoetica","reason":"Quit: Leaving.","date":"2013-03-30T03:30:25.543Z","type":"quit"}
{"nick":"lluad","date":"2013-03-30T03:49:44.015Z","type":"join"}
{"nick":"zenocon","date":"2013-03-30T03:52:13.177Z","type":"join"}
{"nick":"lluad","reason":"Quit: lluad","date":"2013-03-30T04:24:00.028Z","type":"quit"}
{"nick":"crikeyjp","date":"2013-03-30T04:29:39.262Z","type":"join"}
{"nick":"crikeyjp","reason":"Ping timeout: 252 seconds","date":"2013-03-30T04:34:09.111Z","type":"quit"}
{"nick":"k1i","reason":"Quit: k1i","date":"2013-03-30T04:38:54.646Z","type":"quit"}
{"nick":"k1i","date":"2013-03-30T05:25:38.617Z","type":"join"}
{"nick":"zenocon","reason":"Remote host closed the connection","date":"2013-03-30T05:46:07.254Z","type":"quit"}
{"nick":"k1i","message":"owenb: you here","date":"2013-03-30T05:46:36.239Z","type":"message"}
{"nick":"zenocon","date":"2013-03-30T05:46:48.178Z","type":"join"}
{"nick":"crikeyjp","date":"2013-03-30T05:50:36.229Z","type":"join"}
{"nick":"zenocon","reason":"Ping timeout: 245 seconds","date":"2013-03-30T05:50:58.166Z","type":"quit"}
{"nick":"dennismartensson","reason":"Read error: Connection reset by peer","date":"2013-03-30T05:59:23.820Z","type":"quit"}
{"nick":"dennismartensson","date":"2013-03-30T06:01:19.620Z","type":"join"}
{"nick":"zenocon","date":"2013-03-30T06:16:43.167Z","type":"join"}
{"nick":"zenocon","reason":"Ping timeout: 245 seconds","date":"2013-03-30T06:24:43.167Z","type":"quit"}
{"nick":"dennisma_","date":"2013-03-30T06:50:47.492Z","type":"join"}
{"nick":"dennismartensson","reason":"Read error: Connection reset by peer","date":"2013-03-30T06:51:05.874Z","type":"quit"}
{"nick":"k1i","reason":"Quit: k1i","date":"2013-03-30T07:20:23.967Z","type":"quit"}
{"nick":"crikeyjp","reason":"Read error: Connection reset by peer","date":"2013-03-30T08:26:48.416Z","type":"quit"}
{"nick":"crikeyjp","date":"2013-03-30T08:27:22.229Z","type":"join"}
{"nick":"crikeyjp","reason":"Remote host closed the connection","date":"2013-03-30T09:51:26.122Z","type":"quit"}
{"nick":"dennisma_","reason":"Ping timeout: 246 seconds","date":"2013-03-30T09:57:59.152Z","type":"quit"}
{"nick":"evangenieur","date":"2013-03-30T10:37:34.914Z","type":"join"}
{"nick":"crikeyjp","date":"2013-03-30T10:50:23.188Z","type":"join"}
{"nick":"crikeyjp","reason":"Ping timeout: 252 seconds","date":"2013-03-30T10:55:51.226Z","type":"quit"}
{"nick":"crikeyjp","date":"2013-03-30T11:39:55.606Z","type":"join"}
{"nick":"zenocon","date":"2013-03-30T12:19:04.276Z","type":"join"}
{"nick":"evangenieur","reason":"Remote host closed the connection","date":"2013-03-30T12:52:53.684Z","type":"quit"}
{"nick":"zenocon","reason":"Remote host closed the connection","date":"2013-03-30T13:10:11.995Z","type":"quit"}
{"nick":"zenocon","date":"2013-03-30T13:26:05.168Z","type":"join"}
{"nick":"zenocon","reason":"Remote host closed the connection","date":"2013-03-30T13:55:48.439Z","type":"quit"}
{"nick":"lluad","date":"2013-03-30T14:55:58.586Z","type":"join"}
{"nick":"crikeyjp","reason":"Remote host closed the connection","date":"2013-03-30T15:44:45.782Z","type":"quit"}
{"nick":"crikeyjp_","date":"2013-03-30T15:54:31.660Z","type":"join"}
{"nick":"k1i","date":"2013-03-30T17:23:40.705Z","type":"join"}
{"nick":"mtsr","date":"2013-03-30T19:01:53.656Z","type":"join"}
{"nick":"owenb","message":"hey k1i. I'm here if you want to chat","date":"2013-03-30T19:48:34.676Z","type":"message"}
{"nick":"k1i","message":"hey owenb","date":"2013-03-30T19:49:14.029Z","type":"message"}
{"nick":"k1i","message":"so I have been working with SS .4 for a while, trying to work on a nice, clean model implementation","date":"2013-03-30T19:49:27.948Z","type":"message"}
{"nick":"k1i","message":"as a realtime service","date":"2013-03-30T19:49:36.294Z","type":"message"}
{"nick":"k1i","message":"the way I have been structuring it, is, /services/model/modelname.js","date":"2013-03-30T19:50:04.368Z","type":"message"}
{"nick":"owenb","message":"great","date":"2013-03-30T19:50:11.288Z","type":"message"}
{"nick":"owenb","message":"that's the idea","date":"2013-03-30T19:50:12.512Z","type":"message"}
{"nick":"k1i","message":"the issue I am running into","date":"2013-03-30T19:50:20.257Z","type":"message"}
{"nick":"k1i","message":"is dynamically generated clientside code","date":"2013-03-30T19:50:23.798Z","type":"message"}
{"nick":"owenb","message":"hmm yeah","date":"2013-03-30T19:50:38.040Z","type":"message"}
{"nick":"k1i","message":"I want the ability to have one model file, and have it dynamically generate the clientside proxy code for remote calls","date":"2013-03-30T19:50:39.986Z","type":"message"}
{"nick":"owenb","message":"yeah i know what you mean","date":"2013-03-30T19:51:03.176Z","type":"message"}
{"nick":"k1i","message":"so basically, you can use the same calling convention on the serverside as the clientside when calling model funcs / instance methods","date":"2013-03-30T19:51:04.360Z","type":"message"}
{"nick":"owenb","message":"we did this in 0.1 and 0.2","date":"2013-03-30T19:51:08.101Z","type":"message"}
{"nick":"owenb","message":"yup","date":"2013-03-30T19:51:13.408Z","type":"message"}
{"nick":"k1i","message":"I was writing a proxy for mongoose when it got too messy","date":"2013-03-30T19:51:24.210Z","type":"message"}
{"nick":"owenb","message":"ultimately i decided it was faster all round if you just specified the method you wanted to run as a string","date":"2013-03-30T19:51:42.554Z","type":"message"}
{"nick":"owenb","message":"otherwise you end up generating a tonne of objects on the client","date":"2013-03-30T19:51:54.720Z","type":"message"}
{"nick":"owenb","message":"some which may never be called","date":"2013-03-30T19:52:00.156Z","type":"message"}
{"nick":"owenb","message":"and whilst that's going on, the client can't do anything","date":"2013-03-30T19:52:11.307Z","type":"message"}
{"nick":"k1i","message":"the thing is","date":"2013-03-30T19:52:11.709Z","type":"message"}
{"nick":"k1i","message":"I wanted to implement some kind of model metadata","date":"2013-03-30T19:52:19.192Z","type":"message"}
{"nick":"k1i","message":"for functions that CAN be called on the clientside","date":"2013-03-30T19:52:24.400Z","type":"message"}
{"nick":"k1i","message":"I wanted real OO models on the client","date":"2013-03-30T19:52:27.271Z","type":"message"}
{"nick":"owenb","message":"ah right","date":"2013-03-30T19:52:33.506Z","type":"message"}
{"nick":"k1i","message":"some functions, such as convenience methods/dressings","date":"2013-03-30T19:52:35.225Z","type":"message"}
{"nick":"k1i","message":"can absolutely be called on the clientside","date":"2013-03-30T19:52:44.223Z","type":"message"}
{"nick":"owenb","message":"yup","date":"2013-03-30T19:52:44.442Z","type":"message"}
{"nick":"k1i","message":"exports.lcoal","date":"2013-03-30T19:52:49.310Z","type":"message"}
{"nick":"k1i","message":"exports.remote","date":"2013-03-30T19:52:50.987Z","type":"message"}
{"nick":"k1i","message":"exports.schema","date":"2013-03-30T19:52:54.268Z","type":"message"}
{"nick":"k1i","message":"this is my biggest holdup with using SS right now","date":"2013-03-30T19:53:27.258Z","type":"message"}
{"nick":"owenb","message":"so you can't send code dynamically to the client, but you could send code which generates the functions and objects you need","date":"2013-03-30T19:53:33.768Z","type":"message"}
{"nick":"k1i","message":"and eventually you'd write an OT service that could handle that smoothly","date":"2013-03-30T19:53:35.841Z","type":"message"}
{"nick":"k1i","message":"that's what I was doing","date":"2013-03-30T19:53:44.931Z","type":"message"}
{"nick":"k1i","message":"I felt also, like I was duplicating a shitload of code","date":"2013-03-30T19:54:05.014Z","type":"message"}
{"nick":"owenb","message":"send a Model prototype to the client, then create an instance for each model on the server","date":"2013-03-30T19:54:07.633Z","type":"message"}
{"nick":"k1i","message":"between the RPC service","date":"2013-03-30T19:54:15.604Z","type":"message"}
{"nick":"k1i","message":"and my own","date":"2013-03-30T19:54:16.153Z","type":"message"}
{"nick":"owenb","message":"even with the callbacks and json on?","date":"2013-03-30T19:54:40.528Z","type":"message"}
{"nick":"k1i","message":"?","date":"2013-03-30T19:54:48.649Z","type":"message"}
{"nick":"owenb","message":"what else is rpc doing that you need?","date":"2013-03-30T19:54:50.232Z","type":"message"}
{"nick":"k1i","message":"the model function remote call sthemselves","date":"2013-03-30T19:55:05.271Z","type":"message"}
{"nick":"owenb","message":"{use: {json: true, callbacks: true}}","date":"2013-03-30T19:55:07.189Z","type":"message"}
{"nick":"k1i","message":"I have my own realtime service \"model\"","date":"2013-03-30T19:55:18.708Z","type":"message"}
{"nick":"owenb","message":"sure","date":"2013-03-30T19:55:22.196Z","type":"message"}
{"nick":"k1i","message":"which basically duplicates the RPC functions on a model/instance level","date":"2013-03-30T19:55:32.579Z","type":"message"}
{"nick":"owenb","message":"so i've started working on something called realtime models","date":"2013-03-30T19:55:45.196Z","type":"message"}
{"nick":"owenb","message":"it will be implemented as a service","date":"2013-03-30T19:55:56.530Z","type":"message"}
{"nick":"k1i","message":"I'd be happy to dedicate tons of time/code in this","date":"2013-03-30T19:55:59.362Z","type":"message"}
{"nick":"owenb","message":"thanks man","date":"2013-03-30T19:56:06.207Z","type":"message"}
{"nick":"k1i","message":"particularly OT code","date":"2013-03-30T19:56:13.471Z","type":"message"}
{"nick":"k1i","message":"which I believe needs to be implemented at a model level","date":"2013-03-30T19:56:18.233Z","type":"message"}
{"nick":"owenb","message":"that would be awesome","date":"2013-03-30T19:56:20.829Z","type":"message"}
{"nick":"owenb","message":"yes","date":"2013-03-30T19:56:22.790Z","type":"message"}
{"nick":"k1i","message":"also,I really like/agree with/believe in the .3 method of scaling (redis)","date":"2013-03-30T19:56:27.320Z","type":"message"}
{"nick":"k1i","message":"sessions/state needs to be maintained in redis","date":"2013-03-30T19:56:32.405Z","type":"message"}
{"nick":"owenb","message":"true","date":"2013-03-30T19:56:36.549Z","type":"message"}
{"nick":"k1i","message":"for stupid-easy scaling","date":"2013-03-30T19:56:39.021Z","type":"message"}
{"nick":"owenb","message":"i've been working on sessions today","date":"2013-03-30T19:56:43.601Z","type":"message"}
{"nick":"k1i","message":"If you can implement redis in a similar way to .3","date":"2013-03-30T19:57:04.608Z","type":"message"}
{"nick":"k1i","message":"for scalability","date":"2013-03-30T19:57:06.328Z","type":"message"}
{"nick":"owenb","message":"needs a bit more work but hoping to push a big new update in the next few days","date":"2013-03-30T19:57:08.217Z","type":"message"}
{"nick":"k1i","message":"SS will be the best, by far","date":"2013-03-30T19:57:08.690Z","type":"message"}
{"nick":"owenb","message":"it works the same way","date":"2013-03-30T19:57:18.323Z","type":"message"}
{"nick":"k1i","message":"ok","date":"2013-03-30T19:57:20.174Z","type":"message"}
{"nick":"owenb","message":"we use connect session store","date":"2013-03-30T19:57:23.732Z","type":"message"}
{"nick":"k1i","message":"so pubsub will be maintained in redis?","date":"2013-03-30T19:57:28.805Z","type":"message"}
{"nick":"owenb","message":"pubsub and sessions both use redis in 0.3. in 0.4 you will def be able to pass the server a Redis connect session store object and use that for sessions. i've not thought about pubsub, but Redis should also be an option there","date":"2013-03-30T19:58:18.726Z","type":"message"}
{"nick":"owenb","message":"here's the biggest problem I have.....","date":"2013-03-30T19:58:25.461Z","type":"message"}
{"nick":"owenb","message":"with services","date":"2013-03-30T19:58:27.767Z","type":"message"}
{"nick":"owenb","message":"i want each one to be independent","date":"2013-03-30T19:58:35.795Z","type":"message"}
{"nick":"owenb","message":"so you don't have to have pubsub and rpc to use realtime models","date":"2013-03-30T19:58:45.073Z","type":"message"}
{"nick":"k1i","message":"well","date":"2013-03-30T19:58:48.487Z","type":"message"}
{"nick":"k1i","message":"it's kind of inherent","date":"2013-03-30T19:58:52.786Z","type":"message"}
{"nick":"owenb","message":"otherwise we get into dependencies and versioning","date":"2013-03-30T19:58:56.078Z","type":"message"}
{"nick":"k1i","message":"(pubsub)","date":"2013-03-30T19:58:57.430Z","type":"message"}
{"nick":"k1i","message":"also","date":"2013-03-30T19:59:24.062Z","type":"message"}
{"nick":"k1i","message":"If I specify redis as an rts-pubsub provider","date":"2013-03-30T19:59:31.834Z","type":"message"}
{"nick":"k1i","message":"or zmq as an rts-pubsub provider","date":"2013-03-30T19:59:36.681Z","type":"message"}
{"nick":"k1i","message":"realtime models should take advantage of it","date":"2013-03-30T19:59:39.374Z","type":"message"}
{"nick":"owenb","message":"hmmm","date":"2013-03-30T19:59:43.414Z","type":"message"}
{"nick":"owenb","message":"then services need dependencies","date":"2013-03-30T19:59:54.972Z","type":"message"}
{"nick":"owenb","message":"there's no way around it","date":"2013-03-30T19:59:58.025Z","type":"message"}
{"nick":"owenb","message":"i've been trying to avoid this","date":"2013-03-30T20:00:03.956Z","type":"message"}
{"nick":"k1i","message":"I think htere are huge advantages to dependencies","date":"2013-03-30T20:00:29.663Z","type":"message"}
{"nick":"owenb","message":"but i agree, it would make things easier","date":"2013-03-30T20:00:32.937Z","type":"message"}
{"nick":"k1i","message":"I shoudl only have to specify reids once","date":"2013-03-30T20:00:44.152Z","type":"message"}
{"nick":"k1i","message":"for pubsub","date":"2013-03-30T20:00:46.717Z","type":"message"}
{"nick":"k1i","message":"for rts-model to use it","date":"2013-03-30T20:00:48.900Z","type":"message"}
{"nick":"k1i","message":"also","date":"2013-03-30T20:01:23.567Z","type":"message"}
{"nick":"k1i","message":"there needs to be an OT service","date":"2013-03-30T20:01:27.374Z","type":"message"}
{"nick":"k1i","message":"IMO","date":"2013-03-30T20:01:31.484Z","type":"message"}
{"nick":"k1i","message":"I have really been trying to avoid this, myself","date":"2013-03-30T20:01:35.934Z","type":"message"}
{"nick":"owenb","message":"yeah","date":"2013-03-30T20:01:36.146Z","type":"message"}
{"nick":"k1i","message":"but eventually, OT will need to be abstracted into a service","date":"2013-03-30T20:01:41.514Z","type":"message"}
{"nick":"owenb","message":"i kinda agree","date":"2013-03-30T20:01:52.136Z","type":"message"}
{"nick":"owenb","message":"hmmmm","date":"2013-03-30T20:01:56.420Z","type":"message"}
{"nick":"k1i","message":"also, I believe models should be datastore agnostic","date":"2013-03-30T20:02:00.741Z","type":"message"}
{"nick":"k1i","message":"rts-model-mongoose","date":"2013-03-30T20:02:05.207Z","type":"message"}
{"nick":"owenb","message":"so the realtime models implementation i've started doesn't use the pubsub service, but can use redis","date":"2013-03-30T20:02:17.626Z","type":"message"}
{"nick":"k1i","message":"could just be instance methods/bindings","date":"2013-03-30T20:02:18.041Z","type":"message"}
{"nick":"owenb","message":"and should in order to scale","date":"2013-03-30T20:02:23.645Z","type":"message"}
{"nick":"k1i","message":"that was my issue","date":"2013-03-30T20:02:32.394Z","type":"message"}
{"nick":"k1i","message":"allowing dependent services","date":"2013-03-30T20:02:38.850Z","type":"message"}
{"nick":"owenb","message":"i was thinking you'd start one redis connection in your app and pass the same connection to both rts-models and rts-pubsub","date":"2013-03-30T20:02:47.679Z","type":"message"}
{"nick":"k1i","message":"because there is a LOT of RPC within model code obviously","date":"2013-03-30T20:02:48.307Z","type":"message"}
{"nick":"k1i","message":"well, the issue is, the API abstraction","date":"2013-03-30T20:02:59.742Z","type":"message"}
{"nick":"k1i","message":"that's twice the abstraction code","date":"2013-03-30T20:03:04.237Z","type":"message"}
{"nick":"k1i","message":"for different providers that can do pubsub","date":"2013-03-30T20:03:10.381Z","type":"message"}
{"nick":"k1i","message":"zmq, eventemitter, redis","date":"2013-03-30T20:03:16.168Z","type":"message"}
{"nick":"owenb","message":"well a lot of it is already built","date":"2013-03-30T20:03:20.246Z","type":"message"}
{"nick":"k1i","message":"I mean code duplication","date":"2013-03-30T20:03:27.154Z","type":"message"}
{"nick":"owenb","message":"into the service layer","date":"2013-03-30T20:03:27.369Z","type":"message"}
{"nick":"k1i","message":"i feel like the pubsub service itself is a pretty good abstraction","date":"2013-03-30T20:03:44.389Z","type":"message"}
{"nick":"owenb","message":"e.g. all the broadcasting, callbacks etc","date":"2013-03-30T20:03:47.093Z","type":"message"}
{"nick":"owenb","message":"it doesn't really add any lines of code","date":"2013-03-30T20:04:04.153Z","type":"message"}
{"nick":"owenb","message":"just creates an event emitter in the client","date":"2013-03-30T20:04:12.458Z","type":"message"}
{"nick":"owenb","message":"rts-models will do the same","date":"2013-03-30T20:04:21.561Z","type":"message"}
{"nick":"owenb","message":"if you use both rts-models and rts-pubsub browserify will still only send you one eventemitter lib","date":"2013-03-30T20:04:38.679Z","type":"message"}
{"nick":"k1i","message":"yeah","date":"2013-03-30T20:04:57.073Z","type":"message"}
{"nick":"k1i","message":"but the actual bindings to that eventemitter lib","date":"2013-03-30T20:05:02.252Z","type":"message"}
{"nick":"owenb","message":"here's where it gets more difficult","date":"2013-03-30T20:05:07.765Z","type":"message"}
{"nick":"k1i","message":"if you have a common pubsub api","date":"2013-03-30T20:05:08.577Z","type":"message"}
{"nick":"k1i","message":"you can have any backend and only have to write the abstraction code once (rts-pubsub)","date":"2013-03-30T20:05:20.941Z","type":"message"}
{"nick":"k1i","message":"id really like to work on this rts-model implementation","date":"2013-03-30T20:06:14.825Z","type":"message"}
{"nick":"k1i","message":"as that, and sessions, are naturally my major sticking points","date":"2013-03-30T20:06:23.411Z","type":"message"}
{"nick":"owenb","message":"sessions are coming very soon","date":"2013-03-30T20:06:30.607Z","type":"message"}
{"nick":"owenb","message":"along with big changes to the modules","date":"2013-03-30T20:06:36.255Z","type":"message"}
{"nick":"owenb","message":"most exciting thing is you can now connect to the server via a node process","date":"2013-03-30T20:06:48.008Z","type":"message"}
{"nick":"k1i","message":"if everything is written right","date":"2013-03-30T20:06:48.806Z","type":"message"}
{"nick":"owenb","message":"not just a browser","date":"2013-03-30T20:06:50.530Z","type":"message"}
{"nick":"k1i","message":"you can avoid using sticky sessions on enterprise-class horizontal sclaing","date":"2013-03-30T20:06:59.575Z","type":"message"}
{"nick":"owenb","message":"so you can query a server over a node reply","date":"2013-03-30T20:07:09.296Z","type":"message"}
{"nick":"owenb","message":"reply","date":"2013-03-30T20:07:10.624Z","type":"message"}
{"nick":"owenb","message":"repl lol","date":"2013-03-30T20:07:12.845Z","type":"message"}
{"nick":"owenb","message":"using the same api","date":"2013-03-30T20:07:15.808Z","type":"message"}
{"nick":"owenb","message":"i'm hoping so too","date":"2013-03-30T20:07:22.651Z","type":"message"}
{"nick":"owenb","message":"but it's hard","date":"2013-03-30T20:07:24.042Z","type":"message"}
{"nick":"k1i","message":"yes, it is very hard","date":"2013-03-30T20:07:28.867Z","type":"message"}
{"nick":"owenb","message":"the problem is multiple tabs","date":"2013-03-30T20:07:29.704Z","type":"message"}
{"nick":"k1i","message":"all state has to be stored in redis","date":"2013-03-30T20:07:33.213Z","type":"message"}
{"nick":"owenb","message":"not just that","date":"2013-03-30T20:07:37.262Z","type":"message"}
{"nick":"k1i","message":"or mapped to redis","date":"2013-03-30T20:07:37.991Z","type":"message"}
{"nick":"owenb","message":"you don't want to query redis on EVERY message","date":"2013-03-30T20:07:44.820Z","type":"message"}
{"nick":"owenb","message":"only when the user connects for the first time","date":"2013-03-30T20:08:06.035Z","type":"message"}
{"nick":"k1i","message":"no, but websocket connections arent transient","date":"2013-03-30T20:08:06.245Z","type":"message"}
{"nick":"k1i","message":"so yeah","date":"2013-03-30T20:08:08.574Z","type":"message"}
{"nick":"k1i","message":"you can keep some things stored in memory","date":"2013-03-30T20:08:11.930Z","type":"message"}
{"nick":"k1i","message":"so long as state is backed up to redis","date":"2013-03-30T20:08:14.830Z","type":"message"}
{"nick":"owenb","message":"then only when the user changes and saves the session do you write to redis","date":"2013-03-30T20:08:19.382Z","type":"message"}
{"nick":"owenb","message":"but this only works if all incoming clients (browser tabs) are routed to the same backend server","date":"2013-03-30T20:08:32.256Z","type":"message"}
{"nick":"owenb","message":"this is how it works in 0.3","date":"2013-03-30T20:08:41.361Z","type":"message"}
{"nick":"owenb","message":"and i think it's how it will work in 0.4 too","date":"2013-03-30T20:08:48.244Z","type":"message"}
{"nick":"k1i","message":"why do they need to be routed to the same server?","date":"2013-03-30T20:08:49.686Z","type":"message"}
{"nick":"owenb","message":"because the session is stored in ram","date":"2013-03-30T20:08:56.086Z","type":"message"}
{"nick":"k1i","message":"ohh","date":"2013-03-30T20:08:56.302Z","type":"message"}
{"nick":"k1i","message":"you mean actual multiple tbas","date":"2013-03-30T20:08:58.644Z","type":"message"}
{"nick":"k1i","message":"tabs","date":"2013-03-30T20:08:59.142Z","type":"message"}
{"nick":"k1i","message":"with the same session","date":"2013-03-30T20:09:00.830Z","type":"message"}
{"nick":"owenb","message":"yes","date":"2013-03-30T20:09:03.312Z","type":"message"}
{"nick":"k1i","message":"interesting","date":"2013-03-30T20:09:13.896Z","type":"message"}
{"nick":"k1i","message":"you are just trying to avoid having duplicate sessions","date":"2013-03-30T20:09:26.727Z","type":"message"}
{"nick":"k1i","message":"opened across multiple app servers?","date":"2013-03-30T20:09:31.925Z","type":"message"}
{"nick":"owenb","message":"if you don't care about sharing sessions between multiple tabs, you each tab could have a different sessionId then you could route each incoming connection to any server you wanted","date":"2013-03-30T20:09:41.050Z","type":"message"}
{"nick":"k1i","message":"technically you could have the same session opened on multiple tabs","date":"2013-03-30T20:09:58.456Z","type":"message"}
{"nick":"k1i","message":"errr","date":"2013-03-30T20:09:59.431Z","type":"message"}
{"nick":"k1i","message":"on multiple apppservers","date":"2013-03-30T20:10:02.512Z","type":"message"}
{"nick":"k1i","message":"its just really inefficeint","date":"2013-03-30T20:10:06.946Z","type":"message"}
{"nick":"owenb","message":"exactly","date":"2013-03-30T20:10:11.595Z","type":"message"}
{"nick":"owenb","message":"so sticky sessions give us high performance so we don't have to hit redis on each request","date":"2013-03-30T20:10:40.551Z","type":"message"}
{"nick":"owenb","message":"but if you decide you don't care about supporting multiple tabs, it should be possible to pick any random back end server and establish a new session","date":"2013-03-30T20:11:06.037Z","type":"message"}
{"nick":"owenb","message":"ideally we should give the choice to the app developer","date":"2013-03-30T20:11:12.968Z","type":"message"}
{"nick":"k1i","message":"well","date":"2013-03-30T20:11:16.563Z","type":"message"}
{"nick":"k1i","message":"so long as that is a possibility","date":"2013-03-30T20:11:19.826Z","type":"message"}
{"nick":"k1i","message":"is the thing","date":"2013-03-30T20:11:20.662Z","type":"message"}
{"nick":"k1i","message":"it has to be CAPABLE of running the same session concurrently on multiple appserver nodes","date":"2013-03-30T20:11:30.793Z","type":"message"}
{"nick":"k1i","message":"the sticky sessions thing is just a huge efficiency boost","date":"2013-03-30T20:11:37.239Z","type":"message"}
{"nick":"owenb","message":"but think about the amount of calls to redis on each incoming message","date":"2013-03-30T20:11:57.758Z","type":"message"}
{"nick":"owenb","message":"going to be crazy","date":"2013-03-30T20:12:00.318Z","type":"message"}
{"nick":"k1i","message":"redis is designed to handle hundreds of thousands of QPS","date":"2013-03-30T20:12:10.036Z","type":"message"}
{"nick":"k1i","message":"you dont want it to hit redis on EVERY message","date":"2013-03-30T20:12:22.573Z","type":"message"}
{"nick":"owenb","message":"yeah, but why drag the session object data over the network each time","date":"2013-03-30T20:12:37.349Z","type":"message"}
{"nick":"k1i","message":"so you just cache the session in memory","date":"2013-03-30T20:12:38.141Z","type":"message"}
{"nick":"k1i","message":"you don't drag the whole thing","date":"2013-03-30T20:12:45.890Z","type":"message"}
{"nick":"k1i","message":"only thechanges","date":"2013-03-30T20:12:47.167Z","type":"message"}
{"nick":"k1i","message":"you pubsub the changes to a channel \"session:sid\"","date":"2013-03-30T20:13:03.103Z","type":"message"}
{"nick":"k1i","message":"and any client subbed to that channel can update when it sees session changes","date":"2013-03-30T20:13:13.074Z","type":"message"}
{"nick":"k1i","message":"er any appserver subbed to that channel","date":"2013-03-30T20:13:40.207Z","type":"message"}
{"nick":"owenb","message":"what you describe could be done, but nothing does this at the moment. we'd need a new connect redis session store drive written from scratch","date":"2013-03-30T20:13:42.424Z","type":"message"}
{"nick":"k1i","message":"i would think that you need to write the session driver from scratch anyway","date":"2013-03-30T20:13:58.164Z","type":"message"}
{"nick":"owenb","message":"if it works flawlessly it would be great","date":"2013-03-30T20:14:01.714Z","type":"message"}
{"nick":"k1i","message":"to support this kind of scaling/behavior","date":"2013-03-30T20:14:03.034Z","type":"message"}
{"nick":"owenb","message":"that's why i'm just not doing it at the moment - or 0.4 will never get released","date":"2013-03-30T20:14:16.843Z","type":"message"}
{"nick":"k1i","message":"yeah","date":"2013-03-30T20:14:20.032Z","type":"message"}
{"nick":"k1i","message":"good point","date":"2013-03-30T20:14:20.829Z","type":"message"}
{"nick":"owenb","message":"but it's totally possible to write this in the future","date":"2013-03-30T20:14:24.660Z","type":"message"}
{"nick":"owenb","message":"for now sticky sessions is just way easier","date":"2013-03-30T20:14:37.841Z","type":"message"}
{"nick":"owenb","message":"and high performing","date":"2013-03-30T20:14:42.529Z","type":"message"}
{"nick":"owenb","message":"but i agree with you","date":"2013-03-30T20:14:44.656Z","type":"message"}
{"nick":"owenb","message":"if this existed, it would be perfect","date":"2013-03-30T20:14:50.044Z","type":"message"}
{"nick":"owenb","message":"then a client could connect to any backend app server and they would all stay in sync","date":"2013-03-30T20:15:07.444Z","type":"message"}
{"nick":"k1i","message":"yeah","date":"2013-03-30T20:15:13.098Z","type":"message"}
{"nick":"k1i","message":"that's what I had in mind","date":"2013-03-30T20:15:14.785Z","type":"message"}
{"nick":"k1i","message":"when I thought of the whole system","date":"2013-03-30T20:15:16.918Z","type":"message"}
{"nick":"owenb","message":"yeah","date":"2013-03-30T20:15:20.341Z","type":"message"}
{"nick":"owenb","message":"it needs to happen","date":"2013-03-30T20:15:22.758Z","type":"message"}
{"nick":"owenb","message":"i totally agree","date":"2013-03-30T20:15:26.126Z","type":"message"}
{"nick":"owenb","message":"well i can confirm we'll be using connect session store drivers in 0.4, so if you fancy writing one that would be great :)","date":"2013-03-30T20:16:01.262Z","type":"message"}
{"nick":"k1i","message":"the thing is","date":"2013-03-30T20:16:22.192Z","type":"message"}
{"nick":"owenb","message":"and i can put an option in socketstream 0.4 to not cache sessions in ram","date":"2013-03-30T20:16:24.007Z","type":"message"}
{"nick":"owenb","message":"that would force a lookup in the store","date":"2013-03-30T20:16:29.408Z","type":"message"}
{"nick":"owenb","message":"that's when you could do your magic :)","date":"2013-03-30T20:16:35.352Z","type":"message"}
{"nick":"k1i","message":"sessions need to be stored in subscription yea?","date":"2013-03-30T20:16:42.199Z","type":"message"}
{"nick":"k1i","message":"so a session is subscribed to this particular data","date":"2013-03-30T20:16:48.706Z","type":"message"}
{"nick":"k1i","message":"errrr","date":"2013-03-30T20:16:57.077Z","type":"message"}
{"nick":"k1i","message":"sorry, subscriptions","date":"2013-03-30T20:16:59.311Z","type":"message"}
{"nick":"k1i","message":"need to be stored in the session","date":"2013-03-30T20:17:01.505Z","type":"message"}
{"nick":"owenb","message":"in 0.3 we stored which channels a user was subscribed to","date":"2013-03-30T20:17:10.520Z","type":"message"}
{"nick":"k1i","message":"in the session?","date":"2013-03-30T20:17:14.954Z","type":"message"}
{"nick":"owenb","message":"yes","date":"2013-03-30T20:17:18.200Z","type":"message"}
{"nick":"owenb","message":"but i haven't got to all that yet in 0.4","date":"2013-03-30T20:17:26.273Z","type":"message"}
{"nick":"k1i","message":"now, another thought","date":"2013-03-30T20:17:28.007Z","type":"message"}
{"nick":"k1i","message":"session -> [websocket instance, websocket instance]","date":"2013-03-30T20:17:37.735Z","type":"message"}
{"nick":"owenb","message":"socketId","date":"2013-03-30T20:17:48.731Z","type":"message"}
{"nick":"owenb","message":"s","date":"2013-03-30T20:17:49.759Z","type":"message"}
{"nick":"k1i","message":"yep","date":"2013-03-30T20:17:50.911Z","type":"message"}
{"nick":"owenb","message":"yup","date":"2013-03-30T20:17:53.933Z","type":"message"}
{"nick":"k1i","message":"not all sockets","date":"2013-03-30T20:17:55.064Z","type":"message"}
{"nick":"k1i","message":"are subscribed to the same shit","date":"2013-03-30T20:17:57.810Z","type":"message"}
{"nick":"owenb","message":"ah yes","date":"2013-03-30T20:18:03.239Z","type":"message"}
{"nick":"owenb","message":"this has always been a big debate hehe","date":"2013-03-30T20:18:10.198Z","type":"message"}
{"nick":"k1i","message":"which isnt that big of a deal, but is an efficiency thing","date":"2013-03-30T20:18:11.479Z","type":"message"}
{"nick":"owenb","message":"not just that.... it's about reconstructing things when a user accidently closes down a tab","date":"2013-03-30T20:18:39.431Z","type":"message"}
{"nick":"owenb","message":"interesting with the realtime models stuff i've been working on, we don't care about sessoins","date":"2013-03-30T20:18:54.020Z","type":"message"}
{"nick":"owenb","message":"we just track which socketId (clientId) sees what","date":"2013-03-30T20:19:02.367Z","type":"message"}
{"nick":"k1i","message":"ok","date":"2013-03-30T20:19:04.990Z","type":"message"}
{"nick":"owenb","message":"then notifies them of the updates","date":"2013-03-30T20:19:07.748Z","type":"message"}
{"nick":"k1i","message":"which is essentially a session variable","date":"2013-03-30T20:19:08.605Z","type":"message"}
{"nick":"owenb","message":"well not really","date":"2013-03-30T20:19:16.160Z","type":"message"}
{"nick":"k1i","message":"session -> socketIDs -> subscriptions","date":"2013-03-30T20:19:21.688Z","type":"message"}
{"nick":"owenb","message":"sessionId is common across tabs, socketId changes all the time","date":"2013-03-30T20:19:30.040Z","type":"message"}
{"nick":"k1i","message":"why not store that in the session?","date":"2013-03-30T20:19:30.472Z","type":"message"}
{"nick":"k1i","message":"yes","date":"2013-03-30T20:19:35.705Z","type":"message"}
{"nick":"k1i","message":"^","date":"2013-03-30T20:19:36.324Z","type":"message"}
{"nick":"k1i","message":"use one common session store","date":"2013-03-30T20:19:41.250Z","type":"message"}
{"nick":"k1i","message":"and one common pubsub","date":"2013-03-30T20:19:43.806Z","type":"message"}
{"nick":"k1i","message":"so not everything is so skewed","date":"2013-03-30T20:19:47.544Z","type":"message"}
{"nick":"owenb","message":"because a user on a different tab may never have asked for record 133, so why should be use bandwidth to tell them about something they are not interested in","date":"2013-03-30T20:20:07.028Z","type":"message"}
{"nick":"k1i","message":"yes","date":"2013-03-30T20:20:14.578Z","type":"message"}
{"nick":"owenb","message":"there will def only be one common session store","date":"2013-03-30T20:20:37.682Z","type":"message"}
{"nick":"owenb","message":"that's for sure","date":"2013-03-30T20:20:39.488Z","type":"message"}
{"nick":"k1i","message":"session -> { socket1: {subscriptions: [model1]}, socket2: {subs...","date":"2013-03-30T20:20:48.801Z","type":"message"}
{"nick":"owenb","message":"but rts-pubsub is only there because we need compatibility with 0.3","date":"2013-03-30T20:20:53.434Z","type":"message"}
{"nick":"owenb","message":"once 0.4 is out I'm going to totally redo rpc and maybe pubsub and make them much better (maybe under different names)","date":"2013-03-30T20:21:25.379Z","type":"message"}
{"nick":"k1i","message":"I don't feel like you should have multiple pubsub implementations","date":"2013-03-30T20:21:37.931Z","type":"message"}
{"nick":"k1i","message":"not across versions I mean","date":"2013-03-30T20:21:42.188Z","type":"message"}
{"nick":"k1i","message":"but across modules","date":"2013-03-30T20:21:43.500Z","type":"message"}
{"nick":"k1i","message":"for instance, Rt-models shouldn't decide how to do its own pubsub, IMO","date":"2013-03-30T20:21:50.543Z","type":"message"}
{"nick":"k1i","message":"and should rely on the other service to handle that for it, to abstract scaling, driver abstraction","date":"2013-03-30T20:22:07.551Z","type":"message"}
{"nick":"owenb","message":"it's not so clear cut though","date":"2013-03-30T20:22:20.509Z","type":"message"}
{"nick":"k1i","message":"and eventually, streaming","date":"2013-03-30T20:22:22.039Z","type":"message"}
{"nick":"owenb","message":"rts models don't care a jot about sessions","date":"2013-03-30T20:22:32.774Z","type":"message"}
{"nick":"owenb","message":"rts-pubsub only cares about sessions","date":"2013-03-30T20:22:38.433Z","type":"message"}
{"nick":"owenb","message":"the use cases are different","date":"2013-03-30T20:22:43.715Z","type":"message"}
{"nick":"owenb","message":"the only thing in common is the means of notifying each app server of changes","date":"2013-03-30T20:22:54.110Z","type":"message"}
{"nick":"owenb","message":"so you could pass the same redis connection, or whatever to both services - no problem","date":"2013-03-30T20:23:08.032Z","type":"message"}
{"nick":"owenb","message":"keeping them isolated like this will make it easier to test and means we won't get bogged down in having to check the correct version of everything is installed","date":"2013-03-30T20:24:30.942Z","type":"message"}
{"nick":"owenb","message":"but there is a time when i think i'm going to need service dependencies","date":"2013-03-30T20:24:43.099Z","type":"message"}
{"nick":"owenb","message":"the realtime models idea i want to talk about at the conference in a few weeks is totally agnostic to the type of persistent db store you want to use","date":"2013-03-30T20:25:15.696Z","type":"message"}
{"nick":"owenb","message":"all it does it keep track of who sees what and notifies clients when something changes","date":"2013-03-30T20:25:30.681Z","type":"message"}
{"nick":"owenb","message":"it does this using an event emitter in the client. but I have also been working on angular bindings","date":"2013-03-30T20:25:52.629Z","type":"message"}
{"nick":"k1i","message":"where is the conference","date":"2013-03-30T20:26:02.972Z","type":"message"}
{"nick":"owenb","message":"lyon","date":"2013-03-30T20:26:08.459Z","type":"message"}
{"nick":"owenb","message":"in three weeks","date":"2013-03-30T20:26:18.375Z","type":"message"}
{"nick":"k1i","message":"in france?","date":"2013-03-30T20:26:23.262Z","type":"message"}
{"nick":"owenb","message":"yup","date":"2013-03-30T20:26:26.484Z","type":"message"}
{"nick":"owenb","message":"hoping to have a relatively stable preview of 0.4 ready by then","date":"2013-03-30T20:26:37.867Z","type":"message"}
{"nick":"owenb","message":"i.e. stable in terms of ideas","date":"2013-03-30T20:26:44.460Z","type":"message"}
{"nick":"owenb","message":"lots still to go to make this all production readty","date":"2013-03-30T20:26:57.603Z","type":"message"}
{"nick":"owenb","message":"but i feel sure i'm on the right track now","date":"2013-03-30T20:27:14.293Z","type":"message"}
{"nick":"k1i","message":"there are reaosns","date":"2013-03-30T20:27:14.508Z","type":"message"}
{"nick":"k1i","message":"I believe rts-model needs to rely on sessions","date":"2013-03-30T20:27:18.178Z","type":"message"}
{"nick":"owenb","message":"it will","date":"2013-03-30T20:27:24.625Z","type":"message"}
{"nick":"owenb","message":"sessions are common","date":"2013-03-30T20:27:27.448Z","type":"message"}
{"nick":"owenb","message":"to all services","date":"2013-03-30T20:27:31.458Z","type":"message"}
{"nick":"owenb","message":"it has to be like that","date":"2013-03-30T20:27:33.843Z","type":"message"}
{"nick":"owenb","message":"sessions will contain info about who you are","date":"2013-03-30T20:27:51.020Z","type":"message"}
{"nick":"owenb","message":"i.e. what you're allowed to access","date":"2013-03-30T20:27:55.430Z","type":"message"}
{"nick":"k1i","message":"for the redis pubsub","date":"2013-03-30T20:28:42.293Z","type":"message"}
{"nick":"k1i","message":"are you actually using the redis-native pubsub?","date":"2013-03-30T20:28:46.457Z","type":"message"}
{"nick":"owenb","message":"http://realtimeconf.eu/","date":"2013-03-30T20:28:52.378Z","type":"message"}
{"nick":"k1i","message":"or is it some kind of set/get driver","date":"2013-03-30T20:28:52.586Z","type":"message"}
{"nick":"k1i","message":"polling","date":"2013-03-30T20:28:53.732Z","type":"message"}
{"nick":"k1i","message":"http://redis.io/topics/pubsub","date":"2013-03-30T20:29:23.226Z","type":"message"}
{"nick":"k1i","message":"this","date":"2013-03-30T20:29:24.264Z","type":"message"}
{"nick":"owenb","message":"redis native. we do that in 0.3 already","date":"2013-03-30T20:29:26.647Z","type":"message"}
{"nick":"owenb","message":"yes","date":"2013-03-30T20:29:32.936Z","type":"message"}
{"nick":"k1i","message":"gotcha","date":"2013-03-30T20:29:34.487Z","type":"message"}
{"nick":"k1i","message":"how do you think OT is going to be best-handled for models?","date":"2013-03-30T20:29:40.547Z","type":"message"}
{"nick":"owenb","message":"that's the tricky bit.... so in my idea of realtime models, it will be left for the app developer to figure out how to handle writes. we'll get the information from the client-side app down to the model file, but then the app dev can use any OT library they want to figure out how best to write the data","date":"2013-03-30T20:30:30.349Z","type":"message"}
{"nick":"k1i","message":"how will a model look?","date":"2013-03-30T20:30:57.145Z","type":"message"}
{"nick":"owenb","message":"yet to figure this all out, but similar to an rpc file today","date":"2013-03-30T20:31:11.369Z","type":"message"}
{"nick":"k1i","message":"./services/models/model.js?","date":"2013-03-30T20:31:11.761Z","type":"message"}
{"nick":"owenb","message":"well you name your services what you want. whatever name you give it determines the directory you store data to","date":"2013-03-30T20:31:47.816Z","type":"message"}
{"nick":"owenb","message":"but models sounds good hehe","date":"2013-03-30T20:31:59.331Z","type":"message"}
{"nick":"k1i","message":"i mean","date":"2013-03-30T20:32:02.509Z","type":"message"}
{"nick":"k1i","message":"so","date":"2013-03-30T20:32:04.683Z","type":"message"}
{"nick":"k1i","message":"how would you implement, say, a mongoose binding","date":"2013-03-30T20:32:16.284Z","type":"message"}
{"nick":"k1i","message":"to rts-model","date":"2013-03-30T20:32:23.069Z","type":"message"}
{"nick":"k1i","message":"but ideally, you are able to call these same functions in the client, yea?","date":"2013-03-30T20:32:53.863Z","type":"message"}
{"nick":"owenb","message":"no idea about mongoose tbh yet. my ideas on realtime models are still at early stages, but i'm hoping to have something ready before the conference as it's the biggest problem to be solved by far","date":"2013-03-30T20:34:08.529Z","type":"message"}
{"nick":"k1i","message":"that + OT are the biggest reasons, IMO","date":"2013-03-30T20:34:23.851Z","type":"message"}
{"nick":"k1i","message":"that derby/meteor have up on SS","date":"2013-03-30T20:34:33.265Z","type":"message"}
{"nick":"k1i","message":"yet they are unusuable in my (most peoples' cases) for a variety of other reasons","date":"2013-03-30T20:34:54.488Z","type":"message"}
{"nick":"owenb","message":"totally agree. i know with a great model solution SS is going to be way more attractive to most people","date":"2013-03-30T20:35:03.566Z","type":"message"}
{"nick":"owenb","message":"biggest thing for me is that it should not depend on how or where you want to store your data","date":"2013-03-30T20:35:39.527Z","type":"message"}
{"nick":"k1i","message":"that's a huge undertaking","date":"2013-03-30T20:35:40.669Z","type":"message"}
{"nick":"k1i","message":"yeah","date":"2013-03-30T20:35:41.841Z","type":"message"}
{"nick":"owenb","message":"exactly","date":"2013-03-30T20:35:45.204Z","type":"message"}
{"nick":"k1i","message":"activerecord does a fairly good job of this, IMO","date":"2013-03-30T20:35:49.076Z","type":"message"}
{"nick":"owenb","message":"yu","date":"2013-03-30T20:35:54.274Z","type":"message"}
{"nick":"owenb","message":"yes","date":"2013-03-30T20:35:56.587Z","type":"message"}
{"nick":"k1i","message":"but if I want to use mongoose, the default mongo node driver, SQL, etc.","date":"2013-03-30T20:35:56.949Z","type":"message"}
{"nick":"k1i","message":"it should be doable","date":"2013-03-30T20:36:00.656Z","type":"message"}
{"nick":"owenb","message":"totally","date":"2013-03-30T20:36:04.461Z","type":"message"}
{"nick":"owenb","message":"you should be able to store your model data anywhere","date":"2013-03-30T20:36:10.431Z","type":"message"}
{"nick":"k1i","message":"do you believe you shoudl be able to call those kinds of functions","date":"2013-03-30T20:36:11.356Z","type":"message"}
{"nick":"k1i","message":".find for instance","date":"2013-03-30T20:36:16.047Z","type":"message"}
{"nick":"k1i","message":"on the clientside?","date":"2013-03-30T20:36:17.204Z","type":"message"}
{"nick":"owenb","message":"yes","date":"2013-03-30T20:36:19.483Z","type":"message"}
{"nick":"k1i","message":"a la meteor's minimongo","date":"2013-03-30T20:36:26.301Z","type":"message"}
{"nick":"owenb","message":"you will define each one in your model spec file","date":"2013-03-30T20:36:26.891Z","type":"message"}
{"nick":"k1i","message":"except extensible","date":"2013-03-30T20:36:27.833Z","type":"message"}
{"nick":"owenb","message":"exactly","date":"2013-03-30T20:36:31.424Z","type":"message"}
{"nick":"k1i","message":"do you believe in an OO model representation","date":"2013-03-30T20:36:45.284Z","type":"message"}
{"nick":"owenb","message":"what the find function does, and where it gets the data from, will be up to your model module","date":"2013-03-30T20:36:45.708Z","type":"message"}
{"nick":"k1i","message":"where I can define a model","date":"2013-03-30T20:36:48.253Z","type":"message"}
{"nick":"k1i","message":"and play with the object itself","date":"2013-03-30T20:36:50.248Z","type":"message"}
{"nick":"k1i","message":"var book = Book.find(\"idididididid\")","date":"2013-03-30T20:36:58.339Z","type":"message"}
{"nick":"k1i","message":"book.read","date":"2013-03-30T20:37:01.024Z","type":"message"}
{"nick":"owenb","message":"well that's much more tricky as it depends on what you use on your front end","date":"2013-03-30T20:37:12.937Z","type":"message"}
{"nick":"owenb","message":"that's a very backbone way of doing things","date":"2013-03-30T20:37:25.339Z","type":"message"}
{"nick":"owenb","message":"but would never work with Angular","date":"2013-03-30T20:37:31.803Z","type":"message"}
{"nick":"k1i","message":"I mean","date":"2013-03-30T20:37:34.031Z","type":"message"}
{"nick":"k1i","message":"you could actually represent models as JS objects","date":"2013-03-30T20:37:47.768Z","type":"message"}
{"nick":"k1i","message":"and have instance methods, et.c","date":"2013-03-30T20:37:50.093Z","type":"message"}
{"nick":"owenb","message":"yeah i know. and have functions which take two variables and perform a calculation","date":"2013-03-30T20:38:07.770Z","type":"message"}
{"nick":"k1i","message":"yes","date":"2013-03-30T20:38:10.984Z","type":"message"}
{"nick":"k1i","message":"but that wouldn't need to be executed on the serverside","date":"2013-03-30T20:38:16.202Z","type":"message"}
{"nick":"k1i","message":"so","date":"2013-03-30T20:38:17.627Z","type":"message"}
{"nick":"k1i","message":"some way of marking that as a clientside func","date":"2013-03-30T20:38:22.008Z","type":"message"}
{"nick":"k1i","message":"not sure how you would pull that distinction off","date":"2013-03-30T20:38:54.098Z","type":"message"}
{"nick":"owenb","message":"yeah.... i'm trying to avoid doing all this. it's such a massive amount of work. the important thing is to lay the foundations so someone else can implement models in this way. that will be possible","date":"2013-03-30T20:39:38.823Z","type":"message"}
{"nick":"owenb","message":"ultimately there are many ways to do realtime models","date":"2013-03-30T20:39:53.294Z","type":"message"}
{"nick":"owenb","message":"what they all have in common is that the server needs to keep track of which client has seen what data so it can notify them of updates","date":"2013-03-30T20:40:14.205Z","type":"message"}
{"nick":"owenb","message":"i'm trying to get that bit right, then let people build backbone, angular and whatever else bindings on top if they wany","date":"2013-03-30T20:40:40.250Z","type":"message"}
{"nick":"owenb","message":"want*","date":"2013-03-30T20:40:42.967Z","type":"message"}
{"nick":"k1i","message":"yeah","date":"2013-03-30T20:40:56.156Z","type":"message"}
{"nick":"owenb","message":"though I may have to start the process off just to show how it can be done. i'm picking angular as I really like that","date":"2013-03-30T20:40:59.283Z","type":"message"}
{"nick":"k1i","message":"I really like angular too","date":"2013-03-30T20:41:05.592Z","type":"message"}
{"nick":"k1i","message":"BB has way too much boilerplate","date":"2013-03-30T20:41:07.962Z","type":"message"}
{"nick":"k1i","message":"ive got a current production rails + bb app, shitloads of boilerplate files (50+)","date":"2013-03-30T20:41:19.209Z","type":"message"}
{"nick":"k1i","message":"with maybe 5-10 models","date":"2013-03-30T20:41:24.341Z","type":"message"}
{"nick":"owenb","message":"yeah. no one solution is right for everyone in the world of web dev. so unlike meteor and derby, there is likely to be more than one way to do realtime models in SocketStream and i'm just fine with that.","date":"2013-03-30T20:42:02.366Z","type":"message"}
{"nick":"owenb","message":"i just want to make sure whatever people right is high performing and easy to test","date":"2013-03-30T20:42:13.581Z","type":"message"}
{"nick":"owenb","message":"*write","date":"2013-03-30T20:42:25.800Z","type":"message"}
{"nick":"k1i","message":"here's a use case","date":"2013-03-30T20:42:40.374Z","type":"message"}
{"nick":"k1i","message":"how would you handle an app with multiple databases for instance","date":"2013-03-30T20:42:46.810Z","type":"message"}
{"nick":"k1i","message":"that can be defined on the fly","date":"2013-03-30T20:42:52.407Z","type":"message"}
{"nick":"k1i","message":"so this model instance uses DB1, this other one (based on session, maybe) uses DB2","date":"2013-03-30T20:43:10.161Z","type":"message"}
{"nick":"owenb","message":"answer is I won't","date":"2013-03-30T20:43:40.318Z","type":"message"}
{"nick":"owenb","message":"it will be up to the app dev to figure out where the data comes from and where it's saved","date":"2013-03-30T20:44:03.572Z","type":"message"}
{"nick":"owenb","message":"most of the time web apps these days are only writing to a back end REST service","date":"2013-03-30T20:44:16.547Z","type":"message"}
{"nick":"k1i","message":"but that theoretically should be possible","date":"2013-03-30T20:44:17.600Z","type":"message"}
{"nick":"owenb","message":"not even directly to the DB","date":"2013-03-30T20:44:22.299Z","type":"message"}
{"nick":"k1i","message":"the way that meteor handles datastores/dbs","date":"2013-03-30T20:44:57.043Z","type":"message"}
{"nick":"k1i","message":"everything is defined before runtime","date":"2013-03-30T20:45:02.844Z","type":"message"}
{"nick":"owenb","message":"the realtime-model idea I have is very very simple and leaves the app developer free to store anything anyway they want","date":"2013-03-30T20:45:06.870Z","type":"message"}
{"nick":"k1i","message":"(serverside-services)","date":"2013-03-30T20:45:07.853Z","type":"message"}
{"nick":"owenb","message":"yeah, well in SS you just use whatever npm db drivers you want","date":"2013-03-30T20:45:51.865Z","type":"message"}
{"nick":"owenb","message":"i'm the first to admit this is not models in the active-record sense","date":"2013-03-30T20:46:23.051Z","type":"message"}
{"nick":"owenb","message":"but then how you could implement that if all your data is stored in a REST service, I don't know","date":"2013-03-30T20:46:39.402Z","type":"message"}
{"nick":"owenb","message":"anyway, I'm going to go back to working on sessions","date":"2013-03-30T20:46:57.758Z","type":"message"}
{"nick":"owenb","message":"but watch out of the next update - and please do experiment with your own ideas around models. my ideas and assumptions may be wrong. I don't know yet","date":"2013-03-30T20:47:37.356Z","type":"message"}
{"nick":"k1i","message":"are you devleoping","date":"2013-03-30T20:48:10.039Z","type":"message"}
{"nick":"k1i","message":"on a live branch somewhere?","date":"2013-03-30T20:48:12.059Z","type":"message"}
{"nick":"owenb","message":"no, it's all local at the mo. i'll push when i'm happy and the example-app doesn't break","date":"2013-03-30T20:48:28.527Z","type":"message"}
{"nick":"k1i","message":"is there anyway to avoid using the shellscripts","date":"2013-03-30T20:48:50.156Z","type":"message"}
{"nick":"k1i","message":"with the example app","date":"2013-03-30T20:48:52.479Z","type":"message"}
{"nick":"owenb","message":"how do you mean?","date":"2013-03-30T20:49:00.813Z","type":"message"}
{"nick":"owenb","message":"the npm_link thing?","date":"2013-03-30T20:49:09.767Z","type":"message"}
{"nick":"k1i","message":"yes","date":"2013-03-30T20:59:10.264Z","type":"message"}
{"nick":"k1i","message":"sorry","date":"2013-03-30T20:59:12.086Z","type":"message"}
{"nick":"k1i","message":"is there any way to avoid manually linking those packages","date":"2013-03-30T20:59:21.264Z","type":"message"}
{"nick":"owenb","message":"well the script does the linking for you","date":"2013-03-30T21:02:22.586Z","type":"message"}
{"nick":"owenb","message":"but it's all temporary","date":"2013-03-30T21:02:27.869Z","type":"message"}
{"nick":"k1i","message":"also, would it be possible to get a development branch perhaps?","date":"2013-03-30T21:02:33.523Z","type":"message"}
{"nick":"k1i","message":"for experimental PRs, etc.","date":"2013-03-30T21:02:38.246Z","type":"message"}
{"nick":"owenb","message":"until i figure out what modules are what and what they should be called","date":"2013-03-30T21:02:55.745Z","type":"message"}
{"nick":"owenb","message":"the whole repo is experimental so feel free :)","date":"2013-03-30T21:03:12.563Z","type":"message"}
{"nick":"owenb","message":"nothing is set in stone yet","date":"2013-03-30T21:03:15.719Z","type":"message"}
{"nick":"owenb","message":"i'm hoping things will settle down to make it the new master on the main socketstream repo in 3 weeks time, but a huge amount of work needs to happen before now and then","date":"2013-03-30T21:03:54.535Z","type":"message"}
{"nick":"owenb","message":"i will prob just delete the socketstream-0.4 repo then","date":"2013-03-30T21:04:22.272Z","type":"message"}
{"nick":"k1i","message":"gotcha","date":"2013-03-30T21:05:44.288Z","type":"message"}
{"nick":"k1i","message":"so the sessions you are currently working on, will take advantage of the connect-redis driver","date":"2013-03-30T21:06:02.108Z","type":"message"}
{"nick":"k1i","message":"and should be in the next push?","date":"2013-03-30T21:06:04.560Z","type":"message"}
{"nick":"k1i","message":"id be happy to write the new session driver","date":"2013-03-30T21:06:09.382Z","type":"message"}
{"nick":"k1i","message":"if so","date":"2013-03-30T21:06:10.962Z","type":"message"}
{"nick":"owenb","message":"yup. well we're no longer having connect-redis as a dependency, but you'll be able to add that top your app and pass the socketstream server an instance of it, and it will just use that","date":"2013-03-30T21:06:56.393Z","type":"message"}
{"nick":"owenb","message":"and thanks - would be great","date":"2013-03-30T21:07:03.578Z","type":"message"}
{"nick":"owenb","message":"i'll make sure it's possible to turn on in memory caching and always ask the session store for the latest session object on each incoming request","date":"2013-03-30T21:07:32.664Z","type":"message"}
{"nick":"owenb","message":"that way you can decide when to query redis, or return from ram","date":"2013-03-30T21:07:46.416Z","type":"message"}
{"nick":"k1i","message":"I don't understand how it will \"just work\"","date":"2013-03-30T21:07:56.389Z","type":"message"}
{"nick":"k1i","message":"(sessions) that is","date":"2013-03-30T21:08:04.732Z","type":"message"}
{"nick":"k1i","message":"this sits on express?","date":"2013-03-30T21:08:22.797Z","type":"message"}
{"nick":"owenb","message":"var store = connect.session.RedisStore({host: 'localhost'}); // or whatever","date":"2013-03-30T21:08:27.542Z","type":"message"}
{"nick":"owenb","message":"var server = new SocketStream({sessionStore: store}};","date":"2013-03-30T21:08:47.152Z","type":"message"}
{"nick":"owenb","message":"something like that","date":"2013-03-30T21:08:49.534Z","type":"message"}
{"nick":"k1i","message":"gtocha","date":"2013-03-30T21:08:58.245Z","type":"message"}
{"nick":"k1i","message":"and the api for communicating with store is consistent?","date":"2013-03-30T21:09:06.912Z","type":"message"}
{"nick":"owenb","message":"and if you don't pass it anything, it will just use the in memory session store","date":"2013-03-30T21:09:08.083Z","type":"message"}
{"nick":"owenb","message":"yup it's been out for years","date":"2013-03-30T21:09:15.931Z","type":"message"}
{"nick":"owenb","message":"and not changed","date":"2013-03-30T21:09:17.984Z","type":"message"}
{"nick":"owenb","message":"already there are drivers for mongo and every other db you can think of","date":"2013-03-30T21:09:28.234Z","type":"message"}
{"nick":"k1i","message":"connect- something","date":"2013-03-30T21:09:41.885Z","type":"message"}
{"nick":"owenb","message":"yup","date":"2013-03-30T21:09:47.144Z","type":"message"}
{"nick":"k1i","message":"and we were saying the current issue with it","date":"2013-03-30T21:10:08.518Z","type":"message"}
{"nick":"k1i","message":"is that it doesn't pubsub upon writes?","date":"2013-03-30T21:10:16.104Z","type":"message"}
{"nick":"owenb","message":"you could take the existing redis one and modify it to cache recent sessions in memory using a LRU cache then query redis for new incoming session ids, and listen out for any updates using redis.subscribe()","date":"2013-03-30T21:10:52.725Z","type":"message"}
{"nick":"owenb","message":"yup","date":"2013-03-30T21:11:07.704Z","type":"message"}
{"nick":"owenb","message":"but maybe someone has written this already","date":"2013-03-30T21:11:16.907Z","type":"message"}
{"nick":"owenb","message":"it seems like a sensible thing to do","date":"2013-03-30T21:11:21.452Z","type":"message"}
{"nick":"k1i","message":"and this can all be done within the context of a connect-redis replacement?","date":"2013-03-30T21:11:24.529Z","type":"message"}
{"nick":"owenb","message":"yes","date":"2013-03-30T21:11:28.017Z","type":"message"}
{"nick":"owenb","message":"so long as I tell SS not to bother with it's own cache","date":"2013-03-30T21:11:43.977Z","type":"message"}
{"nick":"owenb","message":"which I will do, having had this conversation :)","date":"2013-03-30T21:11:49.315Z","type":"message"}
{"nick":"owenb","message":"right I must go. lots to do and I don't have much more time today. thanks for the interest anyway. I'm feeling really excited about 0.4 now - the ideas are really coming together","date":"2013-03-30T21:12:19.350Z","type":"message"}
{"nick":"k1i","message":"yep","date":"2013-03-30T21:12:22.849Z","type":"message"}
{"nick":"k1i","message":"me too","date":"2013-03-30T21:12:23.404Z","type":"message"}
{"nick":"k1i","message":"is there any concern, also, with large session objects and bloated appserver memory caches for sessions?","date":"2013-03-30T21:12:32.022Z","type":"message"}
{"nick":"owenb","message":"yeah - well ram is cheap, but you'd want to set limits - both on object size and how many are stored in memory at once. there is an LRU module on npm - could be worth a look","date":"2013-03-30T21:13:21.508Z","type":"message"}
{"nick":"owenb","message":"must go now. speak soon","date":"2013-03-30T21:13:29.322Z","type":"message"}
{"nick":"evangenieur","date":"2013-03-30T21:35:03.716Z","type":"join"}
{"nick":"mtsr","reason":"Ping timeout: 240 seconds","date":"2013-03-30T21:37:33.600Z","type":"quit"}
{"nick":"colinsullivan","date":"2013-03-30T22:27:18.435Z","type":"join"}
{"nick":"zenocon","date":"2013-03-30T23:09:03.738Z","type":"join"}