2012������09·���
2012������09·���29������
chrome¾�����������¡�Web\µ���¼\Ð���¼�����ҏ���돢�«���·�����������Ώ�����
Chrome Apps v2's socket api
Chrome ������ Web apps���� manifest v2 �����������Џ�������������¡��½������µ����½��¡��������� Packaged Apps ���̏��������������������Џ��������������������������������¹��¡�
���³������ socket api ���������¹���̏�¡��³������������������ tcp \½\��\���\���������\µ���¼\Ð���¼�����ҏ��폢�������������³���������̏�����������������«������������(listen���������«accept������\���\½\���\������̏��µ���«������������)�������������¹���̏�¡�돫ҏ����� Google API Expert MTG������ µ����������µ���������«��������¡��ӏ�돫ҏ�����Chromium������¼��������؏��µ�����������ď����Ώ����ď�������¡ߏ�����������¾��Ï����я��̏�¡����������������Ï��³��������������¡���������������ޏ�����Web\µ���¼\Ð���¼�����ҏ���돢�«���·�����������Ώ��������·�����ď��Ï��Ï��Ï����������������Ï������̏����䏢����Entry���������¹��¡�(¼¹������»��Џ�������������������¡��¹��������������¡�canary build����������������돢�������������������������¹����
�����������������Ï��³��������������¡���������\³���¼\���������¾���²��Ï��·���������¹��¡���Chrome������돪����·canary build 24.0.1280.0 ������³���������·���������������������¹��¡����������쏢¡�chrome://flags��������¡�����»����³�ޏ�ď����Џ�����������³������\µ����½ API ��¡������ҏ�������⏢�������¹���������������ҏ����쏪���돢��������������������
\µ\���\��\���\³���¼\���
manifest.json
{ "manifest_version": 2, "name": "simple HTTP server", "description": "something what ridiculous simple web server", "version": "0.1", "minimum_chrome_version": "24", "app": { "background": { "scripts": ["httpserver.js"] } }, "permissions": [ "experimental", {"socket": [ "tcp-listen" ]} ] }
permissions��������¡�tcp-listen������»������������¹��������������\���\½���������¹��¡�
httpserver.js
function t2ab(str /* String */) { var buffer = new ArrayBuffer(str.length); var view = new DataView(buffer); for(var i = 0, l = str.length; i < l; i++) { view.setInt8(i, str.charAt(i).charCodeAt()); } return buffer; } function ab2t(buffer /* ArrayBuffer */) { var arr = new Int8Array(buffer); var str = ""; for(var i = 0, l = arr.length; i < l; i++) { str += String.fromCharCode.call(this, arr[i]); } return str; } var RESPHEAD = [ "HTTP/1.1 200 OK", "Server: chrome24", "Content-Length: {%len%}", "Connection: Close", "Content-Type: text/html" ] RESPHEAD = RESPHEAD.join("\r\n")+"\r\n\r\n"; var RESP = [ "<!doctype html>", "<html>", "<head>", "</head>", "<body>", "<h1>Welcome!!</h1>", "<p>this web server is built w/ chrome's packaged apps v2 feature</p>", "</body>", "</html>" ] RESP = RESP.join("\r\n"); var response = function(str){ var len = str.length; return RESPHEAD.replace("{%len%}", len)+str; } var rtw = function(sid) { // [TODO] // call recursive for keep-alive features // currently, I haven't tested. chrome.socket.read(sid, 65535, function(e){ console.log(ab2t(e.data)); if(e.resultCode < 0) { chrome.socket.destroy(sid); return; } chrome.socket.write(sid, t2ab(response(RESP)), function(e){ // [TODO] check datasize console.dir(e); rtw(sid); }); }); } chrome.socket.create('tcp', {}, function(e){ var s = e; chrome.socket.listen(s.socketId, "0.0.0.0", 0, 10, function(e){ chrome.socket.getInfo(s.socketId, function(e){ console.log("Local web server's URL => http://localhost:"+e.localPort+"/"); // you can check listen port :) }); var accept_ = function(sid){ chrome.socket.accept(sid, function(e){ rtw(e.socketId); accept_(s.socketId); }); } accept_(s.socketId); }); });
tcp������accept���·�����ď���������¡�돩�������accept�����ҏ��������Ð��������������������¡�2²��я�����돪�¹��Ώ�����tcp�����䏪�³����\���\���\���\�����������������������������ď������������³��������돢돫��µ���·�������������«�������������Ï��Ï��Ï�����¡���������������𡯏����롭�������ޏ��������������������������������������Ï��³��������������¡�돩�µ������½��Џ��������������������������¹�������³������½��Џ��������������������¡�\���\���\������̏�������������ġ������叢��
����돢돫�³������
¾���µ\³���¼\��������� github�����������ӏ����������������쏢����������·�����ď�¡�chrome://extensions ���������³������������\���\���\¹\������¼\������¹��������������������\���\���\���\���\��Џ��¼\������¼\�����¡ߏ�����\���\��\���\��������ҏ����Џ�������¡���\���\���\�ޏ��¼\���²½���µ������������������������������³������\µ����½�����ҏ�����������¹��Џ�������¡ߏ�������¡�³��돪���ӏ�����\���\���\���\������¼������»���������������¡�\Ð\���\���\��\���\���\���\���\��\���\»\¹���������·������Web\µ���¼\Ð���¼����µ�������돢�·���������¹��¡�
���³���³��������¡�simple HTTP server��������\���\������¼�����ҏ������돢�: _generated_background_page.html��¡ߏ�����\���\���\���\������¹������������ dev tools ����µ�������돢�·���������¹��¡��³���³��������¡�\³\���\½���¼\���������\���\��ӏ�����\���\���\���\������¹��������������¡�Web\µ���¼\Ð���¼������URL���̏��½¼�����µ���������������������������¹��¡�
���½������URL������\���\���\���\��������\��\���\»\¹���¹��������������¡�돪�²¼������²������������̏��½¼�����µ���������������¹��¡���Web\µ���¼\Ð���¼����������돢���������������������������ď�������¡�\���\���\���\�������������������Ð�����������я�������������¡�\��\���\»\¹²������½���������¹��¡�돪�²¼������\¹\���\������¼\���\·\���\���\��������� FireFox������Safari���«������\��\���\»\¹���·������¾���¹�������
�����������я�����\���\���\��\¹\������������Ð���·��������������¡�ޡ돫�\���\½���¼\¹���·���«�����ӏ��µ�����������������\·\���\��\���������Web\µ���¼\Ð���¼����µ�������돢�·���������·�����ġ��
������������������
����²��я�����\���\¹\�����������������¡�Chrome apps v2��������������µ����½�����¡돫������� socket api ��������������������������¡�
- ��돫ҏ����䏢����������������¼��������؏��µ������������ tcp\µ���¼\Ð���¼������API
- \µ\���\��\������������·������Web\µ���¼\Ð���¼������\³���¼\���
��ď��µ���\���\���\��\���\���\\���\�돢����