@openmeshtak/sdk 0.2.0 → 0.2.2

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 CHANGED
@@ -1,33 +1,15 @@
1
1
  # OpenMeshTak SDK
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/@openmeshtak/sdk)](https://www.npmjs.com/package/@openmeshtak/sdk) [![License](https://img.shields.io/github/license/OpenMeshTAK/openmeshtak-sdk)](LICENSE) [![CI](https://github.com/OpenMeshTAK/openmeshtak-sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/OpenMeshTAK/openmeshtak-sdk/actions/workflows/ci.yml)
4
+
3
5
  The official TypeScript and JavaScript client for the OpenMeshTak REST API.
4
6
 
5
7
  The SDK is generated from the released OpenAPI contract and adds a small handwritten layer for
6
8
  authentication, common operations and predictable problem-details errors. It does not duplicate
7
- Core business rules.
8
-
9
- ## Local development
9
+ Core business rules. The SDK version always matches the OpenMeshTak version it was built from and
10
+ works with the later patch releases of that version line. Node.js 24 or newer is required.
10
11
 
11
- This checkout currently targets OpenMeshTak API `>=0.2.0 <0.3.0` and contains the OpenAPI artifact
12
- from Core `v0.2.0`. It requires Node.js 24 or newer.
13
-
14
- ```powershell
15
- pnpm install
16
- pnpm check
17
- ```
18
-
19
- The SDK is a library, not a server, so there is no long-running development process. `pnpm build`
20
- generates the contract types and writes the importable package to `dist/`.
21
-
22
- To refresh the checked-in contract from a verified Core release checkout:
23
-
24
- ```powershell
25
- pnpm api:sync -- ..\openmeshtak\openapi\openapi.json
26
- pnpm check
27
- ```
28
-
29
- Commit the OpenAPI artifact and generated declarations together. Do not edit
30
- `src/generated/schema.ts` or `src/version.ts` by hand.
12
+ Documentation: https://openmeshtak.github.io/openmeshtak-docs/sdk/
31
13
 
32
14
  ## Usage
33
15
 
@@ -94,42 +76,6 @@ for await (const member of paginate((page) => client.listEventMembers(eventId, {
94
76
  Generated DTOs and operation types for every other operation are exported from
95
77
  `@openmeshtak/sdk/generated`.
96
78
 
97
- ## Releases
98
-
99
- The SDK version always equals the OpenMeshTak Core version it was built from: SDK `0.2.0` belongs
100
- to Core `0.2.0`, SDK `0.2.1` to Core `0.2.1`. It supports every Core patch release of the same
101
- minor version (`>=0.2.0 <0.3.0`), so an older SDK keeps working after a Core patch update. The SDK
102
- is released together with Core and Web.
103
-
104
- Releases are driven by annotated `vMAJOR.MINOR.PATCH[-PRERELEASE]` tags. The release workflow:
105
-
106
- 1. verifies the tag, package version, API compatibility range and OpenAPI checksum;
107
- 2. installs with the frozen lockfile, audits dependencies and runs the complete check;
108
- 3. packs the npm tarball and generates third-party notices plus a CycloneDX SBOM;
109
- 4. publishes `@openmeshtak/sdk` to npm (`latest` for stable versions, `next` for prereleases);
110
- 5. creates a GitHub Release containing the verified tarball, notices and SBOM.
111
-
112
- To prepare a release for Core `0.2.1` by hand:
113
-
114
- ```powershell
115
- pnpm api:sync -- ..openmeshtakopenapiopenapi.json # from Core at tag v0.2.1
116
- pnpm version:set -- 0.2.1
117
- # set openmeshtak.apiVersionRange in package.json to ">=0.2.1 <0.3.0"
118
- pnpm generate
119
- pnpm check
120
- git commit -am "chore(release): 0.2.1"
121
- git tag -a v0.2.1 -m "OpenMeshTak SDK 0.2.1"
122
- git push origin main
123
- git push origin v0.2.1
124
- ```
125
-
126
- The workflow refuses mismatched tags or version metadata. Publishing happens only after the pushed
127
- tag passes all checks.
128
-
129
- npm publishing uses trusted publishing for organization `OpenMeshTAK`, repository
130
- `openmeshtak-sdk` and workflow `release.yml`. For the package's very first publication, a
131
- short-lived granular `NPM_TOKEN` repository secret is used once and removed afterwards.
132
-
133
79
  ## License
134
80
 
135
81
  Apache-2.0
@@ -322,7 +322,7 @@ export interface paths {
322
322
  put: operations["AddTakServerCertificate"];
323
323
  post?: never;
324
324
  /**
325
- * @description Removes an added or ACME certificate and disables ACME; the server then uses one issued by the
325
+ * @description Removes an added, ACME or file certificate and disables ACME and the file reload; the server then uses one issued by the
326
326
  * OpenMeshTak CA.
327
327
  */
328
328
  delete: operations["RemoveTakServerCertificate"];
@@ -331,6 +331,26 @@ export interface paths {
331
331
  patch?: never;
332
332
  trace?: never;
333
333
  };
334
+ "/tak-server/server-certificate/files": {
335
+ parameters: {
336
+ query?: never;
337
+ header?: never;
338
+ path?: never;
339
+ cookie?: never;
340
+ };
341
+ get?: never;
342
+ /**
343
+ * @description Uses the reverse proxy's certificate files, mounted read-only below `certificateDirectory`.
344
+ * Core reloads them every twelve hours, so a certificate the proxy renews is picked up. Disables ACME.
345
+ */
346
+ put: operations["UseTakCertificateFiles"];
347
+ post?: never;
348
+ delete?: never;
349
+ options?: never;
350
+ head?: never;
351
+ patch?: never;
352
+ trace?: never;
353
+ };
334
354
  "/events/{eventId}/tak-traffic": {
335
355
  parameters: {
336
356
  query?: never;
@@ -575,6 +595,26 @@ export interface paths {
575
595
  patch?: never;
576
596
  trace?: never;
577
597
  };
598
+ "/tak-server/acme/test": {
599
+ parameters: {
600
+ query?: never;
601
+ header?: never;
602
+ path?: never;
603
+ cookie?: never;
604
+ };
605
+ get?: never;
606
+ put?: never;
607
+ /**
608
+ * @description Runs the saved settings against Let's Encrypt staging to check the setup without touching the
609
+ * production rate limits. Nothing is installed; a failure is returned as `succeeded: false`.
610
+ */
611
+ post: operations["Test"];
612
+ delete?: never;
613
+ options?: never;
614
+ head?: never;
615
+ patch?: never;
616
+ trace?: never;
617
+ };
578
618
  "/events/{eventId}/tak/configuration": {
579
619
  parameters: {
580
620
  query?: never;
@@ -2420,16 +2460,22 @@ export interface components {
2420
2460
  /** @description The certificate the TAK listeners present. The private key is never returned. */
2421
2461
  TakServerCertificateDto: {
2422
2462
  /**
2423
- * @description OpenMeshTak-issued, administrator-added, or obtained automatically through ACME.
2463
+ * @description OpenMeshTak-issued, administrator-added, obtained automatically through ACME, or read from the reverse proxy's files.
2424
2464
  * @enum {string}
2425
2465
  */
2426
- source: "issued" | "added" | "acme";
2466
+ source: "issued" | "added" | "acme" | "file";
2427
2467
  hostName: string;
2428
2468
  subject: string;
2429
2469
  fingerprintSha256: string;
2430
2470
  /** Format: date-time */
2431
2471
  notAfter: string;
2432
2472
  };
2473
+ TakCertificateFilesDto: {
2474
+ /** @description Full chain, server certificate first, e.g. `live/tak.example.org/fullchain.pem`. */
2475
+ certificateFile: string;
2476
+ /** @description Unencrypted private key, e.g. `live/tak.example.org/privkey.pem`. */
2477
+ keyFile: string;
2478
+ };
2433
2479
  TakServerSettingsDto: {
2434
2480
  /** @description Whether the TAK listeners run. Requires a host name. */
2435
2481
  enabled: boolean;
@@ -2448,6 +2494,10 @@ export interface components {
2448
2494
  clientCertificateDays: number;
2449
2495
  /** @description `null` until the server first starts or a certificate is added. */
2450
2496
  serverCertificate: components["schemas"]["TakServerCertificateDto"] | null;
2497
+ /** @description The reverse proxy's certificate files Core reads, relative to `certificateDirectory`; `null` unless used. */
2498
+ certificateFiles: components["schemas"]["TakCertificateFilesDto"] | null;
2499
+ /** @description Where the proxy's certificate directory must be mounted for `certificateFiles`. */
2500
+ certificateDirectory: string;
2451
2501
  /**
2452
2502
  * Format: date-time
2453
2503
  * @description When the public host name or a port last changed after setup; `null` if never. Apps enrolled
@@ -2505,6 +2555,11 @@ export interface components {
2505
2555
  */
2506
2556
  privateKeyPem: string;
2507
2557
  };
2558
+ /** @description Use the reverse proxy's certificate files; both paths are relative to the mounted directory. */
2559
+ UseTakCertificateFilesRequest: {
2560
+ certificateFile: string;
2561
+ keyFile: string;
2562
+ };
2508
2563
  LiveTakConnectionDto: {
2509
2564
  id: components["schemas"]["Uuid"];
2510
2565
  userId: components["schemas"]["Uuid"];
@@ -2669,18 +2724,19 @@ export interface components {
2669
2724
  /** @description Omit to keep the stored token, `null` to remove it. The token is encrypted and write-only. */
2670
2725
  apiToken?: string | null;
2671
2726
  };
2727
+ /** @description Result of a test run against Let's Encrypt staging. */
2728
+ TakAcmeTestResultDto: {
2729
+ succeeded: boolean;
2730
+ /** @description What happened, safe to show to the administrator. */
2731
+ message: string;
2732
+ };
2672
2733
  /**
2673
- * @description - `none`: OpenMeshTak gives no TAK connection guidance.
2674
- * - `meshtastic-local-server`: each participant enables the Meshtastic app's local TAK server and
2675
- * connects ATAK/iTAK on the same phone to it. The app creates its own certificates, so
2676
- * OpenMeshTak provides guidance and settings, not a ready-made connection package.
2677
- * - `built-in-server`: participants enroll ATAK/iTAK with the built-in OpenMeshTak TAK server.
2678
- * @enum {string}
2734
+ * @description TAK settings of a Meshtastic event. Every event sends TAK clients to the built-in TAK server;
2735
+ * Meshtastic events (`meshtasticEnabled` on the event) also connect them to the Meshtastic app's
2736
+ * local TAK server, which carries CoT over this channel.
2679
2737
  */
2680
- TakConnectionMode: "none" | "meshtastic-local-server" | "built-in-server";
2681
2738
  TakConfigurationDto: {
2682
2739
  eventId: components["schemas"]["Uuid"];
2683
- mode: components["schemas"]["TakConnectionMode"];
2684
2740
  /** @description Channel for the app's "TAK Mesh Channel"; `null` uses the primary channel. */
2685
2741
  meshChannelId: components["schemas"]["Uuid"] | null;
2686
2742
  /**
@@ -2697,7 +2753,6 @@ export interface components {
2697
2753
  * @description Version the client last read.
2698
2754
  */
2699
2755
  version: number;
2700
- mode: components["schemas"]["TakConnectionMode"];
2701
2756
  meshChannelId: components["schemas"]["Uuid"] | null;
2702
2757
  };
2703
2758
  SetupStatusResponse: {
@@ -2820,29 +2875,25 @@ export interface components {
2820
2875
  * @enum {string}
2821
2876
  */
2822
2877
  TakRole: "Team Member" | "Team Lead" | "HQ" | "Sniper" | "Medic" | "Forward Observer" | "RTO" | "K9";
2878
+ /** @description The built-in TAK server participants enroll with from the dashboard. */
2879
+ ProfileTakServer: {
2880
+ /** @description `null` while the TAK server is not enabled. */
2881
+ hostName: string | null;
2882
+ /** Format: double */
2883
+ streamingPort: number;
2884
+ };
2823
2885
  /**
2824
- * @description Connection through the Meshtastic app's local TAK server. `meshChannel` is the value for the
2825
- * app's "TAK Mesh Channel": the channel's slot on this member's device, or `null` while that
2826
- * channel has not reached the device yet (then the primary channel is used).
2886
+ * @description The Meshtastic app's local TAK server, which carries CoT over the mesh when there is no network.
2887
+ * `meshChannel` is the value for the app's "TAK Mesh Channel": the channel's slot on this member's
2888
+ * device, or `null` while that channel has not reached the device yet (then the primary channel
2889
+ * is used).
2827
2890
  */
2828
- ProfileTakConnection: {
2891
+ ProfileMeshtasticTakServer: {
2829
2892
  meshChannel: {
2830
2893
  /** Format: double */
2831
2894
  slot: number;
2832
2895
  name: string;
2833
2896
  } | null;
2834
- /** @enum {string} */
2835
- mode: "meshtastic-local-server";
2836
- } | {
2837
- /** Format: double */
2838
- streamingPort: number;
2839
- /** @description `null` while the TAK server is not enabled. */
2840
- hostName: string | null;
2841
- /**
2842
- * @description Enroll with the built-in TAK server from the dashboard.
2843
- * @enum {string}
2844
- */
2845
- mode: "built-in-server";
2846
2897
  };
2847
2898
  /**
2848
2899
  * @description A channel the member receives. `included` channels come with the member's channel set;
@@ -2899,14 +2950,17 @@ export interface components {
2899
2950
  eventRole: components["schemas"]["ProfileAssignment"];
2900
2951
  group: components["schemas"]["ProfileAssignment"];
2901
2952
  tak: {
2902
- /** @description How this member connects ATAK/iTAK; `null` when the event gives no guidance. */
2903
- connection: components["schemas"]["ProfileTakConnection"] | null;
2953
+ /** @description Meshtastic events also connect ATAK/iTAK to the Meshtastic app; `null` otherwise. */
2954
+ meshtasticLocalServer: components["schemas"]["ProfileMeshtasticTakServer"] | null;
2955
+ /** @description Every member enrolls with the built-in TAK server for Data Packages and CoT over the network. */
2956
+ server: components["schemas"]["ProfileTakServer"];
2904
2957
  /** @description The group's TAK server groups for an external TAK server; the built-in server ignores them. */
2905
2958
  serverGroups: string[];
2906
2959
  role: components["schemas"]["TakRole"];
2907
2960
  team: components["schemas"]["TakTeam"];
2908
2961
  callsign: string;
2909
2962
  };
2963
+ /** @description `null` when the event does not use Meshtastic. */
2910
2964
  meshtastic: {
2911
2965
  /** @description `null` for configurations published before events had a firmware version. */
2912
2966
  firmware: components["schemas"]["ProfileFirmware"] | null;
@@ -2915,7 +2969,7 @@ export interface components {
2915
2969
  /** @description `null` only in previews while the group has no short-name prefix. */
2916
2970
  shortName: string | null;
2917
2971
  longName: string;
2918
- };
2972
+ } | null;
2919
2973
  };
2920
2974
  MyEventMembershipDto: {
2921
2975
  eventId: components["schemas"]["Uuid"];
@@ -3305,6 +3359,10 @@ export interface components {
3305
3359
  revision: number;
3306
3360
  /** Format: date-time */
3307
3361
  publishedAt: string;
3362
+ /** @description The built-in TAK server installs it in the app right after the app enrolls. */
3363
+ installOnEnrollment: boolean;
3364
+ /** @description The built-in TAK server installs it, and every new revision, whenever the app connects. */
3365
+ installOnConnection: boolean;
3308
3366
  };
3309
3367
  /** @enum {string} */
3310
3368
  MemberClaimStatus: "open" | "consumed" | "revoked" | "expired";
@@ -3448,6 +3506,12 @@ export interface components {
3448
3506
  * of event accounts that are deleted when the event is archived.
3449
3507
  */
3450
3508
  permanentAccounts: boolean;
3509
+ /**
3510
+ * @description The event provisions Meshtastic radios. When off, profiles carry no Meshtastic part, radio
3511
+ * downloads are unavailable and channels and radio settings stay stored but unused. Like other
3512
+ * configuration it reaches participants of an active event with the next published revision.
3513
+ */
3514
+ meshtasticEnabled: boolean;
3451
3515
  /** Format: date-time */
3452
3516
  createdAt: string;
3453
3517
  /** Format: date-time */
@@ -3486,6 +3550,12 @@ export interface components {
3486
3550
  * of event accounts that are deleted when the event is archived.
3487
3551
  */
3488
3552
  permanentAccounts: boolean;
3553
+ /**
3554
+ * @description The event provisions Meshtastic radios. When off, profiles carry no Meshtastic part, radio
3555
+ * downloads are unavailable and channels and radio settings stay stored but unused. Like other
3556
+ * configuration it reaches participants of an active event with the next published revision.
3557
+ */
3558
+ meshtasticEnabled: boolean;
3489
3559
  /** Format: date-time */
3490
3560
  createdAt: string;
3491
3561
  /** Format: date-time */
@@ -3518,6 +3588,8 @@ export interface components {
3518
3588
  * of event accounts that are deleted when the event is archived. Defaults to `false`.
3519
3589
  */
3520
3590
  permanentAccounts?: boolean;
3591
+ /** @description The event provisions Meshtastic radios. Defaults to `false`, a TAK-only event. */
3592
+ meshtasticEnabled?: boolean;
3521
3593
  };
3522
3594
  UpdateEventRequest: {
3523
3595
  /**
@@ -3544,6 +3616,8 @@ export interface components {
3544
3616
  * of event accounts that are deleted when the event is archived. Omitted keeps the current value.
3545
3617
  */
3546
3618
  permanentAccounts?: boolean;
3619
+ /** @description The event provisions Meshtastic radios. Omitted keeps the current value. */
3620
+ meshtasticEnabled?: boolean;
3547
3621
  };
3548
3622
  EventTransitionRequest: {
3549
3623
  /**
@@ -3658,6 +3732,12 @@ export interface components {
3658
3732
  shortName: string | null;
3659
3733
  eventRole: components["schemas"]["EventAssignmentSummary"];
3660
3734
  eventGroup: components["schemas"]["EventAssignmentSummary"];
3735
+ /**
3736
+ * Format: double
3737
+ * @description TAK apps the member's user has enrolled with the built-in TAK server and that may still
3738
+ * connect (valid client certificates). Certificates belong to the user, not to one event.
3739
+ */
3740
+ enrolledTakApps: number;
3661
3741
  /** Format: double */
3662
3742
  version: number;
3663
3743
  /** Format: date-time */
@@ -3868,19 +3948,27 @@ export interface components {
3868
3948
  settings: components["schemas"]["FirmwareSettingsDocument"];
3869
3949
  };
3870
3950
  CurrentTakConfiguration: {
3871
- mode: components["schemas"]["TakConnectionMode"];
3872
3951
  meshChannelId: string | null;
3873
3952
  };
3874
- /** @description How TAK clients connect; `null` in revisions created before version 4. */
3953
+ /**
3954
+ * @description The Meshtastic app's TAK mesh channel; `null` in revisions created before version 4. Revisions
3955
+ * before version 6 also stored a connection mode, which the switch `meshtasticEnabled` replaced.
3956
+ */
3875
3957
  SnapshotTak: components["schemas"]["CurrentTakConfiguration"];
3876
3958
  /**
3877
3959
  * @description Bump `schemaVersion` whenever the snapshot shape changes; old revisions are never rewritten.
3878
3960
  * Version 2 added `channels` in device order, the first being the primary channel; version 3
3879
- * added `meshtastic`; version 4 added `tak`.
3961
+ * added `meshtastic`; version 4 added `tak`; version 5 added role TAK overrides; version 6 added
3962
+ * `meshtasticEnabled`.
3880
3963
  */
3881
3964
  ConfigurationSnapshot: {
3882
3965
  /** @enum {number} */
3883
- schemaVersion: 1 | 2 | 3 | 4 | 5;
3966
+ schemaVersion: 1 | 2 | 3 | 4 | 5 | 6;
3967
+ /**
3968
+ * @description Whether the event provisions Meshtastic radios; `true` in revisions before version 6. When
3969
+ * `false`, `channels` is empty and `meshtastic` is `null`.
3970
+ */
3971
+ meshtasticEnabled: boolean;
3884
3972
  roles: components["schemas"]["SnapshotRole"][];
3885
3973
  groups: components["schemas"]["SnapshotGroup"][];
3886
3974
  channels: components["schemas"]["SnapshotChannel"][];
@@ -5935,6 +6023,57 @@ export interface operations {
5935
6023
  };
5936
6024
  };
5937
6025
  };
6026
+ UseTakCertificateFiles: {
6027
+ parameters: {
6028
+ query?: never;
6029
+ header?: never;
6030
+ path?: never;
6031
+ cookie?: never;
6032
+ };
6033
+ requestBody: {
6034
+ content: {
6035
+ "application/json": components["schemas"]["UseTakCertificateFilesRequest"];
6036
+ };
6037
+ };
6038
+ responses: {
6039
+ /** @description Certificate files in use */
6040
+ 200: {
6041
+ headers: {
6042
+ [name: string]: unknown;
6043
+ };
6044
+ content: {
6045
+ "application/json": components["schemas"]["TakServerSettingsDto"];
6046
+ };
6047
+ };
6048
+ /** @description Authentication required */
6049
+ 401: {
6050
+ headers: {
6051
+ [name: string]: unknown;
6052
+ };
6053
+ content: {
6054
+ "application/json": components["schemas"]["ProblemDetails"];
6055
+ };
6056
+ };
6057
+ /** @description Access denied */
6058
+ 403: {
6059
+ headers: {
6060
+ [name: string]: unknown;
6061
+ };
6062
+ content: {
6063
+ "application/json": components["schemas"]["ProblemDetails"];
6064
+ };
6065
+ };
6066
+ /** @description Validation failed */
6067
+ 422: {
6068
+ headers: {
6069
+ [name: string]: unknown;
6070
+ };
6071
+ content: {
6072
+ "application/json": components["schemas"]["ProblemDetails"];
6073
+ };
6074
+ };
6075
+ };
6076
+ };
5938
6077
  GetLiveTakTraffic: {
5939
6078
  parameters: {
5940
6079
  query?: never;
@@ -6570,6 +6709,53 @@ export interface operations {
6570
6709
  };
6571
6710
  };
6572
6711
  };
6712
+ Test: {
6713
+ parameters: {
6714
+ query?: never;
6715
+ header?: never;
6716
+ path?: never;
6717
+ cookie?: never;
6718
+ };
6719
+ requestBody?: never;
6720
+ responses: {
6721
+ /** @description Test finished */
6722
+ 200: {
6723
+ headers: {
6724
+ [name: string]: unknown;
6725
+ };
6726
+ content: {
6727
+ "application/json": components["schemas"]["TakAcmeTestResultDto"];
6728
+ };
6729
+ };
6730
+ /** @description Authentication required */
6731
+ 401: {
6732
+ headers: {
6733
+ [name: string]: unknown;
6734
+ };
6735
+ content: {
6736
+ "application/json": components["schemas"]["ProblemDetails"];
6737
+ };
6738
+ };
6739
+ /** @description Access denied */
6740
+ 403: {
6741
+ headers: {
6742
+ [name: string]: unknown;
6743
+ };
6744
+ content: {
6745
+ "application/json": components["schemas"]["ProblemDetails"];
6746
+ };
6747
+ };
6748
+ /** @description Validation failed */
6749
+ 422: {
6750
+ headers: {
6751
+ [name: string]: unknown;
6752
+ };
6753
+ content: {
6754
+ "application/json": components["schemas"]["ProblemDetails"];
6755
+ };
6756
+ };
6757
+ };
6758
+ };
6573
6759
  GetTakConfiguration: {
6574
6760
  parameters: {
6575
6761
  query?: never;
@@ -8309,7 +8495,7 @@ export interface operations {
8309
8495
  "application/json": components["schemas"]["ProblemDetails"];
8310
8496
  };
8311
8497
  };
8312
- /** @description Meshtastic configuration not published */
8498
+ /** @description Meshtastic configuration not published or event without Meshtastic */
8313
8499
  409: {
8314
8500
  headers: {
8315
8501
  [name: string]: unknown;