Skip to content

Commit 1016344

Browse files
committed
fix: update chunked upload method
1 parent fc582d3 commit 1016344

File tree

5 files changed

+129
-139
lines changed

5 files changed

+129
-139
lines changed

templates/web/src/services/template.ts.twig

Lines changed: 13 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,6 @@ export class {{ service.name | caseUcfirst }} extends Service {
8585

8686
if (size <= Service.CHUNK_SIZE) {
8787
return await this.client.call('{{ method.method | caseLower }}', uri, {
88-
8988
{% for parameter in method.parameters.header %}
9089
'{{ parameter.name | caseCamel | escapeKeyword }}': this.client.${{ parameter.name | caseCamel | escapeKeyword }},
9190
{% endfor %}
@@ -94,8 +93,6 @@ export class {{ service.name | caseUcfirst }} extends Service {
9493
{% endfor %}
9594
}, payload);
9695
}
97-
let id = undefined;
98-
let response = undefined;
9996

10097
const apiHeaders: { [header: string]: string } = {
10198
{% for parameter in method.parameters.header %}
@@ -106,50 +103,43 @@ export class {{ service.name | caseUcfirst }} extends Service {
106103
{% endfor %}
107104
}
108105

109-
let counter = 0;
110-
const totalCounters = Math.ceil(size / Service.CHUNK_SIZE);
106+
let offset = 0;
107+
let response = undefined;
111108
{% for parameter in method.parameters.all %}
112109
{% if parameter.isUploadID %}
113110
if({{ parameter.name | caseCamel | escapeKeyword }} != 'unique()') {
114111
try {
115112
response = await this.client.call('GET', new URL(this.client.config.endpoint + apiPath + '/' + {{ parameter.name }}), apiHeaders);
116-
counter = response.chunksUploaded;
113+
offset = response.chunksUploaded * Service.CHUNK_SIZE;
117114
} catch(e) {
118115
}
119116
}
120117
{% endif %}
121118
{% endfor %}
122119

123-
for (counter; counter < totalCounters; counter++) {
124-
const start = (counter * Service.CHUNK_SIZE);
125-
const end = Math.min((((counter * Service.CHUNK_SIZE) + Service.CHUNK_SIZE) - 1), size);
126-
127-
apiHeaders['content-range'] = 'bytes ' + start + '-' + end + '/' + size
128-
129-
if (id) {
130-
apiHeaders['x-{{spec.title | caseLower }}-id'] = id;
131-
}
132-
133-
const stream = {{ parameter.name | caseCamel | escapeKeyword }}.slice(start, end + 1);
134-
payload['{{ parameter.name }}'] = new File([stream], {{ parameter.name | caseCamel | escapeKeyword }}.name);
120+
while (offset < size) {
121+
let end = Math.min(offset + Service.CHUNK_SIZE - 1, size - 1);
135122

123+
const chunk = {{ parameter.name | caseCamel | escapeKeyword }}.slice(offset, end + 1);
124+
payload['{{ parameter.name }}'] = new File([chunk], {{ parameter.name | caseCamel | escapeKeyword }}.name);
125+
apiHeaders['content-range'] = 'bytes ' + offset + '-' + end + '/' + size;
136126
response = await this.client.call('{{ method.method | caseLower }}', uri, apiHeaders, payload);
137127

138-
if (!id) {
139-
id = response['$id'];
128+
offset += Service.CHUNK_SIZE;
129+
if (offset < size) {
130+
apiHeaders['x-{{spec.title | caseLower }}-id'] = response.$id;
140131
}
141132

142133
if (onProgress) {
143134
onProgress({
144135
$id: response.$id,
145-
progress: Math.min((counter + 1) * Service.CHUNK_SIZE, size) / size * 100,
146-
sizeUploaded: end,
136+
progress: Math.min(offset, size) / size * 100,
137+
sizeUploaded: Math.min(offset, size),
147138
chunksTotal: response.chunksTotal,
148139
chunksUploaded: response.chunksUploaded
149140
});
150141
}
151142
}
152-
153143
return response;
154144
{% endif %}
155145
{% endfor %}

tests/Base.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ abstract class Base extends TestCase
114114
public function setUp(): void
115115
{
116116
$headers = "x-sdk-name: {$this->sdkName}; x-sdk-platform: {$this->sdkPlatform}; x-sdk-language: {$this->sdkLanguage}; x-sdk-version: {$this->version}";
117-
// array_push($this->expectedOutput, $headers);
117+
array_push($this->expectedOutput, $headers);
118118
}
119119

120120
public function tearDown(): void
@@ -187,7 +187,7 @@ public function testHTTPSuccess(): void
187187

188188
ob_end_clean();
189189
echo "Env Executing: {$this->command}\n";
190-
// ob_start();
190+
ob_start();
191191

192192
exec($this->command, $output);
193193

tests/WebChromiumTest.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ class WebChromiumTest extends Base
2222
'docker run --rm -v $(pwd):/app -e BROWSER=chromium -w /app/tests/sdks/web mcr.microsoft.com/playwright:v1.15.0-focal node tests.js';
2323

2424
protected array $expectedOutput = [
25-
// ...Base::FOO_RESPONSES,
26-
// ...Base::BAR_RESPONSES,
27-
// ...Base::GENERAL_RESPONSES,
25+
...Base::FOO_RESPONSES,
26+
...Base::BAR_RESPONSES,
27+
...Base::GENERAL_RESPONSES,
2828
...Base::LARGE_FILE_RESPONSES,
29-
// ...Base::EXCEPTION_RESPONSES,
30-
// ...Base::REALTIME_RESPONSES,
31-
// ...Base::QUERY_HELPER_RESPONSES,
32-
// ...Base::PERMISSION_HELPER_RESPONSES,
33-
// ...Base::ID_HELPER_RESPONSES
29+
...Base::EXCEPTION_RESPONSES,
30+
...Base::REALTIME_RESPONSES,
31+
...Base::QUERY_HELPER_RESPONSES,
32+
...Base::PERMISSION_HELPER_RESPONSES,
33+
...Base::ID_HELPER_RESPONSES
3434
];
3535
}

tests/languages/web/index.html

Lines changed: 104 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -29,53 +29,53 @@
2929
client.setProject('console');
3030
client.setEndpointRealtime('ws://demo.appwrite.io/v1');
3131

32-
// client.subscribe('tests', event => {
33-
// responseRealtime = event.payload.response;
34-
// });
32+
client.subscribe('tests', event => {
33+
responseRealtime = event.payload.response;
34+
});
3535

36-
// // Foo
37-
// response = await foo.get('string', 123, ["string in array"]);
38-
// console.log(response.result);
36+
// Foo
37+
response = await foo.get('string', 123, ["string in array"]);
38+
console.log(response.result);
3939

40-
// response = await foo.post('string', 123, ["string in array"]);
41-
// console.log(response.result);
40+
response = await foo.post('string', 123, ["string in array"]);
41+
console.log(response.result);
4242

43-
// response = await foo.put('string', 123, ["string in array"]);
44-
// console.log(response.result);
43+
response = await foo.put('string', 123, ["string in array"]);
44+
console.log(response.result);
4545

46-
// response = await foo.patch('string', 123, ["string in array"]);
47-
// console.log(response.result);
46+
response = await foo.patch('string', 123, ["string in array"]);
47+
console.log(response.result);
4848

49-
// response = await foo.delete('string', 123, ["string in array"]);
50-
// console.log(response.result);
49+
response = await foo.delete('string', 123, ["string in array"]);
50+
console.log(response.result);
5151

52-
// // Bar
53-
// response = await bar.get("string", 123, ["string in array"]);
54-
// console.log(response.result);
52+
// Bar
53+
response = await bar.get("string", 123, ["string in array"]);
54+
console.log(response.result);
5555

56-
// response = await bar.post("string", 123, ["string in array"]);
57-
// console.log(response.result);
56+
response = await bar.post("string", 123, ["string in array"]);
57+
console.log(response.result);
5858

59-
// response = await bar.put("string", 123, ["string in array"]);
60-
// console.log(response.result);
59+
response = await bar.put("string", 123, ["string in array"]);
60+
console.log(response.result);
6161

62-
// response = await bar.patch("string", 123, ["string in array"]);
63-
// console.log(response.result);
62+
response = await bar.patch("string", 123, ["string in array"]);
63+
console.log(response.result);
6464

65-
// response = await bar.delete("string", 123, ["string in array"]);
66-
// console.log(response.result);
65+
response = await bar.delete("string", 123, ["string in array"]);
66+
console.log(response.result);
6767

68-
// // General
69-
// response = await general.redirect();
70-
// console.log(response.result);
68+
// General
69+
response = await general.redirect();
70+
console.log(response.result);
7171

72-
// response = await general.upload(
73-
// "string",
74-
// 123,
75-
// ["string in array"],
76-
// document.getElementById("file").files[0]
77-
// );
78-
// console.log(response.result);
72+
response = await general.upload(
73+
"string",
74+
123,
75+
["string in array"],
76+
document.getElementById("file").files[0]
77+
);
78+
console.log(response.result);
7979

8080
response = await general.upload(
8181
"string",
@@ -85,75 +85,75 @@
8585
);
8686
console.log(response.result);
8787

88-
// try {
89-
// response = await general.empty();
90-
// } catch (error) {
91-
// console.log(error);
92-
// }
93-
94-
// try {
95-
// response = await general.error400();
96-
// } catch (error) {
97-
// console.log(error.message);
98-
// }
99-
100-
// try {
101-
// response = await general.error500();
102-
// } catch (error) {
103-
// console.log(error.message);
104-
// }
105-
106-
// try {
107-
// response = await general.error502();
108-
// } catch (error) {
109-
// console.log(error.message);
110-
// }
111-
112-
// const delay = ms => new Promise(res => setTimeout(res, ms));
113-
// await delay(5000);
114-
// console.log(responseRealtime)
115-
116-
// // Query helper tests
117-
// console.log(Query.equal('released', [true]));
118-
// console.log(Query.equal('title', ['Spiderman', 'Dr. Strange']));
119-
// console.log(Query.notEqual('title', 'Spiderman'));
120-
// console.log(Query.lessThan('releasedYear', 1990));
121-
// console.log(Query.greaterThan('releasedYear', 1990));
122-
// console.log(Query.search('name', "john"));
123-
// console.log(Query.isNull("name"))
124-
// console.log(Query.isNotNull("name"))
125-
// console.log(Query.between("age", 50, 100))
126-
// console.log(Query.between("age", 50.5, 100.5))
127-
// console.log(Query.between("name", "Anna", "Brad"))
128-
// console.log(Query.startsWith("name", "Ann"))
129-
// console.log(Query.endsWith("name", "nne"))
130-
// console.log(Query.select(["name", "age"]))
131-
// console.log(Query.orderAsc("title"));
132-
// console.log(Query.orderDesc("title"));
133-
// console.log(Query.cursorAfter("my_movie_id"));
134-
// console.log(Query.cursorBefore("my_movie_id"));
135-
// console.log(Query.limit(50));
136-
// console.log(Query.offset(20));
137-
138-
// // Permission & Role helper tests
139-
// console.log(Permission.read(Role.any()));
140-
// console.log(Permission.write(Role.user(ID.custom('userid'))));
141-
// console.log(Permission.create(Role.users()));
142-
// console.log(Permission.update(Role.guests()));
143-
// console.log(Permission.delete(Role.team('teamId', 'owner')));
144-
// console.log(Permission.delete(Role.team('teamId')));
145-
// console.log(Permission.create(Role.member('memberId')));
146-
// console.log(Permission.update(Role.users('verified')));
147-
// console.log(Permission.update(Role.user(ID.custom('userid'), 'unverified')));
148-
// console.log(Permission.create(Role.label('admin')));
149-
150-
151-
// // ID helper tests
152-
// console.log(ID.unique());
153-
// console.log(ID.custom('custom_id'));
154-
155-
// response = await general.headers();
156-
// console.log(response.result);
88+
try {
89+
response = await general.empty();
90+
} catch (error) {
91+
console.log(error);
92+
}
93+
94+
try {
95+
response = await general.error400();
96+
} catch (error) {
97+
console.log(error.message);
98+
}
99+
100+
try {
101+
response = await general.error500();
102+
} catch (error) {
103+
console.log(error.message);
104+
}
105+
106+
try {
107+
response = await general.error502();
108+
} catch (error) {
109+
console.log(error.message);
110+
}
111+
112+
const delay = ms => new Promise(res => setTimeout(res, ms));
113+
await delay(5000);
114+
console.log(responseRealtime)
115+
116+
// Query helper tests
117+
console.log(Query.equal('released', [true]));
118+
console.log(Query.equal('title', ['Spiderman', 'Dr. Strange']));
119+
console.log(Query.notEqual('title', 'Spiderman'));
120+
console.log(Query.lessThan('releasedYear', 1990));
121+
console.log(Query.greaterThan('releasedYear', 1990));
122+
console.log(Query.search('name', "john"));
123+
console.log(Query.isNull("name"))
124+
console.log(Query.isNotNull("name"))
125+
console.log(Query.between("age", 50, 100))
126+
console.log(Query.between("age", 50.5, 100.5))
127+
console.log(Query.between("name", "Anna", "Brad"))
128+
console.log(Query.startsWith("name", "Ann"))
129+
console.log(Query.endsWith("name", "nne"))
130+
console.log(Query.select(["name", "age"]))
131+
console.log(Query.orderAsc("title"));
132+
console.log(Query.orderDesc("title"));
133+
console.log(Query.cursorAfter("my_movie_id"));
134+
console.log(Query.cursorBefore("my_movie_id"));
135+
console.log(Query.limit(50));
136+
console.log(Query.offset(20));
137+
138+
// Permission & Role helper tests
139+
console.log(Permission.read(Role.any()));
140+
console.log(Permission.write(Role.user(ID.custom('userid'))));
141+
console.log(Permission.create(Role.users()));
142+
console.log(Permission.update(Role.guests()));
143+
console.log(Permission.delete(Role.team('teamId', 'owner')));
144+
console.log(Permission.delete(Role.team('teamId')));
145+
console.log(Permission.create(Role.member('memberId')));
146+
console.log(Permission.update(Role.users('verified')));
147+
console.log(Permission.update(Role.user(ID.custom('userid'), 'unverified')));
148+
console.log(Permission.create(Role.label('admin')));
149+
150+
151+
// ID helper tests
152+
console.log(ID.unique());
153+
console.log(ID.custom('custom_id'));
154+
155+
response = await general.headers();
156+
console.log(response.result);
157157

158158
});
159159
</script>

tests/resources/spec.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
"url": "https://raw.githubusercontent.com/appwrite/appwrite/master/LICENSE"
1616
}
1717
},
18-
"host": "stage.appwrite.io",
18+
"host": "00b1-67-87-243-148.ngrok-free.app",
1919
"basePath": "/v1",
20-
"schemes": ["https"],
20+
"schemes": ["http"],
2121
"consumes": ["application/json", "multipart/form-data"],
2222
"produces": ["application/json"],
2323
"securityDefinitions": {

0 commit comments

Comments
 (0)