Skip to content

Commit fdb1b34

Browse files
authored
Merge pull request #400 from appwrite/feat-resumable-upload-node
Feat: Node resumable upload
2 parents adc9500 + 6ac9040 commit fdb1b34

File tree

1 file changed

+56
-41
lines changed

1 file changed

+56
-41
lines changed

templates/node/lib/services/service.js.twig

Lines changed: 56 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -50,63 +50,78 @@ class {{ service.name | caseUcfirst }} extends Service {
5050
const { size: size } = await promisify(fs.stat)({{ parameter.name | caseCamel | escapeKeyword }});
5151

5252
if (size <= client.CHUNK_SIZE) {
53-
payload['{{ parameter.name }}'] = fs.createReadStream({{ parameter.name | caseCamel | escapeKeyword }});
53+
payload['{{ parameter.name }}'] = fs.createReadStream({{ parameter.name | caseCamel | escapeKeyword }});
5454

55-
return await this.client.call('{{ method.method | caseLower }}', path, {
55+
return await this.client.call('{{ method.method | caseLower }}', path, {
5656
{% for parameter in method.parameters.header %}
5757
'{{ parameter.name }}': ${{ parameter.name | caseCamel | escapeKeyword }},
5858
{% endfor %}
5959
{% for key, header in method.headers %}
6060
'{{ key }}': '{{ header }}',
6161
{% endfor %}
62-
}, payload{% if method.type == 'location' %}, 'arraybuffer'{% endif %});
62+
}, payload{% if method.type == 'location' %}, 'arraybuffer'{% endif %});
6363
} else {
64-
let id = undefined;
65-
let response = undefined;
64+
let id = undefined;
65+
let response = undefined;
6666

67-
const totalCounters = Math.ceil(size / client.CHUNK_SIZE);
67+
let counter = 0;
68+
const totalCounters = Math.ceil(size / client.CHUNK_SIZE);
6869

69-
for (let counter = 0; counter < totalCounters; counter++) {
70-
const start = (counter * client.CHUNK_SIZE);
71-
const end = Math.min((((counter * client.CHUNK_SIZE) + client.CHUNK_SIZE) - 1), size);
72-
const headers = {
70+
const headers = {
7371
{% for parameter in method.parameters.header %}
74-
'{{ parameter.name }}': ${{ parameter.name | caseCamel | escapeKeyword }},
72+
'{{ parameter.name }}': ${{ parameter.name | caseCamel | escapeKeyword }},
7573
{% endfor %}
7674
{% for key, header in method.headers %}
77-
'{{ key }}': '{{ header }}',
75+
'{{ key }}': '{{ header }}',
76+
{% endfor %}
77+
};
78+
79+
{% for parameter in method.parameters.all %}
80+
{% if parameter.isUploadID %}
81+
if({{ parameter.name | caseCamel | escapeKeyword }} != 'unique()') {
82+
try {
83+
response = await this.client.call('get', path + '/' + {{ parameter.name }}, headers);
84+
counter = response.chunksUploaded;
85+
} catch(e) {
86+
}
87+
}
88+
{% endif %}
7889
{% endfor %}
79-
'content-range': 'bytes ' + start + '-' + end + '/' + size
80-
};
81-
82-
if (id) {
83-
headers['x-{{spec.title | caseLower }}-id'] = id;
84-
}
85-
86-
const stream = fs.createReadStream({{ parameter.name | caseCamel | escapeKeyword }}, {
87-
start,
88-
end
89-
});
90-
payload['{{ parameter.name }}'] = stream;
91-
92-
response = await this.client.call('{{ method.method | caseLower }}', path, headers, payload{% if method.type == 'location' %}, 'arraybuffer'{% endif %});
93-
94-
if (!id) {
95-
id = response['$id'];
96-
}
97-
98-
if (onProgress !== null) {
99-
onProgress({
100-
$id: response['$id'],
101-
progress: Math.min((counter+1) * client.CHUNK_SIZE, size) / size * 100,
102-
sizeUploaded: end+1,
103-
chunksTotal: response['chunksTotal'],
104-
chunksUploaded: response['chunksUploaded']
105-
});
106-
}
90+
91+
for (counter; counter < totalCounters; counter++) {
92+
const start = (counter * client.CHUNK_SIZE);
93+
const end = Math.min((((counter * client.CHUNK_SIZE) + client.CHUNK_SIZE) - 1), size);
94+
95+
headers['content-range'] = 'bytes ' + start + '-' + end + '/' + size;
96+
97+
if (id) {
98+
headers['x-{{spec.title | caseLower }}-id'] = id;
99+
}
100+
101+
const stream = fs.createReadStream({{ parameter.name | caseCamel | escapeKeyword }}, {
102+
start,
103+
end
104+
});
105+
payload['{{ parameter.name }}'] = stream;
106+
107+
response = await this.client.call('{{ method.method | caseLower }}', path, headers, payload{% if method.type == 'location' %}, 'arraybuffer'{% endif %});
108+
109+
if (!id) {
110+
id = response['$id'];
111+
}
112+
113+
if (onProgress !== null) {
114+
onProgress({
115+
$id: response['$id'],
116+
progress: Math.min((counter+1) * client.CHUNK_SIZE, size) / size * 100,
117+
sizeUploaded: end+1,
118+
chunksTotal: response['chunksTotal'],
119+
chunksUploaded: response['chunksUploaded']
120+
});
107121
}
122+
}
108123

109-
return response;
124+
return response;
110125
}
111126
{% endif %}
112127
{% endfor %}

0 commit comments

Comments
 (0)