1. W E B V E V E R I E T
JavaScript Topic Maps in
server environments
Jan Schreiber <jans@ravn.no>
Ravn Webveveriet AS, 2010-10-01
1
2. Outline
• JavaScript
• The tmjs Topic Maps engine
• Use Case: A PSI Server
• Outlook
W E B V E V E R I E T
2
3. JavaScript
• JavaScript is LISP with a C-like syntax
• Virtually every personal computer in
the world has at least one JavaScript
interpreter installed on it and in active
use.
W E B V E V E R I E T
3
4. tmjs
• A Topic Maps engine
• Written in pure JavaScript
• Full TMDM including Variants
• TMAPI 2.0-based
• In-memory backend, JTM import/
export, experimental XTM 2.0 import
(requires DOM)
W E B V E V E R I E T
4
5. tmjs
• Platform independent: All(iPhone &
browsers, mobile devices
modern
Android), server-side JavaScript
• Unit tests, CXTM tests (partly) & JSLint
validating
• Small changes to TMAPI due to the lack of
method overloading
• Syntactic sugar: Supports chaining of
TMAPI calls
W E B V E V E R I E T
5
6. Chaining
1 tm.createTopic().addSubjectIdentifier(foo).
2 createName('bar').getParent().
3 createOccurrence(type,'baz').
4 addScopingTopic(quux);
W E B V E V E R I E T
6
7. tmjs: Outlook
• More import/export formats: XTM 2.0, CTM
• Complete TMAPI, add more tests, full CXTM
• Persistence:
• Web SQL Database backend
• Persistent backend for Node (couchdb?)
• Later: Query language
W E B V E V E R I E T
7
8. Use Case: A PSI Server
• Idea: Start the server with a Topic Map
and it will serve information about all
Subject Identifiers for a given domain
W E B V E V E R I E T
8
10. Server-side JavaScript
• 1996: Netscape releases LiveWire as
part of Netscape Enterprise Server 2.0
• 2009: Ryan Dahl writes Node
W E B V E V E R I E T
10
11. Node
• A framework for low-level network
applications based on Google's V8
engine
• TCP, DNS and HTTP are first-class
protocols
• Event-based, asynchronous
programming
• All I/O is non-blocking
W E B V E V E R I E T
11
14. db_query(db, "SELECT * FROM topic", callback);
callback = function (err, result) {
// ...
}
W E B V E V E R I E T
14
15. 1 var tm, servername;
2 // assumes that the TopicMap object tm has been initialized and
3 // the topic map in question has been imported successfuly.
4 // servername is set from a command line parameter
5 http.createServer(function (req, res) {
6 var url = 'http://'+servername+req.url, loc, topic;
7 loc = tm.createLocator(url);
8 topic = tm.getTopicBySubjectIdentifier(loc);
9 if (topic) {
10 res.writeHead(200, {'Content-Type': 'text/html'});
11 // create a page with information about the PSI
12 } else {
13 // Not found: create a 404 response
14 }
15 res.close();
16 }).listen(80);
W E B V E V E R I E T
15
16. Use Case: A PSI Server
• More output formats: XHTML, JTM, XTM
• Support for logging, caching, templates
• Configurable list of information elements
that are included on generated pages (e.g.
dc:description, supertype-subtype)
• PSI black-listing
• subj3ct.com integration
W E B V E V E R I E T
16
17. PSI Server: Observations
• Easy to implement
• It’s really fast: 200+200ms to read the
Opera topic map, 1ms to serve a PSI
page
• tmjs can be used on server and client
side Reuse of application code
W E B V E V E R I E T
17
18. Summary & Outlook
• Server side Topic Maps with JavaScript:
possible!
• Asynchronous TMAPI?
• In its current state maybe best suited
for low-level applications
W E B V E V E R I E T
18
19. What could it be good for?
• TMRAP, TM REST API
• SDshare
• P2P applications
• DNS servers
W E B V E V E R I E T
19
20. Questions?
Download tmjs now!
http://github.com/jansc/tmjs
Coming soon:
http://github.com/jansc/node-psi-server
W E B V E V E R I E T
20