@nonstrict/recordkit 0.2.1 → 0.3.0-alpha.1

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.
Files changed (40) hide show
  1. package/bin/.gitkeep +0 -0
  2. package/bin/recordkit-rpc +0 -0
  3. package/build.sh +32 -0
  4. package/jest.config.js +16 -0
  5. package/{dist → out}/IpcRecordKit.js +1 -0
  6. package/out/IpcRecordKit.js.map +1 -0
  7. package/{dist → out}/NonstrictRPC.js +1 -0
  8. package/out/NonstrictRPC.js.map +1 -0
  9. package/out/RecordKit.d.ts +50 -0
  10. package/out/RecordKit.js +48 -0
  11. package/out/RecordKit.js.map +1 -0
  12. package/out/Recorder.d.ts +59 -0
  13. package/{dist/RecordingSession.js → out/Recorder.js} +21 -5
  14. package/out/Recorder.js.map +1 -0
  15. package/{dist → out}/finalizationRegistry.js +1 -0
  16. package/out/finalizationRegistry.js.map +1 -0
  17. package/{dist → out}/index.cjs +54 -13
  18. package/out/index.cjs.map +1 -0
  19. package/out/index.d.ts +3 -0
  20. package/{dist → out}/index.js +1 -0
  21. package/out/index.js.map +1 -0
  22. package/package.json +9 -11
  23. package/rollup.config.js +11 -0
  24. package/src/IpcRecordKit.ts +46 -0
  25. package/src/NonstrictRPC.test.ts +98 -0
  26. package/src/NonstrictRPC.ts +308 -0
  27. package/src/RecordKit.ts +99 -0
  28. package/src/Recorder.ts +113 -0
  29. package/src/__snapshots__/NonstrictRPC.test.ts.snap +24 -0
  30. package/src/finalizationRegistry.ts +2 -0
  31. package/src/index.ts +3 -0
  32. package/tsconfig.json +109 -0
  33. package/typedoc.json +6 -0
  34. package/dist/RecordKit.d.ts +0 -34
  35. package/dist/RecordKit.js +0 -22
  36. package/dist/RecordingSession.d.ts +0 -70
  37. package/dist/index.d.ts +0 -1
  38. /package/{dist → out}/IpcRecordKit.d.ts +0 -0
  39. /package/{dist → out}/NonstrictRPC.d.ts +0 -0
  40. /package/{dist → out}/finalizationRegistry.d.ts +0 -0
package/bin/.gitkeep ADDED
File without changes
Binary file
package/build.sh ADDED
@@ -0,0 +1,32 @@
1
+ #!/bin/bash -e
2
+
3
+ # Check arguments
4
+ VERSION_NUMBER="$1"
5
+
6
+ if [ -z "$VERSION_NUMBER" ]; then
7
+ echo "Missing version argument: ./build.sh 0.3.4"
8
+ exit 1
9
+ fi
10
+
11
+
12
+ # Clean up previous artifact directory
13
+ rm -r ./dist || echo "No old build to remove"
14
+
15
+ # Set version in package.json
16
+ function restore_package_json {
17
+ npm version 0.0.0
18
+ echo "Restored version"
19
+ }
20
+
21
+ # register the cleanup function to be called on the EXIT signal
22
+ trap restore_package_json EXIT
23
+
24
+ echo "Updating version number"
25
+ npm version $VERSION_NUMBER
26
+
27
+
28
+ # Build recordkit-electron
29
+ npm run build
30
+ contents=(*)
31
+ mkdir dist
32
+ cp -r ${contents[*]} dist
package/jest.config.js ADDED
@@ -0,0 +1,16 @@
1
+ /** @type {import('ts-jest').JestConfigWithTsJest} */
2
+ export default {
3
+ preset: "ts-jest/presets/default-esm",
4
+ testEnvironment: "node",
5
+ moduleNameMapper: {
6
+ "^(\\.{1,2}/.*)\\.js$": "$1",
7
+ },
8
+ transform: {
9
+ "^.+\\.tsx?$": [
10
+ "ts-jest",
11
+ {
12
+ useESM: true,
13
+ },
14
+ ],
15
+ },
16
+ };
@@ -40,3 +40,4 @@ export class IpcRecordKit {
40
40
  stdin.write(message + "\n");
41
41
  }
42
42
  }
43
+ //# sourceMappingURL=IpcRecordKit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IpcRecordKit.js","sourceRoot":"","sources":["../src/IpcRecordKit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,MAAM,OAAO,YAAY;IACb,WAAW,GAAY,KAAK,CAAC;IAC7B,YAAY,CAAgB;IAC3B,KAAK,CAAQ;IAEtB;QACI,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,gBAAwB,EAAE,cAAuB,KAAK;QACnE,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAA;QAAC,CAAC;QAE/F,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,YAAY,GAAG,MAAM,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpE,MAAM,YAAY,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAA;YAC5C,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;YACzD,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QAC1D,CAAC,CAAC,CAAA;QAEF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAA;QACpC,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAA;QAAC,CAAC;QAErF,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YAC5D,IAAI,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YACtC,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,KAAK,CAAC,OAAe;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC;QACvC,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAA;QAAC,CAAC;QAEvE,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,CAAC;QAED,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAA;IAC/B,CAAC;CACJ"}
@@ -154,3 +154,4 @@ export class NSRPC {
154
154
  return target;
155
155
  }
156
156
  }
157
+ //# sourceMappingURL=NonstrictRPC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NonstrictRPC.js","sourceRoot":"","sources":["../src/NonstrictRPC.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import { Recorder, RecorderSchema } from "./Recorder.js";
2
+ type AuthorizationStatus = 'notDetermined' | 'restricted' | 'denied' | 'authorized';
3
+ export interface Window {
4
+ id: number;
5
+ title?: string;
6
+ frame: Bounds;
7
+ level: number;
8
+ application_process_id?: number;
9
+ application_name?: string;
10
+ }
11
+ export interface Camera {
12
+ id: string;
13
+ name: string;
14
+ model_id: string;
15
+ manufacturer: string;
16
+ availability: 'available' | 'lidClosed' | 'unknownSuspended';
17
+ }
18
+ export interface Microphone {
19
+ id: string;
20
+ name: string;
21
+ model_id: string;
22
+ manufacturer: string;
23
+ availability: 'available' | 'lidClosed' | 'unknownSuspended';
24
+ }
25
+ export interface Bounds {
26
+ x: number;
27
+ y: number;
28
+ width: number;
29
+ height: number;
30
+ }
31
+ export declare class RecordKit {
32
+ private ipcRecordKit;
33
+ initialize(args: {
34
+ rpcBinaryPath: string;
35
+ fallbackToNodeModules: boolean;
36
+ logRpcMessages?: boolean;
37
+ }): Promise<void>;
38
+ getWindows(): Promise<Window[]>;
39
+ getCameras(): Promise<Camera[]>;
40
+ getMicrophones(): Promise<Microphone[]>;
41
+ getCameraAuthorizationStatus(): Promise<AuthorizationStatus>;
42
+ getMicrophoneAuthorizationStatus(): Promise<AuthorizationStatus>;
43
+ getScreenRecordingAccess(): Promise<boolean>;
44
+ requestCameraAccess(): Promise<boolean>;
45
+ requestMicrophoneAccess(): Promise<boolean>;
46
+ requestScreenRecordingAccess(): Promise<void>;
47
+ createRecorder(schema: RecorderSchema): Promise<Recorder>;
48
+ }
49
+ export declare let recordkit: RecordKit;
50
+ export {};
@@ -0,0 +1,48 @@
1
+ import { IpcRecordKit } from "./IpcRecordKit.js";
2
+ import { Recorder } from "./Recorder.js";
3
+ import { existsSync } from "node:fs";
4
+ export class RecordKit {
5
+ ipcRecordKit = new IpcRecordKit();
6
+ async initialize(args) {
7
+ let rpcBinaryPath = args.rpcBinaryPath;
8
+ if (!args.fallbackToNodeModules) {
9
+ if (!existsSync(rpcBinaryPath)) {
10
+ console.log('Falling back to RPC binary from node_modules, no file at given RPC binary path.');
11
+ rpcBinaryPath = rpcBinaryPath.replace('node_modules/electron/dist/Electron.app/Contents/Resources', 'node_modules/@nonstrict/recordkit/bin');
12
+ }
13
+ }
14
+ return this.ipcRecordKit.initialize(rpcBinaryPath, args.logRpcMessages);
15
+ }
16
+ async getWindows() {
17
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getWindows' });
18
+ }
19
+ async getCameras() {
20
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getCameras' });
21
+ }
22
+ async getMicrophones() {
23
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getMicrophones' });
24
+ }
25
+ async getCameraAuthorizationStatus() {
26
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getCameraAuthorizationStatus' });
27
+ }
28
+ async getMicrophoneAuthorizationStatus() {
29
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getMicrophoneAuthorizationStatus' });
30
+ }
31
+ async getScreenRecordingAccess() {
32
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getScreenRecordingAccess' });
33
+ }
34
+ async requestCameraAccess() {
35
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestCameraAccess' });
36
+ }
37
+ async requestMicrophoneAccess() {
38
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestMicrophoneAccess' });
39
+ }
40
+ async requestScreenRecordingAccess() {
41
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestScreenRecordingAccess' });
42
+ }
43
+ async createRecorder(schema) {
44
+ return Recorder.newInstance(this.ipcRecordKit.nsrpc, schema);
45
+ }
46
+ }
47
+ export let recordkit = new RecordKit();
48
+ //# sourceMappingURL=RecordKit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecordKit.js","sourceRoot":"","sources":["../src/RecordKit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import { NSRPC } from "./NonstrictRPC.js";
4
+ import { EventEmitter } from "stream";
5
+ import { Camera, Microphone, Window } from "./RecordKit.js";
6
+ export interface RecorderSchema {
7
+ output_directory?: string;
8
+ items: RecorderSchemaItem[];
9
+ }
10
+ export type RecorderSchemaItem = WebcamSchema | WindowBasedCropSchema;
11
+ export interface WebcamSchema {
12
+ type: 'webcam';
13
+ filename?: string;
14
+ camera: Camera | string;
15
+ microphone: Microphone | string;
16
+ }
17
+ export interface WindowBasedCropSchema {
18
+ type: 'windowBasedCrop';
19
+ filename?: string;
20
+ window: Window | number;
21
+ shows_cursor?: boolean;
22
+ mouse_events?: boolean;
23
+ }
24
+ export type AbortReason = {
25
+ reason: 'userStopped';
26
+ result: RecordingResult;
27
+ } | {
28
+ reason: 'interrupted';
29
+ result: RecordingResult;
30
+ error: RecordKitError;
31
+ } | {
32
+ reason: 'failed';
33
+ error: RecordKitError;
34
+ };
35
+ export interface RecordingResult {
36
+ url: string;
37
+ info: BundleInfo;
38
+ }
39
+ export interface RecordKitError {
40
+ message?: string;
41
+ error_group: string;
42
+ debug_description: string;
43
+ }
44
+ export interface BundleInfo {
45
+ version: 1;
46
+ files: {
47
+ type: 'screen' | 'webcam' | 'mouse';
48
+ filename: string;
49
+ }[];
50
+ }
51
+ export declare class Recorder extends EventEmitter {
52
+ private readonly rpc;
53
+ private readonly target;
54
+ static newInstance(rpc: NSRPC, schema: RecorderSchema): Promise<Recorder>;
55
+ constructor(rpc: NSRPC, target: string);
56
+ prepare(): Promise<void>;
57
+ start(): Promise<void>;
58
+ stop(): Promise<RecordingResult>;
59
+ }
@@ -1,20 +1,35 @@
1
1
  import { randomUUID } from "crypto";
2
2
  import { EventEmitter } from "stream";
3
- export class RecordingSession extends EventEmitter {
3
+ export class Recorder extends EventEmitter {
4
4
  rpc;
5
5
  target;
6
6
  static async newInstance(rpc, schema) {
7
- const target = 'RecordingSession_' + randomUUID();
8
- const object = new RecordingSession(rpc, target);
7
+ const target = 'Recorder_' + randomUUID();
8
+ const object = new Recorder(rpc, target);
9
+ schema.items.forEach(item => {
10
+ if (item.type == 'webcam') {
11
+ if (typeof item.camera != 'string') {
12
+ item.camera = item.camera.id;
13
+ }
14
+ if (typeof item.microphone != 'string') {
15
+ item.microphone = item.microphone.id;
16
+ }
17
+ }
18
+ if (item.type == 'windowBasedCrop') {
19
+ if (typeof item.window != 'number') {
20
+ item.window = item.window.id;
21
+ }
22
+ }
23
+ });
9
24
  const weakRefObject = new WeakRef(object);
10
25
  const onAbortInstance = rpc.registerClosure({
11
26
  handler: (params) => { weakRefObject.deref()?.emit('abort', params.reason); },
12
- prefix: 'RecordingSession.onAbort',
27
+ prefix: 'Recorder.onAbort',
13
28
  lifecycle: object
14
29
  });
15
30
  await rpc.initialize({
16
31
  target,
17
- type: 'RecordingSession',
32
+ type: 'Recorder',
18
33
  params: { schema, onAbortInstance },
19
34
  lifecycle: object
20
35
  });
@@ -35,3 +50,4 @@ export class RecordingSession extends EventEmitter {
35
50
  return await this.rpc.perform({ target: this.target, action: 'stop' });
36
51
  }
37
52
  }
53
+ //# sourceMappingURL=Recorder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Recorder.js","sourceRoot":"","sources":["../src/Recorder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAGpC,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAmDtC,MAAM,OAAO,QAAS,SAAQ,YAAY;IACvB,GAAG,CAAQ;IACX,MAAM,CAAS;IAEhC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,GAAU,EAAE,MAAsB;QACzD,MAAM,MAAM,GAAG,WAAW,GAAG,UAAU,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC1B,IAAI,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE,CAAC;gBAC1B,IAAI,OAAO,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;oBACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;gBAC9B,CAAC;gBACD,IAAI,OAAO,IAAI,CAAC,UAAU,IAAI,QAAQ,EAAE,CAAC;oBACvC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAA;gBACtC,CAAC;YACH,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,IAAI,iBAAiB,EAAE,CAAC;gBACnC,IAAI,OAAO,IAAI,CAAC,MAAM,IAAI,QAAQ,EAAE,CAAC;oBACnC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAA;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,eAAe,GAAG,GAAG,CAAC,eAAe,CAAC;YAC1C,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,MAAqB,CAAC,CAAA,CAAC,CAAC;YAC3F,MAAM,EAAE,kBAAkB;YAC1B,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,MAAM,GAAG,CAAC,UAAU,CAAC;YACnB,MAAM;YACN,IAAI,EAAE,UAAU;YAChB,MAAM,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;YACnC,SAAS,EAAE,MAAM;SAClB,CAAC,CAAC;QAEH,OAAO,MAAM,CAAA;IACf,CAAC;IAED,YAAY,GAAU,EAAE,MAAc;QACpC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,IAAI;QACR,OAAO,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAoB,CAAC;IAC5F,CAAC;CACF"}
@@ -1 +1,2 @@
1
1
  export const finalizationRegistry = new FinalizationRegistry(async (destructor) => { await destructor(); });
2
+ //# sourceMappingURL=finalizationRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"finalizationRegistry.js","sourceRoot":"","sources":["../src/finalizationRegistry.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,CAAa,KAAK,EAAE,UAAU,EAAE,EAAE,GAAG,MAAM,UAAU,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA"}
@@ -4,6 +4,7 @@ var node_child_process = require('node:child_process');
4
4
  var readline = require('readline');
5
5
  var crypto = require('crypto');
6
6
  var stream = require('stream');
7
+ var node_fs = require('node:fs');
7
8
 
8
9
  function _interopNamespaceDefault(e) {
9
10
  var n = Object.create(null);
@@ -221,21 +222,36 @@ class IpcRecordKit {
221
222
  }
222
223
  }
223
224
 
224
- class RecordingSession extends stream.EventEmitter {
225
+ class Recorder extends stream.EventEmitter {
225
226
  rpc;
226
227
  target;
227
228
  static async newInstance(rpc, schema) {
228
- const target = 'RecordingSession_' + crypto.randomUUID();
229
- const object = new RecordingSession(rpc, target);
229
+ const target = 'Recorder_' + crypto.randomUUID();
230
+ const object = new Recorder(rpc, target);
231
+ schema.items.forEach(item => {
232
+ if (item.type == 'webcam') {
233
+ if (typeof item.camera != 'string') {
234
+ item.camera = item.camera.id;
235
+ }
236
+ if (typeof item.microphone != 'string') {
237
+ item.microphone = item.microphone.id;
238
+ }
239
+ }
240
+ if (item.type == 'windowBasedCrop') {
241
+ if (typeof item.window != 'number') {
242
+ item.window = item.window.id;
243
+ }
244
+ }
245
+ });
230
246
  const weakRefObject = new WeakRef(object);
231
247
  const onAbortInstance = rpc.registerClosure({
232
248
  handler: (params) => { weakRefObject.deref()?.emit('abort', params.reason); },
233
- prefix: 'RecordingSession.onAbort',
249
+ prefix: 'Recorder.onAbort',
234
250
  lifecycle: object
235
251
  });
236
252
  await rpc.initialize({
237
253
  target,
238
- type: 'RecordingSession',
254
+ type: 'Recorder',
239
255
  params: { schema, onAbortInstance },
240
256
  lifecycle: object
241
257
  });
@@ -259,23 +275,48 @@ class RecordingSession extends stream.EventEmitter {
259
275
 
260
276
  class RecordKit {
261
277
  ipcRecordKit = new IpcRecordKit();
262
- async initialize(rpcBinaryPath, logRpcMessages = false) {
263
- console.log('Initializing with path:', rpcBinaryPath);
264
- return this.ipcRecordKit.initialize(rpcBinaryPath, logRpcMessages);
278
+ async initialize(args) {
279
+ let rpcBinaryPath = args.rpcBinaryPath;
280
+ if (!args.fallbackToNodeModules) {
281
+ if (!node_fs.existsSync(rpcBinaryPath)) {
282
+ console.log('Falling back to RPC binary from node_modules, no file at given RPC binary path.');
283
+ rpcBinaryPath = rpcBinaryPath.replace('node_modules/electron/dist/Electron.app/Contents/Resources', 'node_modules/@nonstrict/recordkit/bin');
284
+ }
285
+ }
286
+ return this.ipcRecordKit.initialize(rpcBinaryPath, args.logRpcMessages);
265
287
  }
266
288
  async getWindows() {
267
- return await this.ipcRecordKit.nsrpc.perform({ type: 'RecordingSession', action: 'getWindows' });
289
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getWindows' });
268
290
  }
269
291
  async getCameras() {
270
- return await this.ipcRecordKit.nsrpc.perform({ type: 'RecordingSession', action: 'getCameras' });
292
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getCameras' });
271
293
  }
272
294
  async getMicrophones() {
273
- return await this.ipcRecordKit.nsrpc.perform({ type: 'RecordingSession', action: 'getMicrophones' });
295
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getMicrophones' });
296
+ }
297
+ async getCameraAuthorizationStatus() {
298
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getCameraAuthorizationStatus' });
299
+ }
300
+ async getMicrophoneAuthorizationStatus() {
301
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getMicrophoneAuthorizationStatus' });
302
+ }
303
+ async getScreenRecordingAccess() {
304
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getScreenRecordingAccess' });
305
+ }
306
+ async requestCameraAccess() {
307
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestCameraAccess' });
308
+ }
309
+ async requestMicrophoneAccess() {
310
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestMicrophoneAccess' });
311
+ }
312
+ async requestScreenRecordingAccess() {
313
+ return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestScreenRecordingAccess' });
274
314
  }
275
- async createSession(schema) {
276
- return RecordingSession.newInstance(this.ipcRecordKit.nsrpc, schema);
315
+ async createRecorder(schema) {
316
+ return Recorder.newInstance(this.ipcRecordKit.nsrpc, schema);
277
317
  }
278
318
  }
279
319
  let recordkit = new RecordKit();
280
320
 
281
321
  exports.recordkit = recordkit;
322
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["finalizationRegistry.js","NonstrictRPC.js","IpcRecordKit.js","Recorder.js","RecordKit.js"],"sourcesContent":["export const finalizationRegistry = new FinalizationRegistry(async (destructor) => { await destructor(); });\n//# sourceMappingURL=finalizationRegistry.js.map","import { randomUUID } from \"crypto\";\nimport { finalizationRegistry } from \"./finalizationRegistry.js\";\nexport class NSRPC {\n send;\n responseHandlers = new Map();\n closureTargets = new Map();\n constructor(send) {\n this.send = send;\n }\n receive(data) {\n // TODO: For now we just assume the message is a valid NSRPC message, but we should:\n // - Handle invalid JSON comming in\n // - Check if the nsrpc property is set to a number in the range of 1..<2\n // - Validate the message against the defined interfaces above\n const message = JSON.parse(data);\n if (\"status\" in message) {\n // This is a response, dispatch it so it can be handled\n const responseHandler = this.responseHandlers.get(message.id);\n this.responseHandlers.delete(message.id);\n if (responseHandler === undefined) {\n // TODO: Got a response for a request we don't know about, log this\n return;\n }\n if (\"error\" in message) {\n responseHandler.reject(message.error);\n }\n else {\n responseHandler.resolve(message.result);\n }\n }\n else {\n // This is a request\n const responseBody = this.handleRequest(message);\n if (responseBody !== undefined) {\n this.sendResponse(message.id, responseBody);\n }\n }\n }\n /* Sending helpers */\n sendMessage(message) {\n this.send(JSON.stringify(message));\n }\n sendResponse(id, response) {\n if (id === undefined) {\n return;\n }\n this.sendMessage({ ...response, nsrpc: 1, id });\n }\n async sendRequest(request) {\n const id = \"req_\" + randomUUID();\n const response = new Promise((resolve, reject) => {\n this.responseHandlers.set(id, { resolve, reject });\n });\n this.sendMessage({ ...request, nsrpc: 1, id });\n return response;\n }\n /* Request handling */\n handleRequest(request) {\n switch (request.procedure) {\n case \"init\":\n return {\n status: 501,\n error: {\n debugDescription: \"Init procedure not implemented.\",\n userMessage: \"Failed to communicate with external process. (Procedure not implemented)\",\n },\n };\n case \"perform\":\n if (\"action\" in request) {\n return {\n status: 501,\n error: {\n debugDescription: \"Perform procedure for (static) methods not implemented.\",\n userMessage: \"Failed to communicate with external process. (Procedure not implemented)\",\n },\n };\n }\n else {\n return this.handleClosureRequest(request);\n }\n case \"release\":\n return {\n status: 501,\n error: {\n debugDescription: \"Release procedure not implemented.\",\n userMessage: \"Failed to communicate with external process. (Procedure not implemented)\",\n },\n };\n }\n }\n handleClosureRequest(request) {\n const handler = this.closureTargets.get(request.target);\n if (handler === undefined) {\n return {\n status: 404,\n error: {\n debugDescription: `Perform target '${request.target}' not found.`,\n userMessage: \"Failed to communicate with external process. (Target not found)\",\n },\n };\n }\n try {\n const rawresult = handler(request.params ?? {});\n const result = rawresult === undefined ? undefined : rawresult;\n return {\n status: 200,\n result,\n };\n }\n catch (error) {\n return {\n status: 202,\n // TODO: Would be good to have an error type that we can throw that fills these fields more specifically. (But for now it doesn't matter since this is just communicated back the the CLI and not to the user.)\n error: {\n debugDescription: `${error}`,\n userMessage: \"Handler failed to perform request.\",\n underlyingError: error,\n },\n };\n }\n }\n /* Perform remote procedures */\n async initialize(args) {\n const target = args.target;\n finalizationRegistry.register(args.lifecycle, async () => {\n await this.release(target);\n });\n await this.sendRequest({\n target: args.target,\n type: args.type,\n params: args.params,\n procedure: \"init\",\n });\n }\n async perform(body) {\n return await this.sendRequest({\n ...body,\n procedure: \"perform\",\n });\n }\n async release(target) {\n await this.sendRequest({\n procedure: \"release\",\n target,\n });\n }\n /* Register locally available targets/actions */\n registerClosure(options) {\n const target = `target_${options.prefix}_${randomUUID()}`;\n this.closureTargets.set(target, options.handler);\n finalizationRegistry.register(options.lifecycle, () => {\n this.closureTargets.delete(target);\n });\n return target;\n }\n}\n//# sourceMappingURL=NonstrictRPC.js.map","import { spawn } from 'node:child_process';\nimport * as readline from 'readline';\nimport { NSRPC } from \"./NonstrictRPC.js\";\nexport class IpcRecordKit {\n logMessages = false;\n childProcess;\n nsrpc;\n constructor() {\n this.nsrpc = new NSRPC((message) => this.write(message));\n }\n async initialize(recordKitRpcPath, logMessages = false) {\n if (this.childProcess !== undefined) {\n throw new Error('RecordKit RPC: Already initialized.');\n }\n this.logMessages = logMessages;\n this.childProcess = await new Promise((resolve, reject) => {\n const childProcess = spawn(recordKitRpcPath);\n childProcess.on('spawn', () => { resolve(childProcess); });\n childProcess.on('error', (error) => { reject(error); });\n });\n const { stdout } = this.childProcess;\n if (!stdout) {\n throw new Error('RecordKit RPC: No stdout stream on child process.');\n }\n readline.createInterface({ input: stdout }).on('line', (line) => {\n if (logMessages) {\n console.log(\"< \", line.trimEnd());\n }\n this.nsrpc.receive(line);\n });\n }\n write(message) {\n const stdin = this.childProcess?.stdin;\n if (!stdin) {\n throw new Error('RecordKit RPC: Missing stdin stream.');\n }\n if (this.logMessages) {\n console.log(\"> \", message);\n }\n stdin.write(message + \"\\n\");\n }\n}\n//# sourceMappingURL=IpcRecordKit.js.map","import { randomUUID } from \"crypto\";\nimport { EventEmitter } from \"stream\";\nexport class Recorder extends EventEmitter {\n rpc;\n target;\n static async newInstance(rpc, schema) {\n const target = 'Recorder_' + randomUUID();\n const object = new Recorder(rpc, target);\n schema.items.forEach(item => {\n if (item.type == 'webcam') {\n if (typeof item.camera != 'string') {\n item.camera = item.camera.id;\n }\n if (typeof item.microphone != 'string') {\n item.microphone = item.microphone.id;\n }\n }\n if (item.type == 'windowBasedCrop') {\n if (typeof item.window != 'number') {\n item.window = item.window.id;\n }\n }\n });\n const weakRefObject = new WeakRef(object);\n const onAbortInstance = rpc.registerClosure({\n handler: (params) => { weakRefObject.deref()?.emit('abort', params.reason); },\n prefix: 'Recorder.onAbort',\n lifecycle: object\n });\n await rpc.initialize({\n target,\n type: 'Recorder',\n params: { schema, onAbortInstance },\n lifecycle: object\n });\n return object;\n }\n constructor(rpc, target) {\n super();\n this.rpc = rpc;\n this.target = target;\n }\n async prepare() {\n await this.rpc.perform({ target: this.target, action: 'prepare' });\n }\n async start() {\n await this.rpc.perform({ target: this.target, action: 'start' });\n }\n async stop() {\n return await this.rpc.perform({ target: this.target, action: 'stop' });\n }\n}\n//# sourceMappingURL=Recorder.js.map","import { IpcRecordKit } from \"./IpcRecordKit.js\";\nimport { Recorder } from \"./Recorder.js\";\nimport { existsSync } from \"node:fs\";\nexport class RecordKit {\n ipcRecordKit = new IpcRecordKit();\n async initialize(args) {\n let rpcBinaryPath = args.rpcBinaryPath;\n if (!args.fallbackToNodeModules) {\n if (!existsSync(rpcBinaryPath)) {\n console.log('Falling back to RPC binary from node_modules, no file at given RPC binary path.');\n rpcBinaryPath = rpcBinaryPath.replace('node_modules/electron/dist/Electron.app/Contents/Resources', 'node_modules/@nonstrict/recordkit/bin');\n }\n }\n return this.ipcRecordKit.initialize(rpcBinaryPath, args.logRpcMessages);\n }\n async getWindows() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getWindows' });\n }\n async getCameras() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getCameras' });\n }\n async getMicrophones() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'Recorder', action: 'getMicrophones' });\n }\n async getCameraAuthorizationStatus() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getCameraAuthorizationStatus' });\n }\n async getMicrophoneAuthorizationStatus() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getMicrophoneAuthorizationStatus' });\n }\n async getScreenRecordingAccess() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'getScreenRecordingAccess' });\n }\n async requestCameraAccess() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestCameraAccess' });\n }\n async requestMicrophoneAccess() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestMicrophoneAccess' });\n }\n async requestScreenRecordingAccess() {\n return await this.ipcRecordKit.nsrpc.perform({ type: 'AuthorizationStatus', action: 'requestScreenRecordingAccess' });\n }\n async createRecorder(schema) {\n return Recorder.newInstance(this.ipcRecordKit.nsrpc, schema);\n }\n}\nexport let recordkit = new RecordKit();\n//# sourceMappingURL=RecordKit.js.map"],"names":["randomUUID","spawn","readline","EventEmitter","existsSync"],"mappings":"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"}
package/out/index.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export type * from './RecordKit.js';
2
+ export type * from './Recorder.js';
3
+ export { recordkit } from './RecordKit.js';
@@ -1 +1,2 @@
1
1
  export { recordkit } from './RecordKit.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
package/package.json CHANGED
@@ -1,23 +1,20 @@
1
1
  {
2
2
  "name": "@nonstrict/recordkit",
3
- "version": "0.2.1",
3
+ "version": "0.3.0-alpha.1",
4
4
  "description": "RecordKit gives you hassle-free recording in Electron apps on macOS.",
5
5
  "type": "module",
6
- "main": "dist/index.js",
7
- "types": "dist/index.d.ts",
6
+ "main": "out/index.js",
7
+ "types": "out/index.d.ts",
8
8
  "exports": {
9
- "import": "./dist/index.js",
10
- "require": "./dist/index.cjs"
9
+ "import": "./out/index.js",
10
+ "require": "./out/index.cjs"
11
11
  },
12
- "files": [
13
- "dist"
14
- ],
15
12
  "engines": {
16
13
  "node": ">=18.16"
17
14
  },
18
15
  "scripts": {
19
16
  "test": "jest",
20
- "build": "rm -rf dist && tsc && rollup -c",
17
+ "build": "rm -rf out && tsc && rollup -c",
21
18
  "prepublish": "npm run build"
22
19
  },
23
20
  "keywords": [
@@ -34,7 +31,7 @@
34
31
  "author": {
35
32
  "name": "Nonstrict B.V.",
36
33
  "email": "team+recordkit@nonstrict.com",
37
- "url": "https://nonstrict.eu"
34
+ "url": "https://nonstrict.eu/recordkit"
38
35
  },
39
36
  "license": "SEE LICENSE IN License.md",
40
37
  "devDependencies": {
@@ -43,9 +40,10 @@
43
40
  "jest": "^29.7.0",
44
41
  "rollup": "^4.12.0",
45
42
  "ts-jest": "^29.1.2",
43
+ "typedoc": "^0.25.11",
46
44
  "typescript": "^5.3.3"
47
45
  },
48
46
  "volta": {
49
47
  "node": "18.19.1"
50
48
  }
51
- }
49
+ }
@@ -0,0 +1,11 @@
1
+ export default {
2
+ input: 'out/index.js',
3
+ output: [
4
+ {
5
+ file: 'out/index.cjs',
6
+ format: 'cjs',
7
+ sourcemap: true,
8
+ }
9
+ ],
10
+ external: ['node:child_process', 'node:fs', 'readline', 'crypto', 'stream']
11
+ };
@@ -0,0 +1,46 @@
1
+ import { ChildProcess, spawn } from 'node:child_process';
2
+ import * as readline from 'readline';
3
+ import { NSRPC } from "./NonstrictRPC.js";
4
+
5
+ export class IpcRecordKit {
6
+ private logMessages: boolean = false;
7
+ private childProcess?: ChildProcess;
8
+ readonly nsrpc: NSRPC;
9
+
10
+ constructor() {
11
+ this.nsrpc = new NSRPC((message) => this.write(message));
12
+ }
13
+
14
+ async initialize(recordKitRpcPath: string, logMessages: boolean = false): Promise<void> {
15
+ if (this.childProcess !== undefined) { throw new Error('RecordKit RPC: Already initialized.') }
16
+
17
+ this.logMessages = logMessages;
18
+ this.childProcess = await new Promise<ChildProcess>((resolve, reject) => {
19
+ const childProcess = spawn(recordKitRpcPath)
20
+ childProcess.on('spawn', () => { resolve(childProcess) })
21
+ childProcess.on('error', (error) => { reject(error) })
22
+ })
23
+
24
+ const { stdout } = this.childProcess
25
+ if (!stdout) { throw new Error('RecordKit RPC: No stdout stream on child process.') }
26
+
27
+ readline.createInterface({ input: stdout }).on('line', (line) => {
28
+ if (logMessages) {
29
+ console.log("< ", line.trimEnd());
30
+ }
31
+
32
+ this.nsrpc.receive(line);
33
+ });
34
+ }
35
+
36
+ private write(message: String) {
37
+ const stdin = this.childProcess?.stdin;
38
+ if (!stdin) { throw new Error('RecordKit RPC: Missing stdin stream.') }
39
+
40
+ if (this.logMessages) {
41
+ console.log("> ", message);
42
+ }
43
+
44
+ stdin.write(message + "\n")
45
+ }
46
+ }