p5.record.js 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/p5.record.esm.js +1 -1
- package/dist/p5.record.min.js +1 -1
- package/package.json +4 -5
- package/src/{Recorder.js → Recorder.ts} +21 -12
- package/src/{SequenceRecorder.js → SequenceRecorder.ts} +12 -8
- package/src/{Zip.js → Zip.ts} +16 -13
- package/src/{crc32.js → crc32.ts} +2 -2
- package/src/{main.js → main.ts} +5 -4
- package/src/{utils.js → utils.ts} +1 -1
package/README.md
CHANGED
|
@@ -15,10 +15,10 @@ p5.record.js starts with a set of default configuration that covers the simplest
|
|
|
15
15
|
To add p5.record.js to your sketch, include the following script tag in your HTML file:
|
|
16
16
|
|
|
17
17
|
```html
|
|
18
|
-
<script src="https://cdn.jsdelivr.net/npm/p5.record.js@0.
|
|
18
|
+
<script src="https://cdn.jsdelivr.net/npm/p5.record.js@0.2.0/dist/p5.record.min.js"></script>
|
|
19
19
|
```
|
|
20
20
|
|
|
21
|
-
ESM builds are also available either via CDN at https://cdn.jsdelivr.net/npm/p5.record.js@0.
|
|
21
|
+
ESM builds are also available either via CDN at https://cdn.jsdelivr.net/npm/p5.record.js@0.2.0/dist/p5.record.esm.js or via NPM:
|
|
22
22
|
|
|
23
23
|
```sh
|
|
24
24
|
npm install p5.record.js
|
package/dist/p5.record.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
function e(){let e,t=[];for(let n=0;n<256;n++){e=n;for(let t=0;t<8;t++)e=e&1?3988292384^e>>>1:e>>>1;t[n]=e}return t}const t=e();function n(e,n,r,i){let a=t,o=i+r;e^=-1;for(let t=i;t<o;t++)e=e>>>8^a[(e^n[t])&255];return e^-1}const r=new TextEncoder;var i=class e{#e=[];#t=[];#n=0;constructor(){}static generateCentralDirectoryHeader(e,t){let n=new ArrayBuffer(46+e.filename.length),i=new Uint8Array(n),a=new DataView(n);a.setUint32(0,1347092738),a.setUint16(4,20,!0),a.setUint16(6,20,!0),a.setUint16(12,e.modifyTime,!0),a.setUint16(14,e.modifyDate,!0),a.setUint32(16,e.checksum,!0),a.setUint32(20,e.compressedSize,!0),a.setUint32(24,e.uncompressedSize,!0),a.setUint16(28,e.filename.length,!0),a.setUint32(42,t,!0);let o=r.encode(e.filename);return i.set(o,46),a.buffer}addFile(t){let n=e.generateCentralDirectoryHeader(t,this.#n);this.#e.push(t),this.#t.push(n),this.#n+=t.localFileHeader.byteLength,this.#n+=t.content.length}pack(){let e=this.#t.reduce((e,t)=>(e+=t.byteLength,e),0);this.#n+=e;let t=new ArrayBuffer(22),n=new DataView(t);n.setUint32(0,1347093766),n.setUint16(8,this.#e.length,!0),n.setUint16(10,this.#e.length,!0),n.setUint32(12,e,!0),n.setUint32(16,this.#n-e,!0);let r=[];for(let e of this.#e)r.push(e.localFileHeader),r.push(e.content);return r.push(...this.#t),r.push(n.buffer),new Blob(r)}},a=class{modifyTime;modifyDate;checksum;compressedSize;uncompressedSize;filename;content;constructor(e,t){this.filename=e,this.content=t;let{date:r,time:i}=o();this.modifyTime=i,this.modifyDate=r,this.checksum=n(0,t,t.length,0),this.compressedSize=t.length,this.uncompressedSize=t.length}get localFileHeader(){let e=new ArrayBuffer(30+this.filename.length),t=new Uint8Array(e),n=new DataView(e);n.setUint32(0,1347093252),n.setUint16(4,20,!0),n.setUint16(10,this.modifyTime,!0),n.setUint16(12,this.modifyDate,!0),n.setUint32(14,this.checksum,!0),n.setUint32(18,this.compressedSize,!0),n.setUint32(22,this.uncompressedSize,!0),n.setUint16(26,this.filename.length,!0);let i=r.encode(this.filename);return t.set(i,30),n.buffer}};function o(){let e=new Date,t=e.getUTCHours();t<<=6,t|=e.getUTCMinutes(),t<<=5,t|=e.getUTCSeconds()/2;let n=e.getUTCFullYear()-1980;return n<<=4,n|=e.getUTCMonth()+1,n<<=5,n|=e.getUTCDate(),{date:n,time:t}}const s={"image/png":`png`,"image/jpeg":`jpg`,"image/webp":`webp`};var c=class extends EventTarget{#e=0;#t;#n=[];#r;#i;#a;#o;#s=0;#c;state=`inactive`;constructor(e,t,n=60){super(),this.#t=e,this.#i=1e3/n,this.#c=t}start(){this.state=`recording`,this.dispatchEvent(new CustomEvent(`start`)),this.frame()}stop(){this.state=`inactive`,this.#r&&cancelAnimationFrame(this.#r);let e=Promise.all(this.#n.map(e=>e.arrayBuffer())),t=new i;e.then(e=>{for(let n=0;n<e.length;n++){let r=new a(`capture-${String(n+1).padStart(5,`0`)}.${s[this.#c]}`,new Uint8Array(e[n]));t.addFile(r)}this.dispatchEvent(new CustomEvent(`stop`,{detail:{blob:t.pack()}}))})}pause(){this.state=`paused`,this.#r&&cancelAnimationFrame(this.#r),this.dispatchEvent(new CustomEvent(`pause`))}resume(){this.state=`recording`,this.dispatchEvent(new CustomEvent(`resume`)),this.frame()}frame(e){if(this.state===`recording`){if(this.#a=e-this.#o,this.#o=e,this.#s+=this.#a||0,this.#s>=this.#i||this.#i===1/0){this.#s=0;let e=this.#e;this.#t.toBlob(t=>{this.#n[e]=t},this.#c),this.#e++}this.#i<1/0&&(this.#r=requestAnimationFrame(this.frame.bind(this)))}}},l=class{#e;#t;constructor(e){let t=e.frameRate===`manual`?0:e.frameRate,n=[],r=e.source instanceof HTMLCanvasElement?e.source:e.source.canvas,i=r.captureStream(t),a;a=Object.keys(s).includes(e.mimeType)?new c(r,e.mimeType,t):new MediaRecorder(i,{mimeType:e.mimeType??`video/webm;codecs=vp8`}),a.addEventListener(`start`,()=>{console.log(`recording started`)}),a.addEventListener(`stop`,t=>{let r,i;if(this.#t instanceof c?(r=t.detail.blob,i=`recording.zip`):(r=new Blob(n),i=`recording.webm`),typeof e?.stopCallback!=`function`||e?.stopCallback(r)){let e=URL.createObjectURL(r),t=document.createElement(`a`);t.href=e,t.download=i,t.click()}}),a.addEventListener(`dataavailable`,e=>{n.push(e.data)}),a.addEventListener(`pause`,()=>{console.log(`recording paused`)}),a.addEventListener(`resume`,()=>{console.log(`recording resumed`)}),this.#t=a,this.#e=i}get state(){return this.#t.state}start(){this.#t.start()}stop(){this.#t.stop()}pause(){this.#t.pause()}resume(){this.#t.resume()}frame(){this.#t instanceof c?this.#t.frame():this.#e.getVideoTracks()[0].requestFrame()}};function u(e,t,n){let r,i,a=e.VERSION.split(`.`).map(e=>parseInt(e));if(!(a[0]>2||a[0]===2&&a[1]>0||a[0]===2&&a[1]===0&&a[2]>=3)){console.error(`p5.record.js requires p5.js >= 2.0.3`);return}e.Recorder=l,n.postdraw=function(){r&&r.state===`recording`&&i?.frameRate===`manual`&&r.frame()},t.setRecording=function(e){if(e.frameRate===`manual`&&!(`CanvasCaptureMediaStreamTrack`in window)&&!Object.keys(s).includes(e.mimeType)){console.error(`Your browser does not support directly specifying frame capture timing with { frameRate: 'manual' }.`);return}i=e},t.startRecording=function(){i=Object.assign({source:this.canvas,frameRate:this.getTargetFrameRate(),stopCallback:this._customActions?.recordingStopped},i),r=new l(i),r.start()},t.stopRecording=function(){r.stop()},t.pauseRecording=function(){r.pause()},t.resumeRecording=function(){r.resume()},t.createRecording=function(e){return new l(e)}}typeof p5<`u`&&p5.registerAddon(u);export{l as Recorder,u as p5Record};
|
package/dist/p5.record.min.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
(function(e){function t(){let e,t=[];for(let n=0;n<256;n++){e=n;for(let t=0;t<8;t++)e=e&1?3988292384^e>>>1:e>>>1;t[n]=e}return t}let n=t();function r(e,t,r,i){let a=n,o=i+r;e^=-1;for(let n=i;n<o;n++)e=e>>>8^a[(e^t[n])&255];return e^-1}let i=new TextEncoder;var a=class e{#e=[];#t=[];#n=0;constructor(){}static generateCentralDirectoryHeader(e,t){let n=new ArrayBuffer(46+e.filename.length),r=new Uint8Array(n),a=new DataView(n);a.setUint32(0,1347092738),a.setUint16(4,20,!0),a.setUint16(6,20,!0),a.setUint16(12,e.modifyTime,!0),a.setUint16(14,e.modifyDate,!0),a.setUint32(16,e.checksum,!0),a.setUint32(20,e.compressedSize,!0),a.setUint32(24,e.uncompressedSize,!0),a.setUint16(28,e.filename.length,!0),a.setUint32(42,t,!0);let o=i.encode(e.filename);return r.set(o,46),a.buffer}addFile(t){let n=e.generateCentralDirectoryHeader(t,this.#n);this.#e.push(t),this.#t.push(n),this.#n+=t.localFileHeader.byteLength,this.#n+=t.content.length}pack(){let e=this.#t.reduce((e,t)=>(e+=t.byteLength,e),0);this.#n+=e;let t=new ArrayBuffer(22),n=new DataView(t);n.setUint32(0,1347093766),n.setUint16(8,this.#e.length,!0),n.setUint16(10,this.#e.length,!0),n.setUint32(12,e,!0),n.setUint32(16,this.#n-e,!0);let r=[];for(let e of this.#e)r.push(e.localFileHeader),r.push(e.content);return r.push(...this.#t),r.push(n.buffer),new Blob(r)}},o=class{modifyTime;modifyDate;checksum;compressedSize;uncompressedSize;filename;content;constructor(e,t){this.filename=e,this.content=t;let{date:n,time:i}=s();this.modifyTime=i,this.modifyDate=n,this.checksum=r(0,t,t.length,0),this.compressedSize=t.length,this.uncompressedSize=t.length}get localFileHeader(){let e=new ArrayBuffer(30+this.filename.length),t=new Uint8Array(e),n=new DataView(e);n.setUint32(0,1347093252),n.setUint16(4,20,!0),n.setUint16(10,this.modifyTime,!0),n.setUint16(12,this.modifyDate,!0),n.setUint32(14,this.checksum,!0),n.setUint32(18,this.compressedSize,!0),n.setUint32(22,this.uncompressedSize,!0),n.setUint16(26,this.filename.length,!0);let r=i.encode(this.filename);return t.set(r,30),n.buffer}};function s(){let e=new Date,t=e.getUTCHours();t<<=6,t|=e.getUTCMinutes(),t<<=5,t|=e.getUTCSeconds()/2;let n=e.getUTCFullYear()-1980;return n<<=4,n|=e.getUTCMonth()+1,n<<=5,n|=e.getUTCDate(),{date:n,time:t}}let c={"image/png":`png`,"image/jpeg":`jpg`,"image/webp":`webp`};var l=class extends EventTarget{#e=0;#t;#n=[];#r;#i;#a;#o;#s=0;#c;state=`inactive`;constructor(e,t,n=60){super(),this.#t=e,this.#i=1e3/n,this.#c=t}start(){this.state=`recording`,this.dispatchEvent(new CustomEvent(`start`)),this.frame()}stop(){this.state=`inactive`,this.#r&&cancelAnimationFrame(this.#r);let e=Promise.all(this.#n.map(e=>e.arrayBuffer())),t=new a;e.then(e=>{for(let n=0;n<e.length;n++){let r=new o(`capture-${String(n+1).padStart(5,`0`)}.${c[this.#c]}`,new Uint8Array(e[n]));t.addFile(r)}this.dispatchEvent(new CustomEvent(`stop`,{detail:{blob:t.pack()}}))})}pause(){this.state=`paused`,this.#r&&cancelAnimationFrame(this.#r),this.dispatchEvent(new CustomEvent(`pause`))}resume(){this.state=`recording`,this.dispatchEvent(new CustomEvent(`resume`)),this.frame()}frame(e){if(this.state===`recording`){if(this.#a=e-this.#o,this.#o=e,this.#s+=this.#a||0,this.#s>=this.#i||this.#i===1/0){this.#s=0;let e=this.#e;this.#t.toBlob(t=>{this.#n[e]=t},this.#c),this.#e++}this.#i<1/0&&(this.#r=requestAnimationFrame(this.frame.bind(this)))}}},u=class{#e;#t;constructor(e){let t=e.frameRate===`manual`?0:e.frameRate,n=[],r=e.source instanceof HTMLCanvasElement?e.source:e.source.canvas,i=r.captureStream(t),a;a=Object.keys(c).includes(e.mimeType)?new l(r,e.mimeType,t):new MediaRecorder(i,{mimeType:e.mimeType??`video/webm;codecs=vp8`}),a.addEventListener(`start`,()=>{console.log(`recording started`)}),a.addEventListener(`stop`,t=>{let r,i;if(this.#t instanceof l?(r=t.detail.blob,i=`recording.zip`):(r=new Blob(n),i=`recording.webm`),typeof e?.stopCallback!=`function`||e?.stopCallback(r)){let e=URL.createObjectURL(r),t=document.createElement(`a`);t.href=e,t.download=i,t.click()}}),a.addEventListener(`dataavailable`,e=>{n.push(e.data)}),a.addEventListener(`pause`,()=>{console.log(`recording paused`)}),a.addEventListener(`resume`,()=>{console.log(`recording resumed`)}),this.#t=a,this.#e=i}get state(){return this.#t.state}start(){this.#t.start()}stop(){this.#t.stop()}pause(){this.#t.pause()}resume(){this.#t.resume()}frame(){this.#t instanceof l?this.#t.frame():this.#e.getVideoTracks()[0].requestFrame()}};function d(e,t,n){let r,i,a=e.VERSION.split(`.`).map(e=>parseInt(e));if(!(a[0]>2||a[0]===2&&a[1]>0||a[0]===2&&a[1]===0&&a[2]>=3)){console.error(`p5.record.js requires p5.js >= 2.0.3`);return}e.Recorder=u,n.postdraw=function(){r&&r.state===`recording`&&i?.frameRate===`manual`&&r.frame()},t.setRecording=function(e){if(e.frameRate===`manual`&&!(`CanvasCaptureMediaStreamTrack`in window)&&!Object.keys(c).includes(e.mimeType)){console.error(`Your browser does not support directly specifying frame capture timing with { frameRate: 'manual' }.`);return}i=e},t.startRecording=function(){i=Object.assign({source:this.canvas,frameRate:this.getTargetFrameRate(),stopCallback:this._customActions?.recordingStopped},i),r=new u(i),r.start()},t.stopRecording=function(){r.stop()},t.pauseRecording=function(){r.pause()},t.resumeRecording=function(){r.resume()},t.createRecording=function(e){return new u(e)}}return typeof p5<`u`&&p5.registerAddon(d),e.Recorder=u,e.p5Record=d,e})({});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "p5.record.js",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "p5.js addon providing functions to record HTML canvas based sketches",
|
|
5
5
|
"homepage": "https://github.com/limzykenneth/p5.record.js",
|
|
6
6
|
"bugs": "https://github.com/limzykenneth/p5.record.js/issues",
|
|
@@ -26,12 +26,11 @@
|
|
|
26
26
|
},
|
|
27
27
|
"browser": "./dist/p5.record.min.js",
|
|
28
28
|
"scripts": {
|
|
29
|
-
"build": "
|
|
30
|
-
"dev": "
|
|
29
|
+
"build": "rolldown -c rolldown.config.ts",
|
|
30
|
+
"dev": "rolldown -c rolldown.config.ts --watch",
|
|
31
31
|
"prepublishOnly": "npm run build"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"
|
|
35
|
-
"rollup": "^4.41.1"
|
|
34
|
+
"rolldown": "^1.0.0-beta.55"
|
|
36
35
|
}
|
|
37
36
|
}
|
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
import { SequenceRecorder, imageTypesMap } from "./SequenceRecorder";
|
|
2
2
|
|
|
3
|
+
interface RecorderOptions {
|
|
4
|
+
frameRate: "manual" | number,
|
|
5
|
+
source: HTMLCanvasElement | {
|
|
6
|
+
canvas: HTMLCanvasElement
|
|
7
|
+
},
|
|
8
|
+
mimeType?: string,
|
|
9
|
+
stopCallback?: (blob: Blob) => void
|
|
10
|
+
}
|
|
11
|
+
|
|
3
12
|
export class Recorder {
|
|
4
|
-
#stream;
|
|
5
|
-
#recorder;
|
|
13
|
+
#stream: MediaStream;
|
|
14
|
+
#recorder: MediaRecorder | SequenceRecorder;
|
|
6
15
|
|
|
7
|
-
constructor(options) {
|
|
16
|
+
constructor(options: RecorderOptions) {
|
|
8
17
|
const frameRate = options.frameRate === "manual" ? 0 : options.frameRate;
|
|
9
18
|
const chunks = [];
|
|
10
19
|
const canvas = (
|
|
@@ -13,7 +22,7 @@ export class Recorder {
|
|
|
13
22
|
options.source.canvas
|
|
14
23
|
);
|
|
15
24
|
const stream = canvas.captureStream(frameRate);
|
|
16
|
-
let recorder;
|
|
25
|
+
let recorder: MediaRecorder | SequenceRecorder;
|
|
17
26
|
if(Object.keys(imageTypesMap).includes(options.mimeType)){
|
|
18
27
|
recorder = new SequenceRecorder(canvas, options.mimeType, frameRate);
|
|
19
28
|
}else{
|
|
@@ -22,15 +31,15 @@ export class Recorder {
|
|
|
22
31
|
});
|
|
23
32
|
}
|
|
24
33
|
|
|
25
|
-
recorder.addEventListener("start", (
|
|
34
|
+
recorder.addEventListener("start", () => {
|
|
26
35
|
console.log("recording started");
|
|
27
36
|
});
|
|
28
37
|
|
|
29
|
-
recorder.addEventListener("stop", (e) => {
|
|
30
|
-
let blob, filename;
|
|
38
|
+
recorder.addEventListener("stop", (e: Event) => {
|
|
39
|
+
let blob: Blob, filename: string;
|
|
31
40
|
|
|
32
41
|
if(this.#recorder instanceof SequenceRecorder){
|
|
33
|
-
blob = e.detail.blob;
|
|
42
|
+
blob = (e as CustomEvent).detail.blob;
|
|
34
43
|
filename = "recording.zip";
|
|
35
44
|
}else{
|
|
36
45
|
blob = new Blob(chunks);
|
|
@@ -50,15 +59,15 @@ export class Recorder {
|
|
|
50
59
|
}
|
|
51
60
|
});
|
|
52
61
|
|
|
53
|
-
recorder.addEventListener("dataavailable", (e) => {
|
|
62
|
+
(recorder as MediaRecorder).addEventListener("dataavailable", (e: BlobEvent) => {
|
|
54
63
|
chunks.push(e.data);
|
|
55
64
|
});
|
|
56
65
|
|
|
57
|
-
recorder.addEventListener("pause", (
|
|
66
|
+
recorder.addEventListener("pause", () => {
|
|
58
67
|
console.log("recording paused");
|
|
59
68
|
});
|
|
60
69
|
|
|
61
|
-
recorder.addEventListener("resume", (
|
|
70
|
+
recorder.addEventListener("resume", () => {
|
|
62
71
|
console.log("recording resumed");
|
|
63
72
|
});
|
|
64
73
|
|
|
@@ -90,7 +99,7 @@ export class Recorder {
|
|
|
90
99
|
if(this.#recorder instanceof SequenceRecorder){
|
|
91
100
|
this.#recorder.frame();
|
|
92
101
|
}else{
|
|
93
|
-
this.#stream.getVideoTracks()[0].requestFrame();
|
|
102
|
+
(this.#stream.getVideoTracks()[0] as CanvasCaptureMediaStreamTrack).requestFrame();
|
|
94
103
|
}
|
|
95
104
|
}
|
|
96
105
|
}
|
|
@@ -8,17 +8,21 @@ export const imageTypesMap = {
|
|
|
8
8
|
|
|
9
9
|
export class SequenceRecorder extends EventTarget {
|
|
10
10
|
#counter = 0;
|
|
11
|
-
#source;
|
|
11
|
+
#source: HTMLCanvasElement;
|
|
12
12
|
#images = [];
|
|
13
|
-
#animationFrame;
|
|
14
|
-
#timePerFrame;
|
|
15
|
-
#deltaTime;
|
|
16
|
-
#previousTimestamp;
|
|
13
|
+
#animationFrame: number;
|
|
14
|
+
#timePerFrame: number;
|
|
15
|
+
#deltaTime: number;
|
|
16
|
+
#previousTimestamp: number;
|
|
17
17
|
#accumulator = 0;
|
|
18
|
-
#mimeType;
|
|
18
|
+
#mimeType: keyof typeof imageTypesMap;
|
|
19
19
|
state = "inactive";
|
|
20
20
|
|
|
21
|
-
constructor(
|
|
21
|
+
constructor(
|
|
22
|
+
source: HTMLCanvasElement,
|
|
23
|
+
mimeType: keyof typeof imageTypesMap,
|
|
24
|
+
frameRate = 60
|
|
25
|
+
) {
|
|
22
26
|
super();
|
|
23
27
|
this.#source = source;
|
|
24
28
|
this.#timePerFrame = 1000 / frameRate;
|
|
@@ -73,7 +77,7 @@ export class SequenceRecorder extends EventTarget {
|
|
|
73
77
|
this.frame();
|
|
74
78
|
}
|
|
75
79
|
|
|
76
|
-
frame(timestamp) {
|
|
80
|
+
frame(timestamp?: DOMHighResTimeStamp) {
|
|
77
81
|
if(this.state === "recording"){
|
|
78
82
|
this.#deltaTime = timestamp - this.#previousTimestamp;
|
|
79
83
|
this.#previousTimestamp = timestamp;
|
package/src/{Zip.js → Zip.ts}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { crc32 } from "./crc32
|
|
1
|
+
import { crc32 } from "./crc32";
|
|
2
2
|
|
|
3
3
|
const textEncoder = new TextEncoder();
|
|
4
4
|
|
|
@@ -9,7 +9,10 @@ export class Zip {
|
|
|
9
9
|
|
|
10
10
|
constructor(){}
|
|
11
11
|
|
|
12
|
-
static generateCentralDirectoryHeader(
|
|
12
|
+
static generateCentralDirectoryHeader(
|
|
13
|
+
file: FileEntry,
|
|
14
|
+
localFileHeaderOffset: number
|
|
15
|
+
): ArrayBuffer {
|
|
13
16
|
const buf = new ArrayBuffer(46 + file.filename.length);
|
|
14
17
|
const arr = new Uint8Array(buf);
|
|
15
18
|
const view = new DataView(buf);
|
|
@@ -41,7 +44,7 @@ export class Zip {
|
|
|
41
44
|
return view.buffer;
|
|
42
45
|
}
|
|
43
46
|
|
|
44
|
-
addFile(file){
|
|
47
|
+
addFile(file: FileEntry){
|
|
45
48
|
const centralDirectory = Zip.generateCentralDirectoryHeader(file, this.#currentOffset);
|
|
46
49
|
this.#files.push(file);
|
|
47
50
|
|
|
@@ -91,15 +94,15 @@ export class Zip {
|
|
|
91
94
|
}
|
|
92
95
|
|
|
93
96
|
export class FileEntry {
|
|
94
|
-
modifyTime;
|
|
95
|
-
modifyDate;
|
|
96
|
-
checksum;
|
|
97
|
-
compressedSize;
|
|
98
|
-
uncompressedSize;
|
|
99
|
-
filename;
|
|
100
|
-
content;
|
|
101
|
-
|
|
102
|
-
constructor(filename, content){
|
|
97
|
+
modifyTime: number;
|
|
98
|
+
modifyDate: number;
|
|
99
|
+
checksum: number;
|
|
100
|
+
compressedSize: number;
|
|
101
|
+
uncompressedSize: number;
|
|
102
|
+
filename: string;
|
|
103
|
+
content: Uint8Array;
|
|
104
|
+
|
|
105
|
+
constructor(filename: string, content: Uint8Array){
|
|
103
106
|
this.filename = filename;
|
|
104
107
|
this.content = content;
|
|
105
108
|
const { date, time } = getDosDateTime();
|
|
@@ -139,7 +142,7 @@ export class FileEntry {
|
|
|
139
142
|
}
|
|
140
143
|
}
|
|
141
144
|
|
|
142
|
-
function getDosDateTime(){
|
|
145
|
+
function getDosDateTime(): {date: number, time: number}{
|
|
143
146
|
const date = new Date();
|
|
144
147
|
|
|
145
148
|
let dosTime = date.getUTCHours();
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*/
|
|
14
14
|
|
|
15
15
|
function makeTable() {
|
|
16
|
-
let c, table = [];
|
|
16
|
+
let c: number, table = [];
|
|
17
17
|
|
|
18
18
|
for(let n =0; n < 256; n++){
|
|
19
19
|
c = n;
|
|
@@ -29,7 +29,7 @@ function makeTable() {
|
|
|
29
29
|
// Create table on load. Just 255 signed longs. Not a problem.
|
|
30
30
|
const crcTable = makeTable();
|
|
31
31
|
|
|
32
|
-
export function crc32(crc, buf, len, pos) {
|
|
32
|
+
export function crc32(crc: number, buf: number, len: number, pos: number): number {
|
|
33
33
|
const t = crcTable, end = pos + len;
|
|
34
34
|
|
|
35
35
|
crc = crc ^ (-1);
|
package/src/{main.js → main.ts}
RENAMED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Recorder } from "./Recorder
|
|
2
|
-
import { imageTypesMap } from "./SequenceRecorder
|
|
1
|
+
import { Recorder } from "./Recorder";
|
|
2
|
+
import { imageTypesMap } from "./SequenceRecorder";
|
|
3
3
|
|
|
4
4
|
export function p5Record(p5, fn, lifecycles){
|
|
5
5
|
let recorder, options;
|
|
@@ -8,7 +8,7 @@ export function p5Record(p5, fn, lifecycles){
|
|
|
8
8
|
.map((n) => parseInt(n));
|
|
9
9
|
if(!(
|
|
10
10
|
p5VersionSemver[0] > 2 ||
|
|
11
|
-
(p5VersionSemver[0]
|
|
11
|
+
(p5VersionSemver[0] === 2 && p5VersionSemver[1] > 0) ||
|
|
12
12
|
(p5VersionSemver[0] === 2 && p5VersionSemver[1] === 0 && p5VersionSemver[2] >= 3)
|
|
13
13
|
)){
|
|
14
14
|
console.error(`p5.record.js requires p5.js >= 2.0.3`);
|
|
@@ -40,7 +40,8 @@ export function p5Record(p5, fn, lifecycles){
|
|
|
40
40
|
fn.startRecording = function() {
|
|
41
41
|
options = Object.assign({
|
|
42
42
|
source: this.canvas,
|
|
43
|
-
frameRate: this.getTargetFrameRate()
|
|
43
|
+
frameRate: this.getTargetFrameRate(),
|
|
44
|
+
stopCallback: this._customActions?.recordingStopped
|
|
44
45
|
}, options);
|
|
45
46
|
recorder = new Recorder(options);
|
|
46
47
|
recorder.start();
|