Speed up web client initialization
This commit is contained in:
parent
ac396c0d13
commit
4a085f8662
|
@ -1,3 +1,6 @@
|
|||
0.1.5:
|
||||
- Speed up web client initialization
|
||||
|
||||
0.1.4:
|
||||
- Remove dependencies cli and testify
|
||||
|
||||
|
|
9
go.mod
9
go.mod
|
@ -5,12 +5,13 @@ go 1.14
|
|||
require (
|
||||
github.com/GeertJohan/go.rice v1.0.0
|
||||
github.com/daaku/go.zipexe v1.0.1 // indirect
|
||||
github.com/go-git/go-git/v5 v5.0.0
|
||||
github.com/go-git/go-git/v5 v5.1.0
|
||||
github.com/gorilla/mux v1.7.4
|
||||
github.com/gorilla/websocket v1.4.2
|
||||
github.com/imdario/mergo v0.3.10 // indirect
|
||||
github.com/pkg/errors v0.9.1
|
||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 // indirect
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f // indirect
|
||||
golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c // indirect
|
||||
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de // indirect
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381 // indirect
|
||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 // indirect
|
||||
gopkg.in/yaml.v2 v2.3.0
|
||||
)
|
||||
|
|
24
go.sum
24
go.sum
|
@ -9,7 +9,6 @@ github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYU
|
|||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY=
|
||||
github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E=
|
||||
github.com/daaku/go.zipexe v1.0.1 h1:wV4zMsDOI2SZ2m7Tdz1Ps96Zrx+TzaK15VbUaGozw0M=
|
||||
github.com/daaku/go.zipexe v1.0.1/go.mod h1:5xWogtqlYnfBXkSB1o9xysukNP9GTvaNkqzUZbt3Bw8=
|
||||
|
@ -28,14 +27,17 @@ github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agR
|
|||
github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
|
||||
github.com/go-git/go-git-fixtures/v4 v4.0.1 h1:q+IFMfLx200Q3scvt2hN79JsEzy4AmBTp/pqnefH+Bc=
|
||||
github.com/go-git/go-git-fixtures/v4 v4.0.1/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw=
|
||||
github.com/go-git/go-git/v5 v5.0.0 h1:k5RWPm4iJwYtfWoxIJy4wJX9ON7ihPeZZYC1fLYDnpg=
|
||||
github.com/go-git/go-git/v5 v5.0.0/go.mod h1:oYD8y9kWsGINPFJoLdaScGCN6dlKg23blmClfZwtUVA=
|
||||
github.com/go-git/go-git/v5 v5.1.0 h1:HxJn9g/E7eYvKW3Fm7Jt4ee8LXfPOm/H1cdDu8vEssk=
|
||||
github.com/go-git/go-git/v5 v5.1.0/go.mod h1:ZKfuPUoY1ZqIG4QG9BDBh3G4gLM5zvPuSJAozQrZuyM=
|
||||
github.com/google/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY=
|
||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||
github.com/gorilla/mux v1.7.4 h1:VuZ8uybHlWmqV03+zRzdwKL4tUnIp1MAQtp1mIFE1bc=
|
||||
github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
|
||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||
github.com/imdario/mergo v0.3.9/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA=
|
||||
github.com/imdario/mergo v0.3.10 h1:6q5mVkdH/vYmqngx7kZQTjJ5HRsx+ImorDIEQ+beJgc=
|
||||
github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
|
||||
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
|
||||
github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
|
||||
|
@ -67,23 +69,21 @@ github.com/xanzy/ssh-agent v0.2.1 h1:TCbipTQL2JiiCprBWx9frJ2eJlCYT00NmctrHxVAr70
|
|||
github.com/xanzy/ssh-agent v0.2.1/go.mod h1:mLlQY/MoOhWBj+gOGMQkOeiEvkx+8pJSI+0Bx9h2kr4=
|
||||
golang.org/x/crypto v0.0.0-20190219172222-a4c6cb3142f2/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073 h1:xMPOj6Pz6UipU1wXLkrtqpHbR0AVFnyPEQq/wRWz9lM=
|
||||
golang.org/x/crypto v0.0.0-20200302210943-78000ba7a073/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37 h1:cg5LA/zNPRzIXIWSCxQW10Rvpy94aQh3LT/ShoCpkHw=
|
||||
golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig=
|
||||
golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0=
|
||||
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f h1:QBjCr1Fz5kw158VqdE9JfI9cJnl/ymnJWAdMuinqL7Y=
|
||||
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU=
|
||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190221075227-b4e8571b14e0/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527 h1:uYVVQ9WP/Ds2ROhcaGPeIdVq0RIXVLwsHlnvJ+cT1So=
|
||||
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c h1:kISX68E8gSkNYAFRFiDU8rl5RIn1sJYKYb/r2vMLDrU=
|
||||
golang.org/x/sys v0.0.0-20200513112337-417ce2331b5c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1 h1:sIky/MyNRSHTrdxfsiUSS4WIAMvInbeXljJz+jDjeYE=
|
||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
|
||||
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||
|
|
12
notebook.go
12
notebook.go
|
@ -46,7 +46,7 @@ type Notebook struct {
|
|||
Repository *git.Repository `json:"-"`
|
||||
}
|
||||
|
||||
func (n *Notebook) getNote(id string) *Note {
|
||||
func (n *Notebook) getNote(id string, fetchBody bool) *Note {
|
||||
file := n.File(id)
|
||||
if file == nil {
|
||||
return nil
|
||||
|
@ -78,9 +78,11 @@ func (n *Notebook) getNote(id string) *Note {
|
|||
}
|
||||
note.Label = strings.Title(strings.Replace(note.Label, "-", " ", -1))
|
||||
|
||||
note.Body, err = file.Contents()
|
||||
if err != nil {
|
||||
return nil
|
||||
if fetchBody {
|
||||
note.Body, err = file.Contents()
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return note
|
||||
|
@ -101,7 +103,7 @@ func (n *Notebook) allNotes() map[string]*Note {
|
|||
notes := make(map[string]*Note)
|
||||
err = tree.Files().ForEach(func(f *object.File) error {
|
||||
noteID := hash(f.Name)
|
||||
note := n.getNote(noteID)
|
||||
note := n.getNote(noteID, true)
|
||||
notes[noteID] = note
|
||||
return nil
|
||||
})
|
||||
|
|
58
web.go
58
web.go
|
@ -85,7 +85,7 @@ func (s *StickSocket) handleRead() {
|
|||
c.Notebook = notebook
|
||||
|
||||
if noteID, ok := c.Data["note"]; ok {
|
||||
c.Note = notebook.getNote(noteID.(string))
|
||||
c.Note = notebook.getNote(noteID.(string), true)
|
||||
}
|
||||
break
|
||||
}
|
||||
|
@ -104,7 +104,7 @@ func (s *StickSocket) handleRead() {
|
|||
continue
|
||||
}
|
||||
}
|
||||
if c.Command != "delete" && c.Note != nil {
|
||||
if c.Command != "fetch" && c.Command != "delete" && c.Note != nil {
|
||||
if c.Modified != c.Note.ModifiedAt {
|
||||
s.Write(socketResponse("fail", "modified"))
|
||||
continue
|
||||
|
@ -224,7 +224,7 @@ type StickSocketCommand struct {
|
|||
type StickSocketHandler func(*StickSocket, *StickSocketCommand) *map[string]interface{}
|
||||
|
||||
var (
|
||||
SocketCommands = map[string]StickSocketHandler{"edit": webEdit, "check": webCheck, "delete": webDelete}
|
||||
SocketCommands = map[string]StickSocketHandler{"fetch": webFetch,"edit": webEdit, "check": webCheck, "delete": webDelete}
|
||||
SocketCommandLock sync.Mutex
|
||||
|
||||
WebSockets = make(map[int]*StickSocket)
|
||||
|
@ -344,30 +344,22 @@ func serveWeb() {
|
|||
func sendNote(ss *StickSocket, notebookID string, noteID string) {
|
||||
response := map[string]interface{}{}
|
||||
response["author"] = ss.Author.Name
|
||||
response["notebooks"] = map[string]*ServedNotebook{}
|
||||
response["notebookid"] = notebookID
|
||||
response["noteid"] = noteID
|
||||
|
||||
for _, notebook := range ss.Author.Notebooks {
|
||||
if notebook.ID != notebookID {
|
||||
continue
|
||||
}
|
||||
|
||||
notes := make(map[string]*Note)
|
||||
if noteID != "" {
|
||||
note := notebook.getNote(noteID)
|
||||
if note == nil {
|
||||
return
|
||||
}
|
||||
|
||||
notes[note.ID] = note
|
||||
} else {
|
||||
notes = notebook.allNotes()
|
||||
note := notebook.getNote(noteID, true)
|
||||
if note == nil {
|
||||
return
|
||||
}
|
||||
|
||||
snb := &ServedNotebook{Notebook: notebook, Notes: notes}
|
||||
response["notebooks"].(map[string]*ServedNotebook)[snb.ID] = snb
|
||||
break
|
||||
response["note"] = note
|
||||
}
|
||||
|
||||
response["delta"] = true
|
||||
ss.Write(&response)
|
||||
}
|
||||
|
||||
|
@ -394,7 +386,7 @@ func sendNotesSince(ss *StickSocket, modified int64) {
|
|||
|
||||
err = tree.Files().ForEach(func(f *object.File) error {
|
||||
noteID := hash(f.Name)
|
||||
note := notebook.getNote(noteID)
|
||||
note := notebook.getNote(noteID, false)
|
||||
if note == nil || note.ModifiedAt < modified {
|
||||
return nil
|
||||
}
|
||||
|
@ -431,6 +423,11 @@ func sendNotesSince(ss *StickSocket, modified int64) {
|
|||
ss.Write(&response)
|
||||
}
|
||||
|
||||
// Fetch a note
|
||||
func webFetch(s *StickSocket, c *StickSocketCommand) *map[string]interface{} {
|
||||
return &map[string]interface{}{"status": "success", "notebookid": c.Notebook.ID, "noteid": c.Note.ID, "note": c.Note}
|
||||
}
|
||||
|
||||
// Edit a note
|
||||
func webEdit(s *StickSocket, c *StickSocketCommand) *map[string]interface{} {
|
||||
if stick.Config.Debug {
|
||||
|
@ -498,7 +495,7 @@ func webEdit(s *StickSocket, c *StickSocketCommand) *map[string]interface{} {
|
|||
|
||||
if data == body {
|
||||
// TODO: Send unmodified message
|
||||
sendNotesSince(s, c.Note.ModifiedAt)
|
||||
sendNote(s, c.Notebook.ID, c.Note.ID)
|
||||
return socketResponse("success", "")
|
||||
}
|
||||
}
|
||||
|
@ -538,7 +535,7 @@ func webEdit(s *StickSocket, c *StickSocketCommand) *map[string]interface{} {
|
|||
CheckError(err)
|
||||
|
||||
if c.Note == nil {
|
||||
c.Note = c.Notebook.getNote(hash(fileName))
|
||||
c.Note = c.Notebook.getNote(hash(fileName), true)
|
||||
if c.Note == nil {
|
||||
return socketResponse("fail", "modified")
|
||||
}
|
||||
|
@ -701,22 +698,9 @@ func updateWebSockets(author *Author, notebookID string, noteID string) {
|
|||
return
|
||||
}
|
||||
|
||||
for _, notebook := range author.Notebooks {
|
||||
if notebook.ID != notebookID {
|
||||
continue
|
||||
for _, ss := range WebSockets {
|
||||
if ss.Author.Key == author.Key {
|
||||
sendNote(ss, notebookID, noteID)
|
||||
}
|
||||
|
||||
note := notebook.getNote(noteID)
|
||||
if note == nil {
|
||||
continue
|
||||
}
|
||||
|
||||
for _, ss := range WebSockets {
|
||||
if ss.Author.Key == author.Key {
|
||||
sendNote(ss, notebookID, noteID)
|
||||
}
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
|
|
|
@ -190,35 +190,47 @@ function ConnectStick() {
|
|||
Pinned = data.pinned;
|
||||
}
|
||||
}
|
||||
if (data.hasOwnProperty("notebooks")) {
|
||||
var mustRender = false;
|
||||
nowconnected = true;
|
||||
if (data.hasOwnProperty("note") || data.hasOwnProperty("notebooks")) {
|
||||
if (data.hasOwnProperty("note")) {
|
||||
Notebooks[data["notebookid"]].Notes[data["noteid"]] = data["note"];
|
||||
|
||||
if (data.hasOwnProperty("delta")) {
|
||||
for (var nbid in data.notebooks) {
|
||||
for (var nid in data.notebooks[nbid].Notes) {
|
||||
Notebooks[nbid].Notes[nid] = data.notebooks[nbid].Notes[nid];
|
||||
if (Notebooks[data["notebookid"]].Notes[data["noteid"]].ModifiedAt > NotebooksModified) {
|
||||
NotebooksModified = Notebooks[data["notebookid"]].Notes[data["noteid"]].ModifiedAt; // TODO Not needed?
|
||||
}
|
||||
|
||||
if (Notebooks[nbid].Notes[nid].ModifiedAt > NotebooksModified) {
|
||||
NotebooksModified = Notebooks[nbid].Notes[nid].ModifiedAt;
|
||||
}
|
||||
if (NoteMode === "view" && data["notebookid"] === ViewNotebook && data["noteid"] === ViewNote) {
|
||||
mustRender = true;
|
||||
}
|
||||
} else if (data.hasOwnProperty("notebooks")) {
|
||||
var mustRender = false;
|
||||
nowconnected = true;
|
||||
|
||||
if (NoteMode === "view" && nbid === ViewNotebook && nid === ViewNote) {
|
||||
mustRender = true;
|
||||
if (data.hasOwnProperty("delta")) {
|
||||
for (var nbid in data.notebooks) {
|
||||
for (var nid in data.notebooks[nbid].Notes) {
|
||||
Notebooks[nbid].Notes[nid] = data.notebooks[nbid].Notes[nid];
|
||||
|
||||
if (Notebooks[nbid].Notes[nid].ModifiedAt > NotebooksModified) {
|
||||
NotebooksModified = Notebooks[nbid].Notes[nid].ModifiedAt;
|
||||
}
|
||||
|
||||
if (NoteMode === "view" && nbid === ViewNotebook && nid === ViewNote) {
|
||||
mustRender = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Notebooks = data.notebooks;
|
||||
} else {
|
||||
Notebooks = data.notebooks;
|
||||
|
||||
for (var nbid in data.notebooks) {
|
||||
for (var nid in data.notebooks[nbid].Notes) {
|
||||
if (Notebooks[nbid].Notes[nid].ModifiedAt > NotebooksModified) {
|
||||
NotebooksModified = Notebooks[nbid].Notes[nid].ModifiedAt;
|
||||
}
|
||||
for (var nbid in data.notebooks) {
|
||||
for (var nid in data.notebooks[nbid].Notes) {
|
||||
if (Notebooks[nbid].Notes[nid].ModifiedAt > NotebooksModified) {
|
||||
NotebooksModified = Notebooks[nbid].Notes[nid].ModifiedAt;
|
||||
}
|
||||
|
||||
if (NoteMode === "view" && nbid === ViewNotebook && nid === ViewNote) {
|
||||
mustRender = true;
|
||||
if (NoteMode === "view" && nbid === ViewNotebook && nid === ViewNote) {
|
||||
mustRender = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -247,11 +259,25 @@ function ConnectStick() {
|
|||
if (mustRender) {
|
||||
render();
|
||||
}
|
||||
|
||||
|
||||
if (nowconnected) {
|
||||
connected = true;
|
||||
}
|
||||
|
||||
if (data.hasOwnProperty("delta")) {
|
||||
for (var nbid in data.notebooks) {
|
||||
for (var nid in data.notebooks[nbid].Notes) {
|
||||
fetchNote(nbid, nid);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (var nbid in data.notebooks) {
|
||||
for (var nid in data.notebooks[nbid].Notes) {
|
||||
fetchNote(nbid, nid);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mustNavigate) {
|
||||
if (ViewNote === "") {
|
||||
if (history.length > 2) {
|
||||
|
@ -289,6 +315,11 @@ function ConnectStick() {
|
|||
};
|
||||
}
|
||||
|
||||
function fetchNote(notebook, note) {
|
||||
payload = {command: "fetch", notebook: notebook, note: note};
|
||||
socket.send(JSON.stringify(payload));
|
||||
}
|
||||
|
||||
function viewNote(notebook, note) {
|
||||
NoteMode = "view";
|
||||
ViewNotebook = notebook;
|
||||
|
|
Loading…
Reference in New Issue