alphatheta-connect 0.15.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.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +166 -0
  3. package/lib/artwork/index.d.ts +9 -0
  4. package/lib/artwork/parsers/aiff.d.ts +2 -0
  5. package/lib/artwork/parsers/flac.d.ts +2 -0
  6. package/lib/artwork/parsers/id3.d.ts +2 -0
  7. package/lib/artwork/parsers/index.d.ts +5 -0
  8. package/lib/artwork/parsers/mp4.d.ts +2 -0
  9. package/lib/artwork/parsers/utils.d.ts +3 -0
  10. package/lib/artwork/reader.d.ts +15 -0
  11. package/lib/artwork/types.d.ts +44 -0
  12. package/lib/cli/index.d.ts +1 -0
  13. package/lib/cli.js +11431 -0
  14. package/lib/cli.js.map +1 -0
  15. package/lib/constants.d.ts +40 -0
  16. package/lib/control/index.d.ts +20 -0
  17. package/lib/db/getArtworkFromFile.d.ts +13 -0
  18. package/lib/db/getArtworkThumbnail.d.ts +29 -0
  19. package/lib/db/getFile.d.ts +29 -0
  20. package/lib/db/getMetadata.d.ts +28 -0
  21. package/lib/db/getPlaylist.d.ts +26 -0
  22. package/lib/db/getWaveforms.d.ts +29 -0
  23. package/lib/db/index.d.ts +70 -0
  24. package/lib/db/utils.d.ts +7 -0
  25. package/lib/devices/index.d.ts +66 -0
  26. package/lib/devices/utils.d.ts +5 -0
  27. package/lib/entities.d.ts +122 -0
  28. package/lib/index.d.ts +10 -0
  29. package/lib/index.js +13381 -0
  30. package/lib/index.js.map +1 -0
  31. package/lib/localdb/database-adapter.d.ts +49 -0
  32. package/lib/localdb/index.d.ts +104 -0
  33. package/lib/localdb/onelibrary-schema.d.ts +250 -0
  34. package/lib/localdb/onelibrary.d.ts +185 -0
  35. package/lib/localdb/orm.d.ts +60 -0
  36. package/lib/localdb/rekordbox.d.ts +112 -0
  37. package/lib/localdb/schema.d.ts +1 -0
  38. package/lib/localdb/utils.d.ts +5 -0
  39. package/lib/mixstatus/index.d.ts +109 -0
  40. package/lib/mixstatus/utils.d.ts +9 -0
  41. package/lib/network.d.ts +201 -0
  42. package/lib/nfs/index.d.ts +63 -0
  43. package/lib/nfs/programs.d.ts +61 -0
  44. package/lib/nfs/rpc.d.ts +60 -0
  45. package/lib/nfs/utils.d.ts +4 -0
  46. package/lib/nfs/xdr.d.ts +17 -0
  47. package/lib/passive/alphatheta.d.ts +94 -0
  48. package/lib/passive/devices.d.ts +64 -0
  49. package/lib/passive/index.d.ts +169 -0
  50. package/lib/passive/localdb.d.ts +122 -0
  51. package/lib/passive/pcap-adapter.d.ts +77 -0
  52. package/lib/passive/position.d.ts +32 -0
  53. package/lib/passive/remotedb.d.ts +49 -0
  54. package/lib/passive/status.d.ts +41 -0
  55. package/lib/remotedb/constants.d.ts +8 -0
  56. package/lib/remotedb/fields.d.ts +169 -0
  57. package/lib/remotedb/index.d.ts +160 -0
  58. package/lib/remotedb/message/index.d.ts +39 -0
  59. package/lib/remotedb/message/item.d.ts +530 -0
  60. package/lib/remotedb/message/response.d.ts +18 -0
  61. package/lib/remotedb/message/types.d.ts +227 -0
  62. package/lib/remotedb/queries.d.ts +99 -0
  63. package/lib/remotedb/utils.d.ts +23 -0
  64. package/lib/status/index.d.ts +39 -0
  65. package/lib/status/media.d.ts +22 -0
  66. package/lib/status/position.d.ts +29 -0
  67. package/lib/status/types.d.ts +170 -0
  68. package/lib/status/utils.d.ts +19 -0
  69. package/lib/types.d.ts +457 -0
  70. package/lib/types.js +274 -0
  71. package/lib/types.js.map +1 -0
  72. package/lib/utils/converters.d.ts +17 -0
  73. package/lib/utils/index.d.ts +28 -0
  74. package/lib/utils/telemetry.d.ts +82 -0
  75. package/lib/utils/udp.d.ts +20 -0
  76. package/lib/virtualcdj/index.d.ts +33 -0
  77. package/package.json +93 -0
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The default virtual CDJ ID to use.
3
+ *
4
+ * This particular ID is out of the 1-6 range, thus will not be able to request
5
+ * metadata via the remotedb for CDJs.
6
+ */
7
+ export declare const DEFAULT_VCDJ_ID = 7;
8
+ /**
9
+ * The port on which devices on the prolink network announce themselves.
10
+ */
11
+ export declare const ANNOUNCE_PORT = 50000;
12
+ /**
13
+ * The port on which devices on the prolink network send beat timing information.
14
+ */
15
+ export declare const BEAT_PORT = 50001;
16
+ /**
17
+ * The port on which devices on the prolink network announce themselves.
18
+ */
19
+ export declare const STATUS_PORT = 50002;
20
+ /**
21
+ * The amount of time in ms between sending each announcement packet.
22
+ */
23
+ export declare const ANNOUNCE_INTERVAL = 1500;
24
+ /**
25
+ * The interval in ms between startup stage packets (0x0a, 0x00, 0x02, 0x04).
26
+ */
27
+ export declare const STARTUP_STAGE_INTERVAL = 300;
28
+ /**
29
+ * All UDP packets on the PRO DJ LINK network start with this magic header.
30
+ */
31
+ export declare const PROLINK_HEADER: Uint8Array<ArrayBuffer>;
32
+ /**
33
+ * VirtualCDJName is the name given to the Virtual CDJ device.
34
+ */
35
+ export declare const VIRTUAL_CDJ_NAME = "ProLink-Connect";
36
+ /**
37
+ * VirtualCDJFirmware is a string indicating the firmware version reported with
38
+ * status packets.
39
+ */
40
+ export declare const VIRTUAL_CDJ_FIRMWARE = "1.43";
@@ -0,0 +1,20 @@
1
+ import { Socket } from 'dgram';
2
+ import { CDJStatus, Device } from "../types";
3
+ interface Options {
4
+ hostDevice: Device;
5
+ device: Device;
6
+ playState: CDJStatus.PlayState.Cued | CDJStatus.PlayState.Playing;
7
+ }
8
+ /**
9
+ * Generates the packet used to control the playstate of CDJs
10
+ */
11
+ export declare const makePlaystatePacket: ({ hostDevice, device, playState }: Options) => Uint8Array<ArrayBuffer>;
12
+ export default class Control {
13
+ #private;
14
+ constructor(beatSocket: Socket, hostDevice: Device);
15
+ /**
16
+ * Start or stop a CDJ on the network
17
+ */
18
+ setPlayState(device: Device, playState: Options['playState']): Promise<void>;
19
+ }
20
+ export {};
@@ -0,0 +1,13 @@
1
+ import { Track } from "../entities";
2
+ import { Device, DeviceID, MediaSlot } from "../types";
3
+ import { TelemetrySpan as Span } from "../utils/telemetry";
4
+ export interface Options {
5
+ deviceId: DeviceID;
6
+ trackSlot: MediaSlot;
7
+ track: Track;
8
+ span?: Span;
9
+ }
10
+ /**
11
+ * Extract artwork directly from an audio file via NFS.
12
+ */
13
+ export declare function viaFileExtraction(device: Device, opts: Options): Promise<Buffer | null>;
@@ -0,0 +1,29 @@
1
+ import { Track } from "../entities";
2
+ import LocalDatabase from "../localdb";
3
+ import RemoteDatabase from "../remotedb";
4
+ import { Device, DeviceID, MediaSlot, TrackType } from "../types";
5
+ import { TelemetrySpan as Span } from "../utils/telemetry";
6
+ export interface Options {
7
+ /**
8
+ * The device to query the track artwork off of
9
+ */
10
+ deviceId: DeviceID;
11
+ /**
12
+ * The media slot the track is present in
13
+ */
14
+ trackSlot: MediaSlot;
15
+ /**
16
+ * The type of track we are querying artwork for
17
+ */
18
+ trackType: TrackType;
19
+ /**
20
+ * The track to lookup artwork for
21
+ */
22
+ track: Track;
23
+ /**
24
+ * The Sentry transaction span
25
+ */
26
+ span?: Span;
27
+ }
28
+ export declare function viaRemote(remote: RemoteDatabase, opts: Required<Options>): Promise<Buffer<ArrayBufferLike> | null>;
29
+ export declare function viaLocal(local: LocalDatabase, device: Device, opts: Required<Options>): Promise<Buffer<ArrayBuffer> | null>;
@@ -0,0 +1,29 @@
1
+ import { Track } from "../entities";
2
+ import LocalDatabase from "../localdb";
3
+ import RemoteDatabase from "../remotedb";
4
+ import { Device, DeviceID, MediaSlot, TrackType } from "../types";
5
+ import { TelemetrySpan as Span } from "../utils/telemetry";
6
+ export interface Options {
7
+ /**
8
+ * The device to query the file off of
9
+ */
10
+ deviceId: DeviceID;
11
+ /**
12
+ * The media slot the track is present in
13
+ */
14
+ trackSlot: MediaSlot;
15
+ /**
16
+ * The type of track we are querying file for
17
+ */
18
+ trackType: TrackType;
19
+ /**
20
+ * The track to get track for
21
+ */
22
+ track: Track;
23
+ /**
24
+ * The Sentry transaction span
25
+ */
26
+ span?: Span;
27
+ }
28
+ export declare function viaRemote(_remote: RemoteDatabase, _device: Device, _opts: Required<Options>): null;
29
+ export declare function viaLocal(local: LocalDatabase, device: Device, opts: Required<Options>): Promise<Buffer<ArrayBuffer> | null>;
@@ -0,0 +1,28 @@
1
+ import LocalDatabase from "../localdb";
2
+ import RemoteDatabase from "../remotedb";
3
+ import { Device, DeviceID, MediaSlot, TrackType } from "../types";
4
+ import { TelemetrySpan as Span } from "../utils/telemetry";
5
+ export interface Options {
6
+ /**
7
+ * The device to query the track metadata from
8
+ */
9
+ deviceId: DeviceID;
10
+ /**
11
+ * The media slot the track is present in
12
+ */
13
+ trackSlot: MediaSlot;
14
+ /**
15
+ * The type of track we are querying for
16
+ */
17
+ trackType: TrackType;
18
+ /**
19
+ * The track id to retrieve metadata for
20
+ */
21
+ trackId: number;
22
+ /**
23
+ * The Sentry transaction span
24
+ */
25
+ span?: Span;
26
+ }
27
+ export declare function viaRemote(remote: RemoteDatabase, opts: Required<Options>): Promise<import("../types").Track<import("..").EntityFK.WithRelations> | null>;
28
+ export declare function viaLocal(local: LocalDatabase, device: Device, opts: Required<Options>): Promise<import("../types").Track | null>;
@@ -0,0 +1,26 @@
1
+ import { Playlist } from "../entities";
2
+ import LocalDatabase from "../localdb";
3
+ import RemoteDatabase from "../remotedb";
4
+ import { DeviceID, MediaSlot, PlaylistContents } from "../types";
5
+ import { TelemetrySpan as Span } from "../utils/telemetry";
6
+ export interface Options {
7
+ /**
8
+ * The playlist or folder to query the entries of. This may be left as
9
+ * undefined to retrieve the root playlist.
10
+ */
11
+ playlist?: Playlist;
12
+ /**
13
+ * The device to query the track metadata from
14
+ */
15
+ deviceId: DeviceID;
16
+ /**
17
+ * The media slot the track is present in
18
+ */
19
+ mediaSlot: MediaSlot;
20
+ /**
21
+ * The Sentry transaction span
22
+ */
23
+ span?: Span;
24
+ }
25
+ export declare function viaRemote(remote: RemoteDatabase, opts: Options): Promise<PlaylistContents | null>;
26
+ export declare function viaLocal(local: LocalDatabase, opts: Options): Promise<PlaylistContents | null>;
@@ -0,0 +1,29 @@
1
+ import { Track } from "../entities";
2
+ import LocalDatabase from "../localdb";
3
+ import RemoteDatabase from "../remotedb";
4
+ import { Device, DeviceID, MediaSlot, TrackType, Waveforms } from "../types";
5
+ import { TelemetrySpan as Span } from "../utils/telemetry";
6
+ export interface Options {
7
+ /**
8
+ * The device to query the track waveforms off of
9
+ */
10
+ deviceId: DeviceID;
11
+ /**
12
+ * The media slot the track is present in
13
+ */
14
+ trackSlot: MediaSlot;
15
+ /**
16
+ * The type of track we are querying waveforms for
17
+ */
18
+ trackType: TrackType;
19
+ /**
20
+ * The track to lookup waveforms for
21
+ */
22
+ track: Track;
23
+ /**
24
+ * The Sentry transaction span
25
+ */
26
+ span?: Span;
27
+ }
28
+ export declare function viaRemote(remote: RemoteDatabase, opts: Required<Options>): Promise<Waveforms | null>;
29
+ export declare function viaLocal(local: LocalDatabase, device: Device, opts: Required<Options>): Promise<Waveforms | null>;
@@ -0,0 +1,70 @@
1
+ import DeviceManager from "../devices";
2
+ import { Track } from "../entities";
3
+ import LocalDatabase from "../localdb";
4
+ import { DatabaseType } from "../localdb/database-adapter";
5
+ import RemoteDatabase from "../remotedb";
6
+ import { Device, MediaSlot, PlaylistContents, Waveforms } from "../types";
7
+ import * as GetArtworkFromFile from './getArtworkFromFile';
8
+ import * as GetArtworkThumbnail from './getArtworkThumbnail';
9
+ import * as GetMetadata from './getMetadata';
10
+ import * as GetPlaylist from './getPlaylist';
11
+ /**
12
+ * A Database is the central service used to query devices on the prolink
13
+ * network for information from their databases.
14
+ */
15
+ declare class Database {
16
+ #private;
17
+ constructor(hostDevice: Device, local: LocalDatabase, remote: RemoteDatabase, deviceManager: DeviceManager);
18
+ /**
19
+ * Reports weather or not the CDJs can be communicated to over the remote
20
+ * database protocol. This is important when trying to query for unanalyzed or
21
+ * compact disc tracks.
22
+ */
23
+ get cdjSupportsRemotedb(): boolean;
24
+ /**
25
+ * Get the database type (oneLibrary or pdb) for a loaded device slot.
26
+ * Returns null if the slot uses remote database or no database is loaded.
27
+ */
28
+ getDatabaseType(deviceId: number, slot: MediaSlot.USB | MediaSlot.SD): DatabaseType | null;
29
+ /**
30
+ * Retrieve metadata for a track on a specific device slot.
31
+ */
32
+ getMetadata(opts: GetMetadata.Options): Promise<Track | null>;
33
+ /**
34
+ * Retrieves the file off a specific device slot.
35
+ */
36
+ getFile(opts: GetArtworkThumbnail.Options): Promise<Buffer<ArrayBufferLike> | null>;
37
+ /**
38
+ * Retrieves the low-resolution artwork thumbnail from the rekordbox database.
39
+ *
40
+ * This returns the pre-generated thumbnail stored in the rekordbox database,
41
+ * which is typically small (around 80x80 pixels).
42
+ *
43
+ * For full-resolution artwork extracted from the audio file, use getArtwork().
44
+ */
45
+ getArtworkThumbnail(opts: GetArtworkThumbnail.Options): Promise<Buffer<ArrayBufferLike> | null>;
46
+ /**
47
+ * Retrieves artwork for a track by extracting it from the audio file via NFS.
48
+ *
49
+ * This is the primary method for getting artwork. It reads embedded artwork
50
+ * from the audio file (ID3 tags for MP3, metadata atoms for M4A, PICTURE
51
+ * blocks for FLAC, etc.) using partial file reads to minimize data transfer.
52
+ *
53
+ * For low-resolution thumbnails from the rekordbox database, use
54
+ * getArtworkThumbnail() instead.
55
+ */
56
+ getArtwork(opts: GetArtworkFromFile.Options): Promise<Buffer<ArrayBufferLike> | null>;
57
+ /**
58
+ * Retrieves the waveforms for a track on a specific device slot.
59
+ */
60
+ getWaveforms(opts: GetArtworkThumbnail.Options): Promise<Waveforms | null>;
61
+ /**
62
+ * Retrieve folders, playlists, and tracks within the playlist tree. The id
63
+ * may be left undefined to query the root of the playlist tree.
64
+ *
65
+ * NOTE: You will never receive a track list and playlists or folders at the
66
+ * same time. But the API is simpler to combine the lookup for these.
67
+ */
68
+ getPlaylist(opts: GetPlaylist.Options): Promise<PlaylistContents | null>;
69
+ }
70
+ export default Database;
@@ -0,0 +1,7 @@
1
+ import { Device, MediaSlot } from "../types";
2
+ interface AnlzLoaderOpts {
3
+ device: Device;
4
+ slot: MediaSlot.RB | MediaSlot.USB | MediaSlot.SD;
5
+ }
6
+ export declare function anlzLoader(opts: AnlzLoaderOpts): (path: string) => Promise<Buffer<ArrayBuffer>>;
7
+ export {};
@@ -0,0 +1,66 @@
1
+ import StrictEventEmitter from 'strict-event-emitter-types';
2
+ import { Socket } from 'dgram';
3
+ import { EventEmitter } from 'events';
4
+ import { Device, DeviceID } from "../types";
5
+ interface Config {
6
+ /**
7
+ * Time in milliseconds after which a device is considered to have
8
+ * disconnected if it has not broadcast an announcement.
9
+ *
10
+ * @default 10000 ms
11
+ */
12
+ deviceTimeout?: number;
13
+ /**
14
+ * The name of the virtual CDJ to filter out from device announcements.
15
+ * This prevents our own device from appearing in the device list.
16
+ *
17
+ * @default VIRTUAL_CDJ_NAME constant
18
+ */
19
+ vcdjName?: string;
20
+ }
21
+ /**
22
+ * The configuration object that may be passed to reconfigure the manager
23
+ */
24
+ type ConfigEditable = Omit<Config, 'announceSocket'>;
25
+ /**
26
+ * The interface the device manager event emitter should follow
27
+ */
28
+ interface DeviceEvents {
29
+ /**
30
+ * Fired when a new device becomes available on the network
31
+ */
32
+ connected: (device: Device) => void;
33
+ /**
34
+ * Fired when a device has not announced itself on the network for the
35
+ * specified timeout.
36
+ */
37
+ disconnected: (device: Device) => void;
38
+ /**
39
+ * Fired every time the device announces itself on the network
40
+ */
41
+ announced: (device: Device) => void;
42
+ }
43
+ type Emitter = StrictEventEmitter<EventEmitter, DeviceEvents>;
44
+ /**
45
+ * The device manager is responsible for tracking devices that appear on the
46
+ * prolink network, providing an API to react to devices livecycle events as
47
+ * they connect and disconnect form the network.
48
+ */
49
+ declare class DeviceManager {
50
+ #private;
51
+ constructor(announceSocket: Socket, config?: Config);
52
+ on: Emitter['on'];
53
+ off: Emitter['off'];
54
+ once: Emitter['once'];
55
+ /**
56
+ * Get active devices on the network.
57
+ */
58
+ get devices(): Map<number, Device>;
59
+ /**
60
+ * Waits for a specific device ID to appear on the network, with a
61
+ * configurable timeout, in which case it will resolve with null.
62
+ */
63
+ getDeviceEnsured(id: DeviceID, timeout?: number): Promise<Device | null>;
64
+ reconfigure(config: ConfigEditable): void;
65
+ }
66
+ export default DeviceManager;
@@ -0,0 +1,5 @@
1
+ import { Device } from "../types";
2
+ /**
3
+ * Converts a announce packet to a device object.
4
+ */
5
+ export declare function deviceFromPacket(packet: Buffer): Device | null;
@@ -0,0 +1,122 @@
1
+ import { BeatGrid, CueAndLoop, WaveformHD } from "./types";
2
+ /**
3
+ * Documentation type strictly for use with entities that have foreign key
4
+ * attributes.
5
+ */
6
+ export declare enum EntityFK {
7
+ WithFKs = 0,
8
+ WithRelations = 1
9
+ }
10
+ export interface Artwork {
11
+ id: number;
12
+ path?: string;
13
+ }
14
+ export interface Key {
15
+ id: number;
16
+ name: string;
17
+ }
18
+ export interface Label {
19
+ id: number;
20
+ name: string;
21
+ }
22
+ export interface Color {
23
+ id: number;
24
+ name: string;
25
+ }
26
+ export interface Genre {
27
+ id: number;
28
+ name: string;
29
+ }
30
+ export interface Album {
31
+ id: number;
32
+ name: string;
33
+ }
34
+ export interface Artist {
35
+ id: number;
36
+ name: string;
37
+ }
38
+ export interface Playlist {
39
+ id: number;
40
+ name: string;
41
+ isFolder: boolean;
42
+ parentId: number | null;
43
+ }
44
+ interface PlaylistEntryRelations {
45
+ track: Track;
46
+ }
47
+ interface PlaylistEntryFks {
48
+ playlistId: number;
49
+ trackId: number;
50
+ }
51
+ export type PlaylistEntry<withFKs extends EntityFK = EntityFK.WithRelations> = {
52
+ id: number;
53
+ sortIndex: number;
54
+ } & (withFKs extends EntityFK.WithFKs ? PlaylistEntryFks : PlaylistEntryRelations);
55
+ interface TrackRelations {
56
+ artwork: Artwork | null;
57
+ artist: Artist | null;
58
+ originalArtist: Artist | null;
59
+ remixer: Artist | null;
60
+ composer: Artist | null;
61
+ album: Album | null;
62
+ label: Label | null;
63
+ genre: Genre | null;
64
+ color: Color | null;
65
+ key: Key | null;
66
+ }
67
+ interface TrackFks {
68
+ artworkId?: number;
69
+ artistId?: number;
70
+ originalArtistId?: number;
71
+ remixerId?: number;
72
+ composerId?: number;
73
+ albumId?: number;
74
+ labelId?: number;
75
+ genreId?: number;
76
+ colorId?: number;
77
+ keyId?: number;
78
+ }
79
+ /**
80
+ * Represents a track.
81
+ *
82
+ * Note, fields that are not optional will be set for all database request
83
+ * methods.
84
+ */
85
+ export type Track<withFKs extends EntityFK = EntityFK.WithRelations> = {
86
+ id: number;
87
+ title: string;
88
+ duration: number;
89
+ bitrate?: number;
90
+ tempo: number;
91
+ rating: number;
92
+ comment: string;
93
+ filePath: string;
94
+ fileName: string;
95
+ trackNumber?: number;
96
+ discNumber?: number;
97
+ sampleRate?: number;
98
+ sampleDepth?: number;
99
+ playCount?: number;
100
+ year?: number;
101
+ mixName?: string;
102
+ autoloadHotcues?: boolean;
103
+ kuvoPublic?: boolean;
104
+ fileSize?: number;
105
+ analyzePath?: string;
106
+ releaseDate?: string;
107
+ analyzeDate?: Date;
108
+ dateAdded?: Date;
109
+ /**
110
+ * Embedded beat grid information
111
+ */
112
+ beatGrid: BeatGrid | null;
113
+ /**
114
+ * Embedded cue and loop information
115
+ */
116
+ cueAndLoops: CueAndLoop[] | null;
117
+ /**
118
+ * Embedded HD Waveform information
119
+ */
120
+ waveformHd: WaveformHD | null;
121
+ } & (withFKs extends EntityFK.WithFKs ? TrackFks : TrackRelations);
122
+ export {};
package/lib/index.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export * from './entities';
2
+ export * from './mixstatus';
3
+ export * from './network';
4
+ export { default as PositionEmitter } from './status/position';
5
+ export * from './passive';
6
+ export { extractArtwork, extractArtworkFromDevice, isArtworkExtractionSupported, PictureType, } from './artwork';
7
+ export type { ExtractedArtwork, FileReader as ArtworkFileReader } from './artwork';
8
+ export type { DatabaseAdapter, DatabasePreference, DatabaseType, PlaylistQueryResult, } from './localdb/database-adapter';
9
+ export { OneLibraryAdapter } from './localdb/onelibrary';
10
+ export * from './types';