Parser 2011/Real-time-collaboration/EtherPadWebApi

Opening a session

edit

?? Establishes comet API—tries three "coment/channel" requests, one channel=shortpolling, another streaming, then shortpolling again


?? http://204568131128.comet.etherpad.wikimedia.org/comet/xhrXdFrame—assumes wildcard DNS is available??

m:{
   "type":"COLLABROOM",
   "data":{
   "type":"CLIENT_READY",
   "roomType":"padpage",
   "roomName":"padpage/PiCvlh2WAJ",
   "data":{
      "lastRev":0,
      "userInfo": {
         "userId":"g.nrrwxp0egigiulep",
         "name":"Neil",
         "ip":"127.0.0.1",
         "colorId":19,
         "userAgent":"Chrome12.0.742.1"
       },
       "stats":{
           "screen":"1483,363,1920,1126,1920,1200",
           "ip":"127.0.0.1",
           "useragent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_7) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.112 Safari/534.30"
        }
     }
  }
}

Press return once in the doc

Query stirng:
r:998659282690
v:2
id:541001861914
seq:1

Form Data
m:{
   "type":"COLLABROOM", 
    "data":{
        "type":"USER_CHANGES",
        "baseRev":0,
        "changeset":"Z:54>1|2=r=4a*0|1 1$\n",
       "apool":{
          "numToAttrib":{
              "0":["author","g.nrrwxp0egigiulep"]
          },
          "nextNum":1
       }
    }
}

Type WIKI at position 0


queryargs
r:355348323705
v:2
id:541001861914
seq:14

postargs
m:{"type":"COLLABROOM","data":{"type":"USER_CHANGES","baseRev":13,"changeset":"Z:56>1*0 1$W","apool":{"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]},"nextNum":1}}}

-----

queryargs
r:645610667299
v:2
id:541001861914
seq:15

postargs
m:{"type":"COLLABROOM","data":{"type":"USER_CHANGES","baseRev":14,"changeset":"Z:57>3=1*0 3$IKI","apool":{"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]},"nextNum":1}}}



In all cases the server response is a simple "ok"


Typing "QUORBAL" at position 5


r:911135458620
v:2
id:541001861914
seq:18

m:{"type":"COLLABROOM","data":{"type":"USER_CHANGES","baseRev":15,"changeset":"Z:5a>1=4*0 1$Q","apool":{"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]},"nextNum":1}}}

----

r:311440908816
v:2
id:541001861914
seq:19

m:{"type":"COLLABROOM","data":{"type":"USER_CHANGES","baseRev":16,"changeset":"Z:5b>3=5*0 3$UOR","apool":{"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]},"nextNum":1}}}

----

r:336653723381
v:2
id:541001861914
seq:20
Form Dataview URL encoded
m:{"type":"COLLABROOM","data":{"type":"USER_CHANGES","baseRev":17,"changeset":"Z:5e>2=8*0 2$BA","apool":{"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]},"nextNum":1}}}

----

r:684775243048
v:2
id:541001861914
seq:21
Form Dataview URL encoded
m:{"type":"COLLABROOM","data":{"type":"USER_CHANGES","baseRev":18,"changeset":"Z:5g>1=a*0 1$L","apool":{"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]},"nextNum":1}}}

Receiving end—streaming, requires Wireshark to follow these


10
13:oob:keepalive
1d2
462:3:0:{"type":"COLLABROOM","data":{"changeset":"Z:5a>1=4*0+1$Q","newRev":16,"type":"NEW_CHANGES","author":"g.nrrwxp0egigiulep","apool":{"getAttrib":{"prototype":{}},"getAttribKey":{"prototype":{}},"putAttrib":{"prototype":{}},"fromJsonable":{"prototype":{}},"eachAttrib":{"prototype":{}},"getAttribValue":{"prototype":{}},"toJsonable":{"prototype":{}},"nextNum":1,"attribToNum":{"author,g.nrrwxp0egigiulep":0},"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]}}}}
1d4
464:4:0:{"type":"COLLABROOM","data":{"changeset":"Z:5b>3=5*0+3$UOR","newRev":17,"type":"NEW_CHANGES","author":"g.nrrwxp0egigiulep","apool":{"getAttrib":{"prototype":{}},"getAttribKey":{"prototype":{}},"putAttrib":{"prototype":{}},"fromJsonable":{"prototype":{}},"eachAttrib":{"prototype":{}},"getAttribValue":{"prototype":{}},"toJsonable":{"prototype":{}},"nextNum":1,"attribToNum":{"author,g.nrrwxp0egigiulep":0},"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]}}}}
1d3
463:5:0:{"type":"COLLABROOM","data":{"changeset":"Z:5e>2=8*0+2$BA","newRev":18,"type":"NEW_CHANGES","author":"g.nrrwxp0egigiulep","apool":{"getAttrib":{"prototype":{}},"getAttribKey":{"prototype":{}},"putAttrib":{"prototype":{}},"fromJsonable":{"prototype":{}},"eachAttrib":{"prototype":{}},"getAttribValue":{"prototype":{}},"toJsonable":{"prototype":{}},"nextNum":1,"attribToNum":{"author,g.nrrwxp0egigiulep":0},"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]}}}}
1d2
462:6:0:{"type":"COLLABROOM","data":{"changeset":"Z:5g>1=a*0+1$L","newRev":19,"type":"NEW_CHANGES","author":"g.nrrwxp0egigiulep","apool":{"getAttrib":{"prototype":{}},"getAttribKey":{"prototype":{}},"putAttrib":{"prototype":{}},"fromJsonable":{"prototype":{}},"eachAttrib":{"prototype":{}},"getAttribValue":{"prototype":{}},"toJsonable":{"prototype":{}},"nextNum":1,"attribToNum":{"author,g.nrrwxp0egigiulep":0},"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]}}}}
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
1d2
462:7:0:{"type":"COLLABROOM","data":{"changeset":"Z:5h>1=b*0+1$Z","newRev":20,"type":"NEW_CHANGES","author":"g.nrrwxp0egigiulep","apool":{"getAttrib":{"prototype":{}},"getAttribKey":{"prototype":{}},"putAttrib":{"prototype":{}},"fromJsonable":{"prototype":{}},"eachAttrib":{"prototype":{}},"getAttribValue":{"prototype":{}},"toJsonable":{"prototype":{}},"nextNum":1,"attribToNum":{"author,g.nrrwxp0egigiulep":0},"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]}}}}
1d4
464:8:0:{"type":"COLLABROOM","data":{"changeset":"Z:5i>3=c*0+3$ACH","newRev":21,"type":"NEW_CHANGES","author":"g.nrrwxp0egigiulep","apool":{"getAttrib":{"prototype":{}},"getAttribKey":{"prototype":{}},"putAttrib":{"prototype":{}},"fromJsonable":{"prototype":{}},"eachAttrib":{"prototype":{}},"getAttribValue":{"prototype":{}},"toJsonable":{"prototype":{}},"nextNum":1,"attribToNum":{"author,g.nrrwxp0egigiulep":0},"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]}}}}
1d4
464:9:0:{"type":"COLLABROOM","data":{"changeset":"Z:5l>3=f*0+3$ARY","newRev":22,"type":"NEW_CHANGES","author":"g.nrrwxp0egigiulep","apool":{"getAttrib":{"prototype":{}},"getAttribKey":{"prototype":{}},"putAttrib":{"prototype":{}},"fromJsonable":{"prototype":{}},"eachAttrib":{"prototype":{}},"getAttribValue":{"prototype":{}},"toJsonable":{"prototype":{}},"nextNum":1,"attribToNum":{"author,g.nrrwxp0egigiulep":0},"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]}}}}
1da
470:10:0:{"type":"COLLABROOM","data":{"changeset":"Z:5o>a*0+a$STRAWBERRY","newRev":23,"type":"NEW_CHANGES","author":"g.nrrwxp0egigiulep","apool":{"getAttrib":{"prototype":{}},"getAttribKey":{"prototype":{}},"putAttrib":{"prototype":{}},"fromJsonable":{"prototype":{}},"eachAttrib":{"prototype":{}},"getAttribValue":{"prototype":{}},"toJsonable":{"prototype":{}},"nextNum":1,"attribToNum":{"author,g.nrrwxp0egigiulep":0},"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]}}}}
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive
10
13:oob:keepalive



Observations

edit

Posting text typed

edit

Query args

edit

r is a random integer, just to ensure lack of caching

id is unchanging; may refer to document

v is always 2; probably protocol version

seq a monotonically increasing number, presumably referring to communication sequence number

Post args

edit

Posted JSON object. Keys:

m Message? Is always there.

type always COLLABROOM
data another object
type always USER_CHANGES
baseRev monotonically increasing (perhaps would not be with undos)
changeset string with complicated formatting here, defining the user changes. See below
apool: JSON object
0: JSON array
0 -> author
1 -> id that remains constant
nextnum always 1, so far

changeset format

edit
Z:5b>3=5*0 3$UOR

Z: unchanging. ???

colon: separator?

5b: monotonically increasing hex number

> separator?

3: character change length

equals sign: separator

5: offset where this insertion starts

star: may mean 'insertion'

0: doesn't change, not sure

space: separator

3: length again. May refer to the length expected after transformation applied, e.g. this insertion causes change in length from 0->3

dollar: separator

UOR: actual content

Save revision

edit

POSTetherpad:ep: padId:PiCvlh2WAJ

savedBy:Neil
savedById:g.nrrwxp0egigiulep
revNum:24

returns 200 OK:

 
[{"id":"ADz6G2T9gr","timestamp":1309560987757,"revNum":"24","savedById":"g.nrrwxp0egigiulep","label":"Revision 1","savedBy":"Neil"}] 

What is the relation between the padId and the Id we've seen in the other ones, 541001861914 ? If any? Doesn't seem to be base64, that would be NTQxMDAxODYxOTE0Cg==

Undo

edit
m:{"type":"COLLABROOM","data":{"type":"USER_CHANGES","baseRev":24,"changeset":"Z:6a<m-m$","apool":{"numToAttrib":{},"nextNum":0}}}

Redo

edit
m:{"type":"COLLABROOM","data":{"type":"USER_CHANGES","baseRev":31,"changeset":"Z:5o>m*0 m$zacharyzzzraSTRAWBERRY","apool":{"numToAttrib":{"0":["author","g.nrrwxp0egigiulep"]},"nextNum":1}}}

Note baseRev is still increasing, however Z has gone to 5o.

surprisingly it also explains how to do the redo, with text?


Change pad options

edit

e.g. to monospace

m:{"type":"COLLABROOM","data":{"type":"CLIENT_MESSAGE","payload":{"type":"padoptions","options":{"view":{"useMonospaceFont":true}},"changedBy":"Neil"}}}