from __future__ import unicode_literals
from codeop import Compile
import os
import sys
import json
import traceback
import platform
import struct
NODE_CHANNEL_FD = int(os.environ['NODE_CHANNEL_FD'])
UNICODE_TYPE = unicode if sys.version_info[0] == 2 else str
if sys.version_info[0] <= 2:
# print('PY2')
def _exec(_code_, _globs_):
exec('exec _code_ in _globs_')
else:
_exec = getattr(__builtins__, 'exec')
_locals = {'__name__': '__console__', '__doc__': None}
_compile = Compile()
if platform.system() == 'Windows':
# hacky reimplementation of https://github.com/nodejs/node/blob/master/deps/uv/src/win/pipe.c
def read_data(f):
header = f.read(16)
if not header:
return header
try:
msg_length, = struct.unpack('', 'exec'), _locals)
response = dict(type='success')
else:
value = eval(_compile(data['code'], '', 'eval'), _locals)
response = dict(type='success', value=value)
except:
t, e, tb = sys.exc_info()
response = dict(type='exception', value=format_exception(t, e, tb))
data = json.dumps(response, separators=(',', ':')).encode('utf-8') + b'\n'
write_data(writer, data)
# Closing is messy
try:
reader.close()
except IOError:
pass
try:
writer.close()
except IOError:
pass