Compare commits
No commits in common. "dd3723851076b7b4ed194b58f097fad312102667" and "06d860c60192c3c7be75bf1948fac9739b3510f3" have entirely different histories.
dd37238510
...
06d860c601
13
cista/api.py
13
cista/api.py
@ -37,23 +37,16 @@ async def upload(req, ws):
|
|||||||
)
|
)
|
||||||
req = msgspec.json.decode(text, type=FileRange)
|
req = msgspec.json.decode(text, type=FileRange)
|
||||||
pos = req.start
|
pos = req.start
|
||||||
while True:
|
data = None
|
||||||
data = await ws.recv()
|
while pos < req.end and (data := await ws.recv()) and isinstance(data, bytes):
|
||||||
if not isinstance(data, bytes):
|
|
||||||
break
|
|
||||||
if len(data) > req.end - pos:
|
|
||||||
raise ValueError(
|
|
||||||
f"Expected up to {req.end - pos} bytes, got {len(data)} bytes"
|
|
||||||
)
|
|
||||||
sentsize = await alink(("upload", req.name, pos, data, req.size))
|
sentsize = await alink(("upload", req.name, pos, data, req.size))
|
||||||
pos += typing.cast(int, sentsize)
|
pos += typing.cast(int, sentsize)
|
||||||
if pos >= req.end:
|
|
||||||
break
|
|
||||||
if pos != req.end:
|
if pos != req.end:
|
||||||
d = f"{len(data)} bytes" if isinstance(data, bytes) else data
|
d = f"{len(data)} bytes" if isinstance(data, bytes) else data
|
||||||
raise ValueError(f"Expected {req.end - pos} more bytes, got {d}")
|
raise ValueError(f"Expected {req.end - pos} more bytes, got {d}")
|
||||||
# Report success
|
# Report success
|
||||||
res = StatusMsg(status="ack", req=req)
|
res = StatusMsg(status="ack", req=req)
|
||||||
|
print("ack", res)
|
||||||
await asend(ws, res)
|
await asend(ws, res)
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,11 +34,9 @@ class File:
|
|||||||
self.open_rw()
|
self.open_rw()
|
||||||
assert self.fd is not None
|
assert self.fd is not None
|
||||||
if file_size is not None:
|
if file_size is not None:
|
||||||
assert pos + len(buffer) <= file_size
|
|
||||||
os.ftruncate(self.fd, file_size)
|
os.ftruncate(self.fd, file_size)
|
||||||
if buffer:
|
os.lseek(self.fd, pos, os.SEEK_SET)
|
||||||
os.lseek(self.fd, pos, os.SEEK_SET)
|
os.write(self.fd, buffer)
|
||||||
os.write(self.fd, buffer)
|
|
||||||
|
|
||||||
def __getitem__(self, slice):
|
def __getitem__(self, slice):
|
||||||
if self.fd is None:
|
if self.fd is None:
|
||||||
|
@ -234,7 +234,7 @@ let modifiedTimer: any = null
|
|||||||
const updateModified = () => {
|
const updateModified = () => {
|
||||||
for (const doc of props.documents) doc.modified = formatUnixDate(doc.mtime)
|
for (const doc of props.documents) doc.modified = formatUnixDate(doc.mtime)
|
||||||
}
|
}
|
||||||
onMounted(() => { updateModified(); modifiedTimer = setInterval(updateModified, 1000) })
|
onMounted(() => { modifiedTimer = setInterval(updateModified, 1000) })
|
||||||
onUnmounted(() => { clearInterval(modifiedTimer) })
|
onUnmounted(() => { clearInterval(modifiedTimer) })
|
||||||
const mkdir = (doc: Document, name: string) => {
|
const mkdir = (doc: Document, name: string) => {
|
||||||
const control = connect(controlUrl, {
|
const control = connect(controlUrl, {
|
||||||
|
@ -19,10 +19,9 @@ type CloudFile = {
|
|||||||
|
|
||||||
function uploadHandler(event: Event) {
|
function uploadHandler(event: Event) {
|
||||||
event.preventDefault()
|
event.preventDefault()
|
||||||
|
event.stopPropagation()
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
const input = event.target as HTMLInputElement | null
|
const infiles = Array.from(event.dataTransfer?.files || event.target.files) as File[]
|
||||||
const infiles = Array.from((input ?? (event as DragEvent).dataTransfer)?.files ?? []) as File[]
|
|
||||||
if (input) input.value = ''
|
|
||||||
if (!infiles.length) return
|
if (!infiles.length) return
|
||||||
const loc = props.path!.join('/')
|
const loc = props.path!.join('/')
|
||||||
let files = []
|
let files = []
|
||||||
@ -166,6 +165,10 @@ const worker = async () => {
|
|||||||
const ws = await WSCreate()
|
const ws = await WSCreate()
|
||||||
while (upqueue.length) {
|
while (upqueue.length) {
|
||||||
const f = upqueue[0]
|
const f = upqueue[0]
|
||||||
|
if (f.cloudPos === f.file.size) {
|
||||||
|
upqueue.shift()
|
||||||
|
continue
|
||||||
|
}
|
||||||
const start = f.cloudPos
|
const start = f.cloudPos
|
||||||
const end = Math.min(f.file.size, start + (1<<20))
|
const end = Math.min(f.file.size, start + (1<<20))
|
||||||
const control = { name: f.cloudName, size: f.file.size, start, end }
|
const control = { name: f.cloudName, size: f.file.size, start, end }
|
||||||
@ -176,7 +179,6 @@ const worker = async () => {
|
|||||||
ws.sendMsg(control)
|
ws.sendMsg(control)
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
await ws.sendData(data)
|
await ws.sendData(data)
|
||||||
if (f.cloudPos === f.file.size) upqueue.shift()
|
|
||||||
}
|
}
|
||||||
if (upqueue.length) startWorker()
|
if (upqueue.length) startWorker()
|
||||||
uprogress.status = "idle"
|
uprogress.status = "idle"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user